diff --git a/WatcherAgent/src/api.rs b/WatcherAgent/src/api.rs index f0e2506..2246693 100644 --- a/WatcherAgent/src/api.rs +++ b/WatcherAgent/src/api.rs @@ -15,12 +15,13 @@ use std::time::Duration; use crate::docker::serverclientcomm::handle_server_message; use crate::hardware::HardwareInfo; use crate::models::{ - Acknowledgment, DockerMetricDto, DockerRegistrationDto, HeartbeatDto, IdResponse, MetricDto, - RegistrationDto, ServerMessage, + Acknowledgment, DockerContainer, DockerMetricDto, DockerRegistrationDto, HeartbeatDto, + IdResponse, MetricDto, RegistrationDto, ServerMessage, }; use anyhow::Result; use reqwest::{Client, StatusCode}; +use serde::Serialize; use std::error::Error; use tokio::time::sleep; diff --git a/WatcherAgent/src/docker/mod.rs b/WatcherAgent/src/docker/mod.rs index e645d62..466a2be 100644 --- a/WatcherAgent/src/docker/mod.rs +++ b/WatcherAgent/src/docker/mod.rs @@ -134,7 +134,6 @@ impl DockerManager { let _ = self.debug_container_stats(&first_container.id).await; } - // Get stats with proper error handling let stats_result = stats::get_container_stats(&self.docker).await; let (cpu_stats, net_stats, mem_stats) = match stats_result { @@ -146,41 +145,49 @@ impl DockerManager { } }; - println!("Debug: Found {} containers, {} CPU stats, {} network stats, {} memory stats", - containers.len(), cpu_stats.len(), net_stats.len(), mem_stats.len()); + println!( + "Debug: Found {} containers, {} CPU stats, {} network stats, {} memory stats", + containers.len(), + cpu_stats.len(), + net_stats.len(), + mem_stats.len() + ); let container_infos_total: Vec<_> = containers .into_iter() .map(|container| { // Use short ID for matching (first 12 chars) - let container_short_id = if container.id.len() > 12 { - &container.id[..12] - } else { - &container.id + let container_short_id = if container.id.len() > 12 { + &container.id[..12] + } else { + &container.id }; let cpu = cpu_stats .iter() .find(|c| { - c.container_id.as_ref() + c.container_id + .as_ref() .map(|id| id.starts_with(container_short_id)) .unwrap_or(false) }) .cloned(); - + let network = net_stats .iter() .find(|n| { - n.container_id.as_ref() + n.container_id + .as_ref() .map(|id| id.starts_with(container_short_id)) .unwrap_or(false) }) .cloned(); - + let ram = mem_stats .iter() .find(|m| { - m.container_id.as_ref() + m.container_id + .as_ref() .map(|id| id.starts_with(container_short_id)) .unwrap_or(false) }) @@ -188,8 +195,13 @@ impl DockerManager { // Debug output for this container if cpu.is_none() || network.is_none() || ram.is_none() { - println!("Debug: Container {} - CPU: {:?}, Network: {:?}, RAM: {:?}", - container_short_id, cpu.is_some(), network.is_some(), ram.is_some()); + println!( + "Debug: Container {} - CPU: {:?}, Network: {:?}, RAM: {:?}", + container_short_id, + cpu.is_some(), + network.is_some(), + ram.is_some() + ); } DockerContainerInfo { @@ -267,8 +279,7 @@ impl DockerManager { let containers = self.get_containers().await?; let dto = DockerRegistrationDto { server_id: 0, // This will be set by the caller - containers: serde_json::to_string(&containers) - .unwrap_or_else(|_| "[]".to_string()), // Fallback to empty array + containers, // Fallback to empty array }; Ok(dto) @@ -276,36 +287,37 @@ impl DockerManager { /// Debug function to check stats collection for a specific container pub async fn debug_container_stats( - &self, - container_id: &str + &self, + container_id: &str, ) -> Result<(), Box> { println!("=== DEBUG STATS FOR CONTAINER {} ===", container_id); - - let (cpu_info, net_info, mem_info) = stats::get_single_container_stats(&self.docker, container_id).await?; - + + let (cpu_info, net_info, mem_info) = + stats::get_single_container_stats(&self.docker, container_id).await?; + println!("CPU Info: {:?}", cpu_info); println!("Network Info: {:?}", net_info); println!("Memory Info: {:?}", mem_info); - + // Also try the individual stats functions println!("--- Individual CPU Stats ---"); match stats::cpu::get_single_container_cpu_stats(&self.docker, container_id).await { Ok(cpu) => println!("CPU: {:?}", cpu), Err(e) => println!("CPU Error: {}", e), } - + println!("--- Individual Network Stats ---"); match stats::network::get_single_container_network_stats(&self.docker, container_id).await { Ok(net) => println!("Network: {:?}", net), Err(e) => println!("Network Error: {}", e), } - + println!("--- Individual Memory Stats ---"); match stats::ram::get_single_container_memory_stats(&self.docker, container_id).await { Ok(mem) => println!("Memory: {:?}", mem), Err(e) => println!("Memory Error: {}", e), } - + Ok(()) } } @@ -326,4 +338,4 @@ impl DockerContainer { pub fn name(&self) -> &str { &self.name.as_deref().unwrap_or("unknown") } -} \ No newline at end of file +} diff --git a/WatcherAgent/src/main.rs b/WatcherAgent/src/main.rs index 569c593..77c0692 100644 --- a/WatcherAgent/src/main.rs +++ b/WatcherAgent/src/main.rs @@ -117,7 +117,7 @@ async fn main() -> Result<(), Box> { models::DockerRegistrationDto { server_id: 0, //container_count: 0, --- IGNORE --- - containers: "[]".to_string(), + containers: Vec::new(), } }; let _ = diff --git a/WatcherAgent/src/models.rs b/WatcherAgent/src/models.rs index b44df56..20f14f6 100644 --- a/WatcherAgent/src/models.rs +++ b/WatcherAgent/src/models.rs @@ -185,6 +185,7 @@ pub struct Acknowledgment { #[derive(Debug, Serialize, Clone)] pub struct DockerRegistrationDto { /// Unique server identifier (integer) + #[serde(rename = "Server_id")] pub server_id: u16, /// Number of currently running containers // pub container_count: usize, --- IGNORE --- @@ -197,7 +198,8 @@ pub struct DockerRegistrationDto { /// id: unique container ID (first 12 hex digits) /// image: docker image name /// name: container name - pub containers: String, // Vec, + #[serde(rename = "Containers")] + pub containers: Vec, // Vec, } #[derive(Debug, Serialize, Clone)] @@ -257,6 +259,8 @@ pub struct DockerContainerInfo { #[derive(Debug, Serialize, Clone)] pub struct DockerContainer { pub id: String, + #[serde(default)] pub image: Option, + #[serde(default)] pub name: Option, }