如何用Spring Boot+Prometheus+Grafana统计指定时间范围的准确请求数
Prometheus查询指定时间区间接口请求准确增量的方案
问题根因说明
首先明确你遇到的两个问题的本质:
http_server_requests_seconds_count是Counter类型指标,本身存储的是服务启动以来对应接口的请求累计值,直接查询只会返回查询时刻的总计数,和你选的时间区间没有关联,所以会出现跨区间返回旧累计值的问题。increase()函数是Prometheus基于区间向量差值做外推计算的函数,为了适配采样点落在区间边界的场景会做数值修正,所以返回值是近似值,和实际请求量会有小幅偏差。
可选解决方案
方案1:低误差通用方案(适合99%业务场景)
调整Prometheus采集配置+优化查询语句,误差可以控制在1%以内:
- 首先把
http_server_requests相关指标的采集间隔(scrape_interval)设置为你常用最小查询区间的1/10以上,比如你常查5分钟区间,采集间隔设为15s即可大幅降低外推误差。 - 多接口统计的查询语句如下,可直接适配Grafana单值面板的分组展示:
sum by (uri) (increase(http_server_requests_seconds_count{uri!~".*health|.*static"}[$__range]))
方案2:无误差精准统计方案
如果你需要完全准确的请求量统计,直接用区间首尾累计值做差的逻辑,跳过外推计算:
sum by (uri) ( clamp_min( http_server_requests_seconds_count{} - (http_server_requests_seconds_count{} offset $__range), 0 ) )
说明:
- 逻辑是取当前时刻的总请求数,减去所选时间区间起始时刻的总请求数,差值就是区间内的新增请求数,完全无误差。
clamp_min函数是为了避免区间内服务重启导致Counter重置为0时出现负数结果,不需要的话可以去掉。- 如果有多个服务实例,可调整分组维度增加
service、instance等标签适配你的场景。
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

