告警规则设计的常见误区
监控告警体系搭建中,最常见的错误不是缺少告警,而是告警太多。大量低质量告警会导致告警疲劳——运维人员对告警麻木,真正严重的故障反而被淹没。有效的告警体系应遵循以下原则:每条告警都必须可操作(收到后知道该做什么)、告警阈值基于SLO而非绝对值、多级告警对应不同响应级别。
Prometheus告警规则核心语法
AlertManager配合Prometheus的告警规则,是目前最主流的开源告警方案。规则文件使用YAML格式:
groups:
- name: node_alerts
rules:
- alert: NodeHighCPU
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for: 5m
labels:
severity: warning
team: infra
annotations:
summary: "节点 {{ $labels.instance }} CPU使用率超过85%"
description: "当前CPU使用率 {{ $value }}%,持续5分钟"
runbook: "https://wiki.internal/runbook/node-high-cpu"
- alert: NodeCPUCritical
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 95
for: 2m
labels:
severity: critical
team: infra
annotations:
summary: "节点 {{ $labels.instance }} CPU使用率超过95%"
runbook: "https://wiki.internal/runbook/node-high-cpu"
关键字段说明:for指定持续时间,避免瞬时抖动触发告警;labels用于路由和分组;annotations用于展示详细信息;runbook指向处理手册。
基于SLO的告警:Burn Rate方法
传统阈值告警(CPU>80%)是粗粒度的,无法反映对业务的实际影响。Google提出的SLO告警方案基于错误预算消耗速率(Burn Rate):
groups:
- name: slo_alerts
rules:
# SLO: 99.9%可用性,30天窗口
# 错误率 = 1 - 可用性 = 0.1%
# Burn Rate = 实际错误率 / SLO错误率
# 短窗口高Burn Rate触发Page告警
- alert: HighErrorBudgetBurnPage
expr: |
(
sum(rate(http_requests_total{code=~"5.."}[1h]))
/
sum(rate(http_requests_total[1h]))
)
/
0.001 > 14.4
for: 5m
labels:
severity: page
annotations:
summary: "错误预算消耗速率过高,1小时内消耗了超过5%的月度预算"
# 长窗口中Burn Rate触发Ticket告警
- alert: HighErrorBudgetBurnTicket
expr: |
(
sum(rate(http_requests_total{code=~"5.."}[6h]))
/
sum(rate(http_requests_total[6h]))
)
/
0.001 > 6
for: 30m
labels:
severity: ticket
annotations:
summary: "错误预算持续消耗,6小时内消耗了超过2%的月度预算"
14.4和6是Google SRE手册推荐的阈值系数。短窗口高Burn Rate表示突发故障需要立即响应,长窗口中Burn Rate表示慢性退化需要工单跟踪。
AlertManager路由与抑制规则配置
AlertManager的核心能力是多渠道路由和告警抑制:
route:
receiver: 'default-slack'
group_by: ['alertname', 'cluster', 'namespace']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
routes:
- match:
severity: page
receiver: 'pager-duty'
group_wait: 10s
repeat_interval: 1h
- match:
severity: critical
receiver: 'pager-duty'
- match:
team: db
receiver: 'db-team-slack'
inhibit_rules:
# 节点Down时抑制该节点上的所有服务告警
- source_match:
alertname: NodeDown
target_match:
severity: warning
equal: ['instance']
# 数据库主从切换时抑制从库告警
- source_match:
alertname: MySQLFailover
target_match_re:
alertname: MySQLReplicationLag|MySQLSlaveDelay
receivers:
- name: 'pager-duty'
pagerduty_configs:
- service_key: <key>
- name: 'default-slack'
slack_configs:
- api_url: <webhook>
channel: '#alerts'
- name: 'db-team-slack'
slack_configs:
- api_url: <webhook>
channel: '#db-alerts'
告警静默与维护窗口管理
计划内维护(部署、扩容)会触发大量预期告警。使用silence机制而非关闭告警规则:
# 通过API创建静默规则
curl -X POST http://alertmanager:9093/api/v2/silences -H 'Content-Type: application/json' -d '{
"matchers": [
{"name": "cluster", "value": "prod-east", "isRegex": false}
],
"startsAt": "2026-07-29T02:00:00Z",
"endsAt": "2026-07-29T04:00:00Z",
"createdBy": "ops-team",
"comment": "计划内数据库维护窗口"
}'
# 查看当前生效的静默
curl http://alertmanager:9093/api/v2/silences | jq '.[] | select(.status.state=="active")'
告警质量度量:持续优化告警体系
告警体系需要持续度量才能不断优化。关键指标:
1. 告警准确率(告警后确实有问题的比例),目标>90%
2. 告警响应时间(从告警触发到人工确认的时间),Page级<5分钟
3. 告警解决时间(从告警触发到故障修复的时间),按P0/P1/P2分级统计
4. 告警重复率(同一问题触发的告警次数),高重复率说明抑制规则不足
每季度review告警数据,淘汰持续低准确率的告警规则,合并重复告警,调整阈值。告警体系的健康度直接决定了SRE团队的响应效率。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/prometheus-gao-jing-gui-ze-she-ji-shi-zhan-cong-zhi-biao/