用于 json 值的 Prometheus python 导出器

Posted

技术标签:

【中文标题】用于 json 值的 Prometheus python 导出器【英文标题】:Prometheus python exporter for json values 【发布时间】:2020-05-14 05:40:26 【问题描述】:

我有一个场景,我正在获取和格式化 json 响应,然后我想使用 Prometheus-python 客户端将从 response 获得的 json data 转换为 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 中输出 exporter metrics。

【问题讨论】:

【参考方案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
devicevaluedatalnddev="18" 0.0
# HELP devicevalue Help text
# TYPE devicevalue gauge
devicevaluedatalnddev="12" 0.0
# HELP devicevalue Help text
# TYPE devicevalue gauge
devicevaluedatalnddev="123" 0.0
# HELP devicevalue Help text
# TYPE devicevalue gauge
devicevaluedatalnddev="134" 0.0

【讨论】:

但是这些结果是我的值的两倍`# HELP devicevalue Help text # TYPE devicevalue gauge devicevaluedatalnddev="18" 0.0 # HELP devicevalue Help text # TYPE devicevalue gauge devicevaluedatalnddev="18" 0.0 # HELP devicevalue Help text # TYPE devicevalue gauge # HELP devicevalue Help text # TYPE devicevalue gauge devicevaluedatalnddev="12" 0.0 # HELP devicevalue Help text # TYPE devicevalue gauge devicevaluedatalnddev="12" 0.0 # HELP devicevalue Help text # TYPE devicevalue gauge 不确定,您的意思是什么,也许您的 API 返回重复值?使用您提供的 JSON 示例,我为每个“appname”得到一行。请运行我提供的代码,看看它是否在localhost:8003 上为您提供所需的结果。如果是,请在您的 API 响应中查找问题

以上是关于用于 json 值的 Prometheus python 导出器的主要内容,如果未能解决你的问题,请参考以下文章

JSON 获取属性值的方法

具有动态标签值的 Prometheus 指标

关于 Nan 值的 Prometheus 警报

如何查询 Prometheus 中所有具有特定标签值的时间序列?

Prometheus & cadvisor & k8s / 带有空值的“图像”标签

在 prometheus/grafana 中获取不同标签值的计数