[PYTHON] Raspberry Pi "Honwaka Benachrichtigungslampe" Teil 2

Hilfe bei der Überwachung mit Raspberry Pi

In dieser Serie werden wir eine Benachrichtigungslampe mit Raspberry Pi erstellen.

Blue.GIF

Dieses Mal, das zweite Mal, ist es der Detektorteil, der den Alarm erfasst, der die Informationsquelle der "Benachrichtigungslampe" ist. In diesem Artikel erstellen wir einen Detektor für OpsGenie, aber Sie können natürlich auch andere Warnquellen verwenden. Erstellen Sie in diesem Fall einen Detektor, damit das Ausgabeformat identisch ist.

SystemDiagram2.png

Was ist OpsGenie?

OpsGenie ist ein Benachrichtigungsverwaltungsdienst, der Alarme per E-Mail, WebHook, WebAPI usw. empfängt, sie gemäß den Regeln klassifiziert und als Warnungen ausgibt. Obwohl es nicht so wichtig ist wie PagerDuty, hat es eine hohe Affinität zu AWS und eine ausgezeichnete Handhabungsfreiheit für den empfangenen Alert. Dies gilt insbesondere für diejenigen, die DevOps ausführen. Ich empfehle es.

OpsGenieWeb

――Es wird der für die "Schicht" des verantwortlichen Teams verantwortlichen Person gemäß der im Voraus registrierten Teamstruktur und dem Schichtplan zugewiesen, sodass Sie nicht unnötig viele Personen mitnehmen müssen. ――Es ist ein zuverlässiger Mitarbeiter, der die verantwortliche Person dauerhaft kontaktiert, bis Sie mit verschiedenen Mitteln wie E-Mail und Sprachanruf sowie einer Smartphone-Anwendung antworten. Wenn dies nicht funktioniert, eskalieren Sie zur nächsten verantwortlichen Person.

Da der Status jedes Alarms von OpsGenie verwaltet wird, ist die Benachrichtigungslampe dafür verantwortlich, den Status gemeinsam anzuzeigen und einen Ton zu erzeugen.

Allergennivellierung bei Ops Genie

OpsGenie erstellt einen Alarm basierend auf den erhaltenen Allermeinformationen. Wenn Sie eine dringende Warnung erhalten, erstellen Sie eine Warnung mit dem Tag "Fehler", damit die "Benachrichtigungslampe" die Dringlichkeit erkennen kann. Tags können zu Warnungen hinzugefügt werden, indem jede Integration von OpsGenie festgelegt wird.

Detektorarbeit

Der Detektor verwendet die Alert-API von OpsGenie, um einen nicht geschlossenen Alert zu erhalten. Erstellen Sie eine Liste von Warnungen im folgenden Format, basierend auf den einzelnen erhaltenen Warnungen und den in den detaillierten Informationen enthaltenen Tags.

Artikel Inhalt Kommentar
tinyId Alarmnummer von Ops Genie
acknowledged True or False True, wenn Alert bekannt ist
error True or False Warnen'error'True, wenn das Tag gesetzt ist
new True or False Richtig, wenn es beim letzten Mal keine Warnung gab

Versuchen Sie, den Detektor zu bewegen

Sie können dieses Modul ausprobieren, indem Sie die folgenden Schritte ausführen.

  1. Holen Sie sich ein OpsGenie-Konto
  2. Registrieren Sie eine Testbenachrichtigung über das Menü "Warnungen" (fügen Sie bei Bedarf einen "Fehler" -Tag hinzu). OpsGenieAlert
  3. Wählen Sie im Menü "Integrationen" die Option "API", um den API-Schlüssel abzurufen
  4. Führen Sie opsgenie.py mit dem obigen API-Schlüssel als erstem Argument aus

Das Ausführungsergebnis ist wie folgt.

$ ./opsgenie.py ********-****-****-****-************
-- Alert List (1st) ----------------------------------
[{'new': True, 'error': False, 'acknowledged': False, 'tinyId': u'15'}, {'new': True, 'error': True, 'acknowledged': False, 'tinyId': u'14'}]
-- Alert List (2nd) ----------------------------------
[{'new': False, 'error': False, 'acknowledged': False, 'tinyId': u'15'}, {'new': False, 'error': True, 'acknowledged': False, 'tinyId': u'14'}]

Und hier ist der Quellcode Ich bin neu in Python, daher würde ich gerne von Ihnen hören.

opsgenie.py


#!/usr/bin/env python
#coding:utf-8


import urllib
import urllib2
import json
import time


class OpsGenie:
    """OpsGenie access
        We should use If-Modified-Since header if OpsGenie supports."""

    def __init__(self, url, apikey):
        self.url = url
        self.apikey = apikey
        self.alert_list = []
        # [{"tinyId":0, "acknowledged":False, "error":False, "new": False}, ...]

    def _get(self, uri):
        # print("url + params: %s" % uri)
        try:
            response = urllib2.urlopen(uri)
        except urllib2.URLError, e:
            error = "Error "
            if hasattr(e, 'code'):
                error = str(e.code)
            if hasattr(e, 'reason'):
                error = error + ": " + str(e.reason)
            print(error)
        else:
            return response.read()
        return None

    def get_alerts(self, status="open"):
        params = urllib.urlencode(
            {
                "apiKey": self.apikey,
                "status": "open",
                "limit": "100"
            })
        resp = self._get(self.url + params)
        if resp is None:
            return None
        else:
            data = json.loads(resp)
            return data["alerts"]

    def get_alert_detail(self, tiny_id):
        params = urllib.urlencode(
            {
                "apiKey": self.apikey,
                "tinyId": tiny_id
            })
        resp = self._get(self.url + params)
        if resp is None:
            return None
        else:
            data = json.loads(resp)
            return data

    def get_alert_tags(self, tiny_id):
        data = self.get_alert_detail(tiny_id)
        return data["tags"]

    def detector(self):
        # get open alerts
        alerts = self.get_alerts()
        latest_list = []
        for a in alerts:
            latest_list.append({"tinyId": a["tinyId"], "acknowledged": a["acknowledged"], "error": "", "new": ""})

        # set new flags and error flags
        for latest in latest_list:
            for previous in self.alert_list:
                if previous["tinyId"] == latest["tinyId"]:
                    # existing
                    latest["new"] = False
                    latest["error"] = previous["error"]
                    break
            else:
                # new
                latest["new"] = True
                # set error flag if error tag is found
                tags = self.get_alert_tags(int(latest["tinyId"]))
                latest["error"] = ("error" in tags)

        # print("latest_list =" + str(latest_list))
        self.alert_list = latest_list
        return latest_list

if __name__ == '__main__':
    import sys

    URL = 'https://api.opsgenie.com/v1/json/alert?'

    if len(sys.argv) != 2:
        print("Usage: %s 'api-key for your OpsGenie account'." % sys.argv[0])
        exit()
    API_KEY = sys.argv[1]

    o = OpsGenie(URL, API_KEY)
    alerts = o.get_alerts()
    if alerts is None:
        print("Check your api_key or network connection.")
        exit()
    # print("-- Alerts --------------------------------------------")
    # print(json.dumps(alerts, sort_keys=True, indent=2))
    for a in alerts:
        tiny_id = a["tinyId"]
        detail = o.get_alert_detail(tiny_id)
        # print("-- Alerts Detail -------------------------------------------")
        # print(json.dumps(detail, sort_keys=True, indent=2))
    print("-- Alert List (1st) ----------------------------------")
    print(o.detector())
    time.sleep(3)
    print("-- Alert List (2nd) ----------------------------------")
    # All new flag should be "False"
    print(o.detector())

Recommended Posts

Raspberry Pi "Honwaka Benachrichtigungslampe" Teil 2
Raspberry Pi "Honwaka Benachrichtigungslampe" Teil 1
Raspberry Pi "Honwaka Benachrichtigungslampe" Teil 3
Matrixmultiplikation auf Raspberry Pi GPU (Teil 2)
Pigpio auf Himbeer-Pi
Cython auf Raspberry Pi
Pyenv auf Raspberry Pi eingeführt
Verwenden Sie NeoPixel mit Himbeerkuchen
Installieren Sie OpenCV4 auf Raspberry Pi 3
Installieren Sie TensorFlow 1.15.0 auf Raspberry Pi
Testen der Kommunikation mit Raspberry Pi
Himbeer pi 1 Modell b, knotenroter Teil 17
MQTT auf Raspberry Pi und Mac
Himbeer Pi 4 Centos7 auf Docker installieren
Installieren Sie ghoto2 auf Raspberry Pi (Hinweis)
Versuchen Sie es mit ArUco mit Raspberry Pi
OpenCV-Installationsverfahren auf Raspberry Pi
Ein- / Ausschalten von Raspberry Pi mit Arduino
Erkennen Sie den Schalterstatus mit Raspberry Pi 3
Installieren Sie OpenMedia Vault 5 auf Raspberry Pi 4
L Chika mit Himbeer-Pi C #
Erstellen Sie wxPython unter Ubuntu 20.04 auf Himbeer-Pi 4
Telefonische Benachrichtigung, wenn eine Bewegung der Überwachungskamera auf dem Raspberry Pi erkannt wird
Erkennen Sie "Helligkeit" mit Python auf Raspberry Pi 3!
USB-Boot auf Raspberry Pi 4 Model B.
Aktivieren Sie die serielle UART + -Kommunikation mit Raspberry Pi
Adafruit Python BluefruitLE arbeitet mit Raspeye.
Beschleunigen Sie Deep Learning mit der Rasperry Pi 4-CPU
Stellen Sie den Swap Space unter Ubuntu auf Raspberry Pi ein
Normal programmieren mit Node-RED-Programmierung mit Raspberry Pi 3
Verwenden Sie den Grove-Sensor mit Raspberry Pi
Installieren Sie das 64-Bit-Betriebssystem (Bate) auf Raspberry Pi
Installieren Sie Docker-Compose unter 64-Bit-Raspberry-Pi-Betriebssystem
Lassen Sie einen Servomotor mit Python auf Raspberry Pi 3 laufen
Arbeiten mit Sensoren in Mathematica auf Raspberry Pi
Erstellen Sie eine OpenCV-Python-Umgebung auf Raspberry Pi B +
Ermitteln Sie die Temperatur mit Python auf Raspberry Pi 3!
So installieren Sie NumPy auf Raspeye
Arbeiten mit GPS in Python für Raspberry Pi 3
Easy Raspberry Pi GUI App Entwicklung Anfänger Teil 1
Warum DetectMultiScale () auf Raspberry Pi B + langsam ist
Erkennen Sie Schiebeschalter mit Python auf Raspberry Pi 3!
Erstellen Sie eine Django-Umgebung auf Raspai (MySQL)
Versuchen Sie, QR-Code mit Raspberry Pi zu verwenden
Erkennen Sie Magnetschalter mit Python auf Raspberry Pi 3!
Genießen Sie die elektronische Arbeit mit GPIO von Raspberry Pi
Schalten Sie Ihren PC mit Himbeer-Pi ein / aus
Easy Raspberry Pi GUI App Entwicklung Anfänger Teil 2
Grove - Temperatur- und Feuchtigkeitssensor (DHT11) mit Raspberry Pi
Stellen Sie DHT11 mit Raspeye + Python zur Verfügung (Hinweis)
Cross-Compilierung für Raspberry Pi Zero unter Ubuntu gestartet
Lassen Sie den Summer mit Python auf Raspberry Pi 3 erklingen!
Erstellen Sie ein Besuchermeldungssystem mit Raspberry Pi
Zeigen Sie die CPU-Temperatur alle 5 Sekunden auf dem Raspberry Pi 4 an
Einführung von Ceph mit Kubernetes auf Raspberry Pi 4B (ARM64)
Stellen Sie mit Python auf Raspberry Pi eine Verbindung zu MySQL her
Erstellen Sie eine Python-Entwicklungsumgebung auf Raspberry Pi