[PYTHON] Die Geschichte von soracom_exporter (Ich habe versucht, SORACOM Air mit Prometheus zu überwachen)

TL; DR

Einführung

Wenn Sie ein IoT mit der Sim von SORACOM Air betreiben, müssen Sie es natürlich auch überwachen. Abhängig von der Implementierung werden dann Integritätsinformationen vom Betriebssystem oder der Anwendung in einem IoT gesendet. Wenn der NW jedoch nicht kommuniziert wird, können solche Informationen nicht gesendet werden, und es ist erforderlich, aus der Perspektive zu überwachen, ob der NW lebt oder kommunizieren kann.

Wenn es also ein Problem gibt, wäre es schön, wenn Sie verstehen könnten, was mit der Air-Sim-Sitzung als Überlagerung der Ursache ist. Sehr glücklich. Wenn beispielsweise die Anwendungskommunikation im IoT nicht möglich ist, der Sitzungsstatus jedoch Online ist, liegt anscheinend ein Problem im Betriebssystem oder in der Anwendung im IoT vor. Bei Offline besteht eine hohe Wahrscheinlichkeit, dass außen ein Problem auftritt, z. B. ob das Gerät keinen Strom mehr hat, der Funkwellenzustand vorliegt oder die Antenne nicht defekt ist.

Wenn ich Prometheus als Überwachungsumgebung verwende, möchte ich daher Luftinformationen von der SORACOM-API abrufen, in Prometheus ablegen, überspringen, um sie zu lockern, oder sie mit grafana visualisieren.

Implementierung

--soracom_exporter.py (erstellt mit Python, später beschrieben) --Striking der SORACOM-API

So zum Beispiel die folgende Dateistruktur.


/hoge
|-- prometheus
|   |-- prometheus(Binärer Körper)
|   |-- prometheus.yml
|   |-- (verschiedene)
|-- node_exporter(Binärer Körper)
|   |-- node_exporter
|   |-- text_collector
|       |-- soracom_exporter_session_status.prom(Jedes Mal aktualisiert)
|-- soracom_exporter
|   |-- soracom_exporter.py

soracom_exporter.py

soracom_exporter.py


import json
import logging
import time
import requests
logging.basicConfig(level=logging.DEBUG, format="%(asctime)-15s %(message)s")
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True

#Um es zu einem residenten Prozess zu machen und einen Timer auszuführen
# pip install schedule
# cf. https://schedule.readthedocs.io/en/stable/
import schedule

# Prometheus Python Client
# cf. https://github.com/prometheus/client_python
from prometheus_client import CollectorRegistry, Gauge, write_to_textfile # pip install prometheus_client


class SORACOMExporter():
    def __init__(self):
        # config for api
        self.SORACOM_API_KEY_ID = "keyId-xxx"       #Wechseln Sie zu Ihren eigenen
        self.SORACOM_API_KEY_SECRET = "secret-xxx"  #Wechseln Sie zu Ihren eigenen
        self.SORACOM_URL_AUTH = "https://api.soracom.io/v1/auth"
        self.SORACOM_URL_SUBSCRIBERS = "https://api.soracom.io/v1/subscribers?limit=1000"

    def export_session_status_metrics(self):
        # api key id/Token aus Geheimnis generieren(Sie sollten es wirklich richtig verwenden...)
        self._get_soracom_api_token()

        #Holen Sie sich die Air Sim-Liste von API und analysieren Sie
        # cf. https://dev.soracom.io/jp/docs/api/#!/Subscriber/listSubscribers
        self.subscribers = self._get_subscribers()

        #Verarbeiten Sie es zu Prometheus-metrikähnlichen Daten und schreiben Sie es in eine Datei
        registry = CollectorRegistry()
        self._build_soracom_session_status_metrics(registry, self.subscribers)
        self._write_metrics(registry)

    def _build_soracom_session_status_metrics(self, registry, subscribers):
        #Hier der Name und die Bezeichnung der Metriken/Definieren Sie eine Struktur wie den Wert
        soracom_session_status_gauge = Gauge(
            "soracom_session_status",  # metrics name
            "SORACOM session status",  # metrics description
            ["imsi", "name"],  # labels
            registry=registry
        )

        #Fügen Sie die Daten ein, die aus der API entnommen wurden
        for subscriber in subscribers:
            metrics_value = 1.0 if subscriber["session_status"] else 0.0 #Online 1.0, 0 für Offline.0
            soracom_session_status_gauge.labels(
                subscriber["imsi"],
                subscriber["name"]
            ).set(metrics_value)

    def _write_metrics(self, registry):
        #Hier und da verwende ich nur das, was vorbereitet ist, wie in der README von Prometheus 'Python-Client beschrieben.
        # cf. https://github.com/prometheus/client_python
        text_collector_output_path = "/hoge/node_exporter/text_collector/soracom_exporter_session_status.prom"
        write_to_textfile(text_collector_output_path, registry)
        logging.info("text metrics was written!:%s" % text_collector_output_path)

    def _get_subscribers(self):
        subscribers_json = self._get_soracom_api_json(self.SORACOM_URL_SUBSCRIBERS)

        # parse subscribers json to extract every subscribers's imsi/tag.Name/sessionStatus
        subscribers = []
        for subscriber_json in subscribers_json:
            subscribers.append({
                "imsi": subscriber_json["imsi"],
                "name": subscriber_json["tags"]["name"] if "name" in subscriber_json["tags"] else "",
                "session_status": subscriber_json["sessionStatus"]["online"] if subscriber_json[
                    "sessionStatus"] else False
            })

        return subscribers

    def _get_api_headers(self):
        api_headers = {
            "X-Soracom-API-Key": self.auth_api_key,
            "X-Soracom-Token": self.auth_token,
            "Accept": "application/json",
        }
        return api_headers

    def _get_soracom_api_token(self):
        try:
            auth_headers = {"Content-Type": "application/json"}
            auth_payload = {"authKeyId": self.SORACOM_API_KEY_ID, "authKey": self.SORACOM_API_KEY_SECRET}
            auth_response = requests.post(
                self.SORACOM_URL_AUTH,
                headers=auth_headers,
                data=json.dumps(auth_payload),
                verify=True,
                timeout=60
            )
            auth_response.raise_for_status()
        except requests.exceptions.RequestException as err:
            logging.warning(err)
        self.auth_token = auth_response.json()["token"]
        self.auth_api_key = auth_response.json()["apiKey"]

    def _get_soracom_api_json(self, soracom_api_url):
        try:
            soracom_response = requests.get(
                soracom_api_url,
                headers=self._get_api_headers(),
                verify=True,
                timeout=60
            )
            soracom_response.raise_for_status()
        except requests.exceptions.RequestException as err:
            logging.warning(err)
        return soracom_response.json()


if __name__ == "__main__":
    se = SORACOMExporter()
    schedule.every(1).minutes.do(se.export_session_status_metrics) #Lauf jede Minute
    #Exportieren, wenn Sie andere Metriken verwenden möchten_hoge_Definieren Sie Metriken und führen Sie sie mit dem entsprechenden Intervall aus
    while True:
        schedule.run_pending()
        time.sleep(1)

Die Ausgabedatei sieht folgendermaßen aus

$ cat soracom_exporter_session_status.prom
# HELP soracom_session_status SORACOM session status
# TYPE soracom_session_status gauge
soracom_session_status{imsi="00000000000",name="Zur Unternehmensüberprüfung"} 1.0
soracom_session_status{imsi="11111111111",name="Zur Überprüfung zu Hause"} 0.0
...

Startoptionen für node_exporter

node_exporter -web.listen-address ":9100" -collector.textfile.directory /hoge/node_exporter/text_collector/
#Achten Sie auf die Syntax, da die Version möglicherweise alt ist

Impressionen

Von jetzt an

――Was können Sie von nun an tun?

Implementierung

--Warum wird der Textsammler node_exporter anstelle des benutzerdefinierten Prometheus-Exporters implementiert?

Ende

Recommended Posts

Die Geschichte von soracom_exporter (Ich habe versucht, SORACOM Air mit Prometheus zu überwachen)
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
zoom Ich habe versucht, den Grad der Aufregung der Geschichte auf der Konferenz zu quantifizieren
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, die Bewegungen von Wiire-Playern automatisch mit Software zu extrahieren
Ich habe versucht, die Phase der Geschichte mit COTOHA zu extrahieren und zu veranschaulichen
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, den Text des Romans "Wetterkind" mit Word Cloud zu visualisieren
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, die Tweets von JAWS DAYS 2017 mit Python + ELK einfach zu visualisieren
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Ich habe versucht, die Literatur des neuen Corona-Virus mit Python automatisch an LINE zu senden
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, mit dem Seq2Seq-Modell von TensorFlow so etwas wie einen Chatbot zu erstellen
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
Ich habe versucht, die Eigenschaften der neuen Informationen über mit dem Corona-Virus infizierte Personen mit Wordcloud zu visualisieren
Ich habe versucht, die Laufdaten des Rennspiels (Assetto Corsa) mit Plotly zu visualisieren
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich habe versucht, die Zugverspätungsinformationen mit LINE Notify zu benachrichtigen
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Die Geschichte, wie man mit discord.py einen Fragenkasten-Bot erstellt
Ich habe versucht, die Punktgruppendaten-DB der Präfektur Shizuoka mit Vue + Leaflet anzuzeigen
Ich habe versucht, zum Zeitpunkt der Bereitstellung mit Fabric und ChatWork Api automatisch in ChatWork zu posten
Ich habe versucht, den WEB-Server der normalen Linux-Programmierung 1st Edition mit C ++ 14 neu zu schreiben
Ich habe versucht, das Problem von F02 zu lösen, wie man mit Python offline in Echtzeit schreibt
Ich habe versucht, den Stromverbrauch meines Hauses mit Nature Remo E lite zu visualisieren
Ich habe versucht, die Daten des Fußballturniers der FIFA Fussball-Weltmeisterschaft Russland mit Fußball zu analysieren
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Ich habe versucht, den Verkauf von Spielesoftware mit VARISTA anhand des Artikels von Codexa vorherzusagen
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu beschreiben
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
[Linux] Ich habe versucht, die Ressourcenbestätigungsbefehle zusammenzufassen