use crate::health::{HealthCheckerTrait, http::HttpHealthChecker, port::PortHealthChecker, process::ProcessHealthChecker, traffic::TrafficBasedHealthChecker};
use crate::models::{HealthResult, Service};
use std::time::Duration;
#[cfg(feature = "db-health-checks")]
use crate::health::database::DatabaseHealthChecker;
pub struct HealthChecker {
checkers: Vec<Box<dyn HealthCheckerTrait>>,
default_checker: PortHealthChecker,
}
impl HealthChecker {
pub fn new(timeout: Duration, _retry_count: u32) -> Self {
let mut checkers: Vec<Box<dyn HealthCheckerTrait>> = Vec::new();
checkers.push(Box::new(TrafficBasedHealthChecker::new()));
checkers.push(Box::new(HttpHealthChecker::new(timeout)));
checkers.push(Box::new(ProcessHealthChecker::new()));
#[cfg(feature = "db-health-checks")]
checkers.push(Box::new(DatabaseHealthChecker::new(timeout)));
Self {
checkers,
default_checker: PortHealthChecker::new(timeout),
}
}
pub async fn check(&self, service: &Service) -> HealthResult {
for checker in &self.checkers {
if checker.supports(service) {
return checker.check(service).await;
}
}
self.default_checker.check(service).await
}
}