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}