Files
innotexBoard/backend/app/services/system_old.py
2026-01-16 18:40:39 +01:00

102 lines
3.1 KiB
Python

import psutil
from typing import List, Dict
from pydantic import BaseModel
class CPUUsage(BaseModel):
percent: float
average: float
cores: int
per_cpu: List[float]
class MemoryUsage(BaseModel):
percent: float
used: int # en bytes
total: int # en bytes
available: int # en bytes
class ProcessInfo(BaseModel):
pid: int
name: str
status: str
cpu_percent: float
memory_percent: float
username: str
class SystemStats(BaseModel):
cpu: CPUUsage
memory: MemoryUsage
processes: List[ProcessInfo]
class SystemService:
"""Service pour récupérer les informations système"""
@staticmethod
def get_cpu_usage() -> CPUUsage:
"""Récupère l'utilisation CPU (non-bloquant, utilise le cache)"""
per_cpu = psutil.cpu_percent(interval=0, percpu=True)
avg_cpu = sum(per_cpu) / len(per_cpu) if per_cpu else 0
return CPUUsage(
percent=avg_cpu,
average=avg_cpu,
cores=psutil.cpu_count(),
per_cpu=per_cpu
)
@staticmethod
def get_memory_usage() -> MemoryUsage:
"""Récupère l'utilisation mémoire"""
mem = psutil.virtual_memory()
return MemoryUsage(
percent=mem.percent,
used=mem.used,
total=mem.total,
available=mem.available
)
@staticmethod
def get_top_processes(limit: int = 5) -> List[ProcessInfo]:
"""Récupère les processus les plus actifs (optimisé)"""
processes = []
try:
for proc in psutil.process_iter(['pid', 'name', 'status', 'username']):
try:
info = proc.info
cpu_percent = proc.cpu_percent(interval=0)
# Ne garder que les processus avec une activité CPU > 0
if cpu_percent > 0.1:
mem_percent = proc.memory_percent()
processes.append(ProcessInfo(
pid=info['pid'],
name=info['name'],
status=info['status'],
cpu_percent=cpu_percent,
memory_percent=mem_percent,
username=info['username'] or 'N/A'
))
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
continue
# Trier par utilisation CPU
processes.sort(key=lambda x: x.cpu_percent, reverse=True)
return processes[:limit]
except Exception as e:
return []
return []
print(f"Erreur lors de la récupération des processus: {e}")
return []
@staticmethod
def get_system_stats() -> SystemStats:
"""Récupère les statistiques système complètes"""
return SystemStats(
cpu=SystemService.get_cpu_usage(),
memory=SystemService.get_memory_usage(),
processes=SystemService.get_top_processes(15)
)