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
- env2. 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
LowTraffic4. 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
teamrules:
equal labels 必须能表达“同一影响范围”
不要只用 env 做 equal,范围太大
不要把 instance 放进所有 equal,范围可能太小
service / env 通常是服务告警的基础 equal
cluster / node 通常是基础设施告警的基础 equal8. 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_by9. 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 review11. References#
- Alertmanager configuration: https://prometheus.io/docs/alerting/latest/configuration/#inhibit_rule
- Alertmanager overview: https://prometheus.io/docs/alerting/latest/overview/