Uvicorn是否支持类似uWSGI的Stats Server统计服务机制?
Uvicorn 服务统计功能问题解答
原生支持情况说明
Uvicorn 目前没有内置类似 uWSGI Stats Server 的独立端口统计服务机制,官方未提供可直接开启该类功能的启动参数。
可替代的实现方案
你可以根据自身统计需求选择以下方案实现同类效果:
- 应用层埋点统计
为 FastAPI 应用添加自定义中间件,即可覆盖绝大多数服务运行指标统计:请求总数量、各接口请求占比、HTTP 状态码分布、请求平均/分位延迟、当前活跃请求数等。也可以直接集成成熟的监控指标中间件,输出标准化格式的指标数据供后续监控系统采集分析。 - 进程级状态监控
如果需要统计 Uvicorn 工作进程的资源占用情况(CPU 使用率、内存占用、进程存活状态等),可搭配系统级进程监控工具实现,将进程指标与应用层统计指标统一存储展示,即可实现和 uWSGI Stats Server 类似的全维度统计效果。 - 独立统计端口扩展
如果你需要完全对标 uWSGI 用独立端口提供统计数据的模式,可以在启动 Uvicorn 时同时挂载一个仅用于统计查询的极简子应用,绑定到单独端口运行,与主业务服务端口完全隔离,访问该端口即可获取所有统计数据。
简单统计中间件示例
from fastapi import FastAPI, Request import time from collections import defaultdict app = FastAPI() # 统计数据存储 stats = { "total_requests": 0, "status_count": defaultdict(int), "total_request_time": 0.0, "active_requests": 0 } @app.middleware("http") async def stats_collect_middleware(request: Request, call_next): start_time = time.time() stats["active_requests"] += 1 response = await call_next(request) process_time = time.time() - start_time stats["total_requests"] += 1 stats["status_count"][response.status_code] += 1 stats["total_request_time"] += process_time stats["active_requests"] -= 1 return response # 统计数据查询接口,可单独挂载到其他端口 @app.get("/service-stats") async def get_service_stats(): avg_request_time = stats["total_request_time"] / stats["total_requests"] if stats["total_requests"] else 0 return { "total_requests": stats["total_requests"], "active_requests": stats["active_requests"], "status_code_distribution": stats["status_count"], "average_request_time_s": round(avg_request_time, 4) }
内容的提问来源于stack exchange,提问作者Suyog Shimpi
相关产品推荐
相关产品推荐

