use cached::cached;
use serde::{Deserialize, Serialize};
use sysinfo::{Pid, ProcessesToUpdate, System};
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct ProcessSystemInfo {
pub memory_usage: u64,
pub cpu_usage: f32,
pub cpu_time: u64,
pub open_files: Option<usize>,
pub total_written_bytes: u64,
pub written_bytes: u64,
pub total_read_bytes: u64,
pub read_bytes: u64,
}
pub fn current_process_system_info() -> ProcessSystemInfo {
get_process_system_info(std::process::id() as usize)
}
#[cached(max_size = 64, ttl = 10, sync_writes = "by_key")]
pub fn get_process_system_info(pid: usize) -> ProcessSystemInfo {
let mut sys = System::new();
let sysinfo_pid = Pid::from(pid);
sys.refresh_processes(ProcessesToUpdate::Some(&[sysinfo_pid]), false);
sys.process(sysinfo_pid)
.map(|process| {
let disk_usage = process.disk_usage();
ProcessSystemInfo {
cpu_usage: process.cpu_usage(),
memory_usage: process.memory(),
cpu_time: process.accumulated_cpu_time(),
open_files: process.open_files(),
total_written_bytes: disk_usage.total_written_bytes,
written_bytes: disk_usage.written_bytes,
total_read_bytes: disk_usage.total_read_bytes,
read_bytes: disk_usage.read_bytes,
}
})
.unwrap_or_default()
}