强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

07 - 告警管理

07 - 告警管理

7.1 告警体系概述

Prometheus 的告警系统由两部分组成:

┌──────────────────┐    告警触发     ┌───────────────────┐    通知分发     ┌──────────────┐
│  Prometheus      │ ─────────────► │  Alertmanager     │ ─────────────► │  通知渠道     │
│  Server          │                │                   │                │              │
│  (告警规则评估)    │                │  · 分组            │                │ · Email      │
│                  │                │  · 路由            │                │ · Slack      │
│  rule_files      │                │  · 抑制            │                │ · 钉钉       │
│                  │                │  · 静默            │                │ · PagerDuty  │
│                  │                │  · 去重            │                │ · Webhook    │
└──────────────────┘                └───────────────────┘                └──────────────┘

告警生命周期

    触发 ──► 发送 ──► 分组 ──► 路由 ──► 通知
     │        │        │        │        │
     ▼        ▼        ▼        ▼        ▼
  持续中    恢复     合并     匹配     推送
  (firing) (resolved) (group) (route) (notify)
状态说明
pending触发条件满足但未持续达到 for 时间
firing持续满足条件,正式发送告警
resolved条件不再满足,发送恢复通知

7.2 Alertmanager 安装与配置

安装

# 下载
ALERTMANAGER_VERSION="0.27.0"
wget https://github.com/prometheus/alertmanager/releases/download/v${ALERTMANAGER_VERSION}/alertmanager-${ALERTMANAGER_VERSION}.linux-amd64.tar.gz

# 解压安装
tar xvfz alertmanager-${ALERTMANAGER_VERSION}.linux-amd64.tar.gz
sudo cp alertmanager-${ALERTMANAGER_VERSION}.linux-amd64/alertmanager /usr/local/bin/
sudo cp alertmanager-${ALERTMANAGER_VERSION}.linux-amd64/amtool /usr/local/bin/

# Docker
docker run -d \
  --name=alertmanager \
  -p 9093:9093 \
  -v $(pwd)/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
  prom/alertmanager:v0.27.0

Systemd 服务

# /etc/systemd/system/alertmanager.service
[Unit]
Description=Alertmanager
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/bin/alertmanager \
  --config.file=/etc/alertmanager/alertmanager.yml \
  --storage.path=/var/lib/alertmanager/ \
  --web.listen-address=0.0.0.0:9093 \
  --cluster.listen-address=0.0.0.0:9094
Restart=always

[Install]
WantedBy=multi-user.target

配置文件

# /etc/alertmanager/alertmanager.yml
global:
  resolve_timeout: 5m
  smtp_from: '[email protected]'
  smtp_smarthost: 'smtp.example.com:587'
  smtp_auth_username: '[email protected]'
  smtp_auth_password: 'password'
  smtp_require_tls: true
  slack_api_url: 'https://hooks.slack.com/services/xxx/yyy/zzz'

# 模板
templates:
  - '/etc/alertmanager/templates/*.tmpl'

# 路由
route:
  receiver: 'default-receiver'
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  
  routes:
    - match:
        severity: 'critical'
      receiver: 'critical-receiver'
      group_wait: 10s
      
    - match:
        severity: 'warning'
      receiver: 'warning-receiver'
      
    - match_re:
        service: '^(api|web)$'
      receiver: 'service-receiver'
      
    - match:
        severity: 'info'
      receiver: 'info-receiver'
      repeat_interval: 24h

# 抑制
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'cluster', 'service']

# 接收器
receivers:
  - name: 'default-receiver'
    email_configs:
      - to: '[email protected]'
        
  - name: 'critical-receiver'
    pagerduty_configs:
      - routing_key: 'xxx'
    email_configs:
      - to: '[email protected]'
        
  - name: 'warning-receiver'
    slack_configs:
      - channel: '#alerts-warning'
        title: '{{ template "slack.title" . }}'
        text: '{{ template "slack.text" . }}'
        
  - name: 'info-receiver'
    webhook_configs:
      - url: 'http://bot:8080/alert'
        
  - name: 'service-receiver'
    webhook_configs:
      - url: 'http://webhook:9095/alert'

7.3 路由(Route)

路由决定告警发送到哪个接收器。

路由匹配规则

                         ┌──────────────────────┐
                         │    Route (根)          │
                         │    receiver: default   │
                         │    group_by: [...]     │
                         └──────────┬────────────┘
                                    │
                    ┌───────────────┼───────────────┐
                    ▼               ▼               ▼
          ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
          │ severity=   │ │ severity=   │ │ service=    │
          │ critical    │ │ warning     │ │ api|web     │
          │ → critical  │ │ → warning   │ │ → service   │
          │   receiver  │ │   receiver  │ │   receiver  │
          └─────────────┘ └─────────────┘ └─────────────┘

路由字段说明

字段说明
match精确标签匹配
match_re正则标签匹配
receiver接收器名称
group_by分组标签
group_wait初始等待时间(等待同组更多告警)
group_interval同组告警发送间隔
repeat_interval重复发送间隔
continue是否继续匹配后续路由

分组机制

告警流:
  T=0s:   alertA(node1) ──┐
  T=5s:   alertB(node1) ──┤ group_wait: 30s
  T=15s:  alertC(node1) ──┘
  T=30s:  发送所有 node1 的告警(合并为一封通知)
  T=5m:   alertD(node1) ──► group_interval: 5m
  T=10m:  alertD 仍然 firing ──► repeat_interval: 4h
  T=4h10m: 重复发送 alertD

7.4 抑制(Inhibition)

抑制规则允许在某些告警活跃时自动抑制其他相关告警。

inhibit_rules:
  # 当 critical 级别告警触发时,抑制同名的 warning 告警
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'cluster', 'service']

  # 当节点宕机时,抑制该节点的所有其他告警
  - source_match:
      alertname: 'InstanceDown'
    target_match_re:
      alertname: '.+'
    equal: ['instance']

抑制示例

场景:节点 node1 宕机

触发的告警:
  1. InstanceDown(node1) [critical]     ← 源
  2. HighCPU(node1) [warning]           ← 被抑制
  3. HighMemory(node1) [warning]        ← 被抑制
  4. DiskSpaceLow(node1) [warning]      ← 被抑制

结果:只发送 InstanceDown 告警,避免告警风暴

7.5 静默(Silence)

静默用于临时屏蔽特定告警(如维护窗口期间)。

通过 Web UI 创建

  1. 访问 http://localhost:9093/#/silences
  2. 点击 “New Silence”
  3. 设置匹配条件和有效期
  4. 创建

通过 amtool 创建

# 创建静默(2小时)
amtool silence add alertname="InstanceDown" instance="node1:9090" \
  --duration="2h" \
  --comment="Planned maintenance"

# 创建静默(特定时间范围)
amtool silence add alertname="HighCPU" \
  --start="2024-01-01T22:00:00Z" \
  --end="2024-01-02T06:00:00Z" \
  --comment="Scheduled maintenance window"

# 查看所有静默
amtool silence query

# 删除静默
amtool silence expire <silence-id>

# 查询当前活跃告警
amtool alert query

静默 vs 抑制

特性静默(Silence)抑制(Inhibition)
触发方式手动创建自动规则
持续时间指定时间段源告警活跃期间
适用场景计划维护、已知问题告警级联、根因分析
配置方式Web UI / amtoolalertmanager.yml

7.6 接收器(Receiver)

邮件通知

receivers:
  - name: 'email'
    email_configs:
      - to: '[email protected]'
        from: '[email protected]'
        smarthost: 'smtp.example.com:587'
        auth_username: 'user'
        auth_password: 'pass'
        headers:
          subject: '[{{ .Status | toUpper }}] {{ .CommonLabels.alertname }}'
        html: '{{ template "email.html" . }}'
        send_resolved: true

Slack 通知

receivers:
  - name: 'slack'
    slack_configs:
      - channel: '#alerts'
        title: '{{ .CommonLabels.alertname }}'
        text: >-
          {{ range .Alerts }}
          *Alert:* {{ .Labels.alertname }}
          *Severity:* {{ .Labels.severity }}
          *Description:* {{ .Annotations.description }}
          *Instance:* {{ .Labels.instance }}
          {{ end }}
        send_resolved: true

钉钉(Webhook)

receivers:
  - name: 'dingtalk'
    webhook_configs:
      - url: 'http://dingtalk-webhook:8060/dingtalk/ops/send'
        send_resolved: true

PagerDuty

receivers:
  - name: 'pagerduty'
    pagerduty_configs:
      - routing_key: '<integration-key>'
        severity: '{{ .GroupLabels.severity }}'
        description: '{{ .CommonAnnotations.summary }}'

7.7 高可用部署

Alertmanager 集群

┌──────────────────────────────────────────────────┐
│  Prometheus (发送告警到所有 Alertmanager 实例)     │
│                                                  │
│  alerting:                                       │
│    alertmanagers:                                │
│      - static_configs:                           │
│          - targets:                              │
│            - alertmanager1:9093                  │
│            - alertmanager2:9093                  │
│            - alertmanager3:9093                  │
└──────────────────────────────────────────────────┘
         │              │              │
         ▼              ▼              ▼
   ┌──────────┐   ┌──────────┐   ┌──────────┐
   │ Alert    │   │ Alert    │   │ Alert    │
   │ Manager 1│◄──│ Manager 2│◄──│ Manager 3│
   │          │──►│          │──►│          │
   └──────────┘   └──────────┘   └──────────┘
         Gossip Protocol(去重保证)
# 启动集群节点
alertmanager \
  --config.file=/etc/alertmanager/alertmanager.yml \
  --cluster.peer=alertmanager1:9094 \
  --cluster.peer=alertmanager2:9094 \
  --cluster.listen-address=0.0.0.0:9094

7.8 本章小结

组件功能关键配置
路由告警分发match/match_re, receiver
分组合并通知group_by, group_wait
抑制减少噪音inhibit_rules
静默临时屏蔽Silence UI / amtool
接收器通知渠道email/slack/webhook/pagerduty

扩展阅读


上一章06 - PromQL 进阶 下一章08 - 告警规则编写