如何在Grafana中正确展示累加式API响应时间及相关指标
问题背景
我有一个基于Scala + Cats Effect开发的服务(名为sdk-backend),使用Kamon.io将响应时间指标上报至Prometheus。该服务提供令牌获取API,发起2次调用时生成如下直方图指标:
# TYPE api_v1_sdk_token_seconds histogram api_v1_sdk_token_seconds_bucket{le="0.005"} 0.0 api_v1_sdk_token_seconds_bucket{le="0.01"} 0.0 api_v1_sdk_token_seconds_bucket{le="0.025"} 0.0 api_v1_sdk_token_seconds_bucket{le="0.05"} 0.0 api_v1_sdk_token_seconds_bucket{le="0.075"} 0.0 api_v1_sdk_token_seconds_bucket{le="0.1"} 0.0 api_v1_sdk_token_seconds_bucket{le="0.25"} 0.0 api_v1_sdk_token_seconds_bucket{le="0.5"} 0.0 api_v1_sdk_token_seconds_bucket{le="0.75"} 0.0 api_v1_sdk_token_seconds_bucket{le="1.0"} 0.0 api_v1_sdk_token_seconds_bucket{le="2.5"} 0.0 api_v1_sdk_token_seconds_bucket{le="5.0"} 0.0 api_v1_sdk_token_seconds_bucket{le="7.5"} 1.0 api_v1_sdk_token_seconds_bucket{le="10.0"} 2.0 api_v1_sdk_token_seconds_bucket{le="+Inf"} 2.0 api_v1_sdk_token_seconds_count 2.0 api_v1_sdk_token_seconds_sum 16.978542592
其中api_v1_sdk_token_seconds_count表示API被调用2次,总耗时16.97秒(对应api_v1_sdk_token_seconds_sum)。
指标已成功上报至Prometheus,我希望在Grafana中展示时间维度的响应时间,当前使用表达式:
avg by(app) (sum by(app) (increase(api_v1_sdk_token_seconds_sum{app="sdk-backend"}[$__rate_interval])))
负载测试报告显示平均响应时间为1338毫秒,但Grafana中峰值约为3000秒,与预期不符。本次测试共发起44467次请求,平均每秒请求数148.23。
问题
- 以下表达式是否为展示时间维度平均响应时间的正确公式?
avg by(app) (sum by(app) (increase(api_v1_sdk_token_seconds_sum{app="sdk-backend"}[$__rate_interval])))/avg by(app) (sum by(app) (increase(api_v1_sdk_token_seconds_count{app="sdk-backend"}[$__rate_interval])))
- 如何基于累加指标
api_v1_sdk_token_seconds_count编写表达式,展示每秒请求数?
解答
问题1解答
这个表达式核心逻辑正确,但存在冗余可以简化。
核心思路是用时间窗口内的总耗时增量除以请求数增量,得到窗口内的平均响应时间,这个逻辑没问题。但外层的avg by(app)是多余的——sum by(app)已经按app完成聚合,单个app的sum值取平均还是自身,简化后的表达式更简洁:
sum by(app) (increase(api_v1_sdk_token_seconds_sum{app="sdk-backend"}[$__rate_interval])) / sum by(app) (increase(api_v1_sdk_token_seconds_count{app="sdk-backend"}[$__rate_interval]))
额外注意:
- 结果单位是秒,若要和负载测试报告的毫秒单位对齐,需乘以1000:
(sum by(app) (increase(api_v1_sdk_token_seconds_sum{app="sdk-backend"}[$__rate_interval])) / sum by(app) (increase(api_v1_sdk_token_seconds_count{app="sdk-backend"}[$__rate_interval]))) * 1000
increase函数能自动处理指标重置问题,比直接计算差值更可靠,适合用于增量统计。
问题2解答
基于累加的api_v1_sdk_token_seconds_count计算每秒请求数(QPS),有两种常用方式:
- 推荐简洁写法:用
rate函数直接计算时间窗口内的平均每秒增量
rate(api_v1_sdk_token_seconds_count{app="sdk-backend"}[$__rate_interval])
- 直观手动计算:用
increase获取窗口内的请求增量,再除以窗口的秒数
increase(api_v1_sdk_token_seconds_count{app="sdk-backend"}[$__rate_interval]) / $__rate_interval_seconds
两种方式都能正确处理指标重置,rate写法更简洁,适合在Grafana中展示QPS趋势。
内容的提问来源于stack exchange,提问作者Lesha Pipiev
相关产品推荐
相关产品推荐

