Comment arrêter de s'inquiéter et commencer à vivre

Suivi du travail de l'organisation à l'aide de docker et de télégramme bot

Beaucoup aimeraient savoir si quelque chose arrive soudainement à leur site Web, magasin, etc., surtout si cela ne nécessite pas d'argent, de temps ou d'efforts. Mais c'est assez facile à faire: après avoir passé un peu de temps libre, nous allons créer un conteneur docker qui effectuera périodiquement des requêtes dans la base de données, calculera certaines métriques en fonction de celles-ci, les comparerons avec des valeurs de seuil et, si elles les seuils sont dépassés, notifier les parties intéressées.





La première étape consiste à démarrer un bot. Vous pouvez google comment faire cela en 5 minutes. Par exemple, il y avait un article ici récemment . De plus, notre bot a besoin d'une autorisation pour l'ajouter à des groupes si plusieurs personnes prévoient de recevoir des messages. Pour ce faire, lors de la création d'un bot, vous devez écrire la commande BotFather "/ setjoingroups". Après cela, en fait, vous devez créer un groupe, ajouter notre bot et toutes les personnes intéressées à recevoir des messages.





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
      
      



Vous pouvez ignorer l'installation de bash et le remplacer par /bin/sh



, je suis plus habitué lors du débogage, mais en conditions de combat, c'est superflu. Vous pouvez également choisir une image plus récente, mais celle-ci fera très bien l'affaire.





Maintenant, vous devez le construire:





docker build -t bot:latest .
      
      



Et exécutez en passant des variables d'environnement pour vous connecter à la base de données dans la commande:





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



Et vous pouvez attendre les messages. Eh bien, ou ne pas attendre, tout dépend des métriques. Business pour une demi-journée maximum. Cependant, en les dépensant, nous surveillons le système 24 heures sur 24. Presque pour rien.





Ensuite, vous pouvez, par exemple, configurer le transfert des métriques calculées vers Zabbix ou un outil similaire pour la journalisation, les graphiques, les rapports, etc.








All Articles