From 315f86fec779ee2884f99cc1387854c4cf280684 Mon Sep 17 00:00:00 2001 From: Devdutt Shenoi Date: Wed, 26 Jul 2023 12:28:44 +0530 Subject: [PATCH 1/3] refactor: fail to update don't stop stat collector --- uplink/src/collector/systemstats.rs | 79 ++++++++++++++++++++++++----- 1 file changed, 65 insertions(+), 14 deletions(-) diff --git a/uplink/src/collector/systemstats.rs b/uplink/src/collector/systemstats.rs index c8cbb04b4..51ee5915a 100644 --- a/uplink/src/collector/systemstats.rs +++ b/uplink/src/collector/systemstats.rs @@ -535,25 +535,53 @@ impl StatCollector { } /// Stat collector execution loop, sleeps for the duation of `config.stats.update_period` in seconds. + /// Update system information values and increment sequence numbers, while sending to specific data streams. pub fn start(mut self) { loop { std::thread::sleep(Duration::from_secs(self.config.system_stats.update_period)); - if let Err(e) = self.update() { - error!("Faced error while refreshing system statistics: {}", e); - return; - }; + if let Err(e) = self.update_memory_stats() { + error!("Error refreshing system memory statistics: {}", e); + } + + if let Err(e) = self.update_disk_stats() { + error!("Error refreshing disk statistics: {}", e); + } + + if let Err(e) = self.update_network_stats() { + error!("Error refreshing network statistics: {}", e); + } + + if let Err(e) = self.update_cpu_stats() { + error!("Error refreshing CPU statistics: {}", e); + } + + if let Err(e) = self.update_component_stats() { + error!("Error refreshing component statistics: {}", e); + } + + if let Err(e) = self.update_special_stats() { + error!("Error refreshing special component statistics: {}", e); + } + + if let Err(e) = self.update_process_stats() { + error!("Error refreshing process statistics: {}", e); + } } } - /// Update system information values and increment sequence numbers, while sending to specific data streams. - fn update(&mut self) -> Result<(), Error> { + // Refresh memory stats + fn update_memory_stats(&mut self) -> Result<(), Error> { self.sys.refresh_memory(); let timestamp = clock() as u64; let payload = self.system.push(&self.sys, timestamp); self.bridge_tx.send_payload_sync(payload); - // Refresh disk info + Ok(()) + } + + // Refresh disk stats + fn update_disk_stats(&mut self) -> Result<(), Error> { self.sys.refresh_disks(); let timestamp = clock() as u64; for disk_data in self.sys.disks() { @@ -561,7 +589,11 @@ impl StatCollector { self.bridge_tx.send_payload_sync(payload); } - // Refresh network byte rate info + Ok(()) + } + + // Refresh network byte rate stats + fn update_network_stats(&mut self) -> Result<(), Error> { self.sys.refresh_networks(); let timestamp = clock() as u64; for (net_name, net_data) in self.sys.networks() { @@ -569,7 +601,11 @@ impl StatCollector { self.bridge_tx.send_payload_sync(payload); } - // Refresh processor info + Ok(()) + } + + // Refresh processor stats + fn update_cpu_stats(&mut self) -> Result<(), Error> { self.sys.refresh_cpu(); let timestamp = clock() as u64; for proc_data in self.sys.cpus().iter() { @@ -577,14 +613,25 @@ impl StatCollector { self.bridge_tx.send_payload_sync(payload); } - // Refresh component info + Ok(()) + } + + // Refresh component stats + fn update_component_stats(&mut self) -> Result<(), Error> { self.sys.refresh_components(); let timestamp = clock() as u64; for comp_data in self.sys.components().iter() { let payload = self.components.push(comp_data, timestamp); self.bridge_tx.send_payload_sync(payload); } + + Ok(()) + } + + // Refresh special component stats + fn update_special_stats(&mut self) -> Result<(), Error> { let files = glob::glob("/sys/devices/virtual/thermal/thermal_zone*/temp")?; + let timestamp = clock() as u64; for thermal_zone in files { let path = thermal_zone?; let mut label = path.as_os_str().to_str().unwrap_or("temp_component").to_string(); @@ -596,10 +643,14 @@ impl StatCollector { self.bridge_tx.send_payload_sync(payload); } - // Refresh processes info - // NOTE: This can be further optimized by storing pids of interested processes - // at init and only collecting process information for them instead of iterating - // over all running processes as is being done now. + Ok(()) + } + + // Refresh processes info + // NOTE: This can be further optimized by storing pids of interested processes + // at init and only collecting process information for them instead of iterating + // over all running processes as is being done now. + fn update_process_stats(&mut self) -> Result<(), Error> { self.sys.refresh_processes(); let timestamp = clock() as u64; for (&id, p) in self.sys.processes() { From 9623efd6778ed39a8801f6b960ba3c1ce742056e Mon Sep 17 00:00:00 2001 From: Devdutt Shenoi Date: Wed, 26 Jul 2023 12:30:34 +0530 Subject: [PATCH 2/3] fix: untangle broken globs --- uplink/src/collector/systemstats.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/uplink/src/collector/systemstats.rs b/uplink/src/collector/systemstats.rs index 51ee5915a..71274a53c 100644 --- a/uplink/src/collector/systemstats.rs +++ b/uplink/src/collector/systemstats.rs @@ -630,10 +630,17 @@ impl StatCollector { // Refresh special component stats fn update_special_stats(&mut self) -> Result<(), Error> { - let files = glob::glob("/sys/devices/virtual/thermal/thermal_zone*/temp")?; + let paths = glob::glob("/sys/devices/virtual/thermal/thermal_zone*/temp")?; let timestamp = clock() as u64; - for thermal_zone in files { - let path = thermal_zone?; + + for path in paths { + let path = match path { + Ok(p) => p, + Err(e) => { + error!("Couldn't extract file path from glob: {e}"); + continue; + } + }; let mut label = path.as_os_str().to_str().unwrap_or("temp_component").to_string(); label.retain(|c| c.is_numeric()); let label = "thermal_zone".to_owned() + &label; From 71ceb6962804f594fcfb61635f0f217d687a4591 Mon Sep 17 00:00:00 2001 From: Devdutt Shenoi Date: Thu, 27 Jul 2023 18:38:25 +0530 Subject: [PATCH 3/3] feat: remove specific extractors (#261) fix: remove custom extraction code --- uplink/src/collector/systemstats.rs | 37 ----------------------------- 1 file changed, 37 deletions(-) diff --git a/uplink/src/collector/systemstats.rs b/uplink/src/collector/systemstats.rs index 71274a53c..9c5dc132a 100644 --- a/uplink/src/collector/systemstats.rs +++ b/uplink/src/collector/systemstats.rs @@ -361,14 +361,6 @@ impl ComponentStats { comp.into() } - - fn push_custom(&mut self, mut comp_data: Component, timestamp: u64) -> Payload { - self.sequence += 1; - comp_data.timestamp = timestamp; - comp_data.sequence = self.sequence; - - (&mut comp_data).into() - } } #[derive(Debug, Default, Serialize, Clone)] @@ -560,10 +552,6 @@ impl StatCollector { error!("Error refreshing component statistics: {}", e); } - if let Err(e) = self.update_special_stats() { - error!("Error refreshing special component statistics: {}", e); - } - if let Err(e) = self.update_process_stats() { error!("Error refreshing process statistics: {}", e); } @@ -628,31 +616,6 @@ impl StatCollector { Ok(()) } - // Refresh special component stats - fn update_special_stats(&mut self) -> Result<(), Error> { - let paths = glob::glob("/sys/devices/virtual/thermal/thermal_zone*/temp")?; - let timestamp = clock() as u64; - - for path in paths { - let path = match path { - Ok(p) => p, - Err(e) => { - error!("Couldn't extract file path from glob: {e}"); - continue; - } - }; - let mut label = path.as_os_str().to_str().unwrap_or("temp_component").to_string(); - label.retain(|c| c.is_numeric()); - let label = "thermal_zone".to_owned() + &label; - let temperature = std::fs::read_to_string(path)?.trim().parse::()?; - let comp_data = Component { label, temperature, ..Default::default() }; - let payload = self.components.push_custom(comp_data, timestamp); - self.bridge_tx.send_payload_sync(payload); - } - - Ok(()) - } - // Refresh processes info // NOTE: This can be further optimized by storing pids of interested processes // at init and only collecting process information for them instead of iterating