| """Utilities for getting system resource statistics."""
|
|
|
| import time
|
|
|
| import psutil
|
|
|
|
|
| def get_system_stats() -> dict:
|
| """Get current system resource statistics.
|
|
|
| Returns:
|
| dict: A dictionary containing:
|
| - cpu_percent: CPU usage percentage for the current process
|
| - memory: Memory usage stats (rss, vms, percent)
|
| - disk: Disk usage stats (total, used, free, percent)
|
| - io: I/O statistics (read/write bytes)
|
| """
|
| process = psutil.Process()
|
|
|
| process.cpu_percent()
|
|
|
| time.sleep(0.1)
|
|
|
| with process.oneshot():
|
| cpu_percent = process.cpu_percent()
|
| memory_info = process.memory_info()
|
| memory_percent = process.memory_percent()
|
|
|
| disk_usage = psutil.disk_usage('/')
|
|
|
|
|
| try:
|
| with open(f'/proc/{process.pid}/io', 'rb') as f:
|
| io_stats = {}
|
| for line in f:
|
| if line:
|
| try:
|
| name, value = line.strip().split(b': ')
|
| io_stats[name.decode('ascii')] = int(value)
|
| except (ValueError, UnicodeDecodeError):
|
| continue
|
| except (FileNotFoundError, PermissionError):
|
| io_stats = {'read_bytes': 0, 'write_bytes': 0}
|
|
|
| return {
|
| 'cpu_percent': cpu_percent,
|
| 'memory': {
|
| 'rss': memory_info.rss,
|
| 'vms': memory_info.vms,
|
| 'percent': memory_percent,
|
| },
|
| 'disk': {
|
| 'total': disk_usage.total,
|
| 'used': disk_usage.used,
|
| 'free': disk_usage.free,
|
| 'percent': disk_usage.percent,
|
| },
|
| 'io': {
|
| 'read_bytes': io_stats.get('read_bytes', 0),
|
| 'write_bytes': io_stats.get('write_bytes', 0),
|
| },
|
| }
|
|
|