Files
ctms/backend/app/api/v1/permission_monitoring.py
T
Cheng Zhou 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>
2026-05-14 10:41:16 +08:00

135 lines
3.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""权限系统监控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,
}