Acompanhamento do trabalho da organização usando docker e telegram bot
Muitos gostariam de saber se algo acontece repentinamente com seu site, loja, etc., especialmente se não exigir dinheiro, tempo ou esforço. Mas isso é muito fácil de fazer: depois de gastar um pouco de tempo livre, criaremos um contêiner docker que fará consultas periódicas ao banco de dados, calculará algumas métricas com base nelas, compará-las com os valores limite e, se estes limites forem excedidos, notifique as partes interessadas.
O primeiro passo é iniciar um bot. Você pode pesquisar no Google como fazer isso em 5 minutos. Por exemplo, houve um artigo aqui recentemente . Além disso, nosso bot precisa de permissão para adicioná-lo a grupos se mais de uma pessoa estiver planejando receber mensagens. Para fazer isso, ao criar um bot, você precisa escrever o comando BotFather "/ setjoingroups". Depois disso, na verdade, você precisa criar um grupo, adicionar nosso bot e todos os interessados em receber mensagens a ele.
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
Você pode pular a instalação do bash e substituí-lo por /bin/sh
, estou mais acostumado a fazer a depuração, mas em condições de combate é supérfluo. Você também pode escolher uma imagem mais recente, mas esta servirá perfeitamente.
Agora você precisa construí-lo:
docker build -t bot:latest .
E execute passando variáveis de ambiente para se conectar ao banco de dados no comando:
docker run --name bot -d -e USER= -e MYSQL_HOST= -e \ MYSQL_PWD= bot:latest
E você pode esperar por mensagens. Bem, ou não esperar, tudo depende das métricas. Negócios por meio dia no máximo. No entanto, ao gastá-los, obtemos monitoramento 24 horas do sistema. Quase por nada.
Então você pode, por exemplo, configurar a transferência de métricas calculadas para o Zabbix ou uma ferramenta semelhante para registro, gráficos, relatórios e muito mais.