Prometheus最佳实践(四)——告警
Prometheus 告警(Alerting)最佳实践(中文总结)
本文档来自 Prometheus 官方文档 - Alerting,核心思想源自 Google 工程师 Rob Ewaschuk 的《My Philosophy on Alerting》,强调简洁、有效、可操作的告警设计。
一、核心原则
1. 告警应基于“症状”,而非“原因”
- ✅ 告警用户可见的问题:如高延迟、错误率上升、服务不可用。
- ❌ 避免告警底层原因:如磁盘快满、CPU 使用率高(除非已直接影响用户体验)。
- 好处:减少噪音,聚焦真正需要响应的问题。
2. 告警必须可操作
- 每个告警都应有明确的值班人员可执行的动作。
- 如果收到告警后“什么也做不了”或“只需等待自动恢复”,就不该触发页面通知(Pager)。
3. 保持告警数量极少
- 只保留那些真正需要人工干预的告警。
- 目标:每天最多几条有效告警,避免“告警疲劳”。
二、告警层级策略
1. 分层告警(只在关键点告警)
- 延迟(Latency):
- 仅在最靠近用户的层级告警(如 API 网关)。
- 若底层组件变慢但整体用户体验未受损,则不告警。
- 错误率(Error Rate):
- 仅告警用户可见的错误(如 HTTP 5xx)。
- 底层重试成功、内部重定向等“非用户感知错误”不应触发 Pager。
💡 示例:数据库慢 → 但缓存命中率高 → 用户无感知 → 不告警
2. 不同请求类型需分别处理
- 若某些低流量接口问题会被高流量接口掩盖,应单独设置告警规则。
- 对具有不同 SLO 的服务路径,应分别监控。
三、特殊场景告警
1. 离线处理系统
- 关键指标:数据端到端处理延迟
- 当延迟高到可能影响业务时才告警。
2. 批处理作业
- 告警条件:最近一次成功运行时间 > 阈值
- 阈值建议:≥ 2 个完整运行周期
- 例:作业每 4 小时运行一次,耗时 1 小时 → 阈值设为 10 小时
- 原则:单次失败不应需人工介入;若不能容忍失败,应提高运行频率。
3. 容量预警(非紧急但重要)
- 如磁盘使用率 > 80%、内存不足等。
- 虽不立即影响用户,但需人工介入扩容或清理,应设置告警(可降级为邮件/工单,非 Pager)。
四、监控基础设施自身
- 必须监控 Prometheus、Alertmanager、Pushgateway 等组件的可用性。
- 推荐使用黑盒测试(Blackbox Monitoring):
- 模拟完整告警链路:
Pushgateway → Prometheus → Alertmanager → Email - 比单独监控每个组件更可靠,能发现集成问题。
- 模拟完整告警链路:
五、告警命名与组织
- 命名规范:社区普遍采用 驼峰命名法(CamelCase)
- 示例:
HighRequestLatency,DatabaseReplicationLag
- 示例:
- 告警应包含有用信息:
- 链接到相关 Grafana 控制台
- 明确指出受影响的服务或组件
- 提供初步排查指引(通过 Alertmanager 模板实现)
六、容错与松弛(Allow Slack)
- 允许短暂波动:设置合理的时间窗口(如
for: 5m),避免因瞬时毛刺触发告警。 - 避免过度敏感:宁可漏报一次,也不要频繁误报导致信任丧失。
总结:好告警的特征
| 特征 | 说明 |
|---|---|
| 基于症状 | 用户能感知的问题 |
| 可操作 | 收到后知道该做什么 |
| 极少发生 | 每天 ≤ 几次有效告警 |
| 有上下文 | 链接控制台、提供诊断信息 |
| 经过验证 | 通过黑盒测试确保告警链路可靠 |
🌟 终极目标:
让每一次 Pager 响起,都值得工程师放下手头工作立即响应。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 楚歌!
