Не нашел карманный достойный Health Checker – написал свой
Недавно с товарищем разрабатывали один внутренний ресурс и понадобился удобный Alert. Нужно было получать уведомления, если система вдруг перестанет отвечать. Подумал, что телеграм в этом плане подойдет идеально: ничего дополнительно ставить не нужно, все под рукой.
Я пробовал поискать готового бота, пообщался с коллегами — давали разные варианты. Но либо функциональность не та, либо интерфейс неудобный. В итоге решил: «А почему бы не написать своего?»
И написал.
Бот по расписанию пингует API эндпоинты (в общем то любую страницу) и присылает уведомление в телеграм, если что-то пошло не так: нет соединения, долгий отклик или отрицательный код ответа. Звучит просто, но внутри все немного интереснее.
Писал на Java 21. Да, знаю, не супер прагматично для телеграм-бота, но я джавист — привычнее и спокойнее.
Начал с проектирования структуры и сущностей. Получились User (потом масштабировал в Chat), Api и HistoryApi. Первоначально бот управлялся через команды, но по мере роста модели управления пришлось перейти на inline-меню, чтобы UI был удобнее.
Проверку эндпоинтов реализовал конкурентно: выгрузку списка API из базы распределяю по виртуальным потокам (Java 21). В каждом потоке выполняются задачи проверки и асинхронного ожидания ответа (с учётом таймаутов). Такой подход позволил без лишних накладных расходов параллельно обрабатывать тысячи проверок.
В какой-то момент увлекся: добавил статистику, историю проверок, выгрузку журнала, работу в групповых чатах, возможность более точной настройки интервалов и времени отклика. Да, это добавило нагрузки, но зато функционал получился гибкий.
Кстати, сервер, через который бот выполняет проверки, находится в Санкт-Петербурге (пока). Это значит, что время отклика измеряется именно из этого региона, и результаты могут немного отличаться от того, что вы видите со своего компьютера.
Сейчас бот работает так:
добавляем эндпоинт — встали в очереди на проверку;
дефолтный интервал проверки — 15 минут;
максимальное время отклика до уведомления — 2000 мс;
интервал обхода очереди всех API раз в минуту.
В меню управления можно изменить название, URL, интервал проверки, время отклика, приостановить проверку, отключить уведомления для конкретного API или удалить его.
Если во время проверки больше 10 раз не удается получить положительный ответ, проверка ставится на паузу. Пользователь после решения проблемы с ресурсом может возобновить её вручную.
Бот бесплатный, но есть разные планы для удобства и справедливого распределения ресурсов.
Бесплатный — для обычных пользователей: до 2 API, проверка не чаще чем раз в 15 минут, простой порог отклика 1000 мс, статистика только последней проверки. Для большинства это более чем достаточно.
Персональный — для тех, кто хочет больше контроля: до 5 API, проверка каждую минуту, порог отклика до 250 мс, статистика последних 5 проверок и выгрузка CSV до 14 дней.
Групповой — для команд и групп: работа в чатах, до 20 API.
Эти тарифы сделаны не для того, чтобы кого-то заставлять платить, а чтобы покрывать расходы на активных пользователей, которые используют ресурсоёмкие функции. Если вы просто хотите получать уведомления о своих парах API, бесплатного плана хватит с головой.
Из проблем, с которыми пришлось разбираться вручную, — работа с часовыми поясами. Сервер в UTC, пользователи в разных часовых поясах. Добавил ручной ввод смещения от UTC, теперь статистика и история отображаются в локальном времени.
В перспективе хочу добавить поддержку Мini app — чтобы UI стал еще удобнее и можно было управлять проверками прямо в Telegram без многоступенчатых меню.
Бот доступен по ссылке - @APIHealthCheckerBot