diff --git a/harmony/src/domain/topology/oberservability/monitoring.rs b/harmony/src/domain/topology/oberservability/monitoring.rs index 97f040f..4bdf5c1 100644 --- a/harmony/src/domain/topology/oberservability/monitoring.rs +++ b/harmony/src/domain/topology/oberservability/monitoring.rs @@ -1,4 +1,5 @@ use async_trait::async_trait; +use dyn_clone::DynClone; use serde::Serialize; use std::fmt::Debug; @@ -13,19 +14,18 @@ use crate::{interpret::Outcome, topology::Topology}; /// monitoring data, enabling consistent processing regardless of the underlying data source. #[async_trait] pub trait Monitor: Debug + Send + Sync { - async fn deploy_monitor( - &self, - topology: &T, - alert_receivers: Vec, - ) -> Result; + async fn deploy_monitor(&self, topology: &T) -> Result; - async fn delete_monitor( - &self, - topolgy: &T, - alert_receivers: Vec, - ) -> Result; + async fn delete_monitor(&self, topolgy: &T) -> Result; } +#[async_trait] +pub trait AlertReceiverDeployment: Debug + DynClone + Send + Sync { + async fn deploy_alert_receiver(&self, topology: &T) -> Result; +} + +dyn_clone::clone_trait_object!( AlertReceiverDeployment); + #[derive(Debug, Clone, Serialize)] pub struct AlertReceiver { pub receiver_id: String, diff --git a/harmony/src/modules/monitoring/discord_webhook_sender.rs b/harmony/src/modules/monitoring/discord_webhook_sender.rs index 881ee09..20bb19d 100644 --- a/harmony/src/modules/monitoring/discord_webhook_sender.rs +++ b/harmony/src/modules/monitoring/discord_webhook_sender.rs @@ -1,4 +1,6 @@ -use super::discord_alert_manager::discord_alert_manager_score; +use super::{ + discord_alert_manager::discord_alert_manager_score, kube_prometheus_monitor::AlertManagerConfig, +}; use async_trait::async_trait; use serde::Serialize; use serde_yaml::Value; @@ -11,10 +13,18 @@ use crate::{ inventory::Inventory, score::Score, topology::{ - HelmCommand, K8sAnywhereTopology, Topology, oberservability::monitoring::AlertReceiver, + HelmCommand, K8sAnywhereTopology, Topology, + oberservability::monitoring::{AlertReceiver, AlertReceiverDeployment}, }, }; +#[async_trait] +impl AlertReceiverDeployment for DiscordWebhookConfig { + async fn deploy_alert_receiver(&self, topology: &T) -> Result { + topology.deploy_discord_webhook_receiver(self.clone()).await + } +} + #[derive(Debug, Clone, Serialize)] pub struct DiscordWebhookConfig { pub webhook_url: Url, @@ -34,13 +44,9 @@ pub trait DiscordWebhookReceiver { ) -> Result; } -pub trait AlertManagerConfig { - fn get_alert_manager_config(&self) -> Result; -} - #[async_trait] impl AlertManagerConfig for DiscordWebhookConfig { - fn get_alert_manager_config(&self) -> Result { + async fn get_alert_manager_config(&self) -> Result { todo!() } } diff --git a/harmony/src/modules/monitoring/kube_prometheus.rs b/harmony/src/modules/monitoring/kube_prometheus_helm_chart.rs similarity index 100% rename from harmony/src/modules/monitoring/kube_prometheus.rs rename to harmony/src/modules/monitoring/kube_prometheus_helm_chart.rs diff --git a/harmony/src/modules/monitoring/kube_prometheus_monitor.rs b/harmony/src/modules/monitoring/kube_prometheus_monitor.rs new file mode 100644 index 0000000..3a8ce30 --- /dev/null +++ b/harmony/src/modules/monitoring/kube_prometheus_monitor.rs @@ -0,0 +1,108 @@ +use async_trait::async_trait; +use serde::Serialize; +use serde_yaml::Value; + +use crate::{ + data::{Id, Version}, + interpret::{Interpret, InterpretError, InterpretName, InterpretStatus, Outcome}, + inventory::Inventory, + score::Score, + topology::{ + HelmCommand, Topology, + oberservability::monitoring::{AlertReceiverDeployment, Monitor}, + }, +}; + +use super::{ + config::KubePrometheusConfig, kube_prometheus_helm_chart::kube_prometheus_helm_chart_score, +}; + +#[derive(Debug, Clone)] +pub struct KubePrometheus { + alert_receivers: Vec>>, + config: KubePrometheusConfig, +} + +#[async_trait] +pub trait AlertManagerConfig { + async fn get_alert_manager_config(&self) -> Result; +} + +impl KubePrometheus { + pub fn new() -> Self { + Self { + alert_receivers: Vec::new(), + config: KubePrometheusConfig::new(), + } + } +} + +#[async_trait] +impl Monitor for KubePrometheus { + async fn deploy_monitor(&self, topology: &T) -> Result { + for alert_receiver in &self.alert_receivers { + alert_receiver.deploy_alert_receiver(topology).await?; + } + let score = KubePrometheusScore { + config: self.config.clone(), + }; + let inventory = Inventory::autoload(); + score.create_interpret().execute(&inventory, topology).await + } + + async fn delete_monitor(&self, _topolgy: &T) -> Result { + todo!() + } +} + +#[derive(Debug, Clone, Serialize)] +struct KubePrometheusScore { + config: KubePrometheusConfig, +} + +impl Score for KubePrometheusScore { + fn create_interpret(&self) -> Box> { + Box::new(KubePromethusScoreInterpret { + score: self.clone(), + }) + } + + fn name(&self) -> String { + todo!() + } +} + +#[derive(Debug, Clone, Serialize)] +struct KubePromethusScoreInterpret { + score: KubePrometheusScore, +} + +#[async_trait] +impl Interpret for KubePromethusScoreInterpret { + async fn execute( + &self, + inventory: &Inventory, + topology: &T, + ) -> Result { + kube_prometheus_helm_chart_score(&self.score.config) + .create_interpret() + .execute(inventory, topology) + .await + } + + fn get_name(&self) -> InterpretName { + todo!() + } + + fn get_version(&self) -> Version { + todo!() + } + + fn get_status(&self) -> InterpretStatus { + todo!() + } + + fn get_children(&self) -> Vec { + todo!() + } +} diff --git a/harmony/src/modules/monitoring/mod.rs b/harmony/src/modules/monitoring/mod.rs index 1d89eeb..da0e8dd 100644 --- a/harmony/src/modules/monitoring/mod.rs +++ b/harmony/src/modules/monitoring/mod.rs @@ -2,5 +2,6 @@ pub mod alertmanager_types; mod config; mod discord_alert_manager; pub mod discord_webhook_sender; -mod kube_prometheus; +mod kube_prometheus_helm_chart; +pub mod kube_prometheus_monitor; pub mod monitoring_alerting; diff --git a/harmony/src/modules/monitoring/monitoring_alerting.rs b/harmony/src/modules/monitoring/monitoring_alerting.rs index 6d2db38..719e595 100644 --- a/harmony/src/modules/monitoring/monitoring_alerting.rs +++ b/harmony/src/modules/monitoring/monitoring_alerting.rs @@ -14,8 +14,7 @@ use crate::{ }; use super::{ - config::KubePrometheusConfig, discord_alert_manager::discord_alert_manager_score, - kube_prometheus::kube_prometheus_helm_chart_score, + config::KubePrometheusConfig, kube_prometheus_helm_chart::kube_prometheus_helm_chart_score, }; #[derive(Debug, Clone, Serialize)]