Alertmanager #

一、Alertmanager概述 #

1.1 什么是Alertmanager #

text
Alertmanager定义:

┌─────────────────────────────────────────────┐
│ Alertmanager                                │
├─────────────────────────────────────────────┤
│ • 处理Prometheus发送的告警                  │
│ • 去重、分组、路由                          │
│ • 静默和抑制                                │
│ • 发送到各种通知渠道                        │
└─────────────────────────────────────────────┘

核心功能:

┌─────────────────────────────────────────────┐
│ 1. 去重(Deduplication)                    │
├─────────────────────────────────────────────┤
│ • 相同告警只发送一次                        │
│ • 避免告警风暴                              │
└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐
│ 2. 分组(Grouping)                         │
├─────────────────────────────────────────────┤
│ • 相似告警合并                              │
│ • 减少通知数量                              │
└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐
│ 3. 路由(Routing)                          │
├─────────────────────────────────────────────┤
│ • 根据标签分发                              │
│ • 发送到不同接收者                          │
└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐
│ 4. 静默(Silencing)                        │
├─────────────────────────────────────────────┤
│ • 临时屏蔽告警                              │
│ • 维护期间使用                              │
└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐
│ 5. 抑制(Inhibition)                       │
├─────────────────────────────────────────────┤
│ • 高优先级抑制低优先级                      │
│ • 避免重复告警                              │
└─────────────────────────────────────────────┘

二、安装部署 #

2.1 二进制安装 #

bash
# 下载
cd /tmp
wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz

# 解压
tar xvfz alertmanager-0.26.0.linux-amd64.tar.gz

# 移动
sudo mv alertmanager-0.26.0.linux-amd64 /usr/local/alertmanager

# 创建数据目录
sudo mkdir -p /var/lib/alertmanager

# 创建用户
sudo useradd -rs /bin/false alertmanager
sudo chown -R alertmanager:alertmanager /usr/local/alertmanager
sudo chown -R alertmanager:alertmanager /var/lib/alertmanager

# 创建服务
sudo tee /etc/systemd/system/alertmanager.service <<EOF
[Unit]
Description=Alertmanager
After=network.target

[Service]
User=alertmanager
Group=alertmanager
Type=simple
ExecStart=/usr/local/alertmanager/alertmanager \
    --config.file=/usr/local/alertmanager/alertmanager.yml \
    --storage.path=/var/lib/alertmanager

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
sudo systemctl daemon-reload
sudo systemctl start alertmanager
sudo systemctl enable alertmanager

2.2 Docker安装 #

bash
# 基本运行
docker run -d \
    --name alertmanager \
    -p 9093:9093 \
    -v $(pwd)/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
    prom/alertmanager

# 带数据持久化
docker run -d \
    --name alertmanager \
    -p 9093:9093 \
    -v $(pwd)/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
    -v alertmanager_data:/alertmanager \
    prom/alertmanager

三、配置文件 #

3.1 基本配置 #

yaml
# alertmanager.yml

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'severity']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'default-receiver'

receivers:
  - name: 'default-receiver'
    email_configs:
      - to: 'admin@example.com'
        from: 'alertmanager@example.com'
        smarthost: 'smtp.example.com:587'
        auth_username: 'alertmanager@example.com'
        auth_password: 'password'

inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'instance']

3.2 全局配置 #

yaml
global:
  # 解析超时
  resolve_timeout: 5m
  
  # SMTP配置
  smtp_smarthost: 'smtp.example.com:587'
  smtp_from: 'alertmanager@example.com'
  smtp_auth_username: 'alertmanager@example.com'
  smtp_auth_password: 'password'
  smtp_require_tls: true
  
  # Slack配置
  slack_api_url: 'https://hooks.slack.com/services/xxx'
  
  # PagerDuty配置
  pagerduty_url: 'https://events.pagerduty.com/v2/enqueue'
  
  # OpsGenie配置
  opsgenie_api_url: 'https://api.opsgenie.com/'
  
  # WeChat配置
  wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
  wechat_api_secret: 'xxx'
  wechat_api_corp_id: 'xxx'

3.3 路由配置 #

yaml
route:
  # 分组标签
  group_by: ['alertname', 'severity']
  
  # 等待时间(同组告警等待合并)
  group_wait: 30s
  
  # 发送间隔(同组新告警发送间隔)
  group_interval: 5m
  
  # 重复间隔(重复告警发送间隔)
  repeat_interval: 1h
  
  # 默认接收者
  receiver: 'default-receiver'
  
  # 子路由
  routes:
    # 严重告警
    - match:
        severity: critical
      receiver: 'critical-receiver'
      group_wait: 10s
      repeat_interval: 5m
    
    # 警告告警
    - match:
        severity: warning
      receiver: 'warning-receiver'
      group_wait: 1m
      repeat_interval: 30m
    
    # 特定服务
    - match_re:
        service: ^(api|web)$
      receiver: 'service-team-receiver'
    
    # 正则匹配
    - match_re:
        alertname: ^(HighCPU|HighMemory).*$
      receiver: 'infrastructure-team'

3.4 接收者配置 #

yaml
receivers:
  # Email接收者
  - name: 'email-receiver'
    email_configs:
      - to: 'admin@example.com'
        send_resolved: true

  # Slack接收者
  - name: 'slack-receiver'
    slack_configs:
      - channel: '#alerts'
        send_resolved: true
        title: '{{ .Status | toUpper }}: {{ .CommonAnnotations.summary }}'
        text: '{{ .CommonAnnotations.description }}'

  # PagerDuty接收者
  - name: 'pagerduty-receiver'
    pagerduty_configs:
      - service_key: 'xxx'
        severity: critical
        description: '{{ .CommonAnnotations.summary }}'

  # Webhook接收者
  - name: 'webhook-receiver'
    webhook_configs:
      - url: 'http://webhook.example.com/alerts'
        send_resolved: true

  # 企业微信接收者
  - name: 'wechat-receiver'
    wechat_configs:
      - corp_id: 'xxx'
        to_party: '1'
        agent_id: 'xxx'
        api_secret: 'xxx'
        message: '{{ .Status }}: {{ .CommonAnnotations.summary }}'

  # 多接收者
  - name: 'multi-receiver'
    email_configs:
      - to: 'admin@example.com'
    slack_configs:
      - channel: '#alerts'
    webhook_configs:
      - url: 'http://webhook.example.com/alerts'

3.5 抑制规则 #

yaml
inhibit_rules:
  # 严重告警抑制警告告警
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'instance']

  # 节点宕机抑制该节点的所有告警
  - source_match:
      alertname: 'InstanceDown'
    target_match_re:
      alertname: '.*'
    equal: ['instance']

  # 服务不可用抑制该服务的所有告警
  - source_match:
      alertname: 'ServiceDown'
    target_match_re:
      alertname: '.*'
    equal: ['service']

四、告警生命周期 #

text
告警生命周期:

┌─────────────────────────────────────────────┐
│ 1. Prometheus评估告警规则                   │
├─────────────────────────────────────────────┤
│ • 定期评估告警表达式                        │
│ • 条件满足时触发告警                        │
└─────────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────┐
│ 2. 发送到Alertmanager                       │
├─────────────────────────────────────────────┤
│ • Prometheus发送告警到Alertmanager          │
│ • 包含告警信息和标签                        │
└─────────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────┐
│ 3. Alertmanager处理告警                     │
├─────────────────────────────────────────────┤
│ • 去重:相同告警合并                        │
│ • 分组:相似告警合并                        │
│ • 抑制:检查抑制规则                        │
│ • 静默:检查静默规则                        │
└─────────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────┐
│ 4. 路由和发送                               │
├─────────────────────────────────────────────┤
│ • 根据路由规则分发                          │
│ • 发送到对应的接收者                        │
└─────────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────┐
│ 5. 告警恢复                                 │
├─────────────────────────────────────────────┤
│ • 条件不满足时发送恢复通知                  │
│ • 标记告警为已恢复                          │
└─────────────────────────────────────────────┘

五、静默管理 #

5.1 创建静默 #

bash
# 通过Web UI创建
# 访问 http://localhost:9093/silences

# 通过API创建
curl -X POST http://localhost:9093/api/v1/silences -d '{
  "matchers": [
    {
      "name": "instance",
      "value": "localhost:9090",
      "isRegex": false
    }
  ],
  "startsAt": "2024-01-01T00:00:00Z",
  "endsAt": "2024-01-01T01:00:00Z",
  "createdBy": "admin",
  "comment": "Maintenance window"
}'

5.2 查看静默 #

bash
# 列出所有静默
curl http://localhost:9093/api/v1/silences

# 查看特定静默
curl http://localhost:9093/api/v1/silence/<silence_id>

5.3 删除静默 #

bash
# 删除静默
curl -X DELETE http://localhost:9093/api/v1/silence/<silence_id>

六、高可用配置 #

6.1 集群模式 #

yaml
# alertmanager.yml (集群模式)

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'default-receiver'

receivers:
  - name: 'default-receiver'
    email_configs:
      - to: 'admin@example.com'
bash
# 启动集群节点1
alertmanager \
    --config.file=alertmanager.yml \
    --storage.path=/var/lib/alertmanager \
    --cluster.listen-address=0.0.0.0:9094 \
    --cluster.peer=alertmanager2:9094 \
    --cluster.peer=alertmanager3:9094

# 启动集群节点2
alertmanager \
    --config.file=alertmanager.yml \
    --storage.path=/var/lib/alertmanager \
    --cluster.listen-address=0.0.0.0:9094 \
    --cluster.peer=alertmanager1:9094 \
    --cluster.peer=alertmanager3:9094

6.2 Prometheus配置 #

yaml
# prometheus.yml

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - 'alertmanager1:9093'
          - 'alertmanager2:9093'
          - 'alertmanager3:9093'

七、Web UI #

7.1 访问Web UI #

text
访问地址:http://localhost:9093

功能:
├── Alerts:查看当前告警
├── Silences:管理静默
├── Status:查看状态
└── Help:帮助信息

7.2 API接口 #

bash
# 查看告警
curl http://localhost:9093/api/v1/alerts

# 查看状态
curl http://localhost:9093/api/v1/status

# 查看接收者
curl http://localhost:9093/api/v1/receivers

# 重载配置
curl -X POST http://localhost:9093/-/reload

八、总结 #

Alertmanager核心功能:

功能 说明
去重 相同告警只发送一次
分组 相似告警合并
路由 根据标签分发
静默 临时屏蔽告警
抑制 高优先级抑制低优先级

配置要点:

配置项 说明
route 路由规则
receivers 接收者配置
inhibit_rules 抑制规则

下一步,让我们学习告警最佳实践!

最后更新:2026-03-27