如何基于未重置的Prometheus Counter指标统计指定时段新增失败作业数?
问题
我有一个代表唯一命名作业状态的Prometheus Counter指标,该指标在记录后不会重置,只要作业记录存在,对应的时间序列就长期保持为1。我原本用PromQL查询统计过去24小时内的失败作业数量:
sum(status_metric{status="Failed"}) by(status)
但因为24小时前上报状态的作业指标仍为1,这些旧作业被错误计入结果,不符合预期。
举个例子:
- job_1和job_2在1月1日完成执行并上报状态,持续上报至1月2日22:00
- job_3在1月2日5:00完成并上报状态
目标是统计1月1日22:00至1月2日22:00的失败作业数(假设仅job_3在此期间失败),预期结果应为1,但原查询会返回3。
如何统计仅在指定时段内触发的状态事件,排除旧事件对应的指标值?
解决方案
针对这种不会重置的Counter指标,要统计指定时段内**首次上报(即作业完成)**的失败作业,有两种可行的PromQL写法:
方法1:利用increase函数识别时段内的指标新增
因为Counter类型指标只会递增,这类长期保持1的指标只有在首次上报时会从0变为1,后续保持不变。用increase函数检测过去24小时内的指标增量,筛选出增量大于0的条目再统计数量:
count(increase(status_metric{status="Failed"}[24h]) > 0)
increase(metric[24h]):计算指标在过去24小时内的增量,首次上报的作业返回1,旧作业返回0> 0:筛选出时段内新增的失败作业count():统计符合条件的作业数量
方法2:用timestamp函数判断指标的起始时间
如果Prometheus保留了指标的首次出现时间,可以通过时间差判断是否在目标时段内:
count(status_metric{status="Failed"} and on() (time() - timestamp(status_metric{status="Failed"}) <= 86400))
time() - timestamp(metric):计算当前时间与指标首次出现时间的差值(单位:秒)<= 86400:筛选出首次出现时间在过去24小时内的作业count():统计数量
注意事项
- 如果作业会重复执行并重新上报状态,建议在指标标签中加入作业的唯一执行ID(比如
job_id="xxx_20240102"),避免同一作业多次执行的状态被重复统计 - 确保Prometheus的scrape配置正确,旧作业停止上报后,对应的时间序列会在
scrape_timeout后被标记为stale,不会影响后续统计
内容的提问来源于stack exchange,提问作者Nizar Hattab
相关产品推荐
相关产品推荐

