我在 Prometheus 中有一个 Gauge 指标,它显示未处理指标的计数。由于有多个作业处理记录,因此计数会上下波动。
在 Grafana 中,我将其显示为 avg(not_processed_records_total)
的“时间序列”小部件。
它看起来很棒,但一个常见的模式是当计数激增时,然后在几天内逐渐下降:
在这种情况下,我通常需要知道指标的值是如何变化的,比如在 24 小时内。例如。在上面的屏幕截图中,最后一个值约为 607.000,24 小时前约为 684.000。所以增量为 684.000 - 607.000 = 77.000。我想在统计小部件中查看这个数字。
但是,当我尝试这样做时:
avg(-delta(not_processed_records_total[24h]))
我真的不明白为什么,但会感谢你的建议。
回答有关我的 PromQL 查询的可能问题:
我使用 avg
是因为该指标是由多个工作人员收集的,每个工作人员的生活时间约为 1 小时。每个工作进程都会获得一个记录计数,然后在处理记录后减少该数字。因此,工作人员工作的时间越长,与实际计数的偏差就越大,因为其他工作人员也在处理记录。它可能闻起来很糟糕,我需要使用计数器来处理它,但我仍然有兴趣了解如何使用现有的计量指标来解决这个问题。
此外,delta
之前的减号只是为了方便,因为就我而言,减少是好的,增加是坏的。
更新:
这是非聚合数据的样子(查询是 not_processed_records_total
):
即每个 worker 运行一个小时。它计算数据库中的记录数。这是一项繁重的操作,因此每个工作人员只执行一次,然后每次处理记录时都会减少 Gauge 指标。由于其他进程也可以更改数据库中的记录数量,因此这与实际数量的累积偏差并不显着。但正如您在屏幕截图中看到的那样,不会出现大的跳跃。实际上,avg
、min
或 max
聚合显示的结果大致相同(请参阅问题中的第一个屏幕截图)。
现在,当我运行这个时:
-delta(not_processed_records_total[24h])
,
所以每个 worker 都会活一个小时,当它结束时,另一个 worker 就会开始。两个 worker 同时作业,也就几分钟的时间。图表上的 Delta 线从 07:00 的一个小值开始,在一小时内增长到 3542,并保持在 3542,直到第二天 07:00 开始下降,最终在 08 点出现一个小值:00。
因此,似乎 delta 只计算单个工作人员的指标值,@markalex 是对的,如果我对所有 delta 进行求和,我将得到我想要的值需要:
sum(-delta(not_processed_records_total[24h]))
现在该图表看起来像是每 24 小时处理记录的实际速率。
最佳答案
问题出在您对 avg
的使用上。删除它以查看原始数据,并从那里推断。对于所描述的场景,sum(-delta(...))
最有可能会产生接近您想要的结果。
此外,我强烈建议考虑引入单独的工作人员,将实际数据公开给 Prometheus。
解释为什么会发生这种情况:
假设您有两名工作人员:一名工作人员在最后一天工作并处理了 77,000 件元素,而第二名则没有处理任何元素。
现在它们各自的值是 607.000 和 684.000,而昨天它们的值都是 684.000。结果,其中一个的 delta 将返回 77.000,另一个则返回 0。 avg
将返回“正好”38.500。扩展到您的 worker 的实际数量以及他们可能处理或多或少相同数量的项目的事实,并且 3000 的结果变得可行。
关于Prometheus:将最后一个仪表值与24小时前的值进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76745362/