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() 等函数转换为即时向量,才能参与后续计算。
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:正则匹配所有微服务,找出错误率 > 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])
4.4 匹配模式选择原则
在误差预算台账数据偏差排查中,选择器的选择直接影响查询效率和结果准确性。以下原则可供参考:
- 能用精确就不用正则: 精确匹配性能高一个数量级,且不易出错。
- 正则表达式尽量简单: 避免使用
.*开头的模式,优先使用前缀匹配。 - 组合标签缩小范围: 同时使用多个标签选择器,比单一正则更高效。
- 注意转义: 在正则中使用
.等特殊字符时,需要双反斜杠转义(如\\.)。