
Всем привет, в этой статье я хотел бы рассказать о создании бота для мониторинга систем (сайтов) и внутренних сервисов – их доступность/недоступность.
Кому данный бот будет полезен 100%?
Абсолютно всем!
Вы можете мониторить как одну систему, так и хоть 100, получать уведомления в Telegram и оперативно принимать меры по устранению проблем.
Вкратце опишу принцип работы бота. Есть список URL, первый поток бегает по ним и проверяет на доступность, если находит недоступный ресурс – помещает его в список не работающих ресурсов и оповещает нас о недоступности ресурса, временно удаляя неработающий ресурс из списка рабочих. В свою очередь список неработающих систем также мониторится и в случае обнаружения рабочего ресурса – нас оповещают об этом и ресурс, который был в списке неработающих покидает этот список.
Первое что мы делаем – это создаем бота в @BotFather. Придумываем имя и получаем токен. Итак, перейдем непосредственно к коду.
Импортируем нужные библиотеки, telebot (pyTelegramBotAPI) хорошая и лёгкая библиотека для создания бота на Python. Библиотека threading импортируется для запуска в несколько потоков.

В этой части кода указываем тайм-ауты для запросов и долгих response, иногда ресурс может отдать ответ за 5 секунд иногда и 30 будет недостаточно. Прописываем интервал пересылки из бота в беседу (можно не делать пересылку в беседу, но тогда придется прописывать user ID, на который будет триггерить бот, иначе любой кто зайдет в бота сможет запустить проверку сначала). И указываем шаблон оповещения доступной системы.

Создаем функцию, которая будет обрабатывать загрузку файлов. Проходимся построчно по .ТХТ файлу, помещая все значения в список, прописываем кодировку (можно указать кодировку в .ТХТ, но лучше в коде, так как часто файлы меняются и этот момент забывается, либо некорректно воспроизводится другими пользователями). Указываем разделитель, по которому будет происходить отсечение значения, вносим сайт в список.

Переходим непосредственно к checking ресурсов и помещению их в списки (рабочие/нерабочие ресурсы), и оповещению в боте о нерабочих ресурсах.

И получаем в боте сообщение такого формата:

В данном блоке check-аются недоступные ресурсы. Поток бегает по списку недоступных систем и оповещает в боте.

Оповещение о доступности будет иметь такой вид:

Опрашиваем серверы Telegram на предмет новых сообщений, не прекращая опрос при получении ошибки.

Для удобства закинем бота в контейнер Docker.

docker build -t python-docker-checker .
docker run python-docker-checker
И вот бот уже крутится в контейнере.

P.S. Помимо систем, можно мониторить и внутренние сервисы, имеющие Status Code.
Комментарии (9)
badcasedaily1
02.04.2023 06:30+3Посты с кодом лучше оформлять используя окно для ввода кода, а не картинки
Ouozen
02.04.2023 06:30+1Еще нужно предусмотреть защиту от большой задержки в сети. Иногда сервисы доступны, но при высокой нагрузке может быть долгое ожидание, которое выйдет за таймаут. Поэтому я бы добавил кусок кода который повторно обращается к сайту который он пометил как нерабочий. Иначе можно всю личку заспамить, и тогда это будет бесполезный бот для любой IT-компании.
Dannyk1 Автор
02.04.2023 06:30Дополнительные проверки тоже предусмотрены, с определенными интервалами, то о чем вы пишите это всплывает в период тестирования - тестирование данный бот прошёл
user18383
02.04.2023 06:30Рекомендую обратить внимание на библиотеку pyrogram. Здесь описано почему она лучше чем обычный bot api
Она асинхронная, использует mtproto без прослойки в виде http и вообще очень крутая. Она также не имеет ограничений на размер файла и некоторые другие, которые присутствуют в обычном bot api
trabl
02.04.2023 06:30Всё верно, недавно пытался написать бота используя telethon и столкнулся с кучей ограничений. На pyrogram всё взлетело из коробки.
MrTheFirst
02.04.2023 06:30+1Тоже своего бота поднимал, потребовалось расширить функционал для ведения истории и отслеживания сертификатов. На это нужно время разработчика. Поднял uptime-kuma, подключил уведомления в телеграм, отлично справляется с задачей, развертывания 5-10 минут
saboteur_kiev
02.04.2023 06:30+2Почему не настроить уведомления в телеграм в любой уже существующей удобной системе мониторинга?
Зачем всего-лишь из-за отправки уведомлений в телегу нужно писать свой обход урл-ов, причем с примитивной логикой, в то время как в мониторинге можно указать все - и интервалы, и пулл чеки и чеки не только URL а чего угодно (базы данных, брокеры, процессы, свободное место)...А вместо целого кода с ботом, достаточно просто curl для отправки сообщения в нужный чатик из мониторинга, или уже готовый плагин.
TouristPlay
02.04.2023 06:30+2Однажды делал бота в компании для автоматизации системы Jira
Суть ее состояла в том, что она делила сотрудников на роли
1. Разработчик
2. Тимлид
3. Менеджер
4. Руководитель отдела
5. Руководитель производства
В зависимости от роли, приходили структурная информация с джиры
Одним из примеров можно предоставить общее сообщение для всех пользователей, которое показывает задачи просроченные по времени и задачи, которые ушли в перерасход по времени
Задачи по которым есть просрочка или перерасход по часамUME-282 - К выполнению
Просрочка - 25.01.2023
UME-97 - В работе
Перерасход - 522%
Просрочка - 23.01.2023
UME-73 - К выполнению
Перерасход - 161%
Просрочка - 27.12.2022
sic
Если нет какой-то более тонкой системы мониторинга, то вполне рабочий поход. Вот только нужно ещё иметь мониторинг для самого бота, а то, если он молча свалится, то будет ещё хуже, чем без него.