added docker metrics
All checks were successful
Rust Cross-Platform Build / Detect Rust Project (push) Successful in 4s
Rust Cross-Platform Build / Run Tests (push) Successful in 1m3s
Rust Cross-Platform Build / Build (x86_64-unknown-linux-gnu) (push) Successful in 2m56s
Rust Cross-Platform Build / Build (x86_64-pc-windows-gnu) (push) Successful in 3m37s
Rust Cross-Platform Build / Set Tag Name (push) Successful in 5s
Rust Cross-Platform Build / Build and Push Docker Image (push) Successful in 2m12s
Rust Cross-Platform Build / Workflow Summary (push) Successful in 2s
Rust Cross-Platform Build / Create Tag (push) Successful in 5s

This commit is contained in:
2025-10-05 22:43:48 +02:00
parent 66428863e6
commit a7cae5e93f
5 changed files with 89 additions and 77 deletions

View File

@@ -11,7 +11,7 @@ pub mod container;
pub mod serverclientcomm;
pub mod stats;
use crate::models::{DockerRegistrationDto, DockerMetricDto, DockerContainer};
use crate::models::{DockerRegistrationDto, DockerMetricDto, DockerContainer, DockerContainerInfo};
use bollard::{query_parameters::InspectContainerOptions, Docker};
use std::error::Error;
@@ -88,7 +88,7 @@ impl DockerManager {
}
/// Gets all available containers as DTOs for registration
pub async fn get_containers_for_registration(
pub async fn get_containers(
&self,
) -> Result<Vec<DockerContainer>, Box<dyn Error + Send + Sync>> {
let containers = container::get_available_containers(&self.docker).await;
@@ -103,8 +103,6 @@ impl DockerManager {
.collect())
}
/// Gets the number of running containers
pub async fn get_container_count(&self) -> Result<usize, Box<dyn Error + Send + Sync>> {
let containers = container::get_available_containers(&self.docker).await;
@@ -118,6 +116,47 @@ impl DockerManager {
) -> Result<(), Box<dyn Error + Send + Sync>> {
container::restart_container(&self.docker, container_id).await
}
/// Collects Docker metrics for all containers
pub async fn collect_metrics(
&self,
) -> Result<DockerMetricDto, Box<dyn Error + Send + Sync>> {
let containers = self.get_containers().await?;
let (cpu_stats, net_stats, mem_stats) = stats::get_container_stats(&self.docker).await?;
let container_infos: Vec<_> = containers
.into_iter()
.map(|container| {
let cpu = cpu_stats
.iter()
.find(|c| c.container_id == container.id)
.cloned();
let network = net_stats
.iter()
.find(|n| n.container_id == container.id)
.cloned();
let ram = mem_stats
.iter()
.find(|m| m.container_id == container.id)
.cloned();
DockerContainerInfo {
container: Some(container),
status: None, // Status can be fetched if needed
cpu,
network,
ram,
}
})
.collect();
let dto = DockerMetricDto {
server_id: 0,
containers: serde_json::to_string(&container_infos)?,
};
Ok(dto)
}
}
// Keep these as utility functions if needed, but they should use DockerManager internally