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

如何过滤指定时间范围内首次上报的kube_job_status_failed指标条目?

问题

kube_job_status_failed是一个常量指标(值为1或0),部分指标条目在选定时间范围之前就已存在。

如何过滤出那些在指定时间范围内首次上报指标的Job?

或者换一种问法:
如何过滤出那些在指定时间范围内创建并完成的Job对应的指标条目?

补充说明

据我理解,kube_job_status_failed指标在Kubernetes Job未被删除的情况下,值会保持为1,直到Job被移除才会变化。

  • 失败的Job test-sync在3小时前执行,在最近2天的时间范围内过滤kube_job_status_failed{job_name="test-sync"} > 0时,该Job的指标曲线从12:00开始显示:
    test-sync指标曲线
  • 失败的Job test-sync-old于2024年1月14日03:00执行,在最近2天的时间范围内过滤kube_job_status_failed{job_name="test-sync-old"} > 0时,该Job的指标曲线从选定时间范围的起始点开始显示:
    test-sync-old指标曲线

由于存在大量在选定时间范围之前就已启动的Job的kube_job_status_failed指标,我希望仅筛选出那些首次上报值出现在选定时间范围内的指标,排除那些在时间范围起始点就已有指标曲线的条目。因此在这个示例中,仅test-sync应该被筛选出来。


解决方案

方法1:基于指标存在性与变化的筛选(无kube_job_created指标时使用)

假设目标时间范围是最近2天(2d),可以用以下PromQL查询:

kube_job_status_failed > 0
and changes(kube_job_status_failed[2d]) > 0
and absent(kube_job_status_failed offset 2d)
  • changes(kube_job_status_failed[2d]) > 0:确保指标在目标时间范围内发生过状态变化(对应首次上报,从无到有)
  • absent(kube_job_status_failed offset 2d):验证时间范围起始点时该指标不存在,排除提前存在的旧Job

方法2:基于Job创建时间的精准筛选(推荐,若有kube_job_created指标)

如果你的Prometheus采集了kube_job_created指标(记录Job创建的Unix时间戳),可以直接通过时间差过滤:

kube_job_status_failed > 0
and time() - kube_job_created < 86400 * 2
  • time() - kube_job_created < 86400*2:计算当前时间与Job创建时间的差值,筛选出最近2天内创建的失败Job,结果更精准

关键注意点

  • 使用changes()方法时,需保证Prometheus的采样间隔能覆盖指标首次上报的时间点,避免漏检状态变化
  • 若Job执行完成后被快速删除,kube_job_status_failed指标会消失,这种场景下changes()依然有效,因为指标的出现和消失都会被计数为变化

内容的提问来源于stack exchange,提问作者goulashsoup

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:27:49