6eea6b35fd
1. 修复 ApiPermissions.vue 中的数据绑定错误 - 从 axios 响应中正确提取 .data 属性 - 修复 loadPermissionData、loadMonitoringData、save 函数 2. 禁用 FastAPI 响应验证 - 在 api_permissions.py 中添加 response_model=None - 避免 Pydantic 验证错误 3. 注册权限监控 API 路由 - 在 router.py 中导入并注册 permission_monitoring 模块 - 修改 permission_monitoring.py 的路由前缀 Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
135 lines
3.4 KiB
Python
135 lines
3.4 KiB
Python
"""权限系统监控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="/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,
|
||
}
|