flowchart TD
A[告警流入 Alertmanager] --> B{是否匹配抑制规则?}
B -- 否 --> E[正常进入分发/通知流程]
B -- 是 --> C[遍历所有 InhibitRule]
C --> D{目标告警是否匹配 TargetMatchers?}
D -- 否 --> C
D -- 是 --> F{是否存在源告警满足 SourceMatchers 且 Equal 标签相等?}
F -- 否 --> C
F -- 是 --> G[该告警被抑制, 不再通知]
C -->|遍历完所有规则| H{是否被抑制?}
H -- 是 --> G
H -- 否 --> E
subgraph 规则说明
direction LR
X1[InhibitRule: 定义 SourceMatchers, TargetMatchers, Equal标签]
X2[SourceMatchers: 源告警匹配条件]
X3[TargetMatchers: 目标告警匹配条件]
X4[Equal: 源/目标需相等的标签名]
X1 --> X2
X1 --> X3
X1 --> X4
end
style G fill:#f9f,stroke:#333,stroke-width:2px
style E fill:#bbf,stroke:#333,stroke-width:2px
style B fill:#ffd,stroke:#333,stroke-width:1px
style D fill:#ffd,stroke:#333,stroke-width:1px
style F fill:#ffd,stroke:#333,stroke-width:1px
style H fill:#ffd,stroke:#333,stroke-width:1px
// run 负责监听告警流的变化,并实时更新抑制规则的缓存。 // ctx: 上下文,用于取消监听 func(ih *Inhibitor) run(ctx context.Context) { it := ih.alerts.Subscribe() // 订阅告警流 defer it.Close()
for { select { case <-ctx.Done(): return case a := <-it.Next(): if err := it.Err(); err != nil { ih.logger.Error("Error iterating alerts", "err", err) continue } // 更新每条抑制规则的源告警缓存 for _, r := range ih.rules { if r.SourceMatchers.Matches(a.Labels) { if err := r.scache.Set(a); err != nil { ih.logger.Error("error on set alert", "err", err) } } } } } }