Prometheus 可靠性最佳实践:使用 Recording Rules 提升查询性能
在生产环境中,Prometheus 面临着海量指标、高频查询和复杂计算的挑战。如果每次查询都实时执行复杂的 PromQL(如聚合、分位数计算),会导致:
- ❌ 查询延迟高
- ❌ Grafana 仪表板卡顿
- ❌ 告警评估变慢
- ❌ Prometheus Server CPU 使用率飙升
Recording Rules(记录规则) 是 Prometheus 提供的预计算机制,用于将昂贵或常用的查询结果预先计算并存储为新的时间序列,从而大幅提升查询效率和系统可靠性。
一、什么是 Recording Rules?
定义
Recording Rules 是一组在 Prometheus Server 上定期评估的 PromQL 表达式,其结果会被保存为一个新的指标,供后续查询使用。
核心价值
| 问题 | Recording Rules 的解决方案 |
|---|---|
| 复杂查询慢 | 预先计算,查询时直接读取结果 |
| 多个 Dashboard 重复计算 | 只计算一次,共享结果 |
| 告警规则计算开销大 | 使用预计算指标,降低评估压力 |
| Grafana 卡顿 | 查询简单指标,响应更快 |
✅ “一次计算,多次复用”
二、Recording Rules 工作原理
graph LR
A[Prometheus Server] -->|定期执行| B[Recording Rule]
B -->|expr: rate(http_requests_total[5m])| C[新指标: job:http_requests:rate5m]
C --> D[Grafana Dashboard]
C --> E[Alerting Rule]
C --> F[API 查询]
- Prometheus 按
evaluation_interval(如 15s)评估规则 - 执行
expr计算结果 - 将结果写入 TSDB,作为新指标存储
- 后续查询直接使用该指标,无需重新计算
三、配置 Recording Rules
1. 创建规则文件
# rules/recording.yml
groups:
- name: example-recordings
interval: 15s # 可选,覆盖全局 evaluation_interval
rules:
# 1. 按 job 聚合的 HTTP 请求速率
- record: job:http_requests:rate5m
expr: sum by (job) (rate(http_requests_total[5m]))
# 2. 按 job 和 method 的请求速率
- record: job:method:http_requests:rate5m
expr: sum by (job, method) (rate(http_requests_total[5m]))
# 3. P99 延迟(预计算分位数)
- record: job:http_request:duration:99quantile
expr: >
histogram_quantile(0.99,
sum(rate(http_request_duration_seconds_bucket[5m])) by (le, job)
)
# 4. 错误率
- record: job:http_request:error_rate
expr: >
sum(rate(http_requests_total{status=~"5.."}[5m])) by (job)
/
sum(rate(http_requests_total[5m])) by (job)
# 5. JVM 堆内存使用率
- record: jvm:memory:heap:usage_ratio
expr: >
sum(jvm_memory_used_bytes{area="heap"}) by (job, instance)
/
sum(jvm_memory_max_bytes{area="heap"}) by (job, instance)
✅ 指标命名建议:
<level>:<metric>:<aggregation>,如job:http_requests:rate5m
2. 在 prometheus.yml 中加载规则
rule_files:
- "rules/recording.yml"
- "rules/alerts.yml"
✅ 支持通配符:
rules/*.yml
3. 重载配置
修改规则后需重载 Prometheus:
# 方法 1:HTTP API
curl -X POST http://prometheus:9090/-/reload
# 方法 2:发送 SIGHUP 信号
kill -SIGHUP <prometheus-pid>
⚠️ 确保
prometheus.yml中启用了--web.enable-lifecycle
四、在 Grafana 和 Alerting 中使用
1. Grafana 仪表板中使用预计算指标
# 直接查询预计算的速率,无需 rate() 计算
job:http_requests:rate5m{job="api-server"}
✅ 效果:
- 图表加载更快
- 减少 PromQL 复杂度
- 降低 Prometheus 负载
2. 告警规则中引用预计算指标
# rules/alerts.yml
- alert: HighRequestRate
expr: job:http_requests:rate5m{job="api-server"} > 100
for: 5m
annotations:
description: "Request rate is {{ $value }} req/s"
✅ 避免在告警规则中执行
sum by (job) (rate(...))这类昂贵操作
五、Recording Rules 最佳实践
✅ 推荐做法
| 实践 | 说明 |
|---|---|
| 命名规范 | 使用 level:metric:aggregation 格式,如 job:http_requests:rate5m |
| 避免重复计算 | 不要为每个 Dashboard 创建相同规则 |
| 合理设置 interval | 与 evaluation_interval 一致(通常 15s/30s) |
| 监控规则性能 | 使用 prometheus_rule_evaluation_duration_seconds |
| 分文件管理 | 按服务或团队拆分 rules/business.yml, rules/infra.yml |
| 版本控制 | 将规则文件纳入 Git 管理 |
❌ 避免的问题
| 问题 | 后果 |
|---|---|
规则 expr 过于复杂 | 评估超时,阻塞其他规则 |
| 频繁修改规则 | 导致数据不连续 |
未设置 for 的告警使用预计算指标 | 可能丢失瞬时抖动 |
| 高基数指标预计算 | 增加存储和查询压力 |
六、性能优化效果对比
| 场景 | 无 Recording Rules | 使用 Recording Rules |
|---|---|---|
| Grafana 查询延迟 | 800ms ~ 2s | 50ms ~ 200ms |
| Prometheus CPU 使用率 | 70% ~ 90% | 30% ~ 50% |
| 告警评估时间 | 200ms | 50ms |
| Dashboard 流畅度 | 卡顿 | 流畅 |
✅ 在高基数、高频率场景下,性能提升可达 5~10 倍
七、监控 Recording Rules 本身
Prometheus 提供了内置指标来监控规则执行情况:
| 指标 | 说明 |
|---|---|
prometheus_rule_evaluations_total | 规则评估次数 |
prometheus_rule_evaluation_duration_seconds | 规则评估耗时 |
prometheus_rule_evaluation_failures_total | 评估失败次数 |
prometheus_evaluator_duration_seconds | 整体评估耗时 |
示例:告警规则评估过慢
histogram_quantile(0.99, sum(rate(prometheus_rule_evaluation_duration_seconds_bucket[5m])) by (le))
> 1
如果 99 分位 > 1s,说明规则太复杂,需优化或拆分。
八、与 Alerting Rules 的关系
| 类型 | 用途 | 是否存储结果 | 是否触发告警 |
|---|---|---|---|
| Recording Rules | 预计算指标,提升查询性能 | ✅ 是 | ❌ 否 |
| Alerting Rules | 判断是否触发告警 | ❌ 否 | ✅ 是 |
✅ 两者可结合使用:Alerting Rules 使用 Recording Rules 的结果。
九、总结
Recording Rules 是提升 Prometheus 可靠性和性能的关键实践。
核心价值:
“把昂贵的计算留在后台,把快速的查询留给前端。”
实施步骤:
- 识别高频、复杂查询(如
rate(),histogram_quantile()) - 创建
recording.yml文件,定义预计算规则 - 在
prometheus.yml中加载 - 在 Grafana 和 Alerting 中使用新指标
通过合理使用 Recording Rules,你可以:
- ✅ 提升 Dashboard 加载速度
- ✅ 降低 Prometheus 负载
- ✅ 提高告警评估效率
- ✅ 构建更稳定、可扩展的监控系统
📌 建议:所有生产环境的 Prometheus 部署都应启用 Recording Rules。
1267

被折叠的 条评论
为什么被折叠?



