Bot für die Überwachung von Webdiensten in einer halben Stunde: Telegramm + Bash + Cron



Manchmal müssen Sie schnell eine Überwachung für einen neuen Dienst durchführen, aber es steht keine vorgefertigte Infrastruktur / Expertise zur Verfügung. In diesem Handbuch implementieren wir in einer halben Stunde ein Tool zum Überwachen von Webdiensten, das nur die integrierten Ubuntu-Tools verwendet: bash, cron und curl. Wir werden Telegramm verwenden, um Warnungen zu liefern.

"Cherry on the cake" wird die emotionale Beteiligung der Benutzer sein. Es wird auf Menschen überprüft - es funktioniert.

Als wir im Telemedizin-Service von Doctor Near einen Chatbot erstellt haben, um den Grad des Benutzerstresses zu bestimmen, mussten wir ihn überwachen. In wenigen Stunden wurde ein Miniprojekt erstellt, das nicht nur großartig funktioniert, sondern auch positive Rückmeldungen liefert.

Holen Sie sich zunächst ein Repository mit Skripten:

git clone https://github.com/rshekhovtsov/msms.git 

Gehen Sie zum Ordner msms und arbeiten Sie darin.

Wenn das Telegramm blockiert ist, verwenden Sie einen Proxy. Die einfachste und zuverlässigste Option sind Torsocks:

 sudo apt install tor sudo apt install torsocks 

Als Beispiel konfigurieren wir die Überwachung der Startseite von google.com in drei Schritten.

SCHRITT 1. Erstellen Sie einen Bot im Telegramm und erhalten Sie die Benutzer-ID


  • Suchen Sie in der Kontaktsuche im Telegramm nach @botfather :


  • Wir starten es mit der Schaltfläche Start, geben den Befehl / newbot ein und beantworten Fragen. Sie müssen berücksichtigen, dass name der Name des Bots ist, der den Benutzern angezeigt wird, und dass username eindeutig ist und mit "bot" enden muss:



    Unter anderem gibt der Bot ein geheimes Token für die HTTP-API aus, das Sie kopieren und in der Datei telegram-api-key.txt im Ordner msms speichern müssen.
  • Wir geben den Namen unseres Bots in die Telegramm-Suchzeile ein und führen ihn aus.
  • Fügen Sie sich abschließend der Liste der Empfänger von Überwachungsalarmen hinzu:

     sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.sh 

    Das Skript zeigt eine Liste der letzten Aufrufe des Bots an. Es sollte eine Zeile mit unserer ID und unserem Namen im Telegramm geben. Wir nehmen diese ID und speichern sie in der Datei services / google-recipient.txt. Dateiformat: Jede Zeile hat eine ID. Ein Beispiel:

     123456789 987654321 

Um einen neuen Empfänger hinzuzufügen, müssen Sie ihn bitten, den Bot im Telegramm zu starten, recipient-setup.sh auszuführen und der Datei die ID hinzuzufügen.

SCHRITT 2. Überwachung konfigurieren


Die Beschreibung des Dienstes erfolgt durch Erstellen einer INI-Datei im Ordner "servies". Es müssen fünf Parameter eingestellt werden:

  1. MSMS_SERVICE_NAME : Dienstname - wird in Warnungen und Überwachungsprotokollen verwendet.
  2. MSMS_SERVICE_ENDPOINT : Der Endpunkt des Dienstes, mit dem wir uns bei curl on in Verbindung setzen.
  3. MSMS_CURL_PARAMS : Zusätzliche Curl-Parameter, siehe Beispiel unten.
  4. MSMS_EXPECTED : erwartete Serviceantwort. Wird verwendet, wenn die Antwort kurz ist.
  5. MSMS_EXPECTED_FILE : Dateiname mit der erwarteten Serviceantwort. Wenn angegeben, wird MSMS_EXPECTED überschrieben.
  6. MSMS_RECIPIENTS : Datei mit einer Liste der Benachrichtigungsempfänger.

Die Anfrage auf google.com gibt einen festen HTML-Code mit einer Weiterleitung zurück. Wir verwenden diesen als erwartete Serverantwort:

 curl google.com > services/google-response.html 

Erstellen Sie die Datei services / google.ini:

 MSMS_SERVICE_NAME='google front page' # service endpoint MSMS_SERVICE_ENDPOINT='google.com' # curl parameters MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7' # expected service response MSMS_EXPECTED_FILE='google-response.html' # recipients list file MSMS_RECIPIENTS='google-recipients.txt' 

In MSMS_CURL_PARAMS Sie alles angeben, was Curl tun kann, einschließlich:

  1. Deaktivieren Sie die Curl-Meldungen, um die Konsole und das Protokoll nicht zu verstopfen: -s
  2. --connect-timeout 3 Zeitlimit für die Verbindung mit dem zu überprüfenden Dienst ein (in Sekunden): --connect-timeout 3
  3. Antwort-Timeout einstellen: -m 7
  4. Deaktivieren Sie die Zertifikatüberprüfung für SSL (z. B. wenn ein selbstsigniertes Zertifikat verwendet wird): - --insecure
  5. Geben Sie den Typ der http-Anforderung an: -X POST
  6. Geben Sie die Überschriften an: -H "Content-Type: application/json"
  7. Geben Sie den Anforderungshauptteil als Zeichenfolge oder Datei an. Beispiel für die Datei: -d @request.json

Wir haben Benachrichtigungen deaktiviert und eine Zeitüberschreitung von 3 Sekunden festgelegt. bei Verbindung und 7 sek. um eine Antwort vom Dienst zu erhalten.

Achtung : Geben Sie die Parameterwerte wie im Beispiel in einfachen Anführungszeichen an. Leider ist Bash in diesem Sinne ziemlich zerbrechlich, und ein versehentlich an die falsche Stelle geflogener Schmetterling kann mit schwer zu diagnostizierenden Fehlern zum Tod des Universums führen.

Wir richten die Überwachung ein. Überprüfen Sie, ob alles in Ordnung ist:

 sudo chmod +x ./monitoring.sh torsocks ./monitoring.sh 

Das Skript sollte eine Nachricht des Formulars anzeigen:

 2020-01-10 12:14:31 health-check "google front page": OK 

SCHRITT 3. Passen Sie den Zeitplan an


Richten Sie einen Überwachungsplan in cron ein:

 sudo crontab -e 

Fügen Sie jede Minute eine Zeile hinzu, um google.com zu überprüfen:

 */1 * * * * torsocks <   >/monitoring.sh >> <   >/monitoring.log 2>&1 

Fügen Sie jeden Tag um 11.00 Uhr einen Alarm hinzu, um die Überwachung selbst zu bestätigen. Übergeben Sie dazu den Parameter DAILY an das Skript:

 0 11 * * * torsocks <   >/monitoring.sh DAILY >> <   >/monitoring.log 2>&1 

2>&1 - Standardtechnik zur Umleitung von Fehlern in den Hauptausgabestream. Infolgedessen werden sie auch in das Überwachungsprotokoll aufgenommen.

Speichern Sie die Änderungen und rufen Sie sie mit dem folgenden Befehl auf:

  sudo service cron reload 

Weitere Informationen zum Konfigurieren von cron finden Sie beispielsweise hier .

Daher wird jede Minute ein Überwachungsskript gestartet, auf das über gol auf google.com zugegriffen werden kann. Wenn die empfangene Antwort von der erwarteten abweicht, sendet das Skript eine Benachrichtigung im Telegramm an die Empfängerliste. Das Überwachungsprotokoll wird in der Datei monitoring.log verwaltet

Wenn Sie einen weiteren Dienst hinzufügen müssen, erstellen wir einfach eine neue Ini-Datei für diesen Dienst im Dienstordner und erstellen gegebenenfalls eine separate Empfängerliste. Alles andere wird automatisch funktionieren.

Wenn der überprüfte Dienst nicht mehr verfügbar ist, wird jede Minute eine Warnung gesendet. Wenn Sie den Dienst nicht schnell wiederherstellen können, können Sie Benachrichtigungen in den Bot-Eigenschaften im Telegramm vorübergehend deaktivieren.

Schauen wir uns nun die zusätzlichen Funktionen und die Implementierung von Skripten genauer an.

Nachrichtenvorlagen und emotionales Engagement


Um die Kommunikation mit dem Bot lebendiger zu gestalten, haben wir ihn Manechka genannt, den entsprechenden Bild-Avatar hinzugefügt und professionelle PR-Spezialisten mit der Erstellung von Nachrichtentexten beauftragt. Sie können unsere Leistungen nutzen oder nach Ihrem Geschmack verändern.

Zum Beispiel so:


oder auch so:


Warum nicht?

Der Botname und der Avatar werden über @botfather eingestellt .
Nachrichtenvorlagen befinden sich im Vorlagenordner :

  • curl-fail.txt : Nachricht, die gesendet wird, wenn curl einen Fehlercode ungleich Null zurückgibt . Spricht normalerweise über die Unmöglichkeit, den Dienst zu erreichen.
  • daily.txt : tägliche Nachricht, die bestätigt, dass die Dienstüberwachung funktioniert.
  • service-fail.txt : Nachricht gesendet, wenn die Serviceantwort anders als erwartet ist.

Lassen Sie uns die Anpassungsmöglichkeiten am Beispiel der eingebauten Nachrichtenvorlagen untersuchen.
Die Vorlagen verwenden Emojis. Habr zeigt sie leider nicht an.
Um Emojis auszuwählen, ist es bequem, die Suche auf emojipedia.org zu verwenden :



Sie kopieren einfach das entsprechende Zeichen und fügen es in den Text der Vorlage ein (dies ist der übliche Unicode).
  1. curl-fail.txt:

     ,  ...      \"$MSMS_SERVICE_NAME\" \`CURL EXIT CODE: $EXIT_CODE\` 

    Wir haben den von uns angegebenen MSMS_SERVICE_NAME ( MSMS_SERVICE_NAME Variable) und eine interne MSMS_SERVICE_NAME mit dem Curl-Beendigungscode ( EXIT_CODE ) verwendet. Wir haben die Nachricht auch mit dem Telegramm-Mark-Down- Markup formatiert: Die Zeichen `` '' haben einen Rahmentext mit fester Breite. Da Anführungszeichen und Apostrophe offizielle Bash-Zeichen sind, werden sie mit dem Zeichen "\" maskiert. Variablennamen wird ein "$" vorangestellt.

    Ergebnis:


  2. service-fail.txt:

     ,  ...  \"$MSMS_SERVICE_NAME\"     ,     : \`$RESPONSE\` 

    Ergebnis:



    Hier verwenden wir eine andere RESPONSE : RESPONSE . Es enthält die Antwort des Dienstes.
  3. daily.txt:

     , !    , c  : \"$MSMS_SERVICE_NAME\"  ...     ? 

    Ergebnis:



Fahren wir mit der Skriptimplementierung fort.

Überwachungsskript


monitoring.sh macht die automatische Erkennung einfach - entnimmt alle ini-Dateien aus dem Ordner services und führt für jede Datei das Hauptskript mit der Logik zum Prüfen und Senden von Warnungen aus:

 #!/bin/bash cd $(dirname "$0")/services for service_ini in $(ls *.ini); do bash ../msms.sh "$1" "$service_ini" done 

Um eine tägliche Nachricht über den Überwachungsstatus zu generieren, kann dem Skript der Parameter DAILY übergeben werden.

Bitte beachten Sie, dass beim Start des Skripts der aktuelle Ordner in Dienste geändert wird. Dies ermöglicht es ini-Dateien, Dateipfade relativ zu Diensten anzugeben.

Skript zum Prüfen und Versenden von Alarmen


msms.sh enthält die grundlegende Logik zum Überprüfen eines Dienstes und zum Senden von Warnungen.

Mit Telegramm arbeiten:

 # telegram endpoint TG_API_URL="https://api.telegram.org/bot$(cat ../telegram-api-key.txt)/sendMessage" ################################################################# # send message to telegram # parameter: message text ################################################################# function send_message { for chat_id in $(cat ../$MSMS_RECIPIENTS); do curl -s -X POST --connect-timeout 10 $TG_API_URL -d chat_id=$chat_id -d parse_mode="Markdown" -d text="$1" echo done } 

Wir erstellen eine URL für den Zugriff auf die Telegramm-REST-API mit dem in der Datei gespeicherten privaten Schlüssel.

Die Funktion send_message verwendet curl, um Nachrichten an diese REST-API zu senden. Dabei wird die Empfänger-ID aus der in ini angegebenen Datei übernommen. In den Daten, die wir senden, geben wir an, dass wir das Nachrichten-Markup verwenden: parse_mode="Markdown" .

Drucken Sie die aktuelle Uhrzeit aus und laden Sie die Ini-Datei.

 echo $(date '+%Y-%m-%d %H:%M:%S') # load variables from .ini file: . $2 

Die magische Linie . $2 . $2 führt die als zweiter Parameter übergebene ini-Datei als normales Skript aus und trägt die darin angegebenen Werte in Umgebungsvariablen ein.

Laden Sie die erwartete Antwort aus der Datei herunter, wenn der Parameter MSMS_EXPECTED_FILE angegeben ist:

 if [ -n "$MSMS_EXPECTED_FILE" ]; then MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")" fi 

Führen Sie bei Bedarf eine Serviceprüfung durch, indem Sie Warnmeldungen senden:

 RESPONSE="$(eval curl $MSMS_CURL_PARAMS \"$MSMS_SERVICE_ENDPOINT\")" EXIT_CODE=$? if [[ $EXIT_CODE != 0 ]]; then echo health-check \"$MSMS_SERVICE_NAME\" FAILED: CURL EXIT WITH $EXIT_CODE MESSAGE="$(cat ../templates/curl-fail.txt)" MESSAGE=$(eval echo $MESSAGE) send_message "$MESSAGE" elif [[ "$RESPONSE" != "$MSMS_EXPECTED" ]]; then echo health-check \"$MSMS_SERVICE_NAME\" FAILED: "$RESPONSE" MESSAGE="$(cat ../templates/service-fail.txt)" MESSAGE=$(eval echo $MESSAGE) send_message "$MESSAGE" else echo health-check \"$MSMS_SERVICE_NAME\": OK fi 

Zuerst weisen wir die Variable RESPONSE dem Ergebnis des Befehls curl für diesen Dienst zu.

Ausdruck EXIT_CODE=$? Setzt das Ergebnis des letzten Befehls, d. h. locken. Wenn Sie eine Warnung senden müssen, wird die Vorlage aus der entsprechenden Datei gelesen und der Versand an die Empfänger send_message mit send_message .

Der letzte Block verarbeitet den Parameter DAILY:

 if test "$1" = "DAILY"; then echo health-check \"$MSMS_SERVICE_NAME\" DAILY MESSAGE="$(cat ../templates/daily.txt)" MESSAGE=$(eval echo $MESSAGE) send_message "$MESSAGE" fi 

Es wird eine Nachricht gesendet, die den Zustand der Überwachung selbst bestätigt.

Liste der Benutzer-IDs abrufen


recipient-setup.sh ruft die Telegramm-API auf, um die neuesten Nachrichten an den Bot zu senden:

 curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdates \ | python recipients-setup.py 

Es verwendet Python-Magie, um die Ausgabe schön aufzulisten. Dies ist optional, Sie können einfach die gewünschte ID von json nehmen, die der Befehl ausgibt:

 torsocks curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdates 

Fazit


Auf diese Weise können Sie vorgefertigte Skripts und Nachrichtenvorlagen verwenden und nur beobachtbare Dienste und Listen für Benachrichtigungen einrichten. Sie können eine neue "Identität" für den Bot erstellen. und Sie können Ihre Entscheidung auf der Grundlage des Vorschlags treffen.

Als Optionen für die Weiterentwicklung bietet sich die Konfiguration und Verwaltung der Überwachung im Bot selbst an, auf Python kann man hier jedoch nicht verzichten. Wenn jemand die Hände vor mir hat, weißt du, wo du die Pull-Anfrage hochladen musst :-)

Source: https://habr.com/ru/post/de483318/


All Articles