You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于未重置的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 00:01:21