2. PromQL 基础回顾:数据类型与核心概念
在深入自愈剧本的告警延迟排查之前,必须牢固掌握 PromQL 的四种基本数据类型与核心概念。这些是构建查询、理解聚合行为、定位性能瓶颈的基石。错误的数据类型理解往往直接导致查询结果不符合预期,进而引发误告警或延迟触发。
2.1 四种数据类型速览
PromQL 表达式求值后返回以下四种类型之一。理解它们的区别是编写正确查询的第一步。
| 数据类型 | 英文名称 | 说明 | 典型示例 |
|---|---|---|---|
| 瞬时向量 | Instant Vector | 一组时间序列,每个序列包含一个最新采样值,且所有采样点的时间戳相同(查询时间点)。 | node_cpu_seconds_total |
| 区间向量 | Range Vector | 一组时间序列,每个序列包含一段时间窗口内的一组采样值。 | node_cpu_seconds_total[5m] |
| 标量 | Scalar | 一个简单的数字浮点值,没有时序标签。 | 1.618、1024 |
| 字符串 | String | 一个简单的字符串值,在 PromQL 中主要用于标签匹配和告警注释,不参与数学运算。 | "critical" |
SRE 实战提示: 在自愈剧本中,瞬时向量是触发告警规则评估的输入,而区间向量是计算速率(
rate)、平均值(avg_over_time)等聚合函数的原料。混淆两者是导致查询语法错误或逻辑错误的常见原因。
2.2 核心概念:时间序列与标签
Prometheus 存储的所有数据本质上都是时间序列。每个时间序列由 Metric Name(指标名) 和一组 Label(标签) 唯一标识。
- Metric Name: 描述被监控对象的一般特征,例如
http_requests_total、node_memory_MemAvailable_bytes。 - Labels: 键值对,用于对同一个指标进行多维度的细分。例如
method="GET"、status="200"、instance="web-01:9090"。
一个完整的时间序列标识示例:
http_requests_total{method="POST", handler="/api/v1/order", instance="10.0.0.1:8080"}
这个标识代表了一个特定的时间序列:所有标签值完全匹配的、随时间变化的 http_requests_total 数据点集合。
2.3 瞬时向量 vs. 区间向量:核心差异
这是 PromQL 中最关键的概念区分,直接决定了查询的语义和性能。
| 对比维度 | 瞬时向量 (Instant Vector) | 区间向量 (Range Vector) |
|---|---|---|
| 数据点数量 | 每个时间序列仅返回 1 个 最新值 | 每个时间序列返回 N 个 历史值(由时间窗口决定) |
| 语法特征 | 无时间窗口后缀 | 必须包含 [时间窗口],如 [5m]、[1h] |
| 典型用途 | 告警规则评估、当前状态查询、仪表盘即时面板 | 计算速率(rate)、分位数(quantile_over_time)、聚合窗口内的统计值 |
| 性能影响 | 查询速度快,仅需读取最新样本 | 查询速度较慢,需要从存储中读取窗口内的所有样本,窗口越大、序列越多,开销越大 |
延迟排查关键点: 在自愈剧本中,如果告警规则使用了
rate(metric[5m]) 这类区间向量查询,Prometheus 必须等待至少 5 分钟的数据积累才能计算出第一个有效值。这是告警触发延迟的固有来源之一。优化时需考虑是否可以使用瞬时向量替代,或缩短时间窗口。
2.4 数据类型转换与操作符
PromQL 操作符对操作数的数据类型有严格要求。理解这些规则可以避免运行时错误。
- 二元算术运算符(+、-、*、/、%):
- 瞬时向量
+瞬时向量 → 瞬时向量(按标签匹配进行元素级运算) - 瞬时向量
+标量 → 瞬时向量(标量作用于每个元素) - 标量
+标量 → 标量 - 不支持 区间向量直接参与算术运算。
- 瞬时向量
- 比较运算符(==、!=、>、<、>=、<=):
- 返回与操作数相同类型的结果,但值为 0(假)或 1(真)。
- 常用于告警规则中过滤出满足条件的序列。
- 向量匹配(Vector Matching):
- 一对一匹配: 默认模式,要求两侧标签集合完全相同。
- 多对一 / 一对多匹配: 使用
on、ignoring、group_left、group_right关键字,允许标签不完全匹配时进行运算。这是实现多维度聚合的基础。
2.5 核心概念关系图
下图展示了 PromQL 中数据类型、时间序列与查询操作之间的核心关系,帮助建立整体认知。
2.6 常见陷阱与排查思路
- 陷阱 1:在需要区间向量的地方使用了瞬时向量。
- 例如:
rate(http_requests_total)会报错,必须写成rate(http_requests_total[1m])。 - 排查: 检查 PromQL 语法错误提示,确认函数参数类型。
- 例如:
- 陷阱 2:区间向量窗口过大导致查询超时。
- 例如:在高基数指标上使用
avg_over_time(metric[1h]),可能因数据量过大导致 Prometheus OOM 或查询超时。 - 排查: 监控 Prometheus 查询性能指标(如
prometheus_engine_query_duration_seconds),逐步缩小时间窗口。
- 例如:在高基数指标上使用
- 陷阱 3:标量与向量运算时忽略了标签匹配。
- 例如:
node_memory_MemTotal_bytes / 1024是合法的,但node_memory_MemTotal_bytes / node_memory_MemFree_bytes会按标签匹配进行元素级除法,如果标签不一致,结果可能为空。 - 排查: 使用
on()或ignoring()明确匹配规则。
- 例如:
本章小结: 瞬时向量和区间向量是 PromQL 查询的两种基本形态。瞬时向量用于获取当前快照,区间向量用于分析历史趋势。在自愈剧本中,告警规则的延迟问题往往与区间向量的时间窗口长度、数据基数以及查询效率直接相关。掌握这些基础概念,是后续优化聚合查询、降低告警延迟的必备前提。