2. PromQL 基础回顾:数据类型、选择器与标签匹配
在深入黄金指标与录制规则设计之前,必须牢固掌握 PromQL 的核心数据类型与选择器机制。PromQL 的查询结果类型决定了你能对数据执行何种操作,而标签匹配则是精准筛选监控目标的唯一手段。本节将系统梳理这四大基石。
2.1 四种核心数据类型
PromQL 表达式求值后返回以下四种类型之一。理解它们的区别是避免查询错误的前提。
| 类型 | 英文名称 | 说明 | 典型示例 |
|---|---|---|---|
| 瞬时向量 | Instant Vector | 一组时间序列,每个序列包含一个最新采样值,且时间戳相同 | node_cpu_seconds_total |
| 区间向量 | Range Vector | 一组时间序列,每个序列包含一段时间窗口内的多个采样值 | node_cpu_seconds_total[5m] |
| 标量 | Scalar | 一个单纯的数字浮点值,没有时间戳和标签 | 1.618、1024 |
| 字符串 | String | 一个单纯的字符串值,目前仅在 PromQL 内部使用,不常用 | "up" |
实战要点:录制规则(Recording Rules)的右侧表达式必须返回瞬时向量。如果你误写了区间向量或标量,Prometheus 会在规则校验时报错。这是录制规则设计中最常见的入门错误。
2.2 瞬时向量 vs 区间向量:核心差异
这两个向量类型是 PromQL 查询的主力。它们的差异直接决定了你能使用的函数和操作符。
- 瞬时向量:用于当前值的运算、比较、聚合。例如:
avg(rate(http_requests_total[5m]))中的rate()返回的就是瞬时向量。 - 区间向量:用于历史窗口的聚合计算,是
rate()、increase()、avg_over_time()等函数的唯一合法输入。
记忆口诀:方括号
[] 是区间向量的标志。看到 [5m]、[1h] 就知道这是区间向量,必须搭配范围函数使用。
下面的 SVG 图展示了瞬时向量与区间向量在时间轴上的数据采集差异:
2.3 选择器与标签匹配
选择器(Selector)用于从 Prometheus 时间序列数据库中筛选出特定的指标。标签匹配是选择器的灵魂,它决定了查询的精确度与范围。
2.3.1 完整选择器语法
<metric_name>{<label_matchers>}
其中 <label_matchers> 支持四种匹配操作符:
| 操作符 | 含义 | 示例 | 匹配结果 |
|---|---|---|---|
= |
完全相等 | job="api-server" |
精确匹配标签值 |
!= |
不等于 | job!="api-server" |
排除特定标签值 |
=~ |
正则匹配 | instance=~"10\\.0\\.1\\..*" |
匹配正则表达式的标签值 |
!~ |
正则排除 | instance!~"10\\.0\\.1\\..*" |
排除匹配正则表达式的标签值 |
正则性能警告:
=~ 和 !~ 使用 RE2 正则引擎。避免在标签匹配中使用过于复杂的正则表达式(如回溯、反向引用),否则会导致 Prometheus 查询性能急剧下降。对于大量时间序列的查询,优先使用 = 精确匹配。
2.3.2 选择器匹配逻辑
选择器中的多个标签匹配条件是逻辑与(AND)关系。只有同时满足所有标签条件的序列才会被选中。
# 选中 job 为 "node" 且 instance 以 "10.0.1." 开头的所有序列
node_memory_MemTotal_bytes{job="node", instance=~"10\\.0\\.1\\..*"}
下面的 SVG 图展示了选择器如何通过标签匹配从时间序列数据库中筛选数据:
2.4 空匹配与隐式标签
选择器中的标签匹配可以省略指标名,此时会匹配所有指标。这在调试时非常有用,但生产环境中应避免,因为会带来巨大的性能开销。
# 匹配所有指标中 job 为 "node" 的序列(不推荐在生产中使用)
{job="node"}
此外,Prometheus 会自动为每个时间序列附加 __name__ 隐式标签,其值即为指标名。你可以像普通标签一样使用它:
# 等价于 node_cpu_seconds_total
{__name__="node_cpu_seconds_total"}
2.5 选择器最佳实践
- 优先精确匹配:能用
=就不要用=~,正则匹配会消耗更多 CPU。 - 避免全量扫描:始终至少指定一个标签匹配条件,减少 Prometheus 需要扫描的序列数量。
- 注意标签值中的特殊字符:正则匹配时,点号
.、反斜杠\等需要转义。 - 录制规则中固定标签:在录制规则表达式中,尽量使用精确标签匹配,确保规则结果的可预测性。
录制规则设计提示:录制规则的目标是预计算高频查询。在规则表达式中使用精确标签匹配(
=)而非正则匹配,可以显著降低规则评估时的计算开销,同时避免因标签值变化导致规则结果意外改变。