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 函数选择决策流程
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]),前者用于容量评估,后者用于毛刺告警。