如何在 Prometheus 中持续轮询 JSON 数据?

Posted

技术标签:

【中文标题】如何在 Prometheus 中持续轮询 JSON 数据?【英文标题】:How can I continuously poll JSON data in Prometheus? 【发布时间】:2021-08-20 09:08:48 【问题描述】:

我是 prometheus 的新手,所以做了一些研究,发现它有助于监控应用程序有很多增加计数器来检查 api 调用的例子。我的用例有些不同,我有一个 Rest API,它连接到数据库执行查询并以 JSON 格式返回数据。例如:


    "dskreads": 26815,
    "bufreads": 14451041,
    "dskwrites": 52471,
    "bufwrites": 569468,
    "isamtot": 18439806,
    "isopens": 432586,
    "isstarts": 408604,
    "isreads": 6962799,
    "iswrites": 80438,
    "isrewrites": 54535,
    "isdeletes": 54469,
    "iscommits": 61673,
    "isrollbacks": 0,
    "latchwts": 190,
    "buffwts": 192,
    "lockreqs": 13921801,
    "lockwts": 0,
    "ckptwts": 7,
    "deadlks": 0,
    "lktouts": 0,
    "numckpts": 106,
    "plgpagewrites": 11106,
    "plgwrites": 460,
    "llgrecs": 552829,
    "llgpagewrites": 49076,
    "llgwrites": 43672,
    "pagreads": 76446,
    "pagwrites": 68495,
    "flushes": 107,
    "compress": 15039,
    "fgwrites": 0,
    "lruwrites": 0,
    "chunkwrites": 8195,
    "btraidx": 1627,
    "dpra": 3933,
    "rapgs_used": 4755,
    "seqscans": 16008,
    "totalsorts": 6691,
    "memsorts": 4612,
    "disksorts": 2079,
    "maxsortspace": 224

现在我想将我的 API 注册到 Prometheus,以便它不断轮询上述数据并以图形格式显示。

【问题讨论】:

这是示例 JSON,我将对其进行编辑。问题是如何将 JSON 绑定到 Prometheus 的计数器指标。我已经看到了调用 api 时计数器递增的示例,但在这里我想将 json 与它绑定。 【参考方案1】:

我认为您的意思是,您引用的 JSON 文档是 API 调用的结果,并且您希望 Prometheus 将其每个属性(例如 dskreads)视为一个指标,所以你可以查询|绘制这些?

如果是这样,您将需要编写一个导出器:

    GET 是你的 API

    解析 JSON 响应

    遍历属性

    为每个生成 Prometheus 指标

    将结果呈现为 HTTP (/metrics) 页面

    从 Prometheus 服务器上抓取此页面

见Writing Exporters

需要注意的一点是,Prometheus 期望 Counters 始终递增(并且您可能无法设置初始值,例如对于可能称为 total_disk_reads(源自 dskreads)的 Counter,您可以无法将 Counter 的值初始化为 26815

因此,如果您认为需要减小测量值,则可能需要确保您希望使用计数器而不是仪表。见Metric Types

【讨论】:

是的,这正是我想要的。所以你的意思是说 JSON 的每个属性都将成为 Prometheus 中的一个指标?假设如果我想查看“dskreads”和“bufreads”的图表,那么我需要为每个创建两个度量标准?另外,如果您有一些与我的用例相匹配的已编写导出器的示例,请分享。 两个问题都是。 Prometheus Java 客户端包含示例:github.com/prometheus/client_java 与此同时,我运行了一个调度程序来查询数据并将其发布到“/actuator/prometheus”中。因此,在运行查询并获取 JSON 后,我正在执行如下操作 @Autowired private MeterRegistry MeterRegistry;在我的cron函数meterRegistry.gauge("requests_mem_test",json.getInt("dskreads"));我成功地看到了指标,但是一旦我的值发生变化,我就会得到 NAN

以上是关于如何在 Prometheus 中持续轮询 JSON 数据?的主要内容,如果未能解决你的问题,请参考以下文章

ajax长轮询

prometheus中自带的查询指标定义解析

监控大神Prometheus的概述安装与服务发现(持续更新中...)

Zabbix 与 prometheus 的集成

无需持续轮询的实时 Twitter 流

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