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 窗口。
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()判断趋势。
2.5 综合示例:一条告警规则的 PromQL 拆解
以下是一条实际告警规则的 PromQL,我们逐段拆解其含义:
# 告警:过去 5 分钟平均 CPU 使用率超过 85%
avg by (instance) (
rate(node_cpu_seconds_total{mode="idle"}[5m])
) > 0.85
node_cpu_seconds_total{mode="idle"}[5m]→ 区间向量:获取过去 5 分钟每个实例的 idle CPU 样本。rate(...)→ 计算每秒 idle 时间的增长率。avg by (instance) (...)→ 按实例聚合,取平均 idle 率。> 0.85→ 瞬时向量比较,触发条件为 idle 率低于 15%(即 CPU 使用率高于 85%)。