news 2026/6/6 2:56:43

别再死记硬背了!用这5个真实监控场景,彻底搞懂Prometheus聚合查询(sum/topk/by/without)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再死记硬背了!用这5个真实监控场景,彻底搞懂Prometheus聚合查询(sum/topk/by/without)

5个真实监控场景解锁Prometheus聚合查询:从语法到实战的思维跃迁

当监控面板上的曲线突然飙升时,你是否还在手忙脚乱地逐台服务器排查?Prometheus的聚合查询就像给你的监控系统装上了X光机——它能穿透海量数据,直接呈现问题的骨骼结构。但大多数教程只教会你语法规则,却没说清什么时候该用by而不是without,何时该用topk配合sum。本文将用五个真实生产案例,带你重新理解这些聚合操作符的真正价值。

1. 微服务架构下的QPS异常定位:sum与by的黄金组合

某电商平台大促期间,监控中心突然收到数百个API的QPS告警。传统方法是逐个检查接口指标,但这就像在迷宫里找出口。我们用sumby可以三秒定位问题根源:

sum(rate(http_requests_total{status_code=~"5.."}[5m])) by (service_name)

这个查询的关键突破点在于:

  • rate函数先计算5分钟内每秒请求量,避免单纯计数器的误导
  • sum聚合将同一服务的所有实例数据合并(比如user-service有10个pod)
  • **by (service_name)**确保结果按服务维度展示,而不是混杂着实例、节点等标签

对比方案陷阱:如果改用without (instance),当服务部署在多个可用区时,AZ标签也会被保留,导致图表过于杂乱。这就是为什么在微服务场景下,明确指定by往往比排除without更精准。

实际案例中,这套查询帮助团队快速发现是payment-service的QPS达到平常的15倍,而其他服务仅增长2-3倍。进一步用下面查询钻取详情:

topk(3, sum(rate(http_requests_total{service_name="payment-service"}[5m])) by (endpoint, status_code) )

2. 集群磁盘容量预警:topk与without的精准打击

Kubernetes集群中某节点磁盘告警?这太常见了。但真正的运维高手关心的是跨节点的全局磁盘热点。下面这个查询能找出整个集群中磁盘使用率最高的三台主机,无论它们属于哪个节点:

topk(3, max by (device, host) ( node_filesystem_usage_percent * on (instance) group_left(host) node_meta ) ) without (kubernetes_io_hostname)

技术要点解析

  1. node_meta关联查询获取主机名标签(非K8s节点名)
  2. max by (device, host)确保每台主机的不同磁盘取最大值
  3. without移除K8s节点标签,实现跨节点聚合
  4. topk(3)最终筛选前三名

与简单使用by的方案对比,这套查询的优势在于:

方法显示维度是否暴露节点信息适用场景
by (host)仅主机名跨集群容量规划
without (kubernetes_io_hostname)保留所有非K8s标签混合云环境监控
无聚合实例级别完全暴露单节点排查

某次线上事故中,这套查询帮助团队发现三台不同节点上的主机都使用了同一有缺陷的CSI驱动,导致磁盘写入异常。这是单纯节点维度监控永远无法发现的模式。

3. 成本优化利器:avg与by的降维打击

云账单居高不下?用这个查询找出CPU利用率最低的可用区,考虑缩容:

avg by (availability_zone) ( 100 - avg without (cpu) ( rate(node_cpu_seconds_total{mode="idle"}[5m]) ) * 100 )

计算逻辑拆解

  1. 内层avg without (cpu)计算每个实例所有CPU核心的平均空闲率
  2. 100 - ... * 100转换为使用率百分比
  3. 外层avg by (availability_zone)按可用区聚合

在AWS环境实测发现:

  • us-east-1a平均CPU使用率62%
  • us-east-1b平均CPU使用率41%
  • us-east-1c平均CPU使用率58%

基于这个数据,团队将1b的实例规模缩减30%,每月节省$2.3万。关键是要用without (cpu)先消除多核的影响,再用by (availability_zone)提升到区域维度。

4. 错误风暴定位:count_values的降维打击

当500错误突然暴增时,如何快速判断是某个API导致的全局问题,还是所有API均匀上涨?试试这个多维分析:

count_values by (endpoint) ("error_distribution", sum by (endpoint, status_code) ( rate(http_requests_total{status_code=~"5.."}[5m]) ) > bool 10 )

创新点解析

  • bool修饰符将结果转换为1(真)或0(假)
  • count_values统计每个endpoint出现错误率>10次/秒的时间点数量
  • 最终结果展示各API的异常持续时间占比

某次事故分析显示:

  • /checkout87%时间超阈值
  • /search12%时间超阈值
  • 其他API <5%

这直接指向支付网关的接口问题,而非全局负载过高。这种用法在SRE团队中被称为"错误热力图"分析法。

5. 进阶技巧:子查询与聚合的化学反应

想要分析最近1小时内的5分钟请求量峰值?传统方法需要额外存储rollup数据,而PromQL子查询可以实时计算:

max_over_time( sum by (service) ( rate(http_requests_total[5m]) )[1h:5m] )

执行流程说明

  1. 内层rate计算5分钟滑动窗口的请求速率
  2. sum by (service)聚合服务级别数据
  3. [1h:5m]表示在过去1小时内,每5分钟评估一次
  4. 外层max_over_time取每个服务的最大峰值

在容量规划中,这个查询能识别服务的真实峰值负载,比单纯看1小时平均值更准确。例如:

  • 服务A:平均QPS 150,但峰值达到620
  • 服务B:平均QPS 80,峰值85

显然服务A需要预留更多弹性容量。这就是子查询聚合在生产环境中的高阶价值——它揭示了指标背后的真实故事。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 2:50:15

初步了解Django框架

目录创建一个django项目1&#xff0c;vscode安装 “python”扩展2&#xff0c;创建一个 django项目了解目录创建app安装postgreSQL创建 demo_app model创建 demo_app views/urls/tempaltes创建全局 html文件Django 模板语法其他Django是一个高级的PythonWeb应用框架&#xff0c…

作者头像 李华
网站建设 2026/6/6 2:43:41

【0605】定时器测量 PWM 的底层原理

一、定时器里有几个关键寄存器 ┌─────────────────────────────────────────┐ │ TIM8 定时器 │ │ │ │ CNT ← 计数器&#xff1a;一直在跑&…

作者头像 李华
网站建设 2026/6/6 2:43:07

快速原型对比:用快马一键生成trae solo与ide的轻量级demo

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请使用快马平台生成一个简单的web应用&#xff0c;用于对比trae solo和ide在开发同一个功能时的差异。应用需要包含两个并排的代码编辑器区域&#xff0c;左侧模拟trae solo的轻量…

作者头像 李华
网站建设 2026/6/6 2:41:48

SPSS交叉表实战:5分钟搞定疾病相对危险度计算(附数据准备要点)

SPSS交叉表实战&#xff1a;5分钟掌握疾病相对危险度计算全流程在医学研究和公共卫生领域&#xff0c;相对危险度&#xff08;Relative Risk, RR&#xff09;是评估暴露因素与疾病关联强度的核心指标。想象一下&#xff0c;你刚收集完200名患者的病毒检测和癌症诊断数据&#x…

作者头像 李华