Como parar de se preocupar e começar a viver

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.








All Articles