如何利用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才出数据的情况,大概率是:- 之前指标未正常更新(解决上述问题后会改善)
- 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
相关产品推荐
相关产品推荐

