Prometheus:将最后一个仪表值与24小时前的值进行比较

标签 prometheus grafana

我在 Prometheus 中有一个 Gauge 指标,它显示未处理指标的计数。由于有多个作业处理记录,因此计数会上下波动。

在 Grafana 中,我将其显示为 avg(not_processed_records_total) 的“时间序列”小部件。 它看起来很棒,但一个常见的模式是当计数激增时,然后在几天内逐渐下降: enter image description here

在这种情况下,我通常需要知道指标的值是如何变化的,比如在 24 小时内。例如。在上面的屏幕截图中,最后一个值约为 607.000,24 小时前约为 684.000。所以增量为 684.000 - 607.000 = 77.000。我想在统计小部件中查看这个数字。

但是,当我尝试这样做时:

avg(-delta(not_processed_records_total[24h]))

我得到了大约 3.000,这看起来更像是过去一小时的变化: enter image description here

我真的不明白为什么,但会感谢你的建议。


回答有关我的 PromQL 查询的可能问题: 我使用 avg 是因为该指标是由多个工作人员收集的,每个工作人员的生活时间约为 1 小时。每个工作进程都会获得一个记录计数,然后在处理记录后减少该数字。因此,工作人员工作的时间越长,与实际计数的偏差就越大,因为其他工作人员也在处理记录。它可能闻起来很糟糕,我需要使用计数器来处理它,但我仍然有兴趣了解如何使用现有的计量指标来解决这个问题。

此外,delta 之前的减号只是为了方便,因为就我而言,减少是好的,增加是坏的。


更新: 这是非聚合数据的样子(查询是 not_processed_records_total): enter image description here 即每个 worker 运行一个小时。它计算数据库中的记录数。这是一项繁重的操作,因此每个工作人员只执行一次,然后每次处理记录时都会减少 Gauge 指标。由于其他进程也可以更改数据库中的记录数量,因此这与实际数量的累积偏差并不显着。但正如您在屏幕截图中看到的那样,不会出现大的跳跃。实际上,avgminmax 聚合显示的结果大致相同(请参阅问题中的第一个屏幕截图)。

现在,当我运行这个时:

-delta(not_processed_records_total[24h]),

我得到以下信息: enter image description here

如果我只选择其中一名 worker : enter image description here

所以每个 worker 都会活一个小时,当它结束时,另一个 worker 就会开始。两个 worker 同时作业,也就几分钟的时间。图表上的 Delta 线从 07:00 的一个小值开始,在一小时内增长到 3542,并保持在 3542,直到第二天 07:00 开始下降,最终在 08 点出现一个小值:00。

因此,似乎 delta 只计算单个工作人员的指标值,@markalex 是对的,如果我对所有 delta 进行求和,我将得到我想要的值需要:

sum(-delta(not_processed_records_total[24h]))

enter image description here

现在该图表看起来像是每 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/

相关文章:

node.js - 如何监控Mongoose连接池

kubernetes - 从 Kube State Metrics 中提取指标时如何在 Prometheus 中获取 Pod 的标签

Grafana alert execution exceeded timeout,为什么会这样?

grafana - 使用 Prometheus 和 Grafana 监控 Scylla db

mysql - 配置 Grafana 仅在查询匹配超过 4 分钟时发出警报

kubernetes - Prometheus 监控 Kubernetes 容器内存使用情况并报告容器使用率是否超过 90%

java - Prometheus 客户端是同步还是异步?

linux - 无法启动服务 prometheus : oci runtime error: container_linux. go:235: 启动容器进程导致 "container init exited prematurely"

java - 普罗米修斯 : How to collect metrics for memory consumption of temporary processes?

javascript - Grafana,编写一个简单的插件,不使用 grunt 或其他什么