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 中数据类型、时间序列与查询操作之间的核心关系,帮助建立整体认知。

PromQL 数据类型与核心概念关系图 PromQL 数据类型与核心概念关系 时间序列 (Time Series) 标签 (Labels) 唯一标识 查询类型:瞬时向量 (Instant Vector) 查询类型:区间向量 (Range Vector) 包含时间窗口 [5m] [1h] 应用场景:告警规则评估 / 仪表盘面板 / 自愈剧本触发条件 标量 (Scalar) / 字符串 (String) 辅助类型:参与运算 / 告警注释

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 查询的两种基本形态。瞬时向量用于获取当前快照,区间向量用于分析历史趋势。在自愈剧本中,告警规则的延迟问题往往与区间向量的时间窗口长度、数据基数以及查询效率直接相关。掌握这些基础概念,是后续优化聚合查询、降低告警延迟的必备前提。