You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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。

问题
  1. 以下表达式是否为展示时间维度平均响应时间的正确公式?
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])))
  1. 如何基于累加指标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),有两种常用方式:

  1. 推荐简洁写法:用rate函数直接计算时间窗口内的平均每秒增量
rate(api_v1_sdk_token_seconds_count{app="sdk-backend"}[$__rate_interval])
  1. 直观手动计算:用increase获取窗口内的请求增量,再除以窗口的秒数
increase(api_v1_sdk_token_seconds_count{app="sdk-backend"}[$__rate_interval]) / $__rate_interval_seconds

两种方式都能正确处理指标重置,rate写法更简洁,适合在Grafana中展示QPS趋势。


内容的提问来源于stack exchange,提问作者Lesha Pipiev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:09:57