Прометей python экспортер для json значений - PullRequest
0 голосов
/ 28 января 2020

У меня есть сценарий, в котором я получаю и форматирую ответ json, затем я хочу использовать клиент Prometheus- python для преобразования json данных , полученных из response, в Prometheus релевантные метрики.

Вот что я пробовал:

import time
from prometheus_client.core import GaugeMetricFamily, REGISTRY, CounterMetricFamily
from prometheus_client import start_http_server
import requests
import json

class CustomCollector(object):
    def __init__(self):
        pass

    def collect(self):
        response = requests.get('https://api.test.com/v1/data', auth= 
        ('abc@gg.com', 'xxrty'))
        d1=(response.json())
        for key in d1:
           g = GaugeMetricFamily("devicevalue", 'Help text', labels=['datalnddev'])
           g.add_metric([key['appname'], key['value'])
           yield g

if __name__ == '__main__':
    start_http_server(8003)
    REGISTRY.register(CustomCollector())
    while True:
        time.sleep(1)

Но это не помогает решить проблему, я не уверен, как поступить здесь, любая помощь будет большой. ожидаемый экспортер метрики вывод в Прометей.

1 Ответ

0 голосов
/ 29 января 2020

Идея вашего кода прекрасна, однако есть небольшие ошибки. - в ваших json данных есть один элемент с ключом appnamet (с дополнительным t в конце). - когда вы перебираете свои данные, вы забыли получить список по ключу "app_metri c" - вы должны преобразовать значения меток в строку, как в примере ниже ([str(key['appname'])])

import time
from prometheus_client.core import GaugeMetricFamily, REGISTRY, CounterMetricFamily
from prometheus_client import start_http_server
import requests
import json

class CustomCollector(object):
    def __init__(self):
        pass

    def collect(self):
        # response = requests.get('https://api.test.com/v1/data', auth= ('abc@gg.com', 'xxrty'))
        d1 = {
            "app_metric": [
                {
                "appname": 18,
                "value": "0"
                },
                {
                "appname": 12,
                "value": "0"
                },
                {
                "appname": 123,
                "value": "0"
                },
                {
                "appname": 134,
                "value": "0"
                }
            ]
        }
        list_of_metrics = d1["app_metric"]
        for key in list_of_metrics:
           g = GaugeMetricFamily("devicevalue", 'Help text', labels=['datalnddev'])
           g.add_metric([str(key['appname'])], key['value'])
           yield g

if __name__ == '__main__':
    start_http_server(8003)
    REGISTRY.register(CustomCollector())
    while True:
        time.sleep(1)

С В этом примере я получаю желаемый результат:

# HELP devicevalue Help text
# TYPE devicevalue gauge
devicevalue{datalnddev="18"} 0.0
# HELP devicevalue Help text
# TYPE devicevalue gauge
devicevalue{datalnddev="12"} 0.0
# HELP devicevalue Help text
# TYPE devicevalue gauge
devicevalue{datalnddev="123"} 0.0
# HELP devicevalue Help text
# TYPE devicevalue gauge
devicevalue{datalnddev="134"} 0.0
...