Prometheus告警规则编写:你必须知道的7个注意事项

72 阅读3分钟

作为云原生监控的事实标准,Prometheus的告警规则编写直接影响监控系统的有效性和可靠性。本文将深入探讨在编写Prometheus告警规则时的关键注意事项,帮助您构建更加健壮的监控告警体系。

640 (10).webp

一、理解告警规则的基本结构

在开始编写告警规则前,必须清楚告警规则的基本组成:

groups:
 - name: example
  rules:
 - alert: HighErrorRate
    expr: job:request_error_rate:ratio5m{job="myjob"} > 0.5
    for: 10m
    labels:
      severity: critical
    annotations:
      summary: "High error rate on {{ $labels.instance }}"
      description: "Error rate is {{ $value }}"

每个告警规则包含:

  • alert : 告警名称
  • expr : PromQL表达式
  • for : 持续时间(可选)
  • labels : 附加标签
  • annotations : 告警详情注解

二、合理设置告警持续时间(for)

for字段决定了触发条件持续多长时间才会真正触发告警。设置不当会导致:

  • 设置过短:产生大量短暂、无意义的告警(告警风暴)
  • 设置过长:真正的问题可能被延迟发现

最佳实践:

  • 对于关键业务指标:2-5分钟
  • 对于资源类指标(CPU、内存等):10-15分钟
  • 对于需要长期观察的趋势性指标:30分钟以上

三、编写高效的PromSQL表达式

告警规则的核心是PromQL表达式,编写时应注意: 避免的问题:

  • 使用高基数标签(如IP、ID等)导致查询性能下降
  • 过于复杂的join操作增加计算负担
  • 缺少必要的聚合导致告警过于具体

优化建议:

#不推荐 - 高基数
expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.1
#推荐 - 按job聚合
expr: sum by(job) (rate(http_requests_total{status=~"5.."}[5m])) / sum by(job) (rate(http_requests_total[5m])) > 0.1

四、合理使用标签和注解

labels使用原则:

  • 用于告警路由(如severity=critical/warning)
  • 用于告警分组(如region, cluster等)
  • 避免使用可能频繁变化的值作为标签

annotations使用原则:

  • summary应简洁明了
  • description可包含详细信息和建议操作
  • 使用模板变量(如{{ $labels.instance }})使告警信息动态化
annotations:
  summary: "High CPU usage on {{ $labels.instance }} ({{ $value }}%)"
  description: "Instance {{ $labels.instance }} has been over 80% CPU usage for 10 minutes. Please check the process list."
  runbook: "https://wiki.example.com/runbook/high-cpu"

五、避免告警疲劳的关键策略

告警疲劳是运维团队的大敌,可通过以下方式缓解:

(1)分级告警:

labels:
  severity: warning  # 或critical/page

(2)设置合理的告警阈值:

  • 基于历史数据设置动态基线
  • 区分工作日和节假日模式

(3)抑制规则(inhibit_rules):

inhibit_rules:
- source_match:
    severity: 'critical'
  target_match:
    severity: 'warning'
  equal: ['alertname', 'instance']

六、测试与验证告警规则

编写告警规则后必须进行验证:

(1)使用promtool检查语法:

promtool check rules /path/to/alert.rules

(2)在测试环境触发模拟告警

(3)验证Alertmanager的接收和处理

(4)定期评审告警规则的有效性

七、告警规则维护与文档化

随着系统演进,告警规则需要持续维护:

(1)为每个告警添加注释说明:

# 监控API服务的5xx错误率
# 阈值设置为1%是基于SLA 99.9%的要求
# 负责人:@team-api

(2)使用版本控制系统管理规则文件

(3)定期清理不再使用的告警规则

总结

优秀的 Prometheus 告警规则,应当是 “在正确的时间,以正确的方式,告诉正确的人正确的问题”。希望本文所述的注意事项,可以帮助你避开常见的 “告警陷阱”。