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
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:
@@ -10,13 +10,15 @@
|
||||
/// ## Usage
|
||||
/// The [`Collector`] struct is instantiated in the main loop and runs as a background task, continuously collecting and reporting metrics.
|
||||
use std::error::Error;
|
||||
use std::sync::Arc;
|
||||
use std::time::Duration;
|
||||
|
||||
use crate::api;
|
||||
use crate::{api, docker};
|
||||
use crate::docker::DockerManager;
|
||||
//use crate::docker::DockerInfo;
|
||||
use crate::hardware::network::NetworkMonitor;
|
||||
use crate::hardware::HardwareInfo;
|
||||
use crate::models::MetricDto;
|
||||
use crate::models::{DockerMetricDto, MetricDto};
|
||||
|
||||
/// Main orchestrator for hardware and network metric collection and reporting.
|
||||
///
|
||||
@@ -27,8 +29,9 @@ use crate::models::MetricDto;
|
||||
/// - `server_id`: Unique server ID assigned by the backend.
|
||||
/// - `ip_address`: IP address of the agent.
|
||||
pub struct Collector {
|
||||
docker_manager: DockerManager,
|
||||
network_monitor: NetworkMonitor,
|
||||
server_id: i32,
|
||||
server_id: u16,
|
||||
ip_address: String,
|
||||
}
|
||||
|
||||
@@ -41,8 +44,9 @@ impl Collector {
|
||||
///
|
||||
/// # Returns
|
||||
/// A new `Collector` ready to collect and report metrics.
|
||||
pub fn new(server_id: i32, ip_address: String) -> Self {
|
||||
pub fn new(server_id: u16, ip_address: String, docker_manager: DockerManager) -> Self {
|
||||
Self {
|
||||
docker_manager,
|
||||
network_monitor: NetworkMonitor::new(),
|
||||
server_id,
|
||||
ip_address,
|
||||
@@ -72,7 +76,16 @@ impl Collector {
|
||||
continue;
|
||||
}
|
||||
};
|
||||
let docker_metrics = match self.docker_collect().await {
|
||||
Ok(metrics) => metrics,
|
||||
Err(e) => {
|
||||
eprintln!("Error collecting docker metrics: {}", e);
|
||||
tokio::time::sleep(Duration::from_secs(10)).await;
|
||||
continue;
|
||||
}
|
||||
};
|
||||
api::send_metrics(base_url, &metrics).await?;
|
||||
api::send_docker_metrics(base_url, &docker_metrics).await?;
|
||||
tokio::time::sleep(Duration::from_secs(20)).await;
|
||||
}
|
||||
}
|
||||
@@ -113,58 +126,16 @@ impl Collector {
|
||||
})
|
||||
}
|
||||
|
||||
/// Gets container metrics for all containers
|
||||
pub async fn docker_collect(
|
||||
&self,
|
||||
) -> Result<Vec<DockerContainer>, Box<dyn Error + Send + Sync>> {
|
||||
let containers = container::get_available_containers(&self.docker).await;
|
||||
let mut metrics = Vec::new();
|
||||
|
||||
for container in containers {
|
||||
// Get network stats (you'll need to implement this in container.rs)
|
||||
let network_stats = container::get_network_stats(&self.docker, &container.id).await?;
|
||||
// Get CPU stats (you'll need to implement this in container.rs)
|
||||
let cpu_stats = container::get_cpu_stats(&self.docker, &container.id).await?;
|
||||
|
||||
// Get current status by inspecting the container
|
||||
let status = match self
|
||||
.docker
|
||||
.inspect_container(&container.id, None::<InspectContainerOptions>)
|
||||
.await
|
||||
{
|
||||
Ok(container_info) => {
|
||||
// Extract status from container state and convert to string
|
||||
container_info
|
||||
.state
|
||||
.and_then(|state| state.status)
|
||||
.map(|status_enum| {
|
||||
match status_enum {
|
||||
bollard::models::ContainerStateStatusEnum::CREATED => "created",
|
||||
bollard::models::ContainerStateStatusEnum::RUNNING => "running",
|
||||
bollard::models::ContainerStateStatusEnum::PAUSED => "paused",
|
||||
bollard::models::ContainerStateStatusEnum::RESTARTING => {
|
||||
"restarting"
|
||||
}
|
||||
bollard::models::ContainerStateStatusEnum::REMOVING => "removing",
|
||||
bollard::models::ContainerStateStatusEnum::EXITED => "exited",
|
||||
bollard::models::ContainerStateStatusEnum::DEAD => "dead",
|
||||
bollard::secret::ContainerStateStatusEnum::EMPTY => todo!(),
|
||||
}
|
||||
.to_string()
|
||||
})
|
||||
.unwrap_or_else(|| "unknown".to_string())
|
||||
}
|
||||
Err(_) => "unknown".to_string(),
|
||||
};
|
||||
|
||||
metrics.push(DockerContainerMetricDto {
|
||||
server_id: container.id,
|
||||
status: status,
|
||||
network: network_stats,
|
||||
cpu: cpu_stats,
|
||||
});
|
||||
}
|
||||
|
||||
Ok(metrics)
|
||||
/// NOTE: This is a compilation-safe stub. Implement the Docker collection using your
|
||||
/// DockerManager API and container helpers when available.
|
||||
pub async fn docker_collect(&self) -> Result<DockerMetricDto, Box<dyn Error + Send + Sync>> {
|
||||
let metrics = self
|
||||
.docker_manager
|
||||
.collect_metrics()
|
||||
.await?;
|
||||
Ok(DockerMetricDto {
|
||||
server_id: self.server_id,
|
||||
containers: metrics.containers,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user