Hallo Habr!
Ich arbeite derzeit mit einem Team meiner Kollegen an einem Blockchain Messenger-Projekt. Wen kümmert es - sehen Sie die Links im Profil oder fragen Sie in den Kommentaren.
Die Blockchain-Entwicklung ist ein neues und unbekanntes Gebiet, daher müssen Sie manchmal sehr ungewöhnliche Tools verwenden. Wo ist das Mikroskop und die Nägel! Deshalb habe ich mich entschlossen, diesen Blog zu behalten, um verschiedene interessante Fälle aus der Praxis zu erzählen. In dem heutigen Beitrag geht es darum, wie ich sofortige Benachrichtigungen über den Status meines Knotens einrichte, damit ich ihn in diesem Fall schnell wieder zum Leben erwecken kann.

Der Plan, dem ich folgte
Die Aufgabe, die ich mir selbst gestellt habe, war folgende: Jedes Mal, wenn ein Knoten abstürzt oder nicht mehr funktioniert, sollte ich sofort benachrichtigt werden. Aber wir leben in einem fortschrittlichen Zeitalter und sind es gewohnt, alle wichtigen Informationen sofort zu erhalten, oder?
Ich habe beschlossen, dass ich Zabbix an Slack befestigen werde, um diese Aufgabe zu erfüllen (wir haben ein funktionierendes Projektwerkzeug). Dementsprechend überwacht Zabbix den Knoten und sendet mir Fehlermeldungen in Slacks PM.
Implementierung: Schritt für Schritt
Schritt 1: Zabbix
Natürlich verfügt Zabbix nicht über vorkonfigurierte Standardüberwachungstools für unseren Knoten. Daher bestand der erste Wunsch darin, die Verfügbarkeit des Knotenports mithilfe des Schlüssels
net.tcp.listen[port].
zu bestimmen
net.tcp.listen[port].
Aber es gibt ein "aber": Es kommt vor, dass der Knoten aktiv ist, er überwacht den Port, aber er funktioniert nicht richtig. Und hier wurde ich mit der Tatsache konfrontiert, dass Sie das Hauptzeichen für die Leistung eines Knotens bestimmen müssen.
Was soll Noda tun? Richtig, wachsen. Hier wird Wachstum das Hauptzeichen sein. Deshalb habe ich mich für den Schlüssel
system.run[command, mode]
.
Zusammen mit
curl -s http://127.0.0.1:36666/api/blocks/getHeight
.
Als Ergebnis haben wir eine Zeichenfolge im JSON-Format des Formulars erhalten
{"success":true,"nodeTimestamp":XXXXXXX,"height":XXXXXXX}
Das jq-Paket (https://stedolan.imtqy.com/jq/) half bei der Lösung des JSON-Parsing-Problems. Eine einfache Ergebnisübertragung über Pipe
curl http://127.0.0.1:36666/api/blocks/getHeight | jq .height
{6666 / api / blocks / getHeight
curl http://127.0.0.1:36666/api/blocks/getHeight | jq .height
curl http://127.0.0.1:36666/api/blocks/getHeight | jq .height
und anstelle der lang erwarteten Höhe erhielten wir eine Antwort mit Informationen zum Befehl
curl
.

Die redundanten Informationen mussten entfernt werden, und dann kam ein Assistent - der
-s
, auch bekannt als
-silent
. Verwenden Sie daher den Zabbix-Schlüssel
system.run[curl -s http://127.0.0.1:36666/api/blocks/getHeight | jq .height]
system.run[curl -s http://127.0.0.1:36666/api/blocks/getHeight | jq .height]
wir die
system.run[curl -s http://127.0.0.1:36666/api/blocks/getHeight | jq .height]
der gewünschten und für die Überwachung bequemen Ansicht XXXXXXXXX.

Ein Auslöser war auch erforderlich, um die geplante Warnung zu konfigurieren. Der Plan war folgender: Vergleichen Sie den letzten und den vorherigen Wert, damit der Auslöser funktioniert, wenn das Wachstum kleiner als eins ist.
{ADAMANT Node Monitoring:system.run[curl -s http://127.0.0.1:36666/api/blocks/getHeight | jq .height].change()}<1
Schritt 2. Zabbix to Slack

Die nächste Aufgabe besteht darin, den Auslöser in Slack zu benachrichtigen. Als Grundlage habe ich das Material
https://github.com/ericoc/zabbix-slack-alertscript genommen .
Die Anweisungen sind klar, aber die Verwendung von Emoticons zur Unterscheidung zwischen Schweregrad ist nicht ernst. Die Hervorhebung von Farben ist viel interessanter. Nach der Verarbeitung des Skripts bleibt Folgendes:
url='********************************' username='Server' to="$1" subject="$2" recoversub='^RECOVER(Y|ED)?$' if [[ "$subject" == 'Warning' ]]; then color='#EBFF00' elif [ "$subject" == 'Not classified' ]; then color='#D8E3FF' elif [ "$subject" == 'Information' ]; then color='#0049FF' elif [ "$subject" == 'Average' ]; then color='#FFC200' elif [ "$subject" == 'High' ]; then color='#FF5500' elif [ "$subject" == 'Disaster' ]; then color='#FF0000' else color='#00FF06' fi message="${subject} \n $3" payload="payload={\"attachments\": [{\"color\": \"${color}\", \"text\": \"${message}\"}]}" curl -m 5 --data-urlencode "${payload}" $url
Schlussfolgerungen
Aus moralischen Gründen ein paar Worte, warum eine bequeme Überwachung so wichtig ist. Je schneller Sie die Situation kennenlernen, desto schneller werden Sie sie korrigieren und desto weniger ausgeprägt sind die Folgen. Wie sie sagen, wird die erhöhte Zeit nicht als gesunken angesehen. In Slack gibt es unter anderem Gruppenchats, damit das Team eine Verbindung herstellen kann, um das Problem zu beheben und Aktionen zu koordinieren. Unser Projekt hat übrigens Open Source Code und wir respektieren andere Open Source Projekte sehr. Mein Experiment hat einmal mehr gezeigt, dass Open Source gut ist.