2. PromQL 基础回顾:数据类型与基础查询语法

在构建质量门禁与误差预算台账之前,必须牢固掌握 PromQL 的核心数据类型与查询语法。PromQL 是 SRE 工程师与可观测性平台交互的“通用语言”,其类型系统直接决定了你能从指标数据中提取出何种维度的信息。

2.1 四种核心数据类型

PromQL 严格区分四种数据类型,理解它们的差异是避免查询错误的第一步。下表从定义、典型场景与示例三个维度进行对比:

数据类型 定义 典型场景 示例
Instant Vector 一组时间序列,每个序列在当前时刻只有一个采样值 实时告警判断、当前错误率、当前 QPS http_requests_total{status="500"}
Range Vector 一组时间序列,每个序列包含过去一段时间窗口内的多个采样值 滑动窗口聚合、速率计算、分位数估算 http_requests_total[5m]
Scalar 一个单一的数值,没有时间戳和标签 数学运算中的常数、阈值比较、偏移量 1.0、0.95、300
String 一个字符串常量,目前仅在部分函数中有限使用 告警标签模板、查询注释(极少直接使用) "error"、"production"
SRE 实战提示:在误差预算计算中,Instant Vector 用于获取“当前”SLI 状态,Range Vector 用于计算“过去窗口”内的累计错误预算消耗。两者缺一不可。

2.2 Instant Vector(瞬时向量)—— 实时快照

Instant Vector 是 PromQL 中最常用的数据类型。它返回一组时间序列在当前查询时间点的最新值。如果某个序列在最近 5 分钟内没有新数据,则不会出现在结果中。

基础语法:

<metric_name>{<label_selector>}

示例:

# 查询所有 HTTP 请求总数
http_requests_total

# 查询特定状态码的请求数(精确匹配)
http_requests_total{status="500"}

# 查询多个状态码(正则匹配)
http_requests_total{status=~"5[0-9][0-9]"}

# 排除特定实例
http_requests_total{instance!="localhost:9090"}
常见陷阱:Instant Vector 的“当前时刻”取决于查询时间。在 Grafana 面板中拖动时间范围时,每个数据点都是该时间点的 Instant Vector 快照。不要误以为它代表“现在”的时间。

2.3 Range Vector(范围向量)—— 时间窗口

Range Vector 通过在指标名后附加 [duration] 来定义时间窗口。它返回每个时间序列在窗口内的所有样本,是计算速率、增长率和分位数的基础。

基础语法:

<metric_name>{<label_selector>}[<duration>]

示例:

# 过去 5 分钟的所有请求数据
http_requests_total[5m]

# 过去 1 小时的错误请求数据
http_requests_total{status="500"}[1h]

# 过去 30 分钟,按 job 分组
http_requests_total{job="api-server"}[30m]

常用时间单位:

  • s — 秒(如 30s)
  • m — 分钟(如 5m)
  • h — 小时(如 1h)
  • d — 天(如 7d)
  • w — 周(如 2w)
误差预算关联:在质量门禁中,[30d] 窗口常用于计算月度 SLO 消耗,[7d] 用于滚动周评估。窗口长度必须与 SLO 周期对齐。

2.4 Scalar(标量)与 String(字符串)

Scalar 通常作为运算的右操作数出现,例如将错误率与阈值 0.001 比较。PromQL 会自动将标量提升为与 Instant Vector 运算的虚拟序列。

# 错误率超过 0.1% 的告警条件
http_requests_total{status="500"} / http_requests_total > 0.001

String 在 PromQL 中用途有限,主要用于 label_replace() 等函数的模板参数,或作为注释。在质量门禁场景中几乎不会直接使用。

2.5 数据类型转换与运算规则

PromQL 的运算遵循严格的类型匹配规则,理解这些规则可以避免 80% 的查询错误:

左操作数 右操作数 结果类型 说明
Instant Vector Instant Vector Instant Vector 按标签匹配进行逐元素运算
Instant Vector Scalar Instant Vector 标量作用于每个序列的每个值
Range Vector — Range Vector 不能直接参与算术运算,需先经聚合函数转换
Scalar Scalar Scalar 纯数值运算
关键规则:Range Vector 不能直接与 Instant Vector 或 Scalar 进行算术运算。必须先使用 rate()、increase()、avg_over_time() 等函数将其转换为 Instant Vector。

2.6 基础查询语法与标签匹配器

PromQL 的标签匹配器(Label Matcher)是筛选时间序列的核心工具。掌握匹配器类型可以精确控制查询范围:

匹配器 含义 示例
= 精确相等 status="200"
!= 不相等 status!="500"
=~ 正则匹配 status=~"2[0-9][0-9]"
!~ 正则排除 status!~"4[0-9][0-9]"

组合查询示例:

# 查询生产环境、非健康检查路径的 5xx 错误
http_requests_total{
  env="production",
  path!~"/health|/ready",
  status=~"5[0-9][0-9]"
}

2.7 数据类型与查询流程关系图

下图展示了从原始指标到质量门禁判断的完整数据流,以及各数据类型在其中的角色:

PromQL 数据类型在质量门禁中的流转路径 原始指标 http_requests_total Instant Vector 当前时刻快照 Range Vector 时间窗口样本 标签筛选 附加 [5m] 窗口 聚合函数 rate / increase / avg Scalar 阈值 0.001 / 0.999 算术运算 窗口聚合 比较运算 质量门禁结果 通过 / 告警 / 阻断 布尔结果 核心原则 Range Vector → 聚合 → Instant Vector → 比较

2.8 常见查询模式速查

以下模式在误差预算台账中高频出现,建议作为模板记忆:

模式 查询语句 返回类型
当前错误率 rate(http_requests_total{status="500"}[5m]) Instant Vector
累计错误预算消耗 increase(http_requests_total{status="500"}[30d]) Instant Vector
可用性 SLI 1 - rate(http_requests_total{status=~"5[0-9][0-9]"}[5m]) / rate(http_requests_total[5m]) Instant Vector
延迟 P99 超阈值 histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) > 0.5 Instant Vector