如何在Grafana中用PromQL计算按路由方法分组的QoS百分比?
问题分析与解决方案
不需要额外设置两个计数器,单个带method、route、code标签的Counter完全可以满足需求。你的查询无法生成完整时序图的核心原因是:当某个(route, method)分组下没有成功请求(code非2xx)时,分子部分的时间序列会缺失,导致除法操作后该分组的时序消失,图表出现断档。
修正后的PromQL查询
以下查询会自动补全缺失的成功请求序列(设为0),确保每个有请求的分组都能稳定显示QoS数值:
( # 统计各分组的成功请求速率,无成功请求时补0 sum by (route, method) (rate(http_requests_total{code=~"2.."}[$__rate_interval])) or on (route, method) vector(0) ) / # 统计各分组的总请求速率 sum by (route, method) (rate(http_requests_total[$__rate_interval])) * 100
如果需要避免分母为0的情况(比如某个分组暂时没有任何请求),可以进一步优化:
( (sum by (route, method) (rate(http_requests_total{code=~"2.."}[$__rate_interval])) or on (route, method) vector(0)) / sum by (route, method) (rate(http_requests_total[$__rate_interval])) ) * 100 # 总请求为0时显示0 or vector(0)
额外检查点
- 验证指标抓取:访问应用的
/metrics端点,确认http_requests_total指标存在,且带有method、route、code标签的有效条目。 - 变量替换:如果手动执行查询(而非Grafana),将
$__rate_interval替换为具体时间范围,比如5m。 - 路由标签一致性:确保
req.route?.path能正确获取路由路径,对于动态路由(如/api/v1/users/:id),该标签会显示为:id;若需要聚合所有动态子路径,需调整路由标签的生成逻辑(比如将动态参数替换为统一占位符)。
内容的提问来源于stack exchange,提问作者matrix
相关产品推荐
相关产品推荐

