TL; DR
Bien sûr, si vous utilisez quelque chose d'IoT avec la carte SIM de SORACOM Air, vous devez également le surveiller. Ensuite, en fonction de l'implémentation, les informations sur la santé seront envoyées à partir du système d'exploitation ou de l'application à l'intérieur de quelque chose qui est IoT. Cependant, si le NW n'est pas communiqué, de telles informations ne peuvent pas être envoyées, et il est nécessaire de surveiller du point de vue si le NW est vivant ou peut communiquer.
Donc, quand il y a un problème, il serait bon de savoir quelle est la cause de la session Air sim en tant que superposition. Très heureux. Par exemple, si la communication d'application dans l'IoT n'est pas possible mais que l'état de la session est En ligne, il semble y avoir un problème au sein du système d'exploitation ou de l'application à l'intérieur de quelque chose qui est l'IoT. Si vous utilisez Hors ligne, il y a une forte possibilité qu'il y ait un problème à l'extérieur, comme si l'appareil est à court d'électricité, l'état des ondes radio ou l'antenne n'est pas cassée.
C'est pourquoi, lorsque j'utilise Prometheus comme environnement de surveillance, je souhaite récupérer les informations Air de l'API SORACOM, les mettre dans Prometheus, les ignorer pour les relâcher ou les visualiser avec grafana.
--soracom_exporter.py (créé avec python, décrit plus tard)
Ainsi, par exemple, la structure de fichiers suivante.
/hoge
|-- prometheus
| |-- prometheus(Corps binaire)
| |-- prometheus.yml
| |-- (divers)
|-- node_exporter(Corps binaire)
| |-- node_exporter
| |-- text_collector
| |-- soracom_exporter_session_status.prom(Mis à jour à chaque fois)
|-- 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
#Pour en faire un processus résident et exécuter une minuterie
# 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" #Changer pour le vôtre
self.SORACOM_API_KEY_SECRET = "secret-xxx" #Changer pour le vôtre
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/Générer un jeton à partir du secret(Vous devriez vraiment l'utiliser correctement...)
self._get_soracom_api_token()
#Obtenez la liste des simulateurs aériens de l'API et analysez
# cf. https://dev.soracom.io/jp/docs/api/#!/Subscriber/listSubscribers
self.subscribers = self._get_subscribers()
#Traitez-le en données de type métrique Prometheus et écrivez-le dans un fichier
registry = CollectorRegistry()
self._build_soracom_session_status_metrics(registry, self.subscribers)
self._write_metrics(registry)
def _build_soracom_session_status_metrics(self, registry, subscribers):
#Ici le nom et l'étiquette des métriques/Définir une structure telle que la valeur
soracom_session_status_gauge = Gauge(
"soracom_session_status", # metrics name
"SORACOM session status", # metrics description
["imsi", "name"], # labels
registry=registry
)
#Mettez les données extraites de l'API
for subscriber in subscribers:
metrics_value = 1.0 if subscriber["session_status"] else 0.0 #En ligne 1.0, 0 pour hors ligne.0
soracom_session_status_gauge.labels(
subscriber["imsi"],
subscriber["name"]
).set(metrics_value)
def _write_metrics(self, registry):
#Ici et là, j'utilise juste ce qui est préparé comme décrit dans le README du client python de Prometheus.
# 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) #Courir chaque minute
#Exportez si vous souhaitez prendre d'autres métriques_hoge_Définir des métriques et exécuter avec l'intervalle approprié
while True:
schedule.run_pending()
time.sleep(1)
Le fichier de sortie ressemble à ceci
$ cat soracom_exporter_session_status.prom
# HELP soracom_session_status SORACOM session status
# TYPE soracom_session_status gauge
soracom_session_status{imsi="00000000000",name="Pour la vérification de l'entreprise"} 1.0
soracom_session_status{imsi="11111111111",name="Pour la vérification à domicile"} 0.0
...
node_exporter -web.listen-address ":9100" -collector.textfile.directory /hoge/node_exporter/text_collector/
#Attention à la syntaxe car la version peut être ancienne
―― Que pouvez-vous faire à partir de maintenant? --Notification de relâcher --Visualisation avec grafana ―― Quels autres points de terminaison pouvez-vous surveiller?
fin
Recommended Posts