要实现nginx响应时间与qps在grafana中秒级可视化,需采用vts模块+nginx-vts-exporter采集细粒度指标,prometheus以5s间隔抓取,grafana用p99延迟对比及10s刷新确保实时准确。

要让 Nginx 的响应时间与 QPS 在 Grafana 中实现秒级可视化,关键不在“连上就行”,而在于指标采集足够细、传输足够快、展示足够准。核心是用对数据源、设对刷新、分清两类延迟、避免平均值误导。
选对指标采集方式:VTS 模块比 stub_status 更适合秒级吞吐分析
stub_status 只能提供全局连接数和总请求数,无法按 location、upstream 或状态码拆分,QPS 和响应时间都只能算粗粒度均值。真正支撑秒级下钻的,是 VTS 模块 + nginx-vts-exporter:
- 在 nginx.conf 的 http 块中启用:
vhost_traffic_status_zone; - 添加 status 页面(可选):
location /status { vhost_traffic_status_display; vhost_traffic_status_display_format html; } - nginx-vts-exporter 默认监听 9913 端口,Prometheus 抓取该地址即可获取带维度的指标,如:
nginx_vts_server_request_seconds_total{server="api.example.com",code="200"}nginx_vts_upstream_response_seconds_sum{upstream="backend-llm"}
配置 Prometheus 抓取策略:5 秒间隔 + 无标签聚合保障秒级灵敏度
默认 15 秒抓取会平滑掉突发毛刺。要在 Grafana 中看到真实秒级波动,需调整 scrape_interval:
- 在 prometheus.yml 中为 nginx-vts-exporter 任务单独设置:
scrape_interval: 5s - 计算 QPS 用 rate 而非 increase,例如:
rate(nginx_vts_server_request_seconds_count[30s]),窗口略大于抓取周期,减少抖动 - 避免在 PromQL 中过早
sum by()聚合——先保留 server、location、code 等标签,Grafana 面板再按需下钻
Grafana 面板设计:P99 延迟必须和 request_time / upstream_response_time 同图对比
单看“平均响应时间”等于没看。专业看板必须揭示瓶颈位置:
- 用折线图并列绘制:
histogram_quantile(0.99, sum(rate(nginx_vts_server_request_seconds_bucket[1m])) by (le))(客户端总耗时 P99)
与histogram_quantile(0.99, sum(rate(nginx_vts_upstream_response_seconds_bucket[1m])) by (le))(后端真实处理 P99) - 两线差值持续扩大 → Nginx 自身(SSL 握手、重写规则、限流模块)成为瓶颈;差值稳定 → 问题在后端服务
- 在延迟图下方叠加 5xx 错误率(
sum(rate(nginx_vts_server_request_seconds_count{code=~"5.."}[1m])) / sum(rate(nginx_vts_server_request_seconds_count[1m]))),判断“慢是否伴随错”
时间范围与刷新设置:默认 15 分钟 + 自动 10 秒刷新是实用底线
太长的时间范围掩盖瞬时峰值,太短则无法观察趋势。建议:
- Grafana 仪表盘右上角设为 Last 15 minutes,这是识别突发流量与恢复节奏的黄金窗口
- 所有核心面板(QPS、P99 延迟、错误率)开启 Refresh every 10s,确保监控画面不滞后于真实业务
- 避免使用 “Live” 模式——它依赖 WebSocket,稳定性不如定时轮询,在高负载下易断连











