Prometheus Recording Rules:用预计算稳定复杂查询

设计记录规则的命名、聚合层级和评估周期,降低仪表盘与告警的实时查询成本。

文章目录 · 4 节

复杂 PromQL 被多个看板和告警重复执行时,会消耗大量 CPU 并增加超时概率。Recording Rules 将结果周期性写回时间序列,适合稳定复用的聚合。

选择值得预计算的表达式

groups:
  - name: service_request_rates
    interval: 30s
    rules:
      - record: job:http_requests_total:rate5m
        expr: sum by (job) (rate(http_requests_total[5m]))

命名应体现聚合标签和操作窗口。不要预计算大量无人使用的标签组合,否则只是把查询成本换成存储成本。

验证规则

promtool check rules rules/service-rates.yaml
promtool test rules tests/service-rates.test.yaml
curl -s http://prometheus:9090/api/v1/rules

单元测试要覆盖无数据、计数器重置和阈值边界。评估间隔应与原始抓取间隔和业务响应目标匹配。

设计边界

  • 先聚合不再需要的标签,保留告警路由所需维度
  • 告警引用记录规则时监控 rule evaluation failure
  • 修改表达式要评估历史序列语义是否变化
  • 跨团队规则使用稳定前缀和 owner 元数据

收尾清单

上线后比较查询耗时、规则评估时间和新增序列数量。定期扫描未被看板、告警或 API 使用的记录规则并有序下线。