17.5.3 聚合函数与分组策略

聚合函数与分组策略#

PromQL 的聚合用于对多条时间序列进行降维与汇总,是面板与告警的核心。聚合由函数分组策略组成:函数决定数值合并方式,分组策略决定保留哪些标签。

一、原理草图:聚合与分组的作用#

文章图片

二、快速可执行环境(安装与验证)#

用 Docker 起一个 Prometheus,方便练习 PromQL 聚合。

# 1) 创建配置目录
mkdir -p /opt/prometheus
cat > /opt/prometheus/prometheus.yml <<'EOF'
global:
  scrape_interval: 15s
scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]
EOF

# 2) 启动 Prometheus
docker run -d --name prom \
  -p 9090:9090 \
  -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus:v2.48.0

# 3) 验证服务
curl -s http://localhost:9090/-/ready
# 预期输出:Prometheus Server is Ready.

命令解释:
- -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:挂载配置文件。
- -p 9090:9090:暴露 Web UI 与 API。
- /-/ready:就绪检查接口。

三、常用聚合函数与示例(含解释)#

  • sum():求和(实例 → 服务)
  • avg():平均值(跨实例平均)
  • min() / max():极值
  • count():计数(实例数量、存活目标)
  • stddev() / stdvar():波动性
  • topk() / bottomk():排名
  • quantile():分位数(延迟指标)

示例 1:按服务聚合 QPS

sum by (job) (rate(prometheus_http_requests_total[5m]))

解释:将实例维度汇总成服务维度,得到每个 job 的 QPS。

示例 2:按集群平均负载

avg by (job) (rate(process_cpu_seconds_total[5m]))

解释:对同一 job 的进程 CPU 使用率取平均。

示例 3:存活目标数统计

count by (job) (up)

解释:按 job 统计监控目标数量,常用于巡检。

示例 4:Top 5 负载实例

topk(5, rate(process_cpu_seconds_total[5m]))

解释:筛选 CPU 使用率最高的 5 个实例。

四、分组策略:by / without#

  • by (label1, label2):保留标签,按标签组合分组。
  • without (label1, label2):丢弃标签,其他标签自动保留为分组键。

示例 1:保留 job 标签

sum by (job) (rate(prometheus_http_requests_total[5m]))

示例 2:丢弃 instance 标签

avg without (instance) (rate(process_cpu_seconds_total[5m]))

五、聚合标签规则与注意点#

  • 默认聚合会丢弃所有标签(除非 by 指定保留)。
  • without 只删除指定标签,其余标签保留。
  • 指标名 __name__ 默认保留。

六、常见排错与修复#

问题 1:聚合结果“只有一条线”
- 原因:未指定 by,所有维度被合并。
- 修复:

sum by (job, instance) (rate(prometheus_http_requests_total[5m]))

问题 2:结果数量爆炸
- 原因:保留高基数标签(如 instancepod)。
- 修复(丢弃高基数维度):

sum without (instance, pod) (rate(container_cpu_usage_seconds_total[5m]))

问题 3:空结果
- 原因:标签键写错或数据不存在。
- 排查命令(API 验证):

curl -G 'http://localhost:9090/api/v1/series' \
  --data-urlencode 'match[]=prometheus_http_requests_total'

七、练习题(含预期方向)#

  1. 统计 Prometheus 自身每分钟请求量
    - 提示:rate + sum by (job)
  2. 计算各 job 的 CPU 使用率均值
    - 提示:avg by (job)
  3. 统计 up=1 的目标数
    - 提示:count by (job) (up == 1)
  4. 找出 CPU 使用率最高的 3 个实例
    - 提示:topk(3, ...)

八、实践建议#

  • 面板中优先 sum by (job)avg by (cluster),减少噪声。
  • 告警中避免 topk 作为核心条件,保证稳定性。
  • 高基数指标先降维再计算,控制序列数量。