66 lines
2.2 KiB
Python
66 lines
2.2 KiB
Python
"""YakPanel - Monitor API"""
|
|
import psutil
|
|
from fastapi import APIRouter, Depends, Query
|
|
|
|
from app.api.auth import get_current_user
|
|
from app.models.user import User
|
|
|
|
router = APIRouter(prefix="/monitor", tags=["monitor"])
|
|
|
|
|
|
@router.get("/system")
|
|
async def monitor_system(current_user: User = Depends(get_current_user)):
|
|
"""Get system stats"""
|
|
cpu = psutil.cpu_percent(interval=1)
|
|
mem = psutil.virtual_memory()
|
|
disk = psutil.disk_usage("/")
|
|
return {
|
|
"cpu_percent": cpu,
|
|
"memory_percent": mem.percent,
|
|
"memory_used_mb": round(mem.used / 1024 / 1024, 1),
|
|
"memory_total_mb": round(mem.total / 1024 / 1024, 1),
|
|
"disk_percent": disk.percent,
|
|
"disk_used_gb": round(disk.used / 1024 / 1024 / 1024, 2),
|
|
"disk_total_gb": round(disk.total / 1024 / 1024 / 1024, 2),
|
|
}
|
|
|
|
|
|
@router.get("/processes")
|
|
async def monitor_processes(
|
|
current_user: User = Depends(get_current_user),
|
|
limit: int = Query(50, ge=1, le=200),
|
|
):
|
|
"""Get top processes by CPU usage"""
|
|
procs = []
|
|
for p in psutil.process_iter(["pid", "name", "username", "cpu_percent", "memory_percent", "status"]):
|
|
try:
|
|
info = p.info
|
|
cpu = info.get("cpu_percent") or 0
|
|
mem = info.get("memory_percent") or 0
|
|
procs.append({
|
|
"pid": info.get("pid"),
|
|
"name": info.get("name") or "",
|
|
"username": info.get("username") or "",
|
|
"cpu_percent": round(cpu, 1),
|
|
"memory_percent": round(mem, 1),
|
|
"status": info.get("status") or "",
|
|
})
|
|
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
|
continue
|
|
procs.sort(key=lambda x: (x["cpu_percent"] or 0), reverse=True)
|
|
return {"processes": procs[:limit]}
|
|
|
|
|
|
@router.get("/network")
|
|
async def monitor_network(current_user: User = Depends(get_current_user)):
|
|
"""Get network I/O stats"""
|
|
net = psutil.net_io_counters()
|
|
return {
|
|
"bytes_sent": net.bytes_sent,
|
|
"bytes_recv": net.bytes_recv,
|
|
"packets_sent": net.packets_sent,
|
|
"packets_recv": net.packets_recv,
|
|
"bytes_sent_mb": round(net.bytes_sent / 1024 / 1024, 2),
|
|
"bytes_recv_mb": round(net.bytes_recv / 1024 / 1024, 2),
|
|
}
|