PromQL查询解析及超4秒API调用数查询需求求助
PromQL查询解析与需求实现
一、现有延迟分位数查询的工作原理
从内到外拆解这两个查询的执行逻辑:
irate(http_request_duration_seconds_bucket{path="<API Endpoint>"}[2m])http_request_duration_seconds_bucket是Prometheus的直方图指标,每个序列带le标签(表示“小于等于该值的延迟”),记录落在对应延迟区间的请求计数。irate计算瞬时速率:取2分钟时间窗口内最后两个数据点的差值,除以时间差,得到每秒的请求数。相比rate,irate对短时间内的流量波动更敏感,适合监控突发的延迟变化。
乘以30的作用
- 这里的
*30是把“每秒请求数”转换为30秒周期内的请求估算数,通常对应Grafana仪表盘的刷新间隔(比如每30秒刷新一次),让后续求和后的数据更贴合仪表盘的展示周期,避免分位数计算出现偏差。
- 这里的
sum(...) by (path, le)- 按
path(API路径)和le(延迟区间)分组求和,把同一API路径、同一延迟区间的请求数合并(比如多实例部署时,汇总所有实例的对应bucket数据),为分位数计算提供统一的直方图数据集。
- 按
histogram_quantile(0.99, ...)和histogram_quantile(0.95, ...)histogram_quantile是直方图分位数计算函数:第一个参数是分位值(0.99表示99分位,0.95表示95分位),第二个参数是按le分组的直方图数据。- 输出结果是对应分位数的延迟值:比如99分位结果为1.2秒,意味着99%的API请求延迟都不超过1.2秒;95分位同理,代表95%的请求延迟上限。
二、统计延迟大于4秒的API调用数量
利用直方图的le标签特性,可实现该需求,查询语句如下:
sum(irate(http_request_duration_seconds_bucket{path="<API Endpoint>", le="+Inf"}[2m])) by (path) - sum(irate(http_request_duration_seconds_bucket{path="<API Endpoint>", le="4"}[2m])) by (path)
逻辑说明:
le="+Inf"对应的bucket统计了所有请求数(所有请求的延迟都小于等于无穷大);le="4"对应的bucket统计了延迟≤4秒的请求数;- 两者相减,得到的就是延迟>4秒的请求数(以每秒速率的形式呈现,贴合实时监控场景)。
如果需要统计累计的请求总数(而非每秒速率),可以去掉irate,改用sum(http_request_duration_seconds_bucket{...}) by (path),这种方式会统计从指标采集开始到当前的累计值,适合长期趋势统计。
内容的提问来源于stack exchange,提问作者Ritesh Shakya
相关产品推荐
相关产品推荐

