如何过滤指定时间范围内首次上报的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开始显示:
- 失败的Job
test-sync-old于2024年1月14日03:00执行,在最近2天的时间范围内过滤kube_job_status_failed{job_name="test-sync-old"} > 0时,该Job的指标曲线从选定时间范围的起始点开始显示:
由于存在大量在选定时间范围之前就已启动的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
相关产品推荐
相关产品推荐

