3

我有一个场景,我正在获取和格式化 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)

但这无助于解决问题,我不确定如何在这里进行任何帮助都会很棒。prometheus 中的预期出口商指标输出。

4

1 回答 1

1

您的代码的想法很好,但是有一些小错误。- 在您的 json 数据中,有一个带有键的元素appnamet(最后有额外t的)。- 当您遍历数据时,您忘记通过键“app_metric”获取列表 - 您应该将标签值转换为字符串,如下面的示例([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
于 2020-01-29T07:39:36.483 回答