3. PromQL 基础与常用函数:即时查询与范围查询、核心函数

PromQL(Prometheus Query Language)是 Prometheus 生态中用于筛选、聚合和计算时间序列数据的核心语言。在容量压测与故障排查场景中,工程师需要区分即时查询与范围查询,并熟练使用 rate、irate、increase、delta、predict_linear 等函数来洞察系统瓶颈与趋势。

3.1 即时查询 vs 范围查询

查询类型 语法示例 返回结果 典型用途
即时查询 node_cpu_seconds_total{mode="idle"} 单个时间戳上的样本值 仪表盘瞬时快照、告警当前值
范围查询 node_cpu_seconds_total{mode="idle"}[5m] 时间窗口内的一组样本(向量+时间戳) 计算速率、增量、趋势预测
实战要点:压测期间查看当前 CPU 使用率用即时查询;分析过去 5 分钟请求量突增用范围查询配合 rate 函数。

3.2 核心函数详解

3.2.1 rate() — 每秒平均增长率

适用于 Counter 类型指标,计算指定时间窗口内的每秒平均增长率。自动处理计数器重置(如进程重启)。

# 过去5分钟 HTTP 请求每秒平均速率
rate(http_requests_total[5m])

# 压测场景:对比压测前后 QPS 变化
rate(http_requests_total{status="200"}[1m])

3.2.2 irate() — 瞬时增长率

基于时间窗口内最后两个样本计算瞬时增长率,对突增更敏感,但曲线锯齿感强。

# 观察最近两个采集间隔的请求突增
irate(http_requests_total[1m])
对比维度 rate() irate()
计算方式 窗口内所有样本的平均增长率 最后两个样本的增长率
对突变的响应 平滑,滞后 灵敏,易抖动
推荐场景 长期趋势、告警规则 短时毛刺检测、实时仪表盘

3.2.3 increase() — 时间窗口内的增量

返回 Counter 在指定时间窗口内增加了多少。常用于计算“过去 5 分钟请求总数”。

# 过去1小时错误请求总数
increase(http_requests_total{status="500"}[1h])

3.2.4 delta() — Gauge 的差值

适用于 Gauge 类型,计算时间窗口首尾样本的差值。可用于内存、连接数等指标的波动分析。

# 过去10分钟内存使用量的变化
delta(node_memory_MemAvailable_bytes[10m])

3.2.5 predict_linear() — 线性趋势预测

基于过去一段时间的历史数据,使用线性回归预测未来某个时间点的值。容量规划与磁盘满预警的利器。

# 预测未来1小时磁盘使用率(假设过去6小时趋势)
predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[6h], 3600) < 0
避坑提示:predict_linear 对周期性波动(如白天高负载、夜间低负载)预测不准,建议结合业务周期调整时间窗口。

3.3 函数选择决策流程

PromQL 核心函数选择决策流程 指标类型判断 Counter(只增不减) Gauge(可增可减) 需要速率还是增量? rate() / irate() increase() 需要差值还是预测? delta() predict_linear() 实战建议 压测场景:rate() 看平均负载趋势,irate() 抓瞬时毛刺 容量规划:predict_linear() 预测磁盘/内存耗尽时间

3.4 压测与巡检实战组合示例

场景:压测过程中发现 5xx 错误率突增,需要快速定位根因。
# 1. 查看过去5分钟错误率(rate平滑)
rate(http_requests_total{status=~"5.."}[5m])

# 2. 查看最近30秒瞬时错误突增(irate灵敏)
irate(http_requests_total{status=~"5.."}[1m])

# 3. 计算错误请求增量,判断是否达到告警阈值
increase(http_requests_total{status="500"}[5m]) > 100

# 4. 检查对应后端服务内存波动
delta(process_resident_memory_bytes{job="api-server"}[5m])

# 5. 预测磁盘是否会在1小时内写满
predict_linear(node_filesystem_avail_bytes{mountpoint="/data"}[30m], 3600) < 0

3.5 常见误区与排查要点

  • Counter 指标不能直接用 delta() — 计数器重置会导致负值,应使用 rate() 或 increase()。
  • 范围窗口过小 — 如果采集间隔 15s,窗口 [30s] 可能只有 2 个样本,irate() 结果不稳定。
  • predict_linear 时间窗口选择 — 窗口太短(如 5 分钟)无法捕捉长期趋势;窗口太长(如 7 天)可能包含过时模式。
  • rate vs irate 混用 — 告警规则建议用 rate() 避免抖动误告;实时仪表盘可用 irate() 提升敏感度。
SRE 最佳实践:在压测脚本中同时采集 rate(http_requests_total[1m]) 和 irate(http_requests_total[1m]),前者用于容量评估,后者用于毛刺告警。