我可以找到最后一次值更改的时间戳吗

Can I find the timestamp of the last value change

给定一个时间序列,是否可以找到最后一次值更改的时间戳?

例如,cron 作业每晚运行。它首先运行一个 rsync 作业,然后计算目标目录的大小。实际的指标值并不是那么重要,但我想验证它实际上每晚都在变化。

是否可以创建一个查询,其中 return 标量值带有上次值更改的时间戳?

处理此问题的标准方法是推送一个指标,其值为批处理作业成功的 unix 时间戳。然后您可以提醒该值足够新。

https://www.robustperception.io/monitoring-batch-jobs-in-python/ 有一个 Python 例子。

不,你不能那样做。

对于许多用例,都有解决方法。我的没有。

Prometheus 提供了changes 函数,可用于确定时间序列样本在方括号中给定的lookbehind window 上的变化次数。例如,以下查询 returns 最近 5 分钟内名称为 metric_name 的时间序列的样本值更改次数:

changes(metric_name[5m])

可以通过在查询中添加 > 0 来过滤掉零个更改。以下查询 returns non-empty 只有在过去 5 分钟内至少有一个样本值发生变化时才会产生结果:

changes(metric_name[5m]) > 0

不幸的是,Prometheus 不提供返回最后一个 non-empty 值的时间戳的功能:(

如果您仍然需要获取最后一次值更改的时间戳,则 VictoriaMetrics may come to rescue with tlast_over_time function. The following MetricsQL 查询 returns 最后一次值更改的时间戳 metric_name 如果在过去 24 小时内进行了更改:

tlast_over_time(changes(metric_name[5m])[24h:1m])

此查询使用 subquery feature.

P.S。 VictoriaMetrics 从 v1.77.0 开始提供 tlast_change_over_time 功能。此函数 returns 方括号中给定 lookbehind window 上最后一次值更改的时间戳(以秒为单位)。例如,以下查询大部分等同于上面的查询。唯一的区别是它 returns 原始样本最后一次更改的确切时间戳:

tlast_change_over_time(metric_name[24h])