feat: implement driving cron actor

This commit is contained in:
2025-08-10 17:41:10 +02:00
parent 91c5209266
commit fd9a1114b9
6 changed files with 66 additions and 10 deletions

View File

@@ -0,0 +1,21 @@
use crate::app::ports::driving::ForMonitoringAlerts;
pub struct CronAlertsActor {
alert_monitor: Box<dyn ForMonitoringAlerts>,
period: std::time::Duration,
}
impl CronAlertsActor {
pub fn new(alert_monitor: Box<dyn ForMonitoringAlerts>, period: std::time::Duration) -> Self {
Self { alert_monitor, period }
}
pub fn start(&self) {
loop {
if let Err(e) = self.alert_monitor.alert_on_threshold_violation() {
eprintln!("Error occurred: {}", e);
}
std::thread::sleep(self.period);
}
}
}

View File

@@ -0,0 +1,18 @@
use crate::app::ports::driving::ForMonitoringAlerts;
pub struct ForMonitoringAlertsAdapter
{
app : crate::app::service::Service
}
impl ForMonitoringAlertsAdapter {
pub fn new(app: crate::app::service::Service) -> Self {
ForMonitoringAlertsAdapter { app }
}
}
impl ForMonitoringAlerts for ForMonitoringAlertsAdapter {
fn alert_on_threshold_violation(&self) -> Result<(), Box<dyn std::error::Error>> {
self.app.alert_on_threshold_violation()
}
}

View File

@@ -1 +1,2 @@
pub mod driven; pub mod driven;
pub mod driving;

3
src/app/ports/driving.rs Normal file
View File

@@ -0,0 +1,3 @@
pub trait ForMonitoringAlerts {
fn alert_on_threshold_violation(&self) -> Result<(), Box<dyn std::error::Error>>;
}

View File

@@ -4,7 +4,9 @@ use system_monitor::SystemMonitor;
use crate::{actors, adapters, app}; use crate::{actors, adapters, app};
pub fn get_run_service() -> app::service::Service { pub fn get_cron_actor(
duration: std::time::Duration,
) -> actors::driving::cron_alerts::CronAlertsActor {
dotenv().ok(); dotenv().ok();
let notifier = DiscordNotifier::new( let notifier = DiscordNotifier::new(
std::env::var("DISCORD_WEBHOOK").expect("DISCORD_WEBHOOK environment variable not set"), std::env::var("DISCORD_WEBHOOK").expect("DISCORD_WEBHOOK environment variable not set"),
@@ -21,11 +23,15 @@ pub fn get_run_service() -> app::service::Service {
let formatter = actors::driven::for_formatting_message::alert_formatter::AlertFormatter; let formatter = actors::driven::for_formatting_message::alert_formatter::AlertFormatter;
app::service::new( let service = app::service::new(
Box::new(discord_adapter), Box::new(discord_adapter),
Box::new(system_monitor_adapter), Box::new(system_monitor_adapter),
Box::new(formatter), Box::new(formatter),
) );
let service_adapter =
crate::adapters::driving::for_monitoring_alerts::ForMonitoringAlertsAdapter::new(service);
actors::driving::cron_alerts::CronAlertsActor::new(Box::new(service_adapter), duration)
} }
pub fn get_get_service() -> app::service::Service { pub fn get_get_service() -> app::service::Service {

View File

@@ -11,6 +11,9 @@ mod adapters {
pub mod for_monitoring_system; pub mod for_monitoring_system;
pub mod for_sending_notification; pub mod for_sending_notification;
} }
pub mod driving {
pub mod for_monitoring_alerts;
}
} }
mod actors { mod actors {
@@ -22,6 +25,9 @@ mod actors {
pub mod print; pub mod print;
} }
} }
pub mod driving {
pub mod cron_alerts;
}
} }
mod configurator; mod configurator;
@@ -37,7 +43,11 @@ struct Cli {
#[derive(Subcommand)] #[derive(Subcommand)]
enum Commands { enum Commands {
/// Monitor system and alert on threshold violations /// Monitor system and alert on threshold violations
Run, Run {
/// Duration between cron checks in seconds
#[arg(short, long, default_value = "300")]
duration: u64,
},
/// Send all system metrics notification /// Send all system metrics notification
Get, Get,
} }
@@ -45,13 +55,10 @@ enum Commands {
fn main() { fn main() {
let cli = Cli::parse(); let cli = Cli::parse();
match cli.command { match cli.command {
Commands::Run => { Commands::Run { duration } => {
let service = configurator::get_run_service(); let duration = std::time::Duration::from_secs(duration);
if let Err(e) = service.alert_on_threshold_violation() { configurator::get_cron_actor(duration).start();
eprintln!("Error during threshold violation check: {e}");
}
} }
Commands::Get => { Commands::Get => {
let service = configurator::get_get_service(); let service = configurator::get_get_service();