57 lines
2.3 KiB
Python
57 lines
2.3 KiB
Python
|
|
"""系统监控只读接口;全部复用管理员依赖,不提供运维写操作。"""
|
||
|
|
|
||
|
|
from typing import Annotated
|
||
|
|
|
||
|
|
from fastapi import APIRouter, Path, Query, Request
|
||
|
|
from fastapi.encoders import jsonable_encoder
|
||
|
|
from fastapi.responses import JSONResponse
|
||
|
|
|
||
|
|
from app.api.deps import AdminUser, DbSession
|
||
|
|
from app.core.response import ApiResponse, PageResult, ok
|
||
|
|
from app.schemas.monitor import EventOut, EventQuery, MonitorWindow, OverviewOut
|
||
|
|
from app.services import monitor_service
|
||
|
|
|
||
|
|
router = APIRouter(prefix="/monitor", tags=["系统管理 · 系统监控"])
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/overview", response_model=ApiResponse[OverviewOut], summary="健康总览")
|
||
|
|
def overview(request: Request, session: DbSession, _: AdminUser):
|
||
|
|
return ok(monitor_service.overview(session, request.app.state.monitor))
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/trends", response_model=ApiResponse[dict], summary="分钟级监控趋势")
|
||
|
|
def trends(
|
||
|
|
request: Request, session: DbSession, _: AdminUser, query: Annotated[MonitorWindow, Query()]
|
||
|
|
):
|
||
|
|
return ok(monitor_service.trends(session, request.app.state.monitor, query))
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/interfaces", response_model=ApiResponse[dict], summary="接口性能排行")
|
||
|
|
def interfaces(
|
||
|
|
request: Request, session: DbSession, _: AdminUser, query: Annotated[MonitorWindow, Query()]
|
||
|
|
):
|
||
|
|
return ok(monitor_service.interfaces(session, request.app.state.monitor, query))
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/events", response_model=ApiResponse[PageResult[EventOut]], summary="诊断事件")
|
||
|
|
def events(session: DbSession, _: AdminUser, query: Annotated[EventQuery, Query()]):
|
||
|
|
return ok(monitor_service.events(session, query))
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/events/{event_id}", response_model=ApiResponse[EventOut], summary="诊断事件详情")
|
||
|
|
def event(session: DbSession, _: AdminUser, event_id: Annotated[int, Path(ge=1)]):
|
||
|
|
return ok(monitor_service.event(session, event_id))
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/diagnostic", summary="下载脱敏诊断摘要")
|
||
|
|
def diagnostic(
|
||
|
|
request: Request, session: DbSession, _: AdminUser, query: Annotated[EventQuery, Query()]
|
||
|
|
):
|
||
|
|
return JSONResponse(
|
||
|
|
jsonable_encoder(monitor_service.diagnostic(session, request.app.state.monitor, query)),
|
||
|
|
headers={
|
||
|
|
"Content-Disposition": 'attachment; filename="monitor-diagnostic.json"',
|
||
|
|
"Cache-Control": "no-store",
|
||
|
|
},
|
||
|
|
)
|