From 06cec6ff9faf147547de301f79b0255b6e3d90a0 Mon Sep 17 00:00:00 2001 From: donpat1to Date: Mon, 6 Oct 2025 12:43:15 +0200 Subject: [PATCH] added Option to data structs --- WatcherAgent/src/docker/container.rs | 28 +++++++------ WatcherAgent/src/docker/mod.rs | 22 ++++++---- WatcherAgent/src/docker/stats/cpu.rs | 17 ++++---- WatcherAgent/src/docker/stats/mod.rs | 53 +++++++++++++++--------- WatcherAgent/src/docker/stats/network.rs | 20 ++++----- WatcherAgent/src/docker/stats/ram.rs | 12 +++--- 6 files changed, 87 insertions(+), 65 deletions(-) diff --git a/WatcherAgent/src/docker/container.rs b/WatcherAgent/src/docker/container.rs index 9cb360c..eac7c3a 100644 --- a/WatcherAgent/src/docker/container.rs +++ b/WatcherAgent/src/docker/container.rs @@ -4,7 +4,7 @@ //! use crate::docker::stats; use crate::docker::stats::{ContainerCpuInfo, ContainerNetworkInfo}; -use crate::models::{DockerRegistrationDto, DockerMetricDto, DockerContainer}; +use crate::models::DockerContainer; use bollard::query_parameters::{ CreateImageOptions, ListContainersOptions, RestartContainerOptions, @@ -178,14 +178,15 @@ pub async fn get_network_stats( Ok(net_info) } else { // Return default network info if not found + println!("No network info found for container {}", container_id); Ok(ContainerNetworkInfo { - container_id: container_id.to_string(), - rx_bytes: 0, - tx_bytes: 0, - rx_packets: 0, - tx_packets: 0, - rx_errors: 0, - tx_errors: 0, + container_id: Some(container_id.to_string()), + rx_bytes: None, + tx_bytes: None, + rx_packets: None, + tx_packets: None, + rx_errors: None, + tx_errors: None, }) } } @@ -201,12 +202,13 @@ pub async fn get_cpu_stats( Ok(cpu_info) } else { // Return default CPU info if not found + println!("No CPU info found for container {}", container_id); Ok(ContainerCpuInfo { - container_id: container_id.to_string(), - cpu_usage_percent: 0.0, - system_cpu_usage: 0, - container_cpu_usage: 0, - online_cpus: 1, + container_id: Some(container_id.to_string()), + cpu_usage_percent: None, + system_cpu_usage: None, + container_cpu_usage: None, + online_cpus: None, }) } } diff --git a/WatcherAgent/src/docker/mod.rs b/WatcherAgent/src/docker/mod.rs index cc52ae8..b11aaf7 100644 --- a/WatcherAgent/src/docker/mod.rs +++ b/WatcherAgent/src/docker/mod.rs @@ -11,7 +11,7 @@ pub mod container; pub mod serverclientcomm; pub mod stats; -use crate::models::{DockerRegistrationDto, DockerMetricDto, DockerContainer, DockerContainerInfo}; +use crate::models::{DockerContainer, DockerContainerInfo, DockerMetricDto, DockerRegistrationDto}; use bollard::{query_parameters::InspectContainerOptions, Docker}; use std::error::Error; @@ -60,14 +60,20 @@ impl DockerManager { id: container.id, image: container.image, name: container.name, - })) } /// Gets the current client version (image name) if running in Docker pub async fn get_client_version(&self) -> String { match self.get_client_container().await { - Ok(Some(container)) => container.image.clone().unwrap().split(':').next().unwrap_or("unknown").to_string(), + Ok(Some(container)) => container + .image + .clone() + .unwrap() + .split(':') + .next() + .unwrap_or("unknown") + .to_string(), Ok(None) => { println!("Warning: No WatcherAgent container found"); "unknown".to_string() @@ -118,9 +124,7 @@ impl DockerManager { } /// Collects Docker metrics for all containers - pub async fn collect_metrics( - &self, - ) -> Result> { + pub async fn collect_metrics(&self) -> Result> { let containers = self.get_containers().await?; let (cpu_stats, net_stats, mem_stats) = stats::get_container_stats(&self.docker).await?; @@ -129,15 +133,15 @@ impl DockerManager { .map(|container| { let cpu = cpu_stats .iter() - .find(|c| c.container_id == container.id) + .find(|c| c.container_id == Some(container.id.clone())) .cloned(); let network = net_stats .iter() - .find(|n| n.container_id == container.id) + .find(|n| n.container_id == Some(container.id.clone())) .cloned(); let ram = mem_stats .iter() - .find(|m| m.container_id == container.id) + .find(|m| m.container_id == Some(container.id.clone())) .cloned(); DockerContainerInfo { diff --git a/WatcherAgent/src/docker/stats/cpu.rs b/WatcherAgent/src/docker/stats/cpu.rs index f25b1f6..3eab6eb 100644 --- a/WatcherAgent/src/docker/stats/cpu.rs +++ b/WatcherAgent/src/docker/stats/cpu.rs @@ -70,11 +70,11 @@ pub async fn get_single_container_cpu_stats( }; return Ok(Some(ContainerCpuInfo { - container_id: container_id.to_string(), - cpu_usage_percent: cpu_percent, - system_cpu_usage: cpu_stats.system_cpu_usage.unwrap_or(0), - container_cpu_usage: cpu_usage.total_usage.unwrap_or(0), - online_cpus, + container_id: Some(container_id.to_string()), + cpu_usage_percent: Some(cpu_percent), + system_cpu_usage: Some(cpu_stats.system_cpu_usage.unwrap_or(0)), + container_cpu_usage: Some(cpu_usage.total_usage.unwrap_or(0)), + online_cpus: Some(online_cpus), })); } } @@ -91,6 +91,9 @@ pub async fn get_average_cpu_usage(docker: &Docker) -> Result, + pub cpu_usage_percent: Option, + pub system_cpu_usage: Option, + pub container_cpu_usage: Option, + pub online_cpus: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct ContainerNetworkInfo { - pub container_id: String, - pub rx_bytes: u64, - pub tx_bytes: u64, - pub rx_packets: u64, - pub tx_packets: u64, - pub rx_errors: u64, - pub tx_errors: u64, + pub container_id: Option, + pub rx_bytes: Option, + pub tx_bytes: Option, + pub rx_packets: Option, + pub tx_packets: Option, + pub rx_errors: Option, + pub tx_errors: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct ContainerMemoryInfo { - pub container_id: String, - pub memory_usage: u64, - pub memory_limit: u64, - pub memory_usage_percent: f64, + pub container_id: Option, + pub memory_usage: Option, + pub memory_limit: Option, + pub memory_usage_percent: Option, } use bollard::Docker; @@ -38,7 +38,14 @@ use std::error::Error; /// Get container statistics for all containers using an existing Docker client pub async fn get_container_stats( docker: &Docker, -) -> Result<(Vec, Vec, Vec), Box> { +) -> Result< + ( + Vec, + Vec, + Vec, + ), + Box, +> { let cpu_infos = cpu::get_all_containers_cpu_stats(docker).await?; let net_infos = network::get_all_containers_network_stats(docker).await?; let mem_infos = ram::get_all_containers_memory_stats(docker).await?; @@ -50,8 +57,14 @@ pub async fn get_container_stats( pub async fn get_single_container_stats( docker: &Docker, container_id: &str, -) -> Result<(Option, Option, Option), Box> -{ +) -> Result< + ( + Option, + Option, + Option, + ), + Box, +> { let cpu_info = cpu::get_single_container_cpu_stats(docker, container_id).await?; let net_info = network::get_single_container_network_stats(docker, container_id).await?; let mem_info = ram::get_single_container_memory_stats(docker, container_id).await?; @@ -74,4 +87,4 @@ pub async fn get_average_cpu_usage(docker: &Docker) -> Result Result> { ram::get_total_memory_usage(docker).await -} \ No newline at end of file +} diff --git a/WatcherAgent/src/docker/stats/network.rs b/WatcherAgent/src/docker/stats/network.rs index d49c918..8fc5233 100644 --- a/WatcherAgent/src/docker/stats/network.rs +++ b/WatcherAgent/src/docker/stats/network.rs @@ -51,13 +51,13 @@ pub async fn get_single_container_network_stats( // Take the first network interface (usually eth0) if let Some((_name, net)) = networks.into_iter().next() { return Ok(Some(ContainerNetworkInfo { - container_id: container_id.to_string(), - rx_bytes: net.rx_bytes.unwrap(), - tx_bytes: net.tx_bytes.unwrap(), - rx_packets: net.rx_packets.unwrap(), - tx_packets: net.tx_packets.unwrap(), - rx_errors: net.rx_errors.unwrap(), - tx_errors: net.tx_errors.unwrap(), + container_id: Some(container_id.to_string()), + rx_bytes: net.rx_bytes, + tx_bytes: net.tx_bytes, + rx_packets: net.rx_packets, + tx_packets: net.tx_packets, + rx_errors: net.rx_errors, + tx_errors: net.tx_errors, })); } } @@ -72,8 +72,8 @@ pub async fn get_total_network_stats( ) -> Result<(u64, u64), Box> { let net_infos = get_all_containers_network_stats(docker).await?; - let total_rx: u64 = net_infos.iter().map(|net| net.rx_bytes).sum(); - let total_tx: u64 = net_infos.iter().map(|net| net.tx_bytes).sum(); + let total_rx: u64 = net_infos.iter().map(|net| net.rx_bytes.unwrap()).sum(); + let total_tx: u64 = net_infos.iter().map(|net| net.tx_bytes.unwrap()).sum(); Ok((total_rx, total_tx)) -} \ No newline at end of file +} diff --git a/WatcherAgent/src/docker/stats/ram.rs b/WatcherAgent/src/docker/stats/ram.rs index b6624ee..56f8d53 100644 --- a/WatcherAgent/src/docker/stats/ram.rs +++ b/WatcherAgent/src/docker/stats/ram.rs @@ -58,10 +58,10 @@ pub async fn get_single_container_memory_stats( }; return Ok(Some(ContainerMemoryInfo { - container_id: container_id.to_string(), - memory_usage, - memory_limit, - memory_usage_percent, + container_id: Some(container_id.to_string()), + memory_usage: Some(memory_usage), + memory_limit: Some(memory_limit), + memory_usage_percent: Some(memory_usage_percent), })); } } @@ -72,6 +72,6 @@ pub async fn get_single_container_memory_stats( /// Get total memory usage across all containers pub async fn get_total_memory_usage(docker: &Docker) -> Result> { let mem_infos = get_all_containers_memory_stats(docker).await?; - let total_memory: u64 = mem_infos.iter().map(|mem| mem.memory_usage).sum(); + let total_memory: u64 = mem_infos.iter().map(|mem| mem.memory_usage.unwrap()).sum(); Ok(total_memory) -} \ No newline at end of file +}