use smallvec::SmallVec;
use sysinfo::{System, Disks};
use std::sync::Arc;
use parking_lot::Mutex;
#[derive(Debug, Clone)]
pub struct SystemMetrics {
pub cpu_usage: f32,
pub cpu_cores_usage: SmallVec<[f32; 16]>,
pub memory_total: u64,
pub memory_used: u64,
pub swap_total: u64,
pub swap_used: u64,
pub disk_total_space: u64,
pub disk_available_space: u64,
}
pub struct SystemMetricsCollector {
sys: Arc<Mutex<System>>,
disks: Arc<Mutex<Disks>>,
}
impl SystemMetricsCollector {
pub fn new() -> Self {
let mut sys = System::new_all();
sys.refresh_all();
let disks = Disks::new_with_refreshed_list();
SystemMetricsCollector {
sys: Arc::new(Mutex::new(sys)),
disks: Arc::new(Mutex::new(disks)),
}
}
pub fn collect(&self) -> SystemMetrics {
let mut sys = self.sys.lock();
sys.refresh_all();
let cpu_usage = sys.global_cpu_usage();
let cpu_cores_usage = sys.cpus().iter().map(|cpu| cpu.cpu_usage()).collect();
let memory_total = sys.total_memory();
let memory_used = sys.used_memory();
let swap_total = sys.total_swap();
let swap_used = sys.used_swap();
let mut disks = self.disks.lock();
disks.refresh_list();
let disk_total_space = disks.iter().map(|disk| disk.total_space()).sum();
let disk_available_space = disks.iter().map(|disk| disk.available_space()).sum();
SystemMetrics {
cpu_usage,
cpu_cores_usage,
memory_total,
memory_used,
swap_total,
swap_used,
disk_total_space,
disk_available_space,
}
}
}