坑1:标签基数爆炸
最危险的错误:给指标加上高基数标签,比如用户 ID、请求 ID。
一个例子:某指标加了用户 ID 标签,潜在时间序列达到 1200 亿条,活跃序列 5000 万条,内存消耗 150-250GB,Prometheus 直接崩溃。
规则:任何标签的唯一值必须控制在 100 以内。加标签前问三个问题:
- 这个标签有多少种可能的值?
- 这个维度真的需要单独告警吗?
- 能用日志或 Trace 替代吗?
坑2:告警疲劳
初始配置了 97 条告警规则,每天产生 200-300 条告警,团队逐渐麻木。真正的 P0 故障发生时,淹没在噪音里。
解法:只保留 5 条核心告警,标准是:
- 需要立即人工介入
- 直接影响用户体验
- 无法自动恢复
结果:后续一年只有 3 次真正的值班告警,而之前是 47 次。
坑3:聚合指标掩盖真相
平均响应时间正常,但 VIP 用户严重超时——因为他们被正常用户的数据稀释了。
解法:监控 P95、P99,而不只是平均值。按用户类型、地区等维度分别监控。
坑4:变更没有标注
一次 2 小时的故障排查,如果在 Grafana 上有部署标注,5 分钟就能定位。
解法:所有 CI/CD 变更自动在 Grafana 创建 Annotation,让时间线上的变更一目了然。
坑5:数据存储成本失控
存储一年数据每月花费 4200 元,但 99.8% 的查询只访问最近 7 天的数据。
解法:分层存储
- 热数据(7天):Prometheus 本地存储
- 温数据(30天):远程存储 + 降采样
- 冷数据(1年):归档存储
坑6:查询性能差
复杂看板查询耗时 8-15 秒,严重影响使用体验。
解法:使用 Recording Rules 预计算高频聚合查询。
groups:
- name: precomputed
rules:
- record: job:http_requests:rate5m
expr: sum(rate(http_requests_total[5m])) by (job)
查询时间从 12 秒降到 200ms。
坑7:单点故障
主 Prometheus 宕机 5 分钟,所有告警失效,恰好在一次重大故障期间。
解法:部署双 Prometheus 实例,配置相同,通过 Alertmanager 去重。
每月检查清单
- 监控标签基数趋势
- 审查告警触发模式,清理误报
- 验证聚合指标是否掩盖了细节问题
- 检查部署 Annotation 是否完整
- 分析磁盘增长和存储成本
- 检查慢查询
- 监控 Prometheus 自身的健康指标