Grafana官方.NET面板请求统计异常,求正确PromQL查询
问题解决:修复"Top 10请求端点"面板数据异常
原查询的问题分析
你当前的查询存在两个核心问题,导致数据异常:
- 使用
max_over_time取计数器的最大值,最终得到的是计数器的累计总值(从服务启动到当前的总请求数),而非指定时间范围内的新增请求数,所以数值会远高于实际请求量 $__rate_interval是用于速率计算的变量,不适合直接用来统计时间范围内的总请求数,这也是修改时间范围后数据无变化的原因
正确的查询语句
要实现"指定时间范围内总请求数排名前10的端点"需求,使用以下PromQL查询:
基础版(保留原标签分组)
topk(10, sum by (http_route, http_request_method) ( increase(http_server_request_duration_seconds_count{job="$job", app_name="$appname"}[$__range]) ) )
带合并标签版(和原面板展示格式一致)
如果需要像原查询一样合并请求方法和路由为单个标签,使用:
topk(10, label_join( sum by (http_route, http_request_method) ( increase(http_server_request_duration_seconds_count{job="$job", app_name="$appname"}[$__range]) ), "method_route", " ", "http_request_method", "http_route" ) )
为什么这个查询有效
$__range是Grafana内置变量,直接对应当前面板选择的时间范围(比如1小时、6小时),确保统计的是该时间段内的总请求增量increase()是Prometheus专门为计数器设计的函数,自动处理服务重启导致的计数器归零(重置)问题,准确计算时间范围内的请求数增量sum by()按请求端点和方法分组求和,再用topk(10)筛选出请求量最高的10个结果,完全匹配你的需求
额外注意事项
- 确认你的OpenTelemetry采集器正确导出了
http_server_request_duration_seconds_count计数器,且http_route、http_request_method标签没有缺失 - 如果遇到数据仍不准确的情况,检查服务的计数器是否按规范实现(计数器只能递增,不能递减)
内容的提问来源于stack exchange,提问作者donkee
相关产品推荐
相关产品推荐

