4. PromQL 基础语法:即时向量与范围向量、选择器、匹配模式(精确/正则)

在深入误差预算台账数据偏差排查之前,必须牢固掌握 PromQL 的底层数据模型与查询语法。PromQL 的核心操作围绕 时间序列 展开,而查询结果根据时间维度的不同,分为 即时向量 与 范围向量。选择器与匹配模式则是精准定位目标序列的关键工具。

4.1 即时向量与范围向量

理解这两种向量类型是编写正确 PromQL 的前提。它们决定了查询返回的是“某一时刻的快照”还是“一段时间内的样本序列”。

特性 即时向量 (Instant Vector) 范围向量 (Range Vector)
时间维度 仅包含一个时间戳下的样本值 包含一个时间区间内的多个样本值
查询语法 metric_name{label="value"} metric_name{label="value"}[5m]
典型用途 当前状态、告警规则、瞬时计算 速率计算、分位数、滑动窗口聚合
在误差预算中的应用 查询当前 SLI 错误率是否超过预算阈值 计算过去 5 分钟或 1 小时的错误率变化趋势
关键区别: 范围向量必须配合 [] 时间范围使用,且不能直接用于算术运算或比较;必须先通过 rate()、avg_over_time() 等函数转换为即时向量,才能参与后续计算。
即时向量 vs 范围向量 数据模型对比 即时向量(当前时刻 T) T 样本值: 0.023 仅一个数据点 范围向量(区间 [T-5m, T]) 5m 窗口 T 样本序列: [0.021, 0.025, 0.019, 0.030, 0.027, 0.023] 多个数据点,用于计算趋势 范围向量必须通过 rate()、avg_over_time() 等函数转换为即时向量后才能用于告警或算术运算

4.2 选择器:精确匹配与正则匹配

选择器用于从 Prometheus 时间序列数据库中筛选出特定的指标。在误差预算场景中,我们经常需要从大量微服务指标中精确锁定某个服务或某类错误。选择器分为 精确匹配 和 正则匹配 两种模式。

4.2.1 精确匹配模式

精确匹配使用 =(相等)和 !=(不相等)操作符。这是最常用、性能最好的匹配方式。

# 精确匹配:查询 service_a 的错误率
sli:error_ratio{service="service_a"}

# 排除匹配:查询除了 service_b 之外的所有服务错误率
sli:error_ratio{service!="service_b"}

# 多标签精确匹配:查询 service_a 在 production 环境的错误率
sli:error_ratio{service="service_a", env="production"}
性能建议: 在误差预算台账查询中,优先使用精确匹配。精确匹配底层使用哈希索引,查询效率远高于正则匹配。对于已知的服务名、环境名、版本号,始终使用 = 或 !=。

4.2.2 正则匹配模式

正则匹配使用 =~(匹配正则)和 !~(不匹配正则)操作符。当需要模糊匹配或批量选择时非常有用,但需要注意正则表达式的性能开销。

# 正则匹配:查询所有以 "service_" 开头的服务
sli:error_ratio{service=~"service_.*"}

# 排除正则:查询不以 "canary" 结尾的版本
sli:error_ratio{version!~".*canary"}

# 复杂正则:查询 api-v1 或 api-v2 的错误率
sli:error_ratio{service=~"api-v[12]"}
操作符 含义 示例 适用场景
= 精确相等 {service="checkout"} 已知确切标签值
!= 精确不相等 {service!="monitoring"} 排除特定值
=~ 正则匹配 {service=~"frontend|backend"} 批量选择、模糊匹配
!~ 正则不匹配 {version!~"v1\\..*"} 排除符合模式的值
正则陷阱: PromQL 使用 RE2 正则引擎,不支持回溯引用(backreferences)和零宽断言(lookahead/lookbehind)。在误差预算查询中,避免使用过于复杂的正则表达式,否则可能导致查询超时或高 CPU 消耗。建议将正则匹配限制在已知的有限模式集合内。

4.3 选择器在误差预算台账中的实战模式

在排查误差预算消耗异常时,我们通常需要组合使用多种选择器来缩小排查范围。以下是一个典型的排查流程:

  1. 全局概览: 使用正则匹配查询所有服务的错误率,快速定位异常服务。
  2. 精确锁定: 对异常服务使用精确匹配,查看其不同版本或实例的错误率。
  3. 排除干扰: 使用 != 或 !~ 排除已知的维护实例或灰度版本。
  4. 范围向量分析: 对筛选后的即时向量加上时间范围,计算速率或趋势。
# 步骤1:正则匹配所有微服务,找出错误率 > 0.01 的服务
sli:error_ratio{service=~"ms-.*"} > 0.01

# 步骤2:精确锁定 ms-payment 服务,查看各实例情况
sli:error_ratio{service="ms-payment"}

# 步骤3:排除已知的 canary 实例
sli:error_ratio{service="ms-payment", instance!~".*canary.*"}

# 步骤4:计算过去 10 分钟的错误率速率
rate(sli:error_ratio{service="ms-payment"}[10m])
选择器在误差预算排查中的典型流程 1. 正则批量扫描 2. 精确锁定服务 3. 排除干扰项 4. 范围向量分析 流程:正则扫描 → 精确锁定 → 排除干扰 → 范围向量分析,逐步缩小排查范围

4.4 匹配模式选择原则

在误差预算台账数据偏差排查中,选择器的选择直接影响查询效率和结果准确性。以下原则可供参考:

  • 能用精确就不用正则: 精确匹配性能高一个数量级,且不易出错。
  • 正则表达式尽量简单: 避免使用 .* 开头的模式,优先使用前缀匹配。
  • 组合标签缩小范围: 同时使用多个标签选择器,比单一正则更高效。
  • 注意转义: 在正则中使用 . 等特殊字符时,需要双反斜杠转义(如 \\.)。