zzz / openhands /runtime /utils /system_stats.py
ar08's picture
Upload 1040 files
246d201 verified
"""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),
},
}