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:结果数量爆炸
- 原因:保留高基数标签(如 instance、pod)。
- 修复(丢弃高基数维度):
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'
七、练习题(含预期方向)#
- 统计 Prometheus 自身每分钟请求量
- 提示:rate+sum by (job) - 计算各 job 的 CPU 使用率均值
- 提示:avg by (job) - 统计 up=1 的目标数
- 提示:count by (job) (up == 1) - 找出 CPU 使用率最高的 3 个实例
- 提示:topk(3, ...)
八、实践建议#
- 面板中优先
sum by (job)或avg by (cluster),减少噪声。 - 告警中避免
topk作为核心条件,保证稳定性。 - 高基数指标先降维再计算,控制序列数量。