Wie man aufhört, sich Sorgen zu machen und anfängt zu leben

Überwachung der Arbeit der Organisation mit Docker und Telegramm-Bot

Viele möchten wissen, ob plötzlich etwas mit ihrer Website, ihrem Geschäft usw. passiert, insbesondere wenn es kein Geld, keine Zeit oder Mühe erfordert. Dies ist jedoch recht einfach: Nachdem wir viel Freizeit verbracht haben, erstellen wir einen Docker-Container, der regelmäßig Abfragen an die Datenbank durchführt, einige darauf basierende Metriken berechnet, sie mit Schwellenwerten vergleicht und, falls vorhanden Schwellenwerte überschritten werden, Interessenten benachrichtigen.





Der erste Schritt ist das Starten eines Bots. Sie können in 5 Minuten googeln, wie das geht. Zum Beispiel gab es hier kürzlich einen Artikel . Außerdem benötigt unser Bot die Erlaubnis, es zu Gruppen hinzuzufügen, wenn mehr als eine Person Nachrichten empfangen möchte. Dazu müssen Sie beim Erstellen eines Bots den BotFather-Befehl "/ setjoingroups" schreiben. Danach müssen Sie eine Gruppe erstellen, unseren Bot und alle, die Nachrichten erhalten möchten, hinzufügen.





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
      
      



Sie können die Installation von bash überspringen und durch ersetzen /bin/sh



. Ich bin beim Debuggen eher daran gewöhnt, aber unter Kampfbedingungen ist es überflüssig. Sie können auch ein neueres Bild auswählen, aber dieses reicht völlig aus.





Jetzt müssen Sie es bauen:





docker build -t bot:latest .
      
      



Führen Sie die folgenden Umgebungsvariablen aus, um im Befehl eine Verbindung zur Datenbank herzustellen:





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



Und Sie können auf Nachrichten warten. Nun, oder nicht zu warten, alles hängt von den Metriken ab. Geschäft für maximal einen halben Tag. Indem wir sie ausgeben, erhalten wir jedoch eine Überwachung des Systems rund um die Uhr. Fast umsonst.





Anschließend können Sie beispielsweise die Übertragung berechneter Metriken an Zabbix oder ein ähnliches Tool für Protokollierung, Grafiken, Berichte und mehr konfigurieren.








All Articles