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

Grafana百分比错误率仪表盘计算值异常排查求助

问题根源与解决方案

核心问题

你遇到的问题本质是**total_requests_gauge指标没有status_code标签**,同时误用了Gauge类型统计请求数:

  1. 代码中创建_requestGauge时未指定LabelNames,导致该指标无法区分不同状态码的请求——所有请求都会累加至同一个无标签的Gauge实例。
  2. 你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:20:37