TL; DR
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.
--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
...
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
――Was können Sie von nun an tun?
--Warum wird der Textsammler node_exporter anstelle des benutzerdefinierten Prometheus-Exporters implementiert?
soracom_exporter
gegoogelt habe, ist es noch nicht herausgekommen, also hatte ich das Gefühl, ich wollte es verwenden, obwohl es nicht erschöpfend war.Ende
Recommended Posts