sysmonk/resources/
stream.rs1use std::collections::HashMap;
2use sysinfo::{CpuRefreshKind, Disks, RefreshKind, System};
3
4use crate::{resources, squire};
5use serde_json;
6
7pub fn get_disk_stats() -> serde_json::Value {
13    let disks = Disks::new_with_refreshed_list();
14    let disks_total = resources::info::get_disk_usage(&disks);
15    let mut disk_available: Vec<u64> = [].to_vec();
16    for disk in disks.list() {
17        disk_available.push(disk.available_space());
18    }
19    let disks_available: u64 = disk_available.iter().sum();
20    serde_json::json!({
21        "total": disks_total,
22        "used": disks_total - disks_available,
23    })
24}
25
26fn get_docker_stats() -> Result<Vec<serde_json::Value>, Box<dyn std::error::Error>> {
32    let ps_result = squire::util::run_command("docker", &["ps", "-q"], false);
35    let stats_result = match ps_result {
36        Ok(output) if !output.is_empty() => {
37            let stats_result = squire::util::run_command(
38                "docker",
39                &["stats", "--no-stream", "--format", "{{json .}}"],
40                false,
41            );
42            match stats_result {
43                Ok(stats) => stats,
44                Err(err) => {
45                    log::error!("Error running docker stats: {}", err);
46                    return Ok(vec![]);
47                }
48            }
49        }
50        Ok(_) => {
51            return Ok(vec![]);
52        }
53        Err(err) => {
54            log::debug!("Error checking containers: {}", err);
55            return Ok(vec![]);
56        }
57    };
58    let stats: Vec<serde_json::Value> = stats_result
59        .lines()
60        .filter_map(|line| serde_json::from_str(line).ok())
61        .collect();
62    Ok(stats)
63}
64
65fn get_cpu_percent() -> Vec<String> {
71    let mut system = System::new_with_specifics(
72        RefreshKind::new().with_cpu(CpuRefreshKind::everything()),
73    );
74    std::thread::sleep(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL);
75    system.refresh_cpu_all();
76    let mut cpu_usage = Vec::new();
77    for core in system.cpus() {
78        cpu_usage.push(format!("{:.2}", core.cpu_usage()));
79    }
80    cpu_usage
81}
82
83fn get_system_metrics() -> HashMap<String, serde_json::Value> {
89    let mut system = System::new_all();
90    system.refresh_all();
91
92    let load_avg = System::load_average();
95    let mut hash_vec = vec![
96        (
97            "memory_info".to_string(),
98            serde_json::json!({
99                "total": system.total_memory(),
100                "used": system.used_memory(),
101            }),
102        ),
103        (
104            "load_averages".to_string(),
105            serde_json::json!({
106                "m1": load_avg.one,
107                "m5": load_avg.five,
108                "m15": load_avg.fifteen,
109            }),
110        ),
111    ];
112
113    let total_swap = system.total_swap();
114    if total_swap != 0 {
115        hash_vec.push((
116            "swap_info".to_string(),
117            serde_json::json!({
118                "total": total_swap,
119                "used": system.used_swap(),
120            }),
121        ));
122    }
123    HashMap::from_iter(hash_vec)
124}
125
126
127pub fn system_resources() -> HashMap<String, serde_json::Value> {
133    let mut system_metrics = get_system_metrics();
134    let cpu_percent = get_cpu_percent();
135    let docker_stats = get_docker_stats().unwrap();
136    system_metrics.insert("cpu_usage".to_string(), serde_json::json!(cpu_percent));
137    system_metrics.insert("docker_stats".to_string(), serde_json::json!(docker_stats));
138    system_metrics
139}