验证 prometheus 指标是不是已更新

Posted

技术标签:

【中文标题】验证 prometheus 指标是不是已更新【英文标题】:Verify prometheus metric was updated验证 prometheus 指标是否已更新 【发布时间】:2021-12-23 20:50:18 【问题描述】:

我想做这样的事情:

time() - timestamp(my_metric)

但它似乎不起作用。有没有办法知道自最新指标更新以来经过了多长时间?

【问题讨论】:

time() - timestamp(node_cpu_num) 对我来说效果很好(Prometheus 2.26.0)。你有什么问题? time() - timestamp(my_metric) 的值对我来说是循环的,尽管 timestamp(my_metric) 是不变的。 @MarceloÁviladeOliveira 你过去做过类似的事情吗?查看指标是否已更新? timestamp(metric) 不是恒定的,它就像 time() 通过“步数”移动。 和 timestamp(my_metric) 对我来说是不变的。 【参考方案1】:

在 Prometheus 2.26.2 上对我来说效果很好。

例如,这是 time() 指标:

这是时间戳(prometheus_build_info)指标:

最后这是 time()-timestamp(prometheus_build_info) 指标:

【讨论】:

如您所见,它的周期在0到60之间的差异加班,这是为什么呢?对我来说,它的周期在 0 到 14 之间 它应该与时间戳(prometheus_build_info)的形状相同,但它不是......为什么 f 不是? "time" 是一条连续的线,"timestamp" 类似于"time",但每次抓取指标时都会更新(在我的情况下为 1 分钟 = 60)。 “时间 - 时间戳”从 0(当“时间戳”刚刚被刮掉时)和 60(当“时间戳”即将再次被刮掉时)变化。查看图片以更好地理解。 哦,我明白了,谢谢!【参考方案2】:

timestamp() 显示最后一次抓取的时间戳(如果指标本身没有时间戳)。即使指标的值没有改变,如果指标被抓取,它也被认为是更新的,因为它存在。因此,time() - timestamp(some_metric) 通常等于您为作业设置的抓取间隔。

如果您想知道值何时发生变化,您有两种选择:

    创建时间戳(量规)指标。每次更改要跟踪的指标的值时,请将时间戳指标的值设置为当前 unixtime。然后,您可以使用如下查询了解自上次更新以来已经过去了多少时间:
    time() - my_timestamp_metric
    
    使用changes()函数。它不会告诉您何时发生了变化,但 如果在给定的时间间隔内发生了变化:
    changes(my_metric[5m])
    
    '0' 表示没有变化;任何其他数字,显然都发生了变化。

【讨论】:

关于 timestamp() 最后一次抓取时间的有用答案!但我需要知道的是它最后一次更新是什么时候,而不是值改变了:)。

以上是关于验证 prometheus 指标是不是已更新的主要内容,如果未能解决你的问题,请参考以下文章

ECS 中 docker 任务的 Prometheus 指标抓取

具有动态标签值的 Prometheus 指标

已安装 prometheus-community / helm-charts 但我无法获取“默认”命名空间的指标

监控 - Prometheus让Docker指标可视化

所有可用指标的 Prometheus 端点

Prometheus:如何检查给定指标和标签组合是不是存在至少一个时间序列?