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 数据类型与查询流程关系图
下图展示了从原始指标到质量门禁判断的完整数据流,以及各数据类型在其中的角色:
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 |