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

使用Prometheus+Grafana无法准确呈现HTTP请求负载变化的问题求助

解决Prometheus中http_requests_total无法正确反映单次并发请求的问题

测试场景与现状

  • 测试操作:使用Apache Bench发起100并发请求,之后无后续请求
  • 采集配置:Node Exporter(获取CPU使用率)、Python prometheus-fastapi-exporter(获取HTTP请求指标),两者采集间隔均为15s
  • 指标表现差异:
    • CPU使用率图(查询语句100 - (avg by (cpu) (irate(node_cpu_seconds_total{mode="idle"}[30s])) * 100),step/res设为auto):呈平滑增减趋势,可清晰识别单次高负载时刻
    • http_requests_total图(查询语句irate(http_requests_total{handler!~'none|/metrics'}[5m]),数据分辨率设为30s,设auto时波动更严重):显示持续高请求,无法匹配CPU的单次负载事件

问题原因分析

  1. irate时间窗口选择不合理:irate计算指定时间窗口内的瞬时增长率,5m窗口会包含请求完成后的空采集周期,导致即使没有新请求,窗口内仍有之前的增量记录,进而持续显示非零速率。
  2. 多进程指标未聚合:Gunicorn多进程部署时,每个worker独立维护http_requests_total计数器,未做聚合的情况下,irate跨进程计算易出现异常波动。
  3. 数据分辨率与采集间隔不匹配:采集间隔为15s却设置30s分辨率,会导致数据降采样丢失瞬时请求细节;设auto时,Prometheus自动调整step会进一步放大波动。

解决方案

1. 调整irate时间窗口

将时间窗口设为2倍采集间隔(30s),既覆盖至少两次采集点,又不会包含过多空周期,更准确捕捉突发请求:

irate(http_requests_total{handler!~'none|/metrics'}[30s])

2. 聚合多进程指标

对同一实例下的多个worker进程指标做聚合,避免单进程计数器的独立增长导致失真:

irate(sum by (instance, handler) (http_requests_total{handler!~'none|/metrics'})[30s])

3. 匹配数据分辨率与采集间隔

将数据分辨率设为15s(与采集间隔一致),或保持step为auto但限制查询时间范围,避免自动放大step导致的图形失真。

调整后,http_requests_total的速率图会在并发请求时刻出现明显峰值,之后迅速回落至0,与CPU使用率图的高负载时刻完全匹配,真实反映“单次100并发后无请求”的实际场景。

内容的提问来源于stack exchange,提问作者enjoi4life411

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:07:52