rust_observer 0.2.2

Express telemetry rust SDK
Documentation
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,
        }
    }
}