坑1:标签基数爆炸

最危险的错误:给指标加上高基数标签,比如用户 ID、请求 ID。

一个例子:某指标加了用户 ID 标签,潜在时间序列达到 1200 亿条,活跃序列 5000 万条,内存消耗 150-250GB,Prometheus 直接崩溃。

规则:任何标签的唯一值必须控制在 100 以内。加标签前问三个问题:

  1. 这个标签有多少种可能的值?
  2. 这个维度真的需要单独告警吗?
  3. 能用日志或 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 自身的健康指标