在grafana中展示nginx慢查询接口top10需依托$ request_time与$upstream_response_time字段,通过prometheus+nginx-exporter(用histogram_quantile计算p95)或日志服务sql查询(如p95(request_time))实现,并增强维度对比、错误率叠加及点击下钻功能。

要在 Grafana 中展示 Nginx 慢查询接口的 Top10 排行榜,关键不是靠 Nginx 自身统计,而是利用其访问日志中两个核心时间字段——$request_time(客户端总耗时)和 $upstream_response_time(后端真实响应耗时),结合日志解析与 Prometheus 或日志服务两类主流数据源实现。
确保 Nginx 日志记录必要字段
慢接口识别的前提是日志里有可分析的时间维度。需在 Nginx 的 log_format 中明确包含:
- $request_time:单位为秒,精度毫秒,反映端到端延迟
- $upstream_response_time:多个 upstream 用逗号分隔,取第一个或用 Prometheus exporter 自动拆解
- $request_uri 或 $uri:用于聚合接口路径(建议规范化,如去除 query 参数)
- $status:便于后续叠加错误率过滤
示例 log_format:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $upstream_response_time $request_uri';
用 Prometheus + nginx-exporter 实现 Top10 接口排行
推荐使用 nginx-prometheus-exporter(官方维护),它能自动解析 access log 并按 uri、host、status 等维度暴露指标,例如:
-
nginx_http_request_duration_seconds_bucket{le="1.0", uri="/api/v1/user"}→ 直方图指标,支持 P90/P99 计算 -
nginx_http_requests_total{uri="/api/v1/order", status="200"}→ 请求计数,配合 rate() 可算 QPS
在 Grafana 中创建 Top10 面板时,用如下 PromQL 查询(以 P95 响应时间排序):
topk(10, histogram_quantile(0.95, sum(rate(nginx_http_request_duration_seconds_bucket[5m])) by (le, uri)))
注意:需提前在 exporter 启动时启用 --nginx.plus(若用 NGINX Plus)或配置 --web.listen-address 和日志路径;Prometheus 抓取间隔建议设为 15s,保证足够分辨率又不压垮 Nginx。
用日志服务(如阿里云 SLS/腾讯云 CLS)直接分析原始日志
若已有日志采集链路(如 Filebeat → Kafka → 日志服务),可跳过 exporter,直接在 Grafana 中对接日志服务数据源(如 aliyun-log-service-datasource 插件),写 SQL 式查询:
* | SELECT COUNT(*) AS cnt, uri, AVG(request_time) AS avg_rt, P95(request_time) AS p95_rt GROUP BY uri ORDER BY p95_rt DESC LIMIT 10
优势在于灵活支持复杂条件,例如只看 status >= 400 的慢错混合接口,或加 WHERE request_time > 1 筛选真正“慢”的请求。配合 Grafana 的变量功能,还能下钻查看某接口的耗时分布直方图或上游 IP 分布。
让排行榜真正有用:加维度、标异常、可联动
静态 Top10 数字价值有限,建议增强以下三点:
- 区分 request_time 与 upstream_response_time:并列两列,差值大说明 Nginx 层瓶颈(如 SSL、gzip、大 body);接近说明后端问题
-
叠加错误率:对每个 uri 计算
sum(status =~ "5..") / sum(*),高延迟+高 5xx 是典型熔断或超时信号 - 支持点击下钻:在面板设置 Link,跳转到该 uri 的详细延迟分布或最近 10 条原始日志,快速定位具体请求











