Аптайм вахтер: мониторинг веб-сервисов с помощью Globalping и уведомлениями в Telegram
это не тащ мойор следит за вами, а вахтер бдит и уведомляет
Представьте: ваш сервис должен работать безотказно 24/7, быть доступным из любой точки мира, а любые проблемы нужно обнаруживать мгновенно. Как убедиться, что сайт одинаково быстро работает в Нью-Йорке, Токио и Москве? Как отследить проблемы маршрутизации или цензуры в разных странах?
Стандартные системы аналитики могут помочь с базовым мониторингом доступности, но что если вам нужно больше? Что если нет возможности установить счетчик или вас не устраивает способ доставки уведомлений?
Что такое Globalping
Globalping — это проект команды jsDelivr, экспертов с 10-летним опытом в сфере CDN. Они предоставляют бесплатное API для проведения сетевых тестов (ping, traceroute, dns, mtr, http) из точек по всему миру. На момент написания статьи сеть включает:
82 страны
338 городов
1103 узла
Особенности проекта:
Открытый исходный код, ознакомиться можно здесь
Активное сообщество
Возможность добавить собственный узел через Docker или ARM-устройство
Система кредитов для расширенного использования (заработок на своем узле)
Так выглядит ARM-устройство
API: просто и эффективно
API Globalping предоставляет 4 основных метода:
POST /v1/measurements
— создание теста с указанными параметрамиGET /v1/measurements/{id}
— получение результатов по IDGET /v1/probes
— список доступных узлов с метаданнымиGET /v1/limits
— информация о текущих лимитах
Базовое использование API не требует аутентификации, но через дашбоард можно выпустить токен для расширенного доступа.
Uptime Wachter: создаем систему мониторинга
При разработке были поставлены следующие цели:
Максимальная гибкость тестов
— Прямая передача JSON-параметров в API
— Никаких лишних абстракций
Регулярное выполнение
— Настройка через cron-выражения
— Мгновенный запуск при старте
Надежные уведомления
— Интеграция с Telegram
— Мгновенная доставка
— Доступность с любого устройства
Подробное логирование
— Сохранение всех результатов
— Различные уровни детализации
Открытый исходный код
— Возможность кастомизации
— Добавление новых способов уведомлений
Технические детали
Проект реализован на 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 включает три ключевых метода:
loadMeasurements
— загрузка тестов из файловой системыrunMeasurement
— выполнение теста через globalping-ts (typescript обертка API доступная в npm)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. Буду рад вашим вопросам и предложениям по улучшению в комментариях!