Alertmanager 架构
Alertmanager 是 Prometheus 生态系统中的告警处理中枢,负责接收 Prometheus Server 推送的告警,进行去重、分组、抑制、静默等处理后,将告警路由到正确的接收者。理解 Alertmanager 的工作机制是构建可靠告警系统的关键。
核心处理流程
Alertmanager 对告警的处理分为四个阶段:
接收(Receiving):Alertmanager 通过 HTTP API 接收来自 Prometheus 的告警。每个告警包含 labels、annotations、以及告警状态(firing/resolved)。Prometheus 通过 alerting.alertmanager_configs 配置指向 Alertmanager 实例。
去重(Deduplication):Alertmanager 会将相同的告警合并。如果在去重超时时间内收到相同 label 的告警,会被识别为同一条告警,不会重复发送。去重超时通过 group_wait 配置。
分组(Grouping):将相似的告警归为一组,便于批量处理。分组键由告警的 group_by labels 决定。例如,所有 CPU 相关的告警可以分到同一组,通过一条通知发送。
路由(Routing):根据路由树将告警发送到对应的接收器。路由匹配基于告警的 labels,支持复杂的匹配规则和嵌套路由。
分组机制详解
分组是 Alertmanager 最强大的功能之一。假设某个微服务集群中有 20 个实例同时宕机,如果没有分组,系统会发送 20 条告警,造成告警风暴。启用分组后,这些告警可以被合并为一条。
group_wait 的设置需要权衡:太短会导致分组不完全,太长则延迟告警通知时间。对于 critical 级别的告警,建议 group_wait 设置在 30s 左右。
抑制机制
抑制(Inhibition)用于在某些告警触发时,自动屏蔽相关的其他告警。例如,当整个集群不可用时,不需要再单独通知每个实例的故障。
上述配置表示:当 ClusterDown 告警触发时,同一 cluster 下的所有 InstanceDown 告警会被抑制。equal 字段指定了需要匹配的 label 名称。
抑制机制需要谨慎使用。过度抑制会导致重要信息被遗漏。建议只在明确的因果关系场景下使用。
静默规则
静默(Silence)用于临时屏蔽某些告警,常见于:计划内维护窗口、已知的可忽略告警。静默规则可以通过 Alertmanager Web UI 创建,也可以通过 API 自动化管理。
高可用部署
生产环境中,Alertmanager 应该部署多个实例形成集群。通过 Gossip 协议同步告警状态,任一实例宕机不影响告警分发。HA 配置相对简单:
Prometheus 需要配置所有 Alertmanager 实例地址,发送告警时会同时向所有实例推送。