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