复杂 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 使用的记录规则并有序下线。