1. 增加了请求框架
2. 增加了删除虚拟环境的脚本
This commit is contained in:
65
request/src/middleware/performance.py
Normal file
65
request/src/middleware/performance.py
Normal file
@@ -0,0 +1,65 @@
|
||||
from fastapi import Request, Response
|
||||
from starlette.middleware.base import BaseHTTPMiddleware
|
||||
from starlette.types import ASGIApp
|
||||
import time
|
||||
from typing import Callable
|
||||
from ..utils import get_logger
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
|
||||
class PerformanceMiddleware(BaseHTTPMiddleware):
|
||||
"""性能监控中间件"""
|
||||
|
||||
# 类变量,用于存储实例引用
|
||||
_instance = None
|
||||
|
||||
def __init__(self, app: ASGIApp):
|
||||
super().__init__(app)
|
||||
self.logger = get_logger("performance")
|
||||
self.total_requests = 0
|
||||
self.requests_per_status = {}
|
||||
self.total_response_time = 0
|
||||
|
||||
# 保存实例引用
|
||||
PerformanceMiddleware._instance = self
|
||||
|
||||
async def dispatch(self, request: Request, call_next: Callable) -> Response:
|
||||
"""处理请求并添加性能头"""
|
||||
start_time = time.time()
|
||||
|
||||
try:
|
||||
response = await call_next(request)
|
||||
response_time = time.time() - start_time
|
||||
|
||||
# 添加性能头
|
||||
response.headers["X-Response-Time"] = f"{response_time:.4f}"
|
||||
|
||||
# 更新请求计数
|
||||
self.total_requests += 1
|
||||
status_code = response.status_code
|
||||
if status_code not in self.requests_per_status:
|
||||
self.requests_per_status[status_code] = 0
|
||||
self.requests_per_status[status_code] += 1
|
||||
|
||||
# 更新总响应时间
|
||||
self.total_response_time += response_time
|
||||
|
||||
return response
|
||||
|
||||
except Exception as e:
|
||||
raise
|
||||
|
||||
def get_stats(self):
|
||||
"""获取性能统计信息"""
|
||||
return {
|
||||
"total_requests": self.total_requests,
|
||||
"requests_per_status": self.requests_per_status,
|
||||
"total_response_time": self.total_response_time,
|
||||
"average_response_time": self.total_response_time / self.total_requests if self.total_requests > 0 else 0
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def get_instance(cls):
|
||||
"""获取中间件实例"""
|
||||
return cls._instance
|
||||
Reference in New Issue
Block a user