🔔 第24课:告警体系

核心概念

告警体系:让系统主动说话

好的告警体系让你在用户感知故障前就收到通知。差的告警体系要么漏报(P0没通知),要么轰炸(每天200+条)。

告警分级标准

P0 紧急:核心功能完全不可用 → 电话+短信,5分钟响应
P1 重要:核心功能降级 → 短信+IM,15分钟响应
P2 一般:非核心功能异常 → IM通知,1小时响应
P3 提示:需关注的趋势 → 邮件/日报,工作时间处理

命令实操

1. Alertmanager部署与配置 ✅

Alertmanager
cat > alertmanager.yml << 'EOF'
global:
  resolve_timeout: 5m
  slack_api_url: 'https://hooks.slack.com/services/xxx'

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'default'
  routes:
  - match: {severity: critical}
    receiver: 'critical'
    group_wait: 10s
    repeat_interval: 1h
  - match: {severity: warning}
    receiver: 'warning'

receivers:
- name: 'default'
  slack_configs:
  - channel: '#devops-alerts'
    title: '[{{ .Status | toUpper }}] {{ .CommonLabels.alertname }}'

- name: 'critical'
  slack_configs:
  - channel: '#incidents'
    title: '🚨 CRITICAL: {{ .CommonLabels.alertname }}'
  webhook_configs:
  - url: 'http://pagerduty-webhook:8080/alert'

- name: 'warning'
  slack_configs:
  - channel: '#devops-warnings'

inhibit_rules:
- source_match: {severity: 'critical'}
  target_match: {severity: 'warning'}
  equal: ['alertname', 'cluster', 'service']
EOF

docker run -d --name alertmanager -p 9093:9093 \
  -v ./alertmanager.yml:/etc/alertmanager/alertmanager.yml \
  prom/alertmanager:v0.27.0

2. 告警静默与抑制 ✅

静默与抑制
# 创建静默(维护窗口期)
curl -X POST http://localhost:9093/api/v2/silences \
  -H "Content-Type: application/json" \
  -d '{
    "matchers": [{"name": "namespace", "value": "staging", "isRegex": false}],
    "startsAt": "2026-05-19T22:00:00.000Z",
    "endsAt": "2026-05-20T06:00:00.000Z",
    "createdBy": "devops@example.com",
    "comment": "Planned maintenance"
  }'

# 查看活跃静默
curl http://localhost:9093/api/v2/silences | jq '.[] | select(.status.state=="active")'

3. 告警质量治理 ✅

告警质量
#!/bin/bash
# alert-quality.sh
AM_URL="http://localhost:9093"
echo "╔════════════════════════════════════════╗"
echo "║         告警质量报告                    ║"
echo "╠════════════════════════════════════════╣"

TOTAL=$(curl -s "$AM_URL/api/v2/alerts" | jq 'length')
printf "║ 总活跃告警: %-28s║
" "$TOTAL"

curl -s "$AM_URL/api/v2/alerts" | jq -r '.[].labels.severity' | sort | uniq -c | sort -rn | while read count sev; do
    printf "║   %-8s: %-28s║
" "$sev" "$count"
done

echo "╠════════════════════════════════════════╣"
echo "║ 改进建议:                              ║"
echo "║ 1. 重复告警→添加group_by聚合           ║"
echo "║ 2. 低价值告警→调整阈值或降级            ║"
echo "║ 3. 频繁抖动→增加for持续时间            ║"
echo "╚════════════════════════════════════════╝" 

架构图

告警体系:让系统主动说话架构

Prometheus Rules → Alertmanager → 路由/抑制/静默
                                      │
                    ┌─────────────────┼──────────────┐
                    ▼                 ▼              ▼
              ┌──────────┐    ┌──────────┐   ┌──────────┐
              │  电话/短信│    │ Slack/IM │   │  邮件    │
              │ (P0紧急) │    │ (P1/P2) │   │ (P3提示) │
              └──────────┘    └──────────┘   └──────────┘
                    └─────────────────┼──────────────┘
                                      ▼
                              ┌──────────────┐
                              │ On-Call轮值   │
                              └──────────────┘

故障排查

❌ 告警未触发/未发送

排查
curl -s http://localhost:9090/api/v1/alerts | jq '.data.alerts[] | select(.state=="firing")'
curl -s http://localhost:9093/api/v2/alerts | jq '.[] | .status.state'
curl -s http://localhost:9093/api/v2/silences | jq '.[] | select(.status.state=="active")'
# 常见:for条件未满足/被静默或抑制/receiver配置错误
💡 告警黄金法则:每条告警都应有可操作的Runbook、P0告警必须电话通知、每周Review告警质量消除噪音。

🏆 成就解锁:告警体系专家!

掌握Alertmanager路由、静默抑制、质量治理——让告警有价值而非噪音

📝 告警噪音治理清单

问题症状解决方案
告警风暴一次故障50+条告警group_by聚合+inhibit_rules
抖动告警反复firing→resolved增加for持续时间
低价值告警收到从不看降级或删除
误报指标正常却告警调整阈值+多条件
遗漏故障无告警补充监控覆盖
💡 告警质量目标:每周Review一次、P0告警每月<5条、告警/事件比>50%(即一半告警应触发事件处理)。

🔧 Alertmanager高可用

HA部署
# 部署2个Alertmanager实例实现HA
docker run -d --name am1 -p 9093:9093 \
  -v ./alertmanager.yml:/etc/alertmanager/alertmanager.yml \
  prom/alertmanager:v0.27.0 \
  --cluster.listen-address=0.0.0.0:8001 \
  --cluster.peer=am2:8001

docker run -d --name am2 -p 9094:9093 \
  -v ./alertmanager.yml:/etc/alertmanager/alertmanager.yml \
  prom/alertmanager:v0.27.0 \
  --cluster.listen-address=0.0.0.0:8001 \
  --cluster.peer=am1:8001

# Prometheus配置多个Alertmanager
alerting:
  alertmanagers:
  - static_configs:
    - targets: ['am1:9093', 'am2:9093']

# 验证集群状态
curl http://localhost:9093/api/v2/status | jq '.cluster'

📝 告警路由规则设计

标签组合路由目标等待时间重复间隔
severity=critical+team=devops电话+Slack #incidents10s1h
severity=critical+team=backend电话+Slack #backend-alerts10s1h
severity=warningSlack #devops-warnings1m6h
severity=info邮件日报5m24h
💡 Alertmanager技巧:使用inhibit_rules避免重复告警(critical自动抑制warning)、group_by合理分组、repeat_interval避免轰炸。
⚠️ 学习建议:每课内容都需要在实验环境中实际操作验证,只有动手才能真正掌握。建议搭建自己的实验环境反复练习。

课前准备

课后巩固

进阶方向