[Python, Программирование] Как перестать беспокоиться и начать жить
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Мониторинг работы организации с помощью докера и телеграм-ботаМногим хотелось бы знать, если вдруг что-то случится с их сайтом, магазином и т.п., особенно, если это не требует ни денег, ни времени, ни усилий. А ведь это довольно легко сделать: потратив совсем немного свободного времени, создадим докер контейнер, который будет периодически делать запросы в БД, расчитывать на их основании некие метрики, сравнивать их с пороговыми значениями и в случае превышения этих порогов, оповещать заинтересованных лиц.
Первым делом надо завести бота. Как это сделать можно нагуглить за 5 минут. Например, тут недавно была статья. Также нашему боту нужно разрешение на добавление его в группы, если получать сообщения планирует не один человек, а несколько. Для этого при создании бота надо написать BotFather команду «/setjoingroups». После этого, собственно надо создать группу, добавить в нее нашего бота и всех заинтересованных в получении сообщений. Далее воспользуемся библиотекой pytelegrambotapi и закончим подготовительный этап тем, что узнаем CHAT_ID Его можно узнать, например, включив логирование и, воспользовавшись командой из той же статьи, включить своего бота на ожидание команды «/start». Затем ввести эту команду в созданной нами группе. Команда придет к боту, он ответит, логах будет выведена масса разной информации, в том числе и нужный нам CHAT_ID группы:
import logging
import telebot
bot = telebot.TeleBot(TOKEN)
chat_id = CHAT_ID
logger = telebot.logger
telebot.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 datetime
import os
from contextlib import closing
import pymysql
from pymysql.cursors import DictCursor
from 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()
где
@staticmethod
def is_day():
if 9 <= (datetime.datetime.today()).hour <= 23:
return True
else:
return False
также данный метод помогает сравнивать метрики с отличными от дневных пределами в ночное время. Теперь, когда бот настроен и метрики рассчитаны, остается запихнуть все это добро в контейнер и задеплоить его на какую-нибудь круглосуточно работающую машину, либо в облако. Докерфайл будет выглядеть примерно следующим образом:
FROM python:3.6-alpine
COPY requirements.txt requirements.txt
RUN python -m venv venv
RUN venv/bin/pip install -r requirements.txt
RUN apk add bash
COPY src src
COPY .gitignore .gitignore
COPY boot.sh boot.sh
CMD ["bash", "./boot.sh"]
где requirements.txt:
PyMySQL==1.0.2
pyTelegramBotAPI==3.7.6
и boot.sh:
#!/bin/sh
source venv/bin/activate
exec 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
===========
Похожие новости:
- [Python, Программирование] 7 полезных расширений VS Code для Python-разработчиков (перевод)
- [Программирование, Assembler] Перевод числа в строку с помощью SIMD + FPU
- [Open source] Google захывтывает Python
- [Программирование, Kotlin, Старое железо] Пиксели, Excel, Kotlin и немного ностальгии…
- [Программирование, Flutter] Работа с адаптивным программируемым интерфейсом APIs во Flutter (перевод)
- [Программирование, Разработка под Linux, Софт, IT-компании] Цветочные новости: разработчики ОС Fuchsia добавят поддержку запуска немодифицированных Linux-программ
- [Программирование микроконтроллеров, Разработка для интернета вещей, Разработка под Arduino, Компьютерное железо, DIY или Сделай сам] ESP32-C3: первое знакомство. Заменим ESP8266?
- [Системное администрирование, Программирование, Карьера в IT-индустрии, DevOps] Зачем IT-специалисты преподают на курсах и к чему готовиться, если решил стать спикером
- [Высокая производительность, Python, Компиляторы] Как скомпилировать Python
- [Python, Программирование, Совершенный код, Управление разработкой] Код-ревью в Практикуме: как мы делаем его быстрее и эффективнее
Теги для поиска: #_python, #_programmirovanie (Программирование), #_doker (докер), #_piton (питон), #_telegram (телеграм), #_monitoring (мониторинг), #_python, #_programmirovanie (
Программирование
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 05:00
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Мониторинг работы организации с помощью докера и телеграм-ботаМногим хотелось бы знать, если вдруг что-то случится с их сайтом, магазином и т.п., особенно, если это не требует ни денег, ни времени, ни усилий. А ведь это довольно легко сделать: потратив совсем немного свободного времени, создадим докер контейнер, который будет периодически делать запросы в БД, расчитывать на их основании некие метрики, сравнивать их с пороговыми значениями и в случае превышения этих порогов, оповещать заинтересованных лиц. Первым делом надо завести бота. Как это сделать можно нагуглить за 5 минут. Например, тут недавно была статья. Также нашему боту нужно разрешение на добавление его в группы, если получать сообщения планирует не один человек, а несколько. Для этого при создании бота надо написать BotFather команду «/setjoingroups». После этого, собственно надо создать группу, добавить в нее нашего бота и всех заинтересованных в получении сообщений. Далее воспользуемся библиотекой pytelegrambotapi и закончим подготовительный этап тем, что узнаем CHAT_ID Его можно узнать, например, включив логирование и, воспользовавшись командой из той же статьи, включить своего бота на ожидание команды «/start». Затем ввести эту команду в созданной нами группе. Команда придет к боту, он ответит, логах будет выведена масса разной информации, в том числе и нужный нам CHAT_ID группы: import logging
import telebot bot = telebot.TeleBot(TOKEN) chat_id = CHAT_ID logger = telebot.logger telebot.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)
import datetime
import os from contextlib import closing import pymysql from pymysql.cursors import DictCursor from 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()
@staticmethod
def is_day(): if 9 <= (datetime.datetime.today()).hour <= 23: return True else: return False FROM python:3.6-alpine
COPY requirements.txt requirements.txt RUN python -m venv venv RUN venv/bin/pip install -r requirements.txt RUN apk add bash COPY src src COPY .gitignore .gitignore COPY boot.sh boot.sh CMD ["bash", "./boot.sh"] PyMySQL==1.0.2
pyTelegramBotAPI==3.7.6 #!/bin/sh
source venv/bin/activate exec python ./src/bot.py docker build -t bot:latest .
docker run --name bot -d -e USER=ххх -e MYSQL_HOST=ххх -e \
MYSQL_PWD=ххх bot:latest =========== Источник: habr.com =========== Похожие новости:
Программирование ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 05:00
Часовой пояс: UTC + 5