Prometheus Alertmanager 接入
工作原理
┌─────────────────────────────────────────────────────────────────────┐
│ Prometheus Stack │
│ │
│ Prometheus ──scrape──→ Targets ( exporters, 应用, 基础设施 ) │
│ │ │
│ └──评估规则──→ 触发告警 ──→ Alertmanager ──webhook──→ 灵王OPS │
│ │ │
│ (多个 receiver) │
└─────────────────────────────────────────────────────────────────────┘
Alertmanager 接收到 Prometheus 发来的告警后,通过 Webhook 转发给灵王 OPS。灵王 OPS 负责: - 告警去重、分组 - 按团队路由(通过 URL 中的 team_id) - 触发通知(邮件、钉钉、飞书等) - 告警历史与统计分析
前置条件
- 已部署 Prometheus + Alertmanager
- 可访问灵王 OPS 的
:8080端口 - 知道你的团队 ID(在团队页面 → 团队设置中查看)
Alertmanager 配置
最简配置
在 alertmanager.yml 的 receivers 中添加灵王 OPS:
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'cluster']
group_wait: 10s
group_interval: 10s
repeat_interval: 12h
receiver: 'lingwang'
routes:
- match:
severity: critical
receiver: 'lingwang'
continue: true
receivers:
- name: 'lingwang'
webhook_configs:
- url: 'http://ops.sengyueplay.com:8080/api/v1/alerts/alertmanager/{team_id}'
send_resolved: true
max_alerts: 100
多团队路由(通过 label 路由)
如果你的 Prometheus 管理多个团队的告警,可以在告警规则中打标签,Alertmanager 按标签转发到不同团队:
# 告警规则中给不同团队的告警打标签
groups:
- name: example
rules:
- alert: HighCPU
expr: node_cpu_usage > 0.9
labels:
team_id: '团队A的ID'
severity: critical
annotations:
summary: "CPU 使用率过高"
Alertmanager 配置:
route:
group_by: ['alertname', 'team_id']
routes:
# 优先按 team_id 路由
- match:
team_id: '团队A的ID'
receiver: 'lingwang-team-a'
- match:
team_id: '团队B的ID'
receiver: 'lingwang-team-b'
# 默认
- receiver: 'lingwang-default'
continue: true
receivers:
- name: 'lingwang-team-a'
webhook_configs:
- url: 'http://ops.sengyueplay.com:8080/api/v1/alerts/alertmanager/团队A的ID'
send_resolved: true
- name: 'lingwang-team-b'
webhook_configs:
- url: 'http://ops.sengyueplay.com:8080/api/v1/alerts/alertmanager/团队B的ID'
send_resolved: true
- name: 'lingwang-default'
webhook_configs:
- url: 'http://ops.sengyueplay.com:8080/api/v1/alerts/alertmanager/{默认团队ID}'
send_resolved: true
配置示例:静默与抑制
route:
# 收到 firing 告警后,等待 30s 再通知(等待告警稳定)
group_wait: 30s
# 同一组告警,变更后间隔 5m 再通知(避免告警风暴)
group_interval: 5m
# 告警解决 12h 后才停止通知(防止告警反复触发)
repeat_interval: 12h
# 告警抑制:运维期间静默所有相关告警
routes:
- match:
maintenance: "true"
receiver: 'silence'
- match:
severity: critical
receiver: 'lingwang'
continue: true
- match:
severity: warning
receiver: 'lingwang-low'
continue: true
告警规则中的 labels 与 annotations
建议在 Prometheus 告警规则中统一规范 labels 和 annotations:
Labels(用于路由和分组)
| Label | 说明 | 示例 |
|---|---|---|
alertname |
告警名称 | HighCPU |
severity |
严重程度 | critical / warning / info |
team_id |
团队 ID(用于路由) | 3fa2b38c-... |
instance |
监控目标实例 | web-01:9100 |
job |
Prometheus job 名称 | node_exporter |
Annotations(用于展示和通知)
| Annotation | 说明 | 示例 |
|---|---|---|
summary |
简短描述(用于通知标题) | CPU 使用率超过 90% |
description |
详细描述(用于告警详情) | 实例 web-01 的 CPU 使用率已达 {{ $value }} |
runbook_url |
应急手册链接 | https://wiki.example.com/runbooks/high-cpu |
dashboard_url |
Grafana 大盘链接 | https://grafana.example.com/d/xxx |
完整示例
groups:
- name: node
rules:
- alert: HighMemory
expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "内存使用率超过 85%"
description: "节点 {{ $labels.instance }} 内存使用率为 {{ printf \"%.2f\" $value }}%"
runbook_url: "https://wiki.example.com/runbooks/high-memory"
dashboard_url: "https://grafana.example.com/d/node"
- alert: DiskSpaceLow
expr: (node_filesystem_avail_bytes{fstype!~"tmpfs|fuse.lxcfs"} / node_filesystem_size_bytes) * 100 < 15
for: 5m
labels:
severity: critical
annotations:
summary: "磁盘空间不足"
description: "挂载点 {{ $labels.mountpoint }} 可用空间仅剩 {{ printf \"%.2f\" $value }}%"
验证接入
手动发送测试告警
# 获取团队 ID(替换为你的)
TEAM_ID="your-team-id"
curl -X POST "http://localhost:8080/api/v1/alerts/alertmanager/${TEAM_ID}" \
-H "Content-Type: application/json" \
-d '{
"version": "4",
"groupKey": "{}:{alertname=\"TestAlert\"}",
"status": "firing",
"receiver": "lingwang",
"alerts": [
{
"status": "firing",
"labels": {
"alertname": "HighCPU",
"severity": "critical",
"instance": "server-01:9100"
},
"annotations": {
"summary": "CPU 使用率超过 90%",
"description": "服务器 server-01:9100 的 CPU 使用率当前为 95.3%"
},
"startsAt": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
}
]
}'
验证 resolved(告警恢复)
# 告警被解决时,Alertmanager 会发送 resolved 状态
curl -X POST "http://localhost:8080/api/v1/alerts/alertmanager/${TEAM_ID}" \
-H "Content-Type: application/json" \
-d '{
"status": "resolved",
"alerts": [
{
"status": "resolved",
"labels": {"alertname": "HighCPU"},
"endsAt": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
}
]
}'
检查告警列表
登录管理后台 → 告警页面,确认测试告警出现。
性能与限制
| 项目 | 限制 |
|---|---|
| 单次请求最大告警数 | 100 条 |
| 请求超时 | 10s |
| 建议 group_wait | 30s(避免首次告警风暴) |
| 建议 repeat_interval | 12h(告警持续未解决时的重复通知间隔) |
故障排查
告警未出现在平台
- 确认 Alertmanager 配置已重载:
amtool check-config alertmanager.yml - 确认 Webhook URL 可达:
curl -v http://ops.sengyueplay.com:8080/health - 查看 Alertmanager 日志:
journalctl -u alertmanager -f - 查看灵王 OPS 后端日志:
tail -f /tmp/lingwang.log
告警重复通知
- 调大
group_interval(建议 5m) - 确认 Prometheus 告警规则中
for字段设置合理
告警分类/分组不符合预期
- 检查 Prometheus 告警规则的
labels配置 - Alertmanager 按
group_by字段分组,修改group_by列表
告警通知延迟
group_wait越大,首次通知延迟越高(但能有效抑制告警风暴)- Prometheus → Alertmanager 的推送间隔由
evaluation_interval决定(建议 15s)