rust_observer/metrics/
sys_metrics.rs

1use smallvec::SmallVec;
2use sysinfo::{System, Disks};
3use std::sync::Arc;
4use parking_lot::Mutex;
5
6#[derive(Debug, Clone)]
7pub struct SystemMetrics {
8    pub cpu_usage: f32,
9    pub cpu_cores_usage: SmallVec<[f32; 16]>,
10    pub memory_total: u64,
11    pub memory_used: u64,
12    pub swap_total: u64,
13    pub swap_used: u64,
14    pub disk_total_space: u64,
15    pub disk_available_space: u64,
16}
17
18pub struct SystemMetricsCollector {
19    sys: Arc<Mutex<System>>,
20    disks: Arc<Mutex<Disks>>,
21}
22
23impl SystemMetricsCollector {
24    pub fn new() -> Self {
25        let mut sys = System::new_all();
26        sys.refresh_all();
27        let disks = Disks::new_with_refreshed_list();
28
29        SystemMetricsCollector {
30            sys: Arc::new(Mutex::new(sys)),
31            disks: Arc::new(Mutex::new(disks)),
32        }
33    }
34
35    pub fn collect(&self) -> SystemMetrics {
36        let mut sys = self.sys.lock();
37        sys.refresh_all();
38
39        let cpu_usage = sys.global_cpu_usage();
40        let cpu_cores_usage = sys.cpus().iter().map(|cpu| cpu.cpu_usage()).collect();
41        let memory_total = sys.total_memory();
42        let memory_used = sys.used_memory();
43        let swap_total = sys.total_swap();
44        let swap_used = sys.used_swap();
45
46        let mut disks = self.disks.lock();
47        disks.refresh_list();
48        let disk_total_space = disks.iter().map(|disk| disk.total_space()).sum();
49        let disk_available_space = disks.iter().map(|disk| disk.available_space()).sum();
50
51        SystemMetrics {
52            cpu_usage,
53            cpu_cores_usage,
54            memory_total,
55            memory_used,
56            swap_total,
57            swap_used,
58            disk_total_space,
59            disk_available_space,
60        }
61    }
62}