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

如何利用starlette exporter获取每秒请求数?遇指标异常求助

问题排查与解决方案

一、先解决「发送请求后指标无变化」的核心问题

这是所有监控数据异常的根源,先确认指标是否真的在更新:

  • 直接访问你的Starlette服务的metrics端点(默认是/metrics),手动发送GET请求后刷新页面,查看starlette_requests_total的数值是否增长。如果没增长,说明中间件配置存在问题:
    • 检查代码是否正确添加了PrometheusMiddleware,示例配置如下:
      from starlette.applications import Starlette
      from starlette_exporter import PrometheusMiddleware, handle_metrics
      
      app = Starlette()
      app.add_middleware(PrometheusMiddleware)
      app.add_route("/metrics", handle_metrics)
      
    • 确认请求是否经过中间件覆盖的路由,比如FastAPI场景下,要确保中间件是全局添加,而非仅绑定到子路由。
    • 排查是否有反向代理(如Nginx)拦截了/metrics端点,导致Prometheus无法拉取最新数据。

二、解决「rate函数仅4m区间有数据」的问题

当starlette_requests_total能正常更新后,再处理rate计算的问题:

  • Prometheus的rate函数需要至少2个样本点才能计算速率。你的scrape_interval为15s,理论上30s区间就能获取足够样本,但出现4m才出数据的情况,大概率是:
    1. 之前指标未正常更新(解决上述问题后会改善)
    2. Prometheus的scrape配置异常,比如scrape_timeout过短导致拉取失败,或者target配置错误,实际scrape间隔远大于15s。
  • 验证方法:打开Prometheus的Targets页面(/targets),查看服务的scrape状态,确认Last Scrape和Scrape Interval是否符合预期,是否存在scrape错误。
  • 合理的rate区间选择:建议区间设置为scrape_interval的4-5倍,比如15s间隔对应[1m]区间即可。若仍无数据,可直接在Prometheus的Graph页面查询starlette_requests_total{method="GET"},确认是否生成了多时间点的数值序列。

三、额外注意事项

  • starlette_requests_in_progress是gauge类型指标,直接查询即可获取当前正在处理的请求数,无需使用rate函数。
  • 若使用FastAPI,需确认starlette-exporter版本为最新,避免路由匹配兼容问题导致指标不更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:04:56