
Manchmal benötigt man schnell eine Überwachung für einen neuen Service, hat aber keine bestehende Infrastruktur oder Expertise parat. In diesem Leitfaden setzen wir in einer halben Stunde ein Tool zur Überwachung beliebiger Webdienste auf, indem wir lediglich die integrierten Mittel von Ubuntu verwenden: bash, cron und curl. Für die Zustellung der Benachrichtigungen nutzen wir Telegram.
Das „Sahnehäubchen“ ist das emotionale Engagement der Nutzer. In der Praxis getestet – es funktioniert.
Als wir im Telemedizin-Service Doktor Rядом einen Chatbot zur Bestimmung des Stresslevels der Nutzer erstellt haben, benötigten wir eine Überwachung. Innerhalb weniger Stunden wurde ein Mini-Projekt realisiert, das nicht nur hervorragend funktioniert, sondern auch durch seine Nachrichten positive Stimmung verbreitet.
Zunächst holen wir das Repository mit den Skripten:
git clone https://github.com/rshekhovtsov/msms.gitWir wechseln in den msms-Ordner und arbeiten dort weiter.
Falls Telegram blockiert ist, nutzen Sie einen Proxy. Die einfachste und zuverlässigste Option ist torsocks:
sudo apt install tor
sudo apt install torsocksAls Beispiel richten wir in drei Schritten die Überwachung der Startseite google.com ein.
SCHRITT 1. Erstellen Sie einen Bot in Telegram und erhalten Sie die Benutzer-ID.
- In der Kontakt-Suchleiste in Telegram suchen wir nach :

- Wir starten ihn mit der Schaltfläche Start, geben den Befehl /newbot ein und beantworten die Fragen. Es ist wichtig zu beachten, dass der Name der Bot ist, der den Benutzern angezeigt wird, während der Benutzername einzigartig sein muss und mit „bot“ enden sollte:

Unter anderem wird der Bot ein geheimes Token für die HTTP-API bereitstellen, das kopiert und in der Datei telegram-api-key.txt im Verzeichnis msms gespeichert werden muss. - Geben Sie im Suchfeld den Namen unseres Bots ein und starten Sie ihn.
- Als letzten Schliff fügen wir uns der Liste der Benachrichtigungsempfänger für das Monitoring hinzu:
sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.shDas Skript gibt eine Liste der letzten Interaktionen mit dem Bot aus, es sollte eine Zeile mit unseren IDs und dem Namen in Telegram geben. Wir nehmen diese ID und speichern sie in der Datei services/google-recipients.txt. Das Dateiformat: jede Zeile ist eine ID. Beispiel:
123456789 987654321
Um einen neuen Empfänger hinzuzufügen, bitten Sie ihn, den Bot in Telegram zu starten, das recipients-setup.sh zu starten und die ID in die Datei hinzuzufügen.
SCHRITT 2. Überwachung einrichten
Die Beschreibung des Dienstes erfolgt durch das Erstellen einer ini-Datei im Verzeichnis services. Fünf Parameter müssen festgelegt werden:
- MSMS_SERVICE_NAME: der Name des Dienstes, der in den Benachrichtigungen und im Monitoring-Log verwendet wird.
- MSMS_SERVICE_ENDPOINT: Endpoint des Dienstes, auf den wir mit curl zugreifen werden.
- MSMS_CURL_PARAMS: zusätzliche curl-Parameter, siehe Beispiel unten.
- MSMS_EXPECTED: erwartete Antwort des Dienstes. Wird verwendet, wenn die Antwort kurz ist.
- MSMS_EXPECTED_FILE: Name der Datei mit der erwarteten Antwort des Dienstes. Wenn angegeben, überschreibt sie MSMS_EXPECTED.
- MSMS_RECIPIENTS: Datei mit der Liste der Empfänger von Benachrichtigungen.
Die Anfrage an google.com gibt fixen HTML mit Umleitung zurück, wir werden dies als erwartete Antwort des Servers verwenden:
curl google.com > services/google-response.htmlErstellen wir die Datei services/google.ini:
MSMS_SERVICE_NAME='google Startseite'
# Dienst-Endpoint
MSMS_SERVICE_ENDPOINT='google.com'
# curl-Parameter
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'
# erwartete Dienstantwort
MSMS_EXPECTED_FILE='google-response.html'
# Empfängerliste Datei
MSMS_RECIPIENTS='google-recipients.txt' In MSMS_CURL_PARAMS Alles, was curl kann, kann hier festgelegt werden, einschließlich:
- curl-Nachrichten deaktivieren, um die Konsole und das Protokoll nicht zu überfluten:
-s - Timeout für die Verbindung mit dem überprüften Dienst festlegen (in Sekunden):
--connect-timeout 3 - Timeout für den Empfang der Antwort festlegen:
-m 7 - Überprüfung des SSL-Zertifikats deaktivieren (z. B. wenn ein selbstsigniertes Zertifikat verwendet wird):
--insecure - HTTP-Anfragetyp angeben:
-X POST - Header angeben:
-H "Content-Type: application/json" - Den Anfrageinhalt als Zeichenfolge oder Datei angeben. Beispiel für eine Datei:
-d @request.json
Wir haben die Benachrichtigungen deaktiviert und Timeout-Werte von 3 Sekunden für die Verbindung und 7 Sekunden für die Antwort des Dienstes festgelegt.
Achtung: Geben Sie die Parameterwerte in einfachen Anführungszeichen an, wie im Beispiel. Leider ist Bash in dieser Hinsicht recht anfällig, und ein versehentlich falsch gesetztes Anführungszeichen kann zu schwer diagnostizierbaren Fehlern führen.
Wir haben das Monitoring eingerichtet. Lassen Sie uns überprüfen, ob alles in Ordnung ist:
sudo chmod +x ./monitoring.sh
torsocks ./monitoring.shDas Skript sollte eine Ausgabe in folgender Form erzeugen:
2020-01-10 12:14:31
health-check "google front page": OKSCHRITT 3. Wir konfigurieren den Zeitplan
Wir werden den Monitoring-Zeitplan in cron einrichten:
sudo crontab -eFügen Sie eine Zeile für die stündliche Überprüfung von google.com hinzu:
*/1 * * * * torsocks <PFAD ZUM REPOSITORY>/monitoring.sh >> <PFAD ZUM REPOSITORY>/monitoring.log 2>&1Fügen Sie täglich um 11:00 Uhr eine Benachrichtigung hinzu, die die Funktionsfähigkeit des Monitorings bestätigt. Dazu übergeben wir dem Skript den Parameter DAILY:
0 11 * * * torsocks <PFAD ZUM REPOSITORY>/monitoring.sh DAILY >> <PFAD ZUM REPOSITORY>/monitoring.log 2>&1
2>&1 — ein Standardverfahren, das Fehler in den Hauptausgabestrom umleitet. Dadurch gelangen sie ebenfalls in das Monitoring-Log.
Änderungen speichern und vom Team übernehmen:
sudo service cron reloadMehr zur Konfiguration von Cron erfahren Sie beispielsweise .
So wird jede Minute ein Überwachungsskript gestartet, das über curl eine Verbindung zu google.com herstellt. Wenn die erhaltene Antwort von der erwarteten abweicht, sendet das Skript eine Benachrichtigung an die Liste der Empfänger in Telegram. Das Prüfprotokoll wird in der Datei monitoring.log geführt.
Soll ein weiterer Dienst hinzugefügt werden, erstellen wir einfach eine neue ini-Datei für ihn im Verzeichnis services und stellen bei Bedarf eine separate Empfängerliste zusammen. Der Rest arbeitet automatisch.
Wenn der überprüfte Dienst nicht mehr verfügbar ist, wird die Benachrichtigung jede Minute gesendet. Wenn der Dienst nicht schnell wiederhergestellt werden kann, können Sie die Benachrichtigungen vorübergehend in den Eigenschaften des Bots in Telegram deaktivieren.
Jetzt lassen Sie uns die zusätzlichen Möglichkeiten und die Umsetzung der Skripte im Detail durchgehen.
Nachrichtenvorlagen und emotionale Einbindung
Um die Interaktion mit dem Bot lebendiger zu gestalten, haben wir ihm den Namen "Manечка" gegeben, ein passendes Avatarbild hinzugefügt und professionelle PR-Experten beauftragt, die Nachrichten zu verfassen. Sie können unsere Vorlagen verwenden oder nach Ihrem Geschmack anpassen.
Zum Beispiel so:

oder sogar so:

Warum nicht?
Der Name des Bots und das Avatarbild werden über .
Die Nachrichtenschablonen befinden sich im Ordner templates:
- curl-fail.txt: Nachricht, die gesendet wird, wenn curl einen Fehlercode ungleich null zurückgibt. Bezieht sich gewöhnlich auf die Unfähigkeit, den Dienst zu erreichen.
- daily.txt: Tägliche Nachricht zur Bestätigung, dass die Überwachung des Dienstes funktioniert.
- service-fail.txt: Nachricht, die gesendet wird, wenn die Antwort des Dienstes von der erwarteten abweicht.
Lassen Sie uns die Möglichkeiten der Anpassung anhand der integrierten Nachrichtenschablonen betrachten.
In den Schablonen werden Emojis verwendet. Leider zeigt habr diese nicht an.
Zur einfachen Suche nach Emojis kann die Seite :

verwendet werden. Den passenden Symbol einfach kopieren und in den Text der Schablone einfügen (es handelt sich um reguläres Unicode).
- curl-fail.txt:
Kätzchen, hilf mir... Ich kann den Dienst "$MSMS_SERVICE_NAME" nicht erreichen. `CURL EXIT CODE: $EXIT_CODE`Wir haben den von uns festgelegten Dienstnamen (Variable
MSMS_SERVICE_NAME) und die interne Skriptvariable mit dem Curl-Abschlusscode (EXIT_CODE). Zudem haben wir die Nachricht mit der Markup-Syntax formatiert, : die Zeichen "`" umschließen Text in fester Breite. Da Anführungszeichen und Apostrophe in Bash spezielle Zeichen sind, escapen wir sie mit dem Zeichen "". Variablenbezeichnungen beginnen mit dem Zeichen "$".Das Ergebnis:

- service-fail.txt:
Kätzchen, hilf mir... Der Dienst "$MSMS_SERVICE_NAME" hat mich enttäuscht Er funktioniert nicht richtig, das antwortet er mir: `$RESPONSE`Das Ergebnis:

Hier verwenden wir noch eine weitere Skriptvariable:RESPONSE. Sie enthält die Antwort des Dienstes. - daily.txt:
Hey Kleiner! Mir geht's gut, ich überwache den Dienst: "$MSMS_SERVICE_NAME" jede Minute... Und wie geht es dir?Das Ergebnis:

Lass uns zur Umsetzung der Skripte übergehen.
Das Überwachungsskript
monitoring.sh führt eine einfache Autoentdeckung durch – es nimmt alle ini-Dateien aus dem Ordner services und führt für jede die Hauptskriptlogik zur Überprüfung und Versendung von Benachrichtigungen aus:
#!/bin/bash
cd $(dirname "$0")/services
for service_ini in $(ls *.ini); do
bash ../msms.sh "$1" "$service_ini"
doneFür die Erstellung einer täglichen Statusnachricht kann dem Skript der Parameter DAILY übergeben werden.
Bitte beachten Sie, dass beim Starten des Skripts das aktuelle Verzeichnis auf services geändert wird. Dadurch können in ini-Dateien die Dateipfade relativ zu services angegeben werden.
Skript zur Überprüfung und Versendung von Benachrichtigungen
msms.sh enthält die Hauptlogik zur Überprüfung des Dienstes und zum Versenden von Benachrichtigungen.
Arbeiten mit Telegram:
# 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 die URL für den Zugriff auf die REST API von Telegram unter Verwendung des im Datei gespeicherten geheimen Schlüssels.
Die Funktion send_message verwendet curl, um Nachrichten an diese REST API zu senden und die IDs der Empfänger aus der in der ini angegebenen Datei abzurufen. In den gesendeten Daten geben wir an, dass wir die Nachrichtenformatierung verwenden: parse_mode="Markdown".
Lassen Sie uns das aktuelle Datum und die Uhrzeit ausgeben und die ini-Datei laden.
echo $(date '+%Y-%m-%d %H:%M:%S')
# lade Variablen aus der .ini-Datei:
. $2
Magische Zeile . $2 führt die als zweiten Parameter übergebene ini-Datei einfach aus und überträgt die darin festgelegten Werte in Umgebungsvariablen.
Laden Sie die erwartete Antwort aus der Datei, wenn der Parameter angegeben ist. MSMS_EXPECTED_FILE:
if [ -n "$MSMS_EXPECTED_FILE" ]; then
MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi
Führen wir die Dienstüberprüfung mit Versendung von Benachrichtigungen durch, falls nötig:
ANTWORT="$(eval curl $MSMS_CURL_PARAMS "$MSMS_SERVICE_ENDPOINT")"
AUSSTIEGSCODE=$?
if [[ $AUSSTIEGSCODE != 0 ]]; then
echo Gesundheitsprüfung "$MSMS_SERVICE_NAME" FEHLGESCHLAGEN: CURL AUSSTIEG MIT $AUSSTIEGSCODE
NACHRICHT="$(cat ../templates/curl-fail.txt)"
NACHRICHT=$(eval echo $NACHRICHT)
send_message "$NACHRICHT"
elif [[ "$ANTWORT" != "$MSMS_EXPECTED" ]]; then
echo Gesundheitsprüfung "$MSMS_SERVICE_NAME" FEHLGESCHLAGEN: "$ANTWORT"
NACHRICHT="$(cat ../templates/service-fail.txt)"
NACHRICHT=$(eval echo $NACHRICHT)
send_message "$NACHRICHT"
else
echo Gesundheitsprüfung "$MSMS_SERVICE_NAME": OK
fi
Zuerst weisen wir der Variable RESPONSE das Ergebnis des curl-Befehls für diesen Dienst zu.
Ein Ausdruck AUSSTIEGSCODE=$? speichert das Ergebnis des letzten Befehls, also curl. Bei Bedarf wird die Vorlage aus der entsprechenden Datei gelesen und die Benachrichtigung mit Hilfe von send_message.
Der letzte Block behandelt den Parameter TÄGLICH:
if test "$1" = "DAILY"; then
echo Gesundheitsprüfung "$MSMS_SERVICE_NAME" TÄGLICH
NACHRICHT="$(cat ../templates/daily.txt)"
NACHRICHT=$(eval echo $NACHRICHT)
send_message "$NACHRICHT"
fiEs wird eine Nachricht gesendet, die die Funktionsfähigkeit der Überwachung bestätigt.
Empfangen der Liste von Benutzer-IDs
recipients-setup.sh greift auf die Telegram-API zu, um die letzten an den Bot adressierten Nachrichten zu erhalten:
curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdates
| python recipients-setup.pyHier kommt die Magie von Python ins Spiel, um eine ansprechende Liste zu erstellen. Das ist zwar nicht zwingend notwendig, aber Sie können einfach die benötigte ID aus dem JSON verwenden, die der Befehl ausgibt:
torsocks curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdatesFazit
So können Sie fertige Skripte und Nachrichtenschablonen verwenden, indem Sie lediglich die überwachten Dienste und Listen für Benachrichtigungen anpassen; Sie können eine neue „Identität“ für den Bot erstellen oder Ihre eigene Lösung auf der Basis des Vorgeschlagenen entwickeln.
Als mögliche Weiterentwicklung bietet sich die Konfiguration und Verwaltung des Monitorings direkt im Bot an, doch dafür kommt man ohne Python nicht aus. Wenn es jemandem vor mir gelingt — wissen Sie, wo Sie den Pull-Request hochladen können 🙂
Quelle: habr.com



