首页 > 解决方案 > 如何测量 Prometheus 中计数器事件的每日发生率?

问题描述

我正在尝试计算每天的事件数量(在我的示例部署中)。我目前正在做的是基于 pushgateway 的 HTTP API 发送以下计数器事件

# TYPE deployments_count counter
# HELP deployments_count Deployments Counter
deployments_count{label1="${label1}",label2="${label2}"} 1

我想在我的仪表板上计算的是在给定的一天发生了多少不同的事件(即部署)。

根据经验,我知道我每小时应该有超过 10 个事件(部署),但是当我执行以下查询时,我一直收到 0

rate(deployments_count[24h])

请注意,我的计数器总是1在给定事件(部署)发生时报告。

标签: prometheusmonitoringpromqlprometheus-pushgateway

解决方案


首先,该rate()函数计算一个计数器每秒的增长率。也就是说,即使您的计数器值是准确的,您也会得到每秒(过去 24 小时内)发生的部署次数,而不是每天发生的部署次数。

如果要计算过去 24 小时内的部署次数,可以使用以下increase()函数:increase(deployments_count[24h]).

但是您当前的表达式产生 0 的原因是计数器值始终为 1。每次发生事件时都必须递增计数器(请参阅Prometheus 文档)。

也就是说,在将计数器推送到 Pushgateway 之前,您必须以某种方式跟踪计数器的当前值并在每次部署时将其递增,而不是在每个事件上推送 1。后一种方法行不通,在 Prometheus 看来,这个值好像永远不会改变。


有两种可能的方法来解决这个问题:

1.不使用推送网关

您确定需要 Pushgateway 还是可以在代码中合并 Prometheus 客户端库?检查何时使用 Pushgateway,特别是 Pushgateway不是分布式计数器。从本质上讲,Pushgateway 的用例是用于需要在终止之前将其指标存放在某处的临时作业。

另一方面,如果您的代码永久运行,Prometheus 客户端库会负责计数器递增逻辑并公开指标,以便 Prometheus 可以直接抓取它。

2.跟踪计数器值

如果您必须使用 Pushgateway,则需要跟踪当前计数器值,以便您可以递增它。您可以在代码中执行此操作,也可以从 Pushgateway 本身查询当前值,将其递增,然后将其推回。当有多个进程对计数器有贡献时(即并发更新、竞争条件),这两种方法都会遇到问题。


推荐阅读