2. PromQL 基础回顾:瞬时向量与区间向量、标签匹配器、聚合操作符、基础函数速览

在编写告警规则与自愈剧本之前,必须牢固掌握 PromQL 的核心数据模型与查询语法。PromQL 的查询结果始终是 时间序列,而根据时间维度的不同,分为 瞬时向量 (Instant Vector) 与 区间向量 (Range Vector)。理解这两者的区别,是参数调优的基石。

2.1 瞬时向量 vs 区间向量

类型 定义 典型语法 告警场景
瞬时向量 每个时间序列在 当前时刻 的单个样本值 node_cpu_seconds_total 判断当前值是否超过阈值(如 CPU > 80%)
区间向量 每个时间序列在 过去一段时间窗口 内的多个样本值 node_cpu_seconds_total[5m] 计算过去 5 分钟的平均值、速率或分位数
调优要点: 告警规则中,rate()、avg_over_time() 等函数必须使用区间向量作为输入。区间窗口过短会导致抖动,过长则延迟告警。自愈剧本中通常使用 1m 或 5m 窗口。
瞬时向量 vs 区间向量 数据模型对比 时间 t₀ t₁ t₂ (现在) 瞬时向量 仅返回 t₂ 时刻的值 区间向量 [5m] 包含 t₀ 到 t₂ 之间的所有样本

2.2 标签匹配器 (Label Matchers)

标签匹配器用于在查询中筛选特定的时间序列。在告警规则中,精确的标签匹配能避免误报和漏报。

  • = : 精确匹配。例如 job="node-exporter"
  • != : 不匹配。例如 job!="node-exporter"
  • =~ : 正则匹配。例如 instance=~"10.0.0.*"
  • !~ : 正则不匹配。例如 instance!~"10.0.0.*"
性能警告: 正则匹配器(=~ / !~)在大量时间序列上会显著增加 PromQL 引擎的计算开销。在告警规则中,优先使用精确匹配器 = 或 !=,仅在必要时使用正则。

2.3 聚合操作符 (Aggregation Operators)

聚合操作符用于将多个时间序列合并为一个。在自愈剧本中,常用于计算集群整体状态。

操作符 作用 告警示例
sum() 求和 集群总请求量
avg() 平均值 平均 CPU 使用率
max() / min() 最大值 / 最小值 最高延迟 / 最低内存
count() 计数 异常实例数量
quantile() 分位数 P99 延迟

聚合操作符常与 by 或 without 子句配合使用,以保留或移除特定标签。

# 按 job 分组求和
sum by (job) (http_requests_total)

# 排除 instance 标签后求平均
avg without (instance) (node_cpu_seconds_total)

2.4 基础函数速览

以下函数在告警规则与自愈剧本中高频出现,必须熟练掌握。

函数 输入 输出 典型用途
rate() 区间向量 (Counter) 瞬时向量 (每秒增长率) QPS、错误率
irate() 区间向量 (Counter) 瞬时向量 (瞬时增长率) 敏感度更高的速率检测
increase() 区间向量 (Counter) 瞬时向量 (增量) 过去 5 分钟请求增量
avg_over_time() 区间向量 (Gauge) 瞬时向量 (窗口内均值) 平滑 CPU 使用率
max_over_time() 区间向量 (Gauge) 瞬时向量 (窗口内最大值) 峰值检测
delta() 区间向量 (Gauge) 瞬时向量 (首尾差值) 内存变化量
自愈剧本选型建议:
  • 检测流量突增:使用 rate() 配合 1m 窗口,避免 irate() 的毛刺。
  • 检测资源耗尽:使用 avg_over_time() 对 Gauge 指标做平滑,防止瞬时抖动触发误告警。
  • 检测异常突降:使用 delta() 或 decrease() 判断趋势。
PromQL 函数输入输出关系 区间向量 rate / irate / increase 瞬时向量 区间向量 avg_over_time / delta 瞬时向量

2.5 综合示例:一条告警规则的 PromQL 拆解

以下是一条实际告警规则的 PromQL,我们逐段拆解其含义:

# 告警:过去 5 分钟平均 CPU 使用率超过 85%
avg by (instance) (
  rate(node_cpu_seconds_total{mode="idle"}[5m])
) > 0.85
  1. node_cpu_seconds_total{mode="idle"}[5m] → 区间向量:获取过去 5 分钟每个实例的 idle CPU 样本。
  2. rate(...) → 计算每秒 idle 时间的增长率。
  3. avg by (instance) (...) → 按实例聚合,取平均 idle 率。
  4. > 0.85 → 瞬时向量比较,触发条件为 idle 率低于 15%(即 CPU 使用率高于 85%)。