Grafana百分比错误率仪表盘计算值异常排查求助
问题根源与解决方案
核心问题
你遇到的问题本质是**total_requests_gauge指标没有status_code标签**,同时误用了Gauge类型统计请求数:
- 代码中创建
_requestGauge时未指定LabelNames,导致该指标无法区分不同状态码的请求——所有请求都会累加至同一个无标签的Gauge实例。 - 你的PromQL查询中使用
status_code!="200"过滤该指标,但该指标根本不存在status_code标签,过滤后无匹配数据;同时Gauge类型不适合统计请求数(它表示瞬时值,而非累计事件数)。
正确解决方案
推荐使用Counter类型统计请求数(Prometheus标准做法),具体步骤如下:
1. 修改MetricsReporter代码
给total_requests Counter添加status_code标签,并调整调用逻辑:
public class MetricReporter { private readonly ILogger<MetricReporter> _logger; private readonly Counter _requestCounter; private readonly Histogram _responseTimeHistogram; public MetricReporter(ILogger<MetricReporter> logger) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); // 给Counter添加status_code标签 _requestCounter = Metrics.CreateCounter("total_requests", "The total number of requests serviced by this API.", new CounterConfiguration { LabelNames = new[] { "status_code" } }); _responseTimeHistogram = Metrics.CreateHistogram("request_duration_seconds", "The duration in seconds between the response to a request.", new HistogramConfiguration { Buckets = Histogram.ExponentialBuckets(0.01, 2, 10), LabelNames = new[] { "status_code", "method" , "path"} }); } // 调整方法,传入请求状态码 public void RegisterRequest(int statusCode) { _requestCounter.Labels(statusCode.ToString()).Inc(); } public void RegisterResponseTime(int statusCode, string method,string path, TimeSpan elapsed) { _responseTimeHistogram.Labels(statusCode.ToString(), method, path).Observe(elapsed.TotalSeconds); } }
之后在API请求结束的逻辑中,调用RegisterRequest(statusCode)传入实际的HTTP状态码(比如在全局过滤器、ActionFilter中处理)。
2. 修正PromQL查询
使用Counter的rate()函数计算每分钟错误请求占比:
100 * (sum(rate(total_requests{status_code!~"200|201|204"}[1m])) / sum(rate(total_requests[1m])))
rate():计算Counter的每秒增长率,适合统计一段时间内的请求速率,自动处理进程重启后的指标重置status_code!~"200|201|204":用正则匹配排除常见成功状态码,可根据业务需求调整;若仅需排除200,改为status_code!="200"即可
额外说明
- 移除
total_requests_gauge:Gauge用于表示瞬时状态(如当前在线用户数),不适合统计累计请求数,Counter才是正确选择 - 原查询失效原因:无标签的
total_requests_gauge无法通过status_code过滤,同时sum_over_time对Gauge的统计逻辑不符合请求数统计需求
内容的提问来源于stack exchange,提问作者Golide
相关产品推荐
相关产品推荐

