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

如何让Prometheus针对KubeJobFailed指标仅发送一次告警?

问题与解答:KubeJobFailed仅首次失败触发告警

问题描述

我们通过Prometheus使用表达式kube_job_failed{job="kube-state-metrics",namespace=~".*"} > 0监控KubeJobFailed指标,目前同一失败的Job会触发多次告警(该Job未被标记为已解决)。我们希望仅在Job首次失败时收到告警,不想删除Job,且尝试删除repeat_interval后,仍会遵循默认间隔发送重复告警。当前Alertmanager配置如下:

- match:
    alertname: 'KubeJobFailed'
  repeat_interval: 1h
  receiver: "slack-k8s-dev"
  continue: true

解决方案

要实现仅首次失败触发告警,需要同时调整Prometheus告警规则的表达式和Alertmanager配置,具体如下:

1. 修改Prometheus告警规则的表达式

原表达式只要Job处于失败状态就会持续触发告警,我们需要检测指标从"未失败"到"失败"的状态变化,只在变化发生时触发告警。将表达式修改为:

changes(kube_job_failed{job="kube-state-metrics",namespace=~".*"}[1m]) > 0 
and 
kube_job_failed{job="kube-state-metrics",namespace=~".*"} > 0
  • changes(metric[1m]) > 0 用于检测最近1分钟内指标值发生了变化
  • 结合kube_job_failed > 0确保变化是从0变为1(即Job首次失败)

这样只有当Job刚进入失败状态时,告警才会被触发;之后只要Job保持失败状态,表达式就不会满足,不会重复生成告警。

2. 调整Alertmanager配置

即使修改了表达式,为了避免意外的重复通知,建议将repeat_interval设置为一个极大值(比如365d),确保不会重复发送同一告警:

- match:
    alertname: 'KubeJobFailed'
  repeat_interval: 365d
  receiver: "slack-k8s-dev"
  continue: true

如果完全删除repeat_interval,Alertmanager会使用默认的12小时重复间隔,所以显式设置一个超长间隔更稳妥。

补充说明

  • 这种方式不需要删除失败的Job,只要Job保持失败状态,就不会重复触发告警;如果Job被重新执行再次失败,changes函数会再次检测到状态变化,触发新的告警。
  • 可以根据实际情况调整changes函数中的时间窗口(比如[5m]),适配集群中Job状态更新的频率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:19:57