266 lines
8.3 KiB
Python
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)}
|