"""权限系统监控API 提供权限系统的监控数据和告警信息。 """ from typing import Annotated from fastapi import APIRouter, Depends, status from app.core.deps import get_current_user from app.core.permission_monitor import get_permission_monitor router = APIRouter(prefix="/api/v1/permission-monitoring", tags=["permission-monitoring"]) @router.get("/metrics", status_code=status.HTTP_200_OK) async def get_permission_metrics( _=Depends(get_current_user), ) -> dict: """获取权限系统指标 返回权限检查、缓存等运行指标。 """ monitor = get_permission_monitor() return monitor.get_metrics() @router.get("/cache-stats", status_code=status.HTTP_200_OK) async def get_cache_statistics( _=Depends(get_current_user), ) -> dict: """获取缓存统计信息 返回缓存命中率、缓存项目数等信息。 """ monitor = get_permission_monitor() return monitor.get_cache_stats() @router.get("/alerts", status_code=status.HTTP_200_OK) async def get_alerts( level: str | None = None, limit: int = 100, _=Depends(get_current_user), ) -> dict: """获取告警列表 Args: level: 告警级别过滤(info, warning, error) limit: 返回的最大告警数 Returns: 告警列表 """ monitor = get_permission_monitor() alerts = monitor.get_alerts(level=level, limit=limit) return { "total": len(alerts), "alerts": alerts, } @router.post("/reset-metrics", status_code=status.HTTP_200_OK) async def reset_metrics( _=Depends(get_current_user), ) -> dict: """重置监控指标 清除所有累积的指标数据,重新开始统计。 """ monitor = get_permission_monitor() monitor.reset_metrics() return {"message": "指标已重置"} @router.post("/clear-alerts", status_code=status.HTTP_200_OK) async def clear_alerts( _=Depends(get_current_user), ) -> dict: """清除所有告警 删除所有累积的告警记录。 """ monitor = get_permission_monitor() monitor.clear_alerts() return {"message": "告警已清除"} @router.get("/health", status_code=status.HTTP_200_OK) async def permission_system_health( _=Depends(get_current_user), ) -> dict: """权限系统健康检查 返回权限系统的健康状态。 """ monitor = get_permission_monitor() metrics = monitor.get_metrics() cache_stats = monitor.get_cache_stats() # 计算健康分数 check_metrics = metrics["check_metrics"] cache_metrics = metrics["cache_metrics"] health_score = 100 issues = [] # 检查错误率 if check_metrics["error_rate"] > 1: health_score -= 20 issues.append("权限检查错误率过高") # 检查缓存命中率 if cache_metrics["hit_rate"] < 50: health_score -= 10 issues.append("缓存命中率过低") # 检查平均响应时间 if check_metrics["avg_time"] > 0.01: # 10ms health_score -= 10 issues.append("权限检查响应时间过长") # 检查拒绝率 if check_metrics["deny_rate"] > 50: health_score -= 5 issues.append("权限拒绝率过高") return { "status": "healthy" if health_score >= 80 else "degraded" if health_score >= 50 else "unhealthy", "health_score": max(0, health_score), "issues": issues, "metrics": metrics, "cache_stats": cache_stats, }