好的告警体系让你在用户感知故障前就收到通知。差的告警体系要么漏报(P0没通知),要么轰炸(每天200+条)。
P0 紧急:核心功能完全不可用 → 电话+短信,5分钟响应 P1 重要:核心功能降级 → 短信+IM,15分钟响应 P2 一般:非核心功能异常 → IM通知,1小时响应 P3 提示:需关注的趋势 → 邮件/日报,工作时间处理
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# 创建静默(维护窗口期)
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")'#!/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配置错误掌握Alertmanager路由、静默抑制、质量治理——让告警有价值而非噪音
| 问题 | 症状 | 解决方案 |
|---|---|---|
| 告警风暴 | 一次故障50+条告警 | group_by聚合+inhibit_rules |
| 抖动告警 | 反复firing→resolved | 增加for持续时间 |
| 低价值告警 | 收到从不看 | 降级或删除 |
| 误报 | 指标正常却告警 | 调整阈值+多条件 |
| 遗漏 | 故障无告警 | 补充监控覆盖 |
# 部署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 #incidents | 10s | 1h | |
| severity=critical+team=backend | 电话+Slack #backend-alerts | 10s | 1h | |
| severity=warning | Slack #devops-warnings | 1m | 6h | |
| severity=info | 邮件日报 | 5m | 24h |