Cómo dejar de preocuparte y empezar a vivir

Monitoreo del trabajo de la organización usando docker y telegram bot

A muchos les gustaría saber si algo le sucede de repente a su sitio web, tienda, etc., especialmente si no requiere dinero, tiempo o esfuerzo. Pero esto es bastante fácil de hacer: después de pasar bastante tiempo libre, crearemos un contenedor docker que periódicamente hará consultas a la base de datos, calculará algunas métricas en base a ellas, las comparará con valores de umbral y, si estos se superan los umbrales, notificar a las partes interesadas.





El primer paso es iniciar un bot. Puedes buscar en Google cómo hacer esto en 5 minutos. Por ejemplo, hubo un artículo aquí recientemente . Además, nuestro bot necesita permiso para agregarlo a grupos si más de una persona planea recibir mensajes. Para hacer esto, al crear un bot, debe escribir el comando BotFather "/ setjoingroups". Después de eso, de hecho, debe crear un grupo, agregar nuestro bot y todos los interesados ​​en recibir mensajes.





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
      
      



Puede omitir la instalación de bash y reemplazarlo con /bin/sh



, estoy más acostumbrado a depurar, pero en condiciones de combate es superfluo. También puede elegir una imagen más nueva, pero esta funcionará bien.





Ahora necesitas construirlo:





docker build -t bot:latest .
      
      



Y ejecute pasando variables de entorno para conectarse a la base de datos en el comando:





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



Y puedes esperar mensajes. Bueno, o no esperar, todo depende de las métricas. Negocio por medio día como máximo. Sin embargo, al gastarlos, obtenemos un monitoreo del sistema las 24 horas del día. Casi por nada.





Luego, puede, por ejemplo, configurar la transferencia de métricas calculadas a Zabbix o una herramienta similar para registros, gráficos, informes y más.








All Articles