Prometheus 最佳实践:八条军规
Prometheus 八条最佳实践:命名规范、警惕高基数标签、追踪总量与失败量、PromQL 加作用域、告警加容忍时间、处理指标缺失、保留关键标签、规划扩容路径。
Prometheus 简单到能十分钟跑起来,又复杂到足以让你在生产环境踩一年的坑。这八条实践是社区用事故换来的经验,按"埋点 → 查询 → 告警 → 扩展"的顺序逐条过一遍。
1. 遵守命名规范
- 小写 + 下划线:
http_requests_total; - 单位进名字:
_seconds、_bytes、_total(计数器); - 加领域前缀:
myapp_、nodejs_,避免不同组件指标撞名; - 自洽检验:对指标做
sum()应该得出有意义的值(这是官方文档的经典建议)。
2. 警惕高基数标签
基数爆炸是 Prometheus 头号杀手。order_status_total{status="completed"} 没问题(status 取值有限);但加上 product_id 标签后,序列数 = 商品数,几十万起步,内存直接撑爆。
红线清单(永远别放进标签):用户 ID、订单号、请求 ID、时间戳、原始 URL 路径、IP 地址。标签的取值集合必须有限且可枚举。
3. 追踪"总量"和"失败量",而不是"成功量"
# 成功率 = 1 - 失败/总量
1 - (sum(rate(requests_failed_total[5m])) / sum(rate(requests_total[5m])))
只记成功数,失败就隐身了。总量 + 失败的组合能算出任意维度(成功率、失败率),反过来不行。
4. PromQL 查询要加作用域
裸写 sum(rate(http_requests_total[5m])) 会把所有环境、所有服务的数据混在一起。养成加过滤条件的习惯:
sum by (service) (rate(http_requests_total{env="production"}[5m]))
5. 告警加时间容忍(for 子句)
瞬时针刺不该半夜叫人:
alert: HighErrorRate
expr: error_rate > 0.05
for: 10m # 持续 10 分钟才触发
for 是防误报的第一道闸。延迟类告警建议 5-15m,资源类 15-30m。
6. 处理指标缺失
指标消失(目标挂了、exporter 挂了)时查询返回空——没有数据 ≠ 一切正常。两种情况都要覆盖:
# 方式一:absent() 检测整个序列消失
absent(http_requests_total{job="api"})
# 方式二:up 指标检测目标失联
up{job="api"} == 0
"没有数据"的告警和"数据异常"的告警同样重要。
7. 告警规则里保留关键标签
聚合会丢标签。告警规则里用 by 把定位所需的标签(instance、service、环境)保留下来,否则告警通知里只有"出事了",没有"谁出事了":
expr: sum by (service, instance) (rate(errors_total[5m])) > 10
8. 提前规划扩容路径
单机 Prometheus 的瓶颈:存储保留(默认 15 天)、单点故障、超大基数。信号出现时(查询变慢、内存吃紧、需要多年数据)再补就晚了。可选路径:
- 联邦(Federation):分层聚合,各集群 Prom 抓各自的,上层抓汇总;
- 远程存储:remote write 到 Thanos/Mimir/VictoriaMetrics,长期存储 + 全局查询;
- 托管方案:直接把指标 remote write 到 SaaS 平台,把存储与高可用外包出去。
观测云对照
观测云可以作为 Prometheus 的远端归宿:DataKit 接收 remote write,长期存储、多副本高可用、全局查询都由平台托管,本地 Prometheus 只保留短期热数据;告警侧,观测云监控器内置"无数据检测""持续时长"等能力,第 5、6 条实践是配置项而不是手写规则;标签治理用 Pipeline 可视化完成,基数治理从配置审查变成可查询的统计报表。
常见问题(FAQ)
Q:怎么发现现有的高基数指标?
A:topk(10, count by (__name__)({__name__=~".+"})) 按指标名统计序列数;Prometheus UI 的 TSDB 状态页也有基数报表。
Q:recording rules 什么时候该用?
A:仪表盘或告警里的重查询(大时间范围聚合、多表达式嵌套)每次都算太慢时,用 recording rule 预计算成新指标。注意它只是"缓存计算",不解决基数问题。
Q:多套环境(dev/staging/prod)怎么隔离?
A:最佳实践是所有指标带 env 标签,一个 Prometheus 即可;数据量大或合规要求强隔离时才拆实例。