Files
ai-agent-admin/backend-fastapi/core/server_monitor/api.py
T
2026-06-08 18:14:59 +08:00

266 lines
8.3 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
服务器监控API(异步版本)
"""
import asyncio
from typing import Dict, Any, List, Optional
from fastapi import APIRouter
from core.server_monitor.server_info import ServerInfoCollector
from core.server_monitor.schema import (
ServerMonitorResponseSchema,
RealtimeStatsSchema,
BatteryInfoSchema,
BasicInfoSchema,
CpuInfoSchema,
MemoryInfoSchema,
DiskInfoSchema,
NetworkInfoSchema,
ProcessInfoSchema,
SystemLoadSchema,
BootTimeSchema,
UserInfoSchema,
)
router = APIRouter(prefix="/server_monitor", tags=["服务器监控"])
# 创建全局的服务器信息收集器实例
server_collector = ServerInfoCollector()
def _get_default_overview_error(error_msg: str) -> Dict[str, Any]:
"""获取默认的错误响应"""
return {
"basic_info": {
"hostname": "error",
"ip_address": "error",
"system": "error",
"platform": error_msg,
"architecture": "error",
"processor": "error",
"python_version": "error",
"machine": "error",
"node": "error",
"release": "error",
"version": "error"
},
"cpu_info": {
"physical_cores": 0,
"total_cores": 0,
"cpu_percent": 0.0,
"cpu_percent_per_core": [],
"max_frequency": 0.0,
"min_frequency": 0.0,
"current_frequency": 0.0,
"cpu_times": {},
"cpu_stats": {}
},
"memory_info": {
"virtual": {
"total": 0.0,
"available": 0.0,
"used": 0.0,
"free": 0.0,
"percent": 0.0,
"active": 0.0,
"inactive": 0.0,
"buffers": 0.0,
"cached": 0.0,
"shared": 0.0
},
"swap": {
"total": 0.0,
"used": 0.0,
"free": 0.0,
"percent": 0.0,
"sin": 0.0,
"sout": 0.0
}
},
"disk_info": {
"partitions": [],
"total_read_bytes": 0.0,
"total_write_bytes": 0.0,
"total_read_count": 0,
"total_write_count": 0
},
"network_info": {
"total": {
"bytes_sent": 0,
"bytes_recv": 0,
"packets_sent": 0,
"packets_recv": 0,
"errin": 0,
"errout": 0,
"dropin": 0,
"dropout": 0
},
"per_interface": {},
"interfaces": {},
"connections": []
},
"process_info": {
"total_processes": 0,
"top_processes": [],
"running_processes": 0,
"sleeping_processes": 0
},
"system_load": {
"load_1min": 0.0,
"load_5min": 0.0,
"load_15min": 0.0,
"cpu_count": 0
},
"boot_time": {
"boot_time": "",
"uptime_seconds": 0,
"uptime_formatted": "",
"uptime_days": 0,
"uptime_hours": 0,
"uptime_minutes": 0
},
"users_info": [],
"timestamp": ""
}
@router.get("/overview", response_model=ServerMonitorResponseSchema, summary="获取服务器完整监控信息")
async def get_server_overview():
"""获取服务器完整监控信息"""
try:
data = await asyncio.to_thread(server_collector.get_all_info)
return data
except Exception as e:
print(f"Error in get_server_overview: {e}")
return _get_default_overview_error(str(e))
@router.get("/realtime", response_model=RealtimeStatsSchema, summary="获取实时统计信息")
async def get_realtime_stats():
"""获取实时统计信息"""
try:
return await asyncio.to_thread(server_collector.get_realtime_stats)
except Exception as e:
print(f"Error in get_realtime_stats: {e}")
return {
"cpu_percent": 0.0,
"memory_percent": 0.0,
"disk_io": {"read_speed": 0, "write_speed": 0},
"network_io": {"upload_speed": 0, "download_speed": 0},
"network_total": {"bytes_sent": 0, "bytes_recv": 0, "packets_sent": 0, "packets_recv": 0},
"disk_total": {"read_bytes": 0, "write_bytes": 0, "read_count": 0, "write_count": 0},
"cpu_details": {"current_frequency": 0, "cpu_percent_per_core": []},
"memory_details": {"total": 0, "available": 0, "used": 0, "free": 0},
"system_load": {"load_1min": 0, "load_5min": 0, "load_15min": 0},
"process_stats": {"total_processes": 0, "running_processes": 0, "sleeping_processes": 0},
"process_info": {"total_processes": 0, "top_processes": [], "running_processes": 0, "sleeping_processes": 0},
"network_interfaces": {},
"network_connections": [],
"timestamp": ""
}
@router.get("/basic_info", response_model=BasicInfoSchema, summary="获取基础系统信息")
async def get_basic_info():
"""获取基础系统信息"""
try:
return await asyncio.to_thread(server_collector.get_basic_info)
except Exception as e:
return {"error": str(e)}
@router.get("/cpu_info", response_model=CpuInfoSchema, summary="获取CPU信息")
async def get_cpu_info():
"""获取CPU信息"""
try:
return await asyncio.to_thread(server_collector.get_cpu_info)
except Exception as e:
return {"error": str(e)}
@router.get("/memory_info", response_model=MemoryInfoSchema, summary="获取内存信息")
async def get_memory_info():
"""获取内存信息"""
try:
return await asyncio.to_thread(server_collector.get_memory_info)
except Exception as e:
return {"error": str(e)}
@router.get("/disk_info", response_model=DiskInfoSchema, summary="获取磁盘信息")
async def get_disk_info():
"""获取磁盘信息"""
try:
return await asyncio.to_thread(server_collector.get_disk_info)
except Exception as e:
return {"error": str(e)}
@router.get("/network_info", response_model=NetworkInfoSchema, summary="获取网络信息")
async def get_network_info():
"""获取网络信息"""
try:
return await asyncio.to_thread(server_collector.get_network_info)
except Exception as e:
return {"error": str(e)}
@router.get("/process_info", response_model=ProcessInfoSchema, summary="获取进程信息")
async def get_process_info():
"""获取进程信息"""
try:
return await asyncio.to_thread(server_collector.get_process_info)
except Exception as e:
return {"error": str(e)}
@router.get("/system_load", response_model=SystemLoadSchema, summary="获取系统负载信息")
async def get_system_load():
"""获取系统负载信息"""
try:
return await asyncio.to_thread(server_collector.get_system_load)
except Exception as e:
return {"error": str(e)}
@router.get("/boot_time", response_model=BootTimeSchema, summary="获取系统启动时间信息")
async def get_boot_time():
"""获取系统启动时间信息"""
try:
return await asyncio.to_thread(server_collector.get_boot_time)
except Exception as e:
return {"error": str(e)}
@router.get("/users_info", response_model=List[UserInfoSchema], summary="获取用户信息")
async def get_users_info():
"""获取用户信息"""
try:
return await asyncio.to_thread(server_collector.get_users_info)
except Exception as e:
return {"error": str(e)}
@router.get("/temperature_info", summary="获取温度信息")
async def get_temperature_info():
"""获取温度信息"""
try:
return await asyncio.to_thread(server_collector.get_temperature_info)
except Exception as e:
return {"error": str(e)}
@router.get("/battery_info", response_model=Optional[BatteryInfoSchema], summary="获取电池信息")
async def get_battery_info():
"""获取电池信息"""
try:
battery_info = await asyncio.to_thread(server_collector.get_battery_info)
if battery_info:
return battery_info
else:
return None
except Exception as e:
return {"error": str(e)}