Prometheus 可靠性最佳实践:使用 Recording Rules 提升查询性能

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 查询]
  1. Prometheus 按 evaluation_interval(如 15s)评估规则
  2. 执行 expr 计算结果
  3. 将结果写入 TSDB,作为新指标存储
  4. 后续查询直接使用该指标,无需重新计算

三、配置 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 创建相同规则
合理设置 intervalevaluation_interval 一致(通常 15s/30s)
监控规则性能使用 prometheus_rule_evaluation_duration_seconds
分文件管理按服务或团队拆分 rules/business.yml, rules/infra.yml
版本控制将规则文件纳入 Git 管理

❌ 避免的问题

问题后果
规则 expr 过于复杂评估超时,阻塞其他规则
频繁修改规则导致数据不连续
未设置 for 的告警使用预计算指标可能丢失瞬时抖动
高基数指标预计算增加存储和查询压力

六、性能优化效果对比

场景无 Recording Rules使用 Recording Rules
Grafana 查询延迟800ms ~ 2s50ms ~ 200ms
Prometheus CPU 使用率70% ~ 90%30% ~ 50%
告警评估时间200ms50ms
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 可靠性和性能的关键实践

核心价值:

“把昂贵的计算留在后台,把快速的查询留给前端。”

实施步骤:

  1. 识别高频、复杂查询(如 rate(), histogram_quantile()
  2. 创建 recording.yml 文件,定义预计算规则
  3. prometheus.yml 中加载
  4. 在 Grafana 和 Alerting 中使用新指标

通过合理使用 Recording Rules,你可以:

  • ✅ 提升 Dashboard 加载速度
  • ✅ 降低 Prometheus 负载
  • ✅ 提高告警评估效率
  • ✅ 构建更稳定、可扩展的监控系统

📌 建议:所有生产环境的 Prometheus 部署都应启用 Recording Rules。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值