rust_observer/metrics/
sys_metrics.rs1use 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}