| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- """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()
- # Get initial CPU percentage (this will return 0.0)
- process.cpu_percent()
- # Wait a bit and get the actual CPU percentage
- 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('/')
- # Get I/O stats directly from /proc/[pid]/io to avoid psutil's field name assumptions
- 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),
- },
- }
|