VMP 支持自动复用预聚合结果,无需手动修改看板中的 PromQL。本文介绍哪些查询可以复用已有规则,以及哪些变化会导致无法复用。
以下示例均基于如下 Recording Rule 表达式:
sum by (cluster, namespace, service, status_code) (
rate(http_requests_total{job="gateway"}[5m])
生成的预聚合指标为:
workload:http_requests:rate5m
该查询可以直接命中加速,写法存在少量差异时,只要计算口径不变,仍能复用该规则。
原始查询:
sum by (cluster, namespace, service, status_code) (
rate(http_requests_total{job="gateway"}[5m])
命中后改写:
workload:http_requests:rate5m
该查询可以命中加速,系统会先替换可复用的部分,再保留外层判断。响应头出现时,仅表示查询中存在已被替换的表达式。
原始查询:
sum by (cluster, namespace, service, status_code) (
rate(http_requests_total{job="gateway"}[5m])
命中后改写:
workload:http_requests:rate5m > 100
若新增筛选条件所使用的标签在规则中已保留,则该查询可复用预聚合结果。若使用未保留的标签,例如 pod 或 instance,则无法复用。
原始查询:
命中后改写:
workload:http_requests:rate5m{
预聚合结果可以继续汇总为更粗粒度的结果,例如总量。
说明
被聚合的标签不可恢复,无法在后续查询中用于分组。
原始查询:
命中后改写:
workload:http_requests:rate5m{
子查询内部的表达式可命中加速,外层子查询写法无需修改。使用此类查询时,请确保时间范围已覆盖子查询的回看窗口。
原始查询:
命中后改写:
workload:http_requests:rate5m{
示例六:min、max 和 count 的派生匹配
以下示例分别使用 3 条独立规则,每条规则均保留 cluster 和 service 标签。
当规则已保留所需标签时,min 可以继续在预聚合结果上计算。该方式适用于先按较细粒度预计算,再按更大范围查看最小值。
规则表达式:
min by (cluster, service) (
生成的预聚合指标为:
workload:worker_queue_depth:min
原始查询:
命中后改写
workload:worker_queue_depth:min{
max 的处理方式与 min 类似,可以在预聚合结果上继续汇总。只要筛选条件和保留维度一致,即可复用。
规则表达式:
max by (cluster, service) (
生成的预聚合指标为:
workload:worker_queue_depth:max
原始查询:
命中后改写:
workload:worker_queue_depth:max{
count 与 min、max 不同,继续汇总时通常需要使用 sum 累加结果。若直接继续使用 count,结果通常不代表原始序列总数。
规则表达式:
count by (cluster, service) (
生成的预聚合指标为:
原始查询:
命中后改写:
下表以本节开头的请求速率规则为例。无法复用表示该规则不能替换对应表达式,查询仍会按照原始 PromQL 执行。
判断查询能否复用规则时,建议依次检查: