|
|
|
|
|
import platform
|
|
|
import socket
|
|
|
import time
|
|
|
from pathlib import Path
|
|
|
|
|
|
import psutil
|
|
|
|
|
|
from app.utils.common_util import bytes2human
|
|
|
|
|
|
from .schema import (
|
|
|
CpuInfoSchema,
|
|
|
DiskInfoSchema,
|
|
|
MemoryInfoSchema,
|
|
|
PyInfoSchema,
|
|
|
ServerMonitorSchema,
|
|
|
SysInfoSchema,
|
|
|
)
|
|
|
|
|
|
|
|
|
class ServerService:
|
|
|
"""服务监控模块服务层"""
|
|
|
|
|
|
@staticmethod
|
|
|
async def get_server_monitor_info() -> ServerMonitorSchema:
|
|
|
return ServerMonitorSchema(
|
|
|
cpu=ServerService._get_cpu_info(),
|
|
|
mem=ServerService._get_memory_info(),
|
|
|
sys=ServerService._get_system_info(),
|
|
|
py=ServerService._get_python_info(),
|
|
|
disks=ServerService._get_disk_info(),
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
def _get_cpu_info() -> CpuInfoSchema:
|
|
|
cpu_times = psutil.cpu_times_percent()
|
|
|
cpu_num = psutil.cpu_count(logical=True)
|
|
|
if not cpu_num:
|
|
|
cpu_num = 1
|
|
|
return CpuInfoSchema(
|
|
|
cpu_num=cpu_num,
|
|
|
used=cpu_times.user,
|
|
|
sys=cpu_times.system,
|
|
|
free=cpu_times.idle,
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
def _get_memory_info() -> MemoryInfoSchema:
|
|
|
memory = psutil.virtual_memory()
|
|
|
return MemoryInfoSchema(
|
|
|
total=bytes2human(memory.total),
|
|
|
used=bytes2human(memory.used),
|
|
|
free=bytes2human(memory.free),
|
|
|
usage=memory.percent,
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
def _get_system_info() -> SysInfoSchema:
|
|
|
hostname = socket.gethostname()
|
|
|
return SysInfoSchema(
|
|
|
computer_ip=socket.gethostbyname(hostname),
|
|
|
computer_name=platform.node(),
|
|
|
os_arch=platform.machine(),
|
|
|
os_name=platform.platform(),
|
|
|
user_dir=str(Path.cwd()),
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
def _get_python_info() -> PyInfoSchema:
|
|
|
current_process = psutil.Process()
|
|
|
memory = psutil.virtual_memory()
|
|
|
process_memory = current_process.memory_info()
|
|
|
|
|
|
start_time = current_process.create_time()
|
|
|
run_time = ServerService._calculate_run_time(start_time)
|
|
|
|
|
|
return PyInfoSchema(
|
|
|
name=current_process.name(),
|
|
|
version=platform.python_version(),
|
|
|
start_time=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(start_time)),
|
|
|
run_time=run_time,
|
|
|
home=str(Path(current_process.exe())),
|
|
|
memory_total=bytes2human(memory.available),
|
|
|
memory_used=bytes2human(process_memory.rss),
|
|
|
memory_free=bytes2human(memory.available - process_memory.rss),
|
|
|
memory_usage=round((process_memory.rss / memory.available) * 100, 2),
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
def _get_disk_info() -> list[DiskInfoSchema]:
|
|
|
disk_info = []
|
|
|
for partition in psutil.disk_partitions():
|
|
|
try:
|
|
|
usage = psutil.disk_usage(partition.mountpoint)
|
|
|
mount_point = str(Path(partition.mountpoint))
|
|
|
disk_info.append(
|
|
|
DiskInfoSchema(
|
|
|
dir_name=mount_point,
|
|
|
sys_type_name=partition.fstype,
|
|
|
type_name=f"本地固定磁盘({mount_point})",
|
|
|
total=bytes2human(usage.total),
|
|
|
used=bytes2human(usage.used),
|
|
|
free=bytes2human(usage.free),
|
|
|
usage=usage.percent,
|
|
|
)
|
|
|
)
|
|
|
except (PermissionError, FileNotFoundError):
|
|
|
continue
|
|
|
return disk_info
|
|
|
|
|
|
@staticmethod
|
|
|
def _calculate_run_time(start_time: float) -> str:
|
|
|
difference = time.time() - start_time
|
|
|
days = int(difference // (24 * 60 * 60))
|
|
|
hours = int((difference % (24 * 60 * 60)) // (60 * 60))
|
|
|
minutes = int((difference % (60 * 60)) // 60)
|
|
|
return f"{days}天{hours}小时{minutes}分钟"
|