Аптайм вахтер: мониторинг веб-сервисов с помощью Globalping и уведомлениями в Telegram

это не тащ мойор следит за вами, а вахтер бдит и уведомляет

это не тащ мойор следит за вами, а вахтер бдит и уведомляет

Представьте: ваш сервис должен работать безотказно 24/7, быть доступным из любой точки мира, а любые проблемы нужно обнаруживать мгновенно. Как убедиться, что сайт одинаково быстро работает в Нью-Йорке, Токио и Москве? Как отследить проблемы маршрутизации или цензуры в разных странах?

Стандартные системы аналитики могут помочь с базовым мониторингом доступности, но что если вам нужно больше? Что если нет возможности установить счетчик или вас не устраивает способ доставки уведомлений?

Что такое Globalping

Globalping — это проект команды jsDelivr, экспертов с 10-летним опытом в сфере CDN. Они предоставляют бесплатное API для проведения сетевых тестов (ping, traceroute, dns, mtr, http) из точек по всему миру. На момент написания статьи сеть включает:

  • 82 страны

  • 338 городов

  • 1103 узла

Особенности проекта:

  • Открытый исходный код, ознакомиться можно здесь

  • Активное сообщество

  • Возможность добавить собственный узел через Docker или ARM-устройство

  • Система кредитов для расширенного использования (заработок на своем узле)

Так выглядит ARM-устройство

Так выглядит ARM-устройство

API: просто и эффективно

API Globalping предоставляет 4 основных метода:

  1. POST /v1/measurements — создание теста с указанными параметрами

  2. GET /v1/measurements/{id} — получение результатов по ID

  3. GET /v1/probes — список доступных узлов с метаданными

  4. GET /v1/limits — информация о текущих лимитах

Базовое использование API не требует аутентификации, но через дашбоард можно выпустить токен для расширенного доступа.

Uptime Wachter: создаем систему мониторинга

4ea880f4fb67471b87f7603e9488ecce.png

При разработке были поставлены следующие цели:

  1. Максимальная гибкость тестов

    — Прямая передача JSON-параметров в API

    — Никаких лишних абстракций

  1. Регулярное выполнение

    — Настройка через cron-выражения

    — Мгновенный запуск при старте

  1. Надежные уведомления

    — Интеграция с Telegram

    — Мгновенная доставка

    — Доступность с любого устройства

  1. Подробное логирование

    — Сохранение всех результатов

    — Различные уровни детализации

  1. Открытый исходный код

    — Возможность кастомизации

    — Добавление новых способов уведомлений

Технические детали

Проект реализован на TypeScript и требует Node.js 18+. Конфигурация следующая:

TELEGRAM_TOKEN= # Токен бота

NOTIFICATION_LIST= # Список ID получателей, можно указать групповой чат

LOG_LEVEL= # Уровень логирования (0-3)

NOTIFICATION_LEVEL= # Уровень уведомлений (0-3)

TIMEZONE= # Часовой пояс

MEASUREMENTS_PATH= # Папка для результатов

Про уровни логирования и уведомлений:

  • 3 — только ошибки

  • 2 — ошибки и предупреждения

  • 1 — ошибки, предупреждения и информация о выполнении

  • 0 — все выше перечисленное

Основной класс Wachter включает три ключевых метода:

  1. loadMeasurements — загрузка тестов из файловой системы

  2. runMeasurement — выполнение теста через globalping-ts (typescript обертка API доступная в npm)

  3. notify — обработка и рассылка уведомлений

Система покрывает различные типы тестов:

  • ping: проверяется количество потерянных пакетов и среднее время приема-передачи RTT (round-trip time);

  • traceroute: вычисляем среднее RTT на основе данных по каждому прыжку (hop) и происходит тоже самое, что и в типе ping;

  • dns: тут ситуация немного сложнее, сам тип делится на 2 подтипа: простой днс тест и с включенной трассировкой. В обоих проверяется среднее время жизни TTL (time to live);

  • mtr: проверяется количество потерянных пакетов, среднее время приема-передачи RTT и среднее число нежелательных фазовых или частотных отклонений передаваемого сигнала (jitter);

  • http: проверяются различные тайминги (они перечисляются в документации API), наличие и валидность TLS-сертификата, а также уведомления приходят каждую итерацию теста об окончании сертификата или приближении этой даты.

    Сами тесты хранятся в папке measurements, добавим какой-нибудь тест, вполне подойдет любой из документации к API, единственное что нам нужно это добавить cronExpression, к примеру */2 * * * *, измерение будет выполняться каждые 2 минуты. Название файла может быть любым, главное сохранить его в формате JSON.
    Получается следующее:

    {
        "type": "ping",
        "target": "cdn.jsdelivr.net",
        "locations": [
            {
                "country": "DE"
            },
            {
                "country": "PL"
            }
        ],
        "cronExpression": "*/2 * * * *"
    }

    Теперь можно сделать билд и запустить приложение:

    npm run buildAndGuard

Примерно так выглядят уведомления

Примерно так выглядят уведомления

Итоги

Uptime Wachter — приложение для демонстрации возможностей Globalping API и не более.

Возможно оно будет полезно для команд, которым критично важен постоянный мониторинг сервисов из разных точек мира без развертывания собственной инфраструктуры. Исходный код доступен в Github. Буду рад вашим вопросам и предложениям по улучшению в комментариях!

© Habrahabr.ru