from typing import Any, List from fastapi import APIRouter, Depends, Query from fastapi.responses import HTMLResponse from app import schemas from app.core.security import verify_apitoken from app.monitoring import monitor, get_metrics_response from app.schemas.monitoring import ( PerformanceSnapshot, EndpointStats, ErrorRequest, MonitoringOverview ) router = APIRouter() @router.get("/overview", summary="获取监控概览", response_model=schemas.MonitoringOverview) def get_overview(_: str = Depends(verify_apitoken)) -> Any: """ 获取完整的监控概览信息 """ # 获取性能快照 performance = monitor.get_performance_snapshot() # 获取最活跃端点 top_endpoints = monitor.get_top_endpoints(limit=10) # 获取最近错误 recent_errors = monitor.get_recent_errors(limit=20) # 检查告警 alerts = monitor.check_alerts() return MonitoringOverview( performance=PerformanceSnapshot( timestamp=performance.timestamp, cpu_usage=performance.cpu_usage, memory_usage=performance.memory_usage, active_requests=performance.active_requests, request_rate=performance.request_rate, avg_response_time=performance.avg_response_time, error_rate=performance.error_rate, slow_requests=performance.slow_requests ), top_endpoints=[EndpointStats(**endpoint) for endpoint in top_endpoints], recent_errors=[ErrorRequest(**error) for error in recent_errors], alerts=alerts ) @router.get("/performance", summary="获取性能快照", response_model=schemas.PerformanceSnapshot) def get_performance(_: str = Depends(verify_apitoken)) -> Any: """ 获取当前性能快照 """ snapshot = monitor.get_performance_snapshot() return PerformanceSnapshot( timestamp=snapshot.timestamp, cpu_usage=snapshot.cpu_usage, memory_usage=snapshot.memory_usage, active_requests=snapshot.active_requests, request_rate=snapshot.request_rate, avg_response_time=snapshot.avg_response_time, error_rate=snapshot.error_rate, slow_requests=snapshot.slow_requests ) @router.get("/endpoints", summary="获取端点统计", response_model=List[schemas.EndpointStats]) def get_endpoints( limit: int = Query(10, ge=1, le=50, description="返回的端点数量"), _: str = Depends(verify_apitoken) ) -> Any: """ 获取最活跃的API端点统计 """ endpoints = monitor.get_top_endpoints(limit=limit) return [EndpointStats(**endpoint) for endpoint in endpoints] @router.get("/errors", summary="获取错误请求", response_model=List[schemas.ErrorRequest]) def get_errors( limit: int = Query(20, ge=1, le=100, description="返回的错误数量"), _: str = Depends(verify_apitoken) ) -> Any: """ 获取最近的错误请求记录 """ errors = monitor.get_recent_errors(limit=limit) return [ErrorRequest(**error) for error in errors] @router.get("/alerts", summary="获取告警信息", response_model=List[str]) def get_alerts(_: str = Depends(verify_apitoken)) -> Any: """ 获取当前告警信息 """ return monitor.check_alerts() @router.get("/metrics", summary="Prometheus指标") def get_prometheus_metrics(_: str = Depends(verify_apitoken)) -> Any: """ 获取Prometheus格式的监控指标 """ return get_metrics_response() @router.get("/dashboard", summary="监控仪表板", response_class=HTMLResponse) def get_dashboard(_: str = Depends(verify_apitoken)) -> Any: """ 获取实时监控仪表板HTML页面 """ return HTMLResponse(content=""" MoviePilot 性能监控仪表板

🎬 MoviePilot 性能监控仪表板

--
CPU使用率 (%)
--
内存使用率 (%)
--
活跃请求数
--
请求率 (req/min)
--
平均响应时间 (s)
--
错误率 (%)

📊 性能趋势

🔥 最活跃端点

""")