Initial YakPanel commit
This commit is contained in:
65
YakPanel-server/backend/app/api/monitor.py
Normal file
65
YakPanel-server/backend/app/api/monitor.py
Normal file
@@ -0,0 +1,65 @@
|
||||
"""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),
|
||||
}
|
||||
Reference in New Issue
Block a user