Alertmanager 架构深度解析:Prometheus 生态核心组件源码剖析
引言
Alertmanager 是 Prometheus 监控生态系统中的核心组件,负责接收 Prometheus Server 发送的告警,对其进行去重、分组、静默、抑制等处理,并通过多种通知渠道(邮件、Slack、钉钉、PagerDuty 等)将告警通知给相关人员。本文基于 Alertmanager v0.28.1 源码,深入分析其架构设计和各模块实现原理。
整体架构概览
Alertmanager 采用模块化架构设计,主要包含以下核心模块:
┌─────────────────────────────────────────────────────────────┐
│ Alertmanager 整体架构 │
├─────────────────┬─────────────────┬─────────────────────────┤
│ HTTP API │ Web UI │ 配置管理 │
├─────────────────┼─────────────────┼─────────────────────────┤
│ │ 告警调度器 (Dispatcher) │
│ ├─────────────────────────────────────────┤
│ 告警接收 │ 路由树 (Route Tree) + 分组逻辑 │
│ ├─────────────────────────────────────────┤
│ │ 通知管道 (Notification Pipeline) │
├─────────────────┼─────────────────┬─────────────────────────┤
│ 静默管理 │ 抑制规则 │ 通知记录 │
│ (Silences) │ (Inhibition) │ (Notification Log) │
├─────────────────┼─────────────────┼─────────────────────────┤
│ │ 集群同步 (Cluster) │
├─────────────────┴─────────────────┴─────────────────────────┤
│ 存储层 (Memory/File-based) │
└─────────────────────────────────────────────────────────────┘
核心模块源码分析
1. 主程序启动流程
从 cmd/alertmanager/main.go
可以看到 Alertmanager 的完整启动流程:
func main() {
// 1. 解析命令行参数和配置
// 2. 初始化集群功能(如果启用)
peer, err := cluster.Create(...)
// 3. 初始化通知日志
notificationLog, err := nflog.New(notificationLogOpts)
// 4. 初始化静默管理
silences, err := silence.New(silenceOpts)
// 5. 初始化告警存储
alerts, err := mem.NewAlerts(...)
// 6. 创建配置协调器,支持热重载
configCoordinator := config.NewCoordinator(...)
configCoordinator.Subscribe(func(conf *config.Config) error {
// 配置变更时重新构建路由树和通知管道
routes := dispatch.NewRoute(conf.Route, nil)
// ...
disp = dispatch.NewDispatcher(...)
go disp.Run()
return nil
})
// 7. 启动 API 服务器
api, err := api.New(...)
}
2. 告警调度器 (Dispatcher) 实现
调度器是 Alertmanager 的核心,负责接收告警并按路由规则分发到不同的通知管道:
// dispatch/dispatch.go
type Dispatcher struct {
route *Route // 路由树
alerts provider.Alerts // 告警存储
stage notify.Stage // 通知管道
marker types.GroupMarker // 状态标记器
aggrGroupsPerRoute map[*Route]map[model.Fingerprint]*aggrGroup
}
func (d *Dispatcher) Run() {
it := d.alerts.Subscribe()
for {
select {
case alert := <-it.Next():
// 遍历匹配的路由
for _, r := range d.route.Match(alert.Labels) {
d.processAlert(alert, r)
}
}
}
}
告警分组机制
Alertmanager 通过聚合组 (Aggregation Group) 实现告警的分组和批量发送:
type aggrGroup struct {
labels model.LabelSet // 分组标签
opts *RouteOpts // 路由选项
alerts *store.Alerts // 组内告警
next *time.Timer // 下次发送时间
}
func (ag *aggrGroup) run(nf notifyFunc) {
for {
select {
case now := <-ag.next.C:
// 等待 group_wait 时间后首次发送
// 后续按 group_interval 间隔发送
ag.flush(nf)
ag.next.Reset(ag.opts.GroupInterval)
}
}
}
分组逻辑基于以下参数:
- group_by: 指定用于分组的标签名
- group_wait: 新分组等待时间,用于收集更多告警
- group_interval: 同一分组后续发送间隔
- repeat_interval: 告警重复发送间隔
3. 通知管道 (Notification Pipeline) 架构
通知管道采用责任链模式,每个阶段处理特定逻辑:
// notify/notify.go
type Stage interface {
Exec(ctx context.Context, l *slog.Logger, alerts ...*types.Alert) (context.Context, []*types.Alert, error)
}
// 管道构建
func (pb *PipelineBuilder) New(...) RoutingStage {
rs := make(RoutingStage, len(receivers))
// 各个阶段
ms := NewGossipSettleStage(peer) // 集群同步等待
is := NewMuteStage(inhibitor) // 抑制处理
tas := NewTimeActiveStage(intervener) // 活跃时间窗口
tms := NewTimeMuteStage(intervener) // 静音时间窗口
ss := NewMuteStage(silencer) // 静默处理
for name := range receivers {
st := createReceiverStage(name, receivers[name], ...)
rs[name] = MultiStage{ms, is, tas, tms, ss, st}
}
return rs
}
多种通知渠道实现
Alertmanager 支持丰富的通知渠道,所有通知器都实现统一的 Notifier
接口:
type Notifier interface {
Notify(context.Context, ...*types.Alert) (bool, error)
}
典型的通知器实现(以 Slack 为例):
// notify/slack/slack.go
func (n *Notifier) Notify(ctx context.Context, alerts ...*types.Alert) (bool, error) {
// 1. 模板渲染
data := notify.GetTemplateData(ctx, n.tmpl, alerts, n.logger)
message := tmpl(n.conf.Text)
// 2. 构建请求
req := slackRequest{
Channel: tmpl(n.conf.Channel),
Text: message,
// ...
}
// 3. 发送请求
resp, err := notify.PostJSON(ctx, n.client, url, &payload)
// 4. 处理响应和重试逻辑
return n.retrier.Check(resp.StatusCode, resp.Body)
}
4. 静默功能 (Silences) 实现
静默功能允许临时屏蔽特定告警,避免在维护期间产生噪音:
// silence/silence.go
type Silences struct {
st state // 静默状态存储
mc matcherCache // 匹配器缓存
version int // 版本号,用于集群同步
}
// 静默匹配逻辑
func (s *Silencer) Mutes(lset model.LabelSet) bool {
fp := lset.Fingerprint()
activeIDs, pendingIDs, markerVersion, _ := s.marker.Silenced(fp)
// 查询所有相关静默规则
allSils, newVersion, err := s.silences.Query(
QState(types.SilenceStateActive, types.SilenceStatePending),
QMatches(lset),
)
// 检查是否有活跃的静默规则匹配
for _, sil := range allSils {
if getState(sil, now) == types.SilenceStateActive {
return true
}
}
return false
}
5. 抑制规则 (Inhibition Rules) 实现
抑制规则用于在高级别告警触发时屏蔽低级别告警:
// inhibit/inhibit.go
type InhibitRule struct {
SourceMatchers labels.Matchers // 源告警匹配器
TargetMatchers labels.Matchers // 目标告警匹配器
Equal map[model.LabelName]struct{} // 必须相等的标签
scache *store.Alerts // 源告警缓存
}
func (ih *Inhibitor) Mutes(lset model.LabelSet) bool {
for _, r := range ih.rules {
if !r.TargetMatchers.Matches(lset) {
continue
}
// 检查是否存在匹配的源告警
if inhibitedByFP, eq := r.hasEqual(lset, r.SourceMatchers.Matches(lset)); eq {
return true
}
}
return false
}
6. 集群功能 (Cluster) 实现
Alertmanager 支持集群部署以实现高可用性,使用 HashiCorp memberlist 库实现 gossip 协议:
// cluster/cluster.go
type Peer struct {
mlist *memberlist.Memberlist // 成员列表
delegate *delegate // 委托处理器
states map[string]State // 状态数据
}
// 状态同步接口
type State interface {
MarshalBinary() ([]byte, error)
Merge(b []byte) error
}
func (p *Peer) AddState(key string, s State, reg prometheus.Registerer) ClusterChannel {
p.states[key] = s
// 返回广播通道,用于状态变更通知
return NewChannel(key, send, peers, sendOversize, ...)
}
集群同步的关键数据包括:
- 静默状态: 确保所有节点的静默规则一致
- 通知日志: 避免重复发送通知
7. 配置管理与热重载
配置协调器 (Coordinator) 负责配置文件的加载和热重载:
// config/coordinator.go
type Coordinator struct {
configFilePath string
config *Config
subscribers []func(*Config) error // 配置变更订阅者
}
func (c *Coordinator) Reload() error {
c.mutex.Lock()
defer c.mutex.Unlock()
// 加载新配置
if err := c.loadFromFile(); err != nil {
return err
}
// 通知所有订阅者
return c.notifySubscribers()
}
8. REST API 层设计
Alertmanager 提供完整的 REST API,基于 OpenAPI 规范自动生成:
// api/v2/api.go
type API struct {
silences *silence.Silences
alerts provider.Alerts
alertGroups groupsFn
getAlertStatus getAlertStatusFn
}
// 告警查询接口
func (api *API) getAlertsHandler(params alert_ops.GetAlertsParams) middleware.Responder {
// 解析过滤条件
matchers, err := parseFilter(params.Filter)
// 应用告警过滤器
alertFilter := api.alertFilter(matchers, *params.Silenced, *params.Inhibited, *params.Active)
// 遍历告警并应用过滤条件
for a := range alerts.Next() {
if !alertFilter(a, now) {
continue
}
res = append(res, AlertToOpenAPIAlert(a, ...))
}
return alert_ops.NewGetAlertsOK().WithPayload(res)
}
告警处理流程
完整的告警处理流程
关键时间参数说明
- group_wait: 新分组等待收集告警的时间
- group_interval: 同一分组后续批量发送的间隔
- repeat_interval: 告警重复通知的间隔
- resolve_timeout: 告警自动解决的超时时间
高可用性设计
1. 集群架构
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Alertmanager-1 │ │ Alertmanager-2 │ │ Alertmanager-3 │
│ │ │ │ │ │
│ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │ Gossip │◄┼────┼►│ Gossip │◄┼────┼►│ Gossip │ │
│ │ Protocol │ │ │ │ Protocol │ │ │ │ Protocol │ │
│ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │
│ │ │ │ │ │
│ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │ Silences │ │ │ │ Silences │ │ │ │ Silences │ │
│ │ NfLog │ │ │ │ NfLog │ │ │ │ NfLog │ │
│ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
2. 状态同步机制
- Gossip 协议: 基于 memberlist 实现节点发现和故障检测
- 状态同步: 静默规则和通知日志在集群间自动同步
- 去重保证: 确保同一告警只会发送一次通知
3. 分区容忍性
即使集群发生网络分区,每个分区仍能独立工作,分区恢复后自动同步状态。
性能优化设计
1. 内存管理
- 告警存储: 使用内存存储提供快速访问
- LRU 缓存: 匹配器缓存避免重复编译
- 定期清理: 自动清理过期告警和静默规则
2. 并发处理
- 通知并发: 不同接收器的通知并行发送
- 分组独立: 不同聚合组独立处理
- 无锁设计: 大部分数据结构采用无锁或读写分离设计
3. 资源限制
// 支持配置各种限制参数
type Limits struct {
MaxNumberOfAggregationGroups() int // 最大聚合组数量
MaxSilences() int // 最大静默规则数量
MaxSilenceSizeBytes() int // 单个静默规则最大字节数
}
最佳实践建议
1. 路由配置设计
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 30s # 新组等待时间
group_interval: 5m # 组间隔
repeat_interval: 12h # 重复间隔
receiver: 'default'
routes:
- matchers:
- severity="critical"
receiver: 'critical-pager'
group_wait: 10s # 紧急告警快速响应
repeat_interval: 5m
- matchers:
- severity="warning"
receiver: 'warning-email'
group_wait: 2m
repeat_interval: 2h
2. 静默策略
# 维护窗口静默
- matchers:
- service="api"
- env="prod"
startsAt: "2024-01-15T02:00:00Z"
endsAt: "2024-01-15T06:00:00Z"
comment: "Scheduled maintenance"
3. 抑制规则设计
inhibit_rules:
# 服务宕机时抑制其他相关告警
- source_matchers:
- alertname="ServiceDown"
target_matchers:
- alertname="HighLatency"
- alertname="HighErrorRate"
equal: ['service', 'cluster']
监控与调试
1. 关键指标
alertmanager_notifications_total
: 通知发送总数alertmanager_silences
: 各状态静默规则数量alertmanager_dispatcher_aggregation_groups
: 活跃聚合组数量alertmanager_cluster_members
: 集群成员数量
2. 调试工具
- amtool: 命令行工具,支持告警和静默管理
- Web UI: 直观的 Web 界面查看告警状态
- API 接口: 完整的 REST API 用于集成和自动化
总结
Alertmanager 作为 Prometheus 生态的告警处理中心,其架构设计体现了以下核心思想:
- 模块化设计: 各功能模块职责清晰,易于维护和扩展
- 可靠性保证: 通过集群部署、状态同步、重试机制确保告警不丢失
- 灵活的路由: 强大的路由和分组机制满足复杂的告警处理需求
- 丰富的通知渠道: 支持多种主流通知方式,易于集成
- 运维友好: 提供完善的管理工具和监控指标
通过深入理解 Alertmanager 的源码实现,我们可以更好地配置和使用这一强大的告警管理工具,构建可靠的监控告警体系。
本文基于 Alertmanager v0.28.1 源码分析,更多技术细节请参考官方文档和源代码仓库。