Русский
Русский
English
Статистика
Реклама

Как перестать беспокоиться и начать жить

Мониторинг работы организации с помощью докера и телеграм-бота

Многим хотелось бы знать, если вдруг что-то случится с их сайтом, магазином и т.п., особенно, если это не требует ни денег, ни времени, ни усилий. А ведь это довольно легко сделать: потратив совсем немного свободного времени, создадим докер контейнер, который будет периодически делать запросы в БД, расчитывать на их основании некие метрики, сравнивать их с пороговыми значениями и в случае превышения этих порогов, оповещать заинтересованных лиц.

Первым делом надо завести бота. Как это сделать можно нагуглить за 5 минут. Например, тут недавно была статья. Также нашему боту нужно разрешение на добавление его в группы, если получать сообщения планирует не один человек, а несколько. Для этого при создании бота надо написать BotFather команду /setjoingroups. После этого, собственно надо создать группу, добавить в нее нашего бота и всех заинтересованных в получении сообщений.

Далее воспользуемся библиотекой pytelegrambotapi и закончим подготовительный этап тем, что узнаем CHAT_ID Его можно узнать, например, включив логирование и, воспользовавшись командой из той же статьи, включить своего бота на ожидание команды /start. Затем ввести эту команду в созданной нами группе. Команда придет к боту, он ответит, логах будет выведена масса разной информации, в том числе и нужный нам CHAT_ID группы:

import loggingimport telebotbot = telebot.TeleBot(TOKEN)chat_id = CHAT_IDlogger = telebot.loggertelebot.logger.setLevel(logging.DEBUG)@bot.message_handler(commands=['start'])def start_message(message):    bot.send_message(message.chat.id, 'Привет, ты написал мне /start')bot.polling()

Теперь мы можем посылать сообщения ботом в нашу группу:

bot.send_message(chat_id=CHAT_ID, text=TEXT)

Чтобы было что посылать рассчитаем метрику, по данным полученным из БД. Допустим, у нас каждый бизнес процесс подтверждается СМС клиенту. Соответственно, если давно не посылались СМС, что-то идет не так.

Создадим класс, который будет отвечать за подключение к БД и расчет метрик. Я использовал для доступа в БД библиотеку pymysql. Она легкая и понятная:

import datetimeimport osfrom contextlib import closingimport pymysqlfrom pymysql.cursors import DictCursorfrom constants import *class Monitor:    def __init__(self):        self.starttime = datetime.datetime.today()        self.port = 3306        self.host = os.environ.get('MYSQL_HOST')        self.user = os.environ.get('USER')        self.password = os.environ.get('MYSQL_PWD')        self.db_name = 'backend'def sms_log(self):    with closing(pymysql.connect(host=self.host, port=self.port, user=self.user, password=self.password,db=self.db_name, charset='utf8', cursorclass=DictCursor)) as connection:        end_time = datetime.datetime.today()        start_time = end_time - datetime.timedelta(minutes=TIME_PERIOD)        st_time = start_time.strftime('%Y-%m-%d %H:%M:%S')                end_time = end_time.strftime('%Y-%m-%d %H:%M:%S')        with connection.cursor() as cursor:            query = f"SELECT COUNT(*) FROM sms_log WHERE created_at BETWEEN '{st_time}' AND '{end_time}'"            cursor.execute(query)            for row in cursor:                result = row['COUNT(*)']                if result < SMS_COUNT_ALERT:                    return f"За {TIME_PERIOD} минут с \            f"{start_time.strftime('%H:%M')} " \                 f"было отправлено {result} СМС, предел: {SMS_COUNT_ALERT}"

Подобным образом рассчитываем все интересующие нас метрики, сравниваем их с некими пределами, при превышении которых, высылаем сообщения. Для чего подправим главную функцию бота следующим образом:

def main():    bot = telebot.TeleBot(TOKEN)    chat_id = CHAT_ID    logger = telebot.logger    telebot.logger.setLevel(logging.DEBUG)      monitor = Monitor()    while True:        """         Выполняем запросы в БД каждые 15 (TIME_PERIOD) минут.         """      result = monitor.sms_log()      if result:            bot.send_message(            chat_id=chat_id,             text=result,            disable_notification=not monitor.is_day()        )      . . .      sleep(TIME_PERIOD*60)

Для того, чтобы сообщения ночью приходили бесшумно, используем следующую конструкцию:

disable_notification=not monitor.is_day()

где

@staticmethoddef is_day():    if 9 <= (datetime.datetime.today()).hour <= 23:        return True    else:        return False

также данный метод помогает сравнивать метрики с отличными от дневных пределами в ночное время.

Теперь, когда бот настроен и метрики рассчитаны, остается запихнуть все это добро в контейнер и задеплоить его на какую-нибудь круглосуточно работающую машину, либо в облако.

Докерфайл будет выглядеть примерно следующим образом:

FROM python:3.6-alpineCOPY requirements.txt requirements.txtRUN python -m venv venvRUN venv/bin/pip install -r requirements.txtRUN apk add bashCOPY src srcCOPY .gitignore .gitignoreCOPY boot.sh boot.shCMD ["bash", "./boot.sh"]

где requirements.txt:

PyMySQL==1.0.2pyTelegramBotAPI==3.7.6

и boot.sh:

#!/bin/shsource venv/bin/activateexec python ./src/bot.py

Можно не ставить bash и заменить его на /bin/sh , мне с ним привычнее при отладке, но на боевых условиях это лишнее. Образ также можно выбрать поновее, но и этот отлично справится.

Теперь его надо сбилдить:

docker build -t bot:latest .

И запустить, передав переменные окружения для подключения к БД в команде:

docker run --name bot -d -e USER=ххх -e MYSQL_HOST=ххх -e \MYSQL_PWD=ххх bot:latest

И можно ждать сообщений. Ну или не ждать, тут все зависит от метрик. Делов-то на полдня максимум. Однако, потратив их, мы получаем круглосуточное наблюдение за системой. Почти даром.

Дальше можно, например, настроить передачу рассчитанных метрик в Zabbix или подобный инструмент для логирования, графиков, отчетов и прочего.

Источник: habr.com
К списку статей
Опубликовано: 14.02.2021 14:06:25
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Python

Программирование

Докер

Питон

Телеграм

Мониторинг

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru