"""请求耗时观测中间件。""" from __future__ import annotations import logging import time from starlette.middleware.base import BaseHTTPMiddleware logger = logging.getLogger("api.performance") class PerformanceMiddleware(BaseHTTPMiddleware): """记录接口耗时;日志只包含路径、状态码和耗时,不包含请求参数。""" def __init__(self, app, *, slow_ms: float = 500.0): super().__init__(app) self.slow_ms = slow_ms async def dispatch(self, request, call_next): started = time.perf_counter() response = await call_next(request) elapsed_ms = (time.perf_counter() - started) * 1000 if elapsed_ms >= self.slow_ms: logger.warning( "slow request path=%s method=%s status=%s elapsed_ms=%.2f", request.url.path, request.method, response.status_code, elapsed_ms, ) return response