Conseils Prometheus client_python - Comment créer des métriques pour plusieurs cibles

Overview

Prometheus a plusieurs exportateurs, mais j'ai créé des API Si vous souhaitez générer vos propres métriques, vous pouvez utiliser la bibliothèque cliente.

Donc, python a également une bibliothèque pour cela, qui est ici. En gros, vous pouvez le faire en utilisant Gauge, le code sera donc le suivant.

#!/usr/bin/env python3
# import os
import sys
import re
from logging import getLogger
from prometheus_client import generate_latest
from prometheus_client import Gauge
from prometheus_client import REGISTRY
logger = getLogger(__name__)

class MetricsGenetator(object):

    def __init__(self):
        self.g = Gauge('my_inprogress_requests', 'Description of gauge')

    def run(self):
        self.g.inc()      # Increment by 1
        self.g.dec(10)    # Decrement by given value
        self.g.set(4.2)   # Set to a given value
        metrics = generate_latest(self.registry)
        return metrics



def main():
    app = MetricsGenerator()
    metrics = app.run()
    print(metrics)

if __name__ == '__main__':
    main()

Ce serait bien si cela était fait à chaque fois, Par exemple, si la valeur 4.2 transmise à self.g.set est utilisée comme suit, des problèmes se produiront.

--Lorsque le code lui-même est réutilisé simplement en divisant la cible comme snmpget cpu_usage de

Plus précisément, que va-t-il se passer?

  1. Obtenez l'utilisation du processeur d'un ensemble de serveurs à -50
  2. La tentative d'obtention de l'utilisation du processeur à partir du serveur B échoue (aucun)
  1. Ensuite, l'utilisation du processeur du serveur B est renvoyée à 50.

En d'autres termes, la valeur précédente est utilisée telle quelle. Dans le cas de la structure ci-dessus, l'utilisation du processeur = Aucune, etc. doit être explicitement saisie. Le nombre de processeurs du serveur A et du serveur B est fluide, comme pour le processeur dans cpu_num: Les valeurs factices ne peuvent pas être saisies si l'étiquette est générée dynamiquement.

Que faire

En utilisant target_info de Collector Registry, qui a été nouvellement engagé en septembre 2019 Vous pourrez séparer le registre. Comme ça. Cependant, à partir de novembre 2019, target_info ajouté à registry.py Il n'est pas emballé, vous devez donc le remplacer vous-même.

#!/usr/bin/env python3
# import os
import sys
import re
from logging import getLogger
from prometheus_client import generate_latest
from prometheus_client import Gauge
# from prometheus_client import REGISTRY
from prometheus_client.core import CollectorRegistry
logger = getLogger(__name__)

class MetricsGenetator(object):

    def __init__(self):
        registry = CollectorRegistry(target_info={"target": server_name})
        self.g = Gauge(
                     'my_inprogress_requests',
                     'Description of gauge',
                     registry=registry)

    def run(self):
        self.g.inc()      # Increment by 1
        self.g.dec(10)    # Decrement by given value
        self.g.set(4.2)   # Set to a given value
        metrics = generate_latest(self.registry)
        return metrics



def main():
    app = MetricsGenerator()
    metrics = app.run()
    print(metrics)

if __name__ == '__main__':
    main()

Notez que ce qui précède ne fonctionne pas tel quel car aucun nom_serveur n'est entré. (Comme il s'agit d'une explication du registre des collecteurs, la cohérence de ces lieux est omise)

Recommended Posts

Conseils Prometheus client_python - Comment créer des métriques pour plusieurs cibles
Comment créer un fichier * .spec pour pyinstaller.
[Python] Comment créer facilement des dossiers de formation, de validation et de test pour plusieurs problèmes de classification