Inhibition

Alertmanager Inhibition#

Inhibition 用来在某些高级别告警已经触发时,自动抑制相关的低级别告警,避免告警风暴。

核心目的:
    根因告警已经出现时,不再重复发送下游症状告警

典型场景:
    critical 抑制 warning
    service down 抑制 high latency / high error rate
    node down 抑制该 node 上的 pod / container 告警
    cluster unavailable 抑制 namespace / workload 级别告警

1. Mental Model#

source alert:
    已经触发的高优先级 / 根因告警

target alert:
    被抑制的低优先级 / 症状告警

equal:
    source 和 target 必须相同的 labels
    只有这些 labels 相同,抑制才会生效
inhibit_rules:
  - source_matchers:
      - severity="critical"
    target_matchers:
      - severity="warning"
    equal:
      - alertname
      - service
      - env

2. Best Practice: Critical Suppresses Warning#

同一个服务、同一个环境、同一个 alertname 下,critical 触发后抑制 warning。

inhibit_rules:
  - source_matchers:
      - severity="critical"
    target_matchers:
      - severity="warning"
    equal:
      - alertname
      - service
      - env

适合:

HighHttpErrorRate warning:
    error rate > 2%

HighHttpErrorRate critical:
    error rate > 10%

3. Best Practice: Service Down Suppresses Symptoms#

服务已经不可用时,抑制这个服务的延迟、错误率、流量异常等症状告警。

inhibit_rules:
  - source_matchers:
      - alertname="ServiceDown"
      - severity="critical"
    target_matchers:
      - severity=~"warning|critical"
      - alertname=~"HighHttpErrorRate|HighP95Latency|LowTraffic|HighCpuUsage"
    equal:
      - service
      - env

适合:

ServiceDown:
    up{service="order-api"} == 0

被抑制:
    HighHttpErrorRate
    HighP95Latency
    LowTraffic

4. Best Practice: Node Down Suppresses Workload Alerts#

节点已经 down 时,抑制这个节点上的 pod / container 相关告警。

inhibit_rules:
  - source_matchers:
      - alertname="NodeDown"
      - severity="critical"
    target_matchers:
      - alertname=~"PodNotReady|ContainerRestarting|ContainerHighCpu|ContainerHighMemory"
    equal:
      - cluster
      - node

适合 Kubernetes / VM 混合环境:

NodeDown 是根因
PodNotReady / ContainerRestarting 很可能是下游症状

5. Best Practice: Cluster Down Suppresses Lower Level Alerts#

集群级别不可用时,抑制 namespace / workload / pod 级别告警。

inhibit_rules:
  - source_matchers:
      - alertname="ClusterUnavailable"
      - severity="critical"
    target_matchers:
      - severity=~"warning|critical"
    equal:
      - cluster
      - env

注意:

这个规则影响范围很大
必须确保 ClusterUnavailable 非常可靠
否则可能误抑制大量真实告警

6. Best Practice: Dependency Down Suppresses Caller Symptoms#

核心依赖已经不可用时,抑制调用方的部分症状告警。

inhibit_rules:
  - source_matchers:
      - alertname="DatabaseDown"
      - severity="critical"
    target_matchers:
      - alertname=~"HighHttpErrorRate|HighP95Latency|JobFailures"
    equal:
      - env
      - database

适合:

DatabaseDown:
    database="orders"

被抑制:
    依赖 orders database 的服务错误率 / 延迟 / job 失败

前提:

target alerts 必须也有 database label
否则无法通过 equal 精准关联

7. Label Design For Inhibition#

抑制规则是否好用,很大程度取决于 alert label 设计。

recommended labels:
    alertname
    severity
    service
    env
    region
    cluster
    namespace
    node
    dependency
    database
    team
rules:
    equal labels 必须能表达“同一影响范围”
    不要只用 env 做 equal,范围太大
    不要把 instance 放进所有 equal,范围可能太小
    service / env 通常是服务告警的基础 equal
    cluster / node 通常是基础设施告警的基础 equal

8. Anti-patterns#

❌ 只按 severity 抑制
    critical 会抑制全局所有 warning,范围过大

❌ equal 太少
    例如只写 env,会导致 prod 一个服务故障抑制其他服务告警

❌ equal 太多
    例如加入 pod / instance,导致根因和症状 label 对不上,抑制不生效

❌ 用不稳定 label 做 equal
    pod name / container id / endpoint path 变化频繁

❌ 抑制规则没有测试
    配置看起来合理,但实际 firing 后没有生效

❌ 用 inhibition 代替修复告警规则
    噪音太大时,先检查 alert expression / for / threshold / group_by

9. Test Inhibition#

检查配置:

amtool check-config alertmanager.yml

查看当前告警:

amtool alert query

查看 inhibition 是否生效:

amtool alert query --alertmanager.url=http://localhost:9093

建议:

每新增一条 inhibit rule:
    1. 写清楚 source alert
    2. 写清楚 target alert
    3. 写清楚 equal labels 的理由
    4. 在测试环境构造 firing alert 验证

10. Practical Checklist#

Before adding an inhibit rule:
    [ ] source alert 是否代表更接近根因的问题
    [ ] target alert 是否确实是 source 的下游症状
    [ ] equal labels 是否表达同一影响范围
    [ ] 是否避免了过宽抑制
    [ ] 是否避免了过窄抑制
    [ ] source alert 是否足够可靠
    [ ] 是否有测试或演练
    [ ] 是否写进 Git review

11. References#