From 2f8e150f41d921fd72fdfda95db321a78dbb8c38 Mon Sep 17 00:00:00 2001 From: Willem Date: Mon, 5 May 2025 12:49:28 -0400 Subject: [PATCH] feat: added Score and topology to create kube prometheus monitoring and alerting stack --- harmony/src/domain/topology/mod.rs | 1 + .../{resources => }/kube_prometheus.rs | 1 - harmony/src/modules/monitoring/mod.rs | 6 +- .../modules/monitoring/monitoring_alerting.rs | 105 +++++++++++++----- .../src/modules/monitoring/resources/mod.rs | 1 - 5 files changed, 79 insertions(+), 35 deletions(-) rename harmony/src/modules/monitoring/{resources => }/kube_prometheus.rs (99%) delete mode 100644 harmony/src/modules/monitoring/resources/mod.rs diff --git a/harmony/src/domain/topology/mod.rs b/harmony/src/domain/topology/mod.rs index 3d773ff..0cbfee6 100644 --- a/harmony/src/domain/topology/mod.rs +++ b/harmony/src/domain/topology/mod.rs @@ -1,3 +1,4 @@ +pub mod monitoring_alerting; mod ha_cluster; mod host_binding; mod http; diff --git a/harmony/src/modules/monitoring/resources/kube_prometheus.rs b/harmony/src/modules/monitoring/kube_prometheus.rs similarity index 99% rename from harmony/src/modules/monitoring/resources/kube_prometheus.rs rename to harmony/src/modules/monitoring/kube_prometheus.rs index 620b27e..6dbccae 100644 --- a/harmony/src/modules/monitoring/resources/kube_prometheus.rs +++ b/harmony/src/modules/monitoring/kube_prometheus.rs @@ -1,4 +1,3 @@ - use std::str::FromStr; use non_blank_string_rs::NonBlankString; diff --git a/harmony/src/modules/monitoring/mod.rs b/harmony/src/modules/monitoring/mod.rs index dd2a70f..dd17cc1 100644 --- a/harmony/src/modules/monitoring/mod.rs +++ b/harmony/src/modules/monitoring/mod.rs @@ -1,3 +1,3 @@ -mod monitoring_alerting; -mod resources; -pub use monitoring_alerting::*; +pub mod monitoring_alerting; +mod kube_prometheus; + diff --git a/harmony/src/modules/monitoring/monitoring_alerting.rs b/harmony/src/modules/monitoring/monitoring_alerting.rs index 1379e29..1dd8233 100644 --- a/harmony/src/modules/monitoring/monitoring_alerting.rs +++ b/harmony/src/modules/monitoring/monitoring_alerting.rs @@ -1,58 +1,103 @@ +use async_trait::async_trait; use serde::Serialize; use crate::{ - interpret::Interpret, - maestro::Maestro, + data::{Id, Version}, + interpret::{Interpret, InterpretError, InterpretName, InterpretStatus, Outcome}, + inventory::Inventory, + maestro::{self, Maestro}, modules::helm::chart::HelmChartScore, - score::Score, - topology::{K8sclient, Topology}, + score::{CloneBoxScore, Score}, + topology::{K8sclient, Topology, monitoring_alerting::MonitoringAlertingTopology}, }; -#[derive(Debug, Clone, Serialize)] +use super::kube_prometheus::kube_prometheus_score; + + +#[derive(Debug)] pub struct MonitoringAlertingStackScore { - monitoring: HelmChartScore, + pub monitoring_stack: Vec>>, +} + +impl Default for MonitoringAlertingStackScore { + fn default() -> Self { + let ns = "monitoring"; + Self { + monitoring_stack: vec![ + Box::new(kube_prometheus_score(ns)) as Box>, + ], + } + } +} +impl Clone for MonitoringAlertingStackScore { + fn clone(&self) -> Self { + Self { + monitoring_stack: self.monitoring_stack.iter().map(|s| s.clone_box()).collect(), + } + } +} + +impl Serialize for MonitoringAlertingStackScore { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut s = serializer.serialize_struct("MonitoringAlertingStackScore", 1)?; + let monitoring_values: Vec<_> = self.monitoring_stack.iter().map(|m| m.serialize()).collect(); + s.serialize_field("monitoring", &monitoring_values)?; + s.end() + } } impl Score for MonitoringAlertingStackScore { fn create_interpret(&self) -> Box> { Box::new(MonitoringAlertingStackInterpret { - score: self.clone(), + score: MonitoringAlertingStackScore { + monitoring_stack: self.monitoring_stack.iter().map(|s| s.clone_box()).collect(), + }, }) } fn name(&self) -> String { - format!( - "{} {} MonitoringAlertingStackScore", - self.monitoring.chart_name, self.monitoring.release_name - ) + format!("MonitoringAlertingStackScore") } } -#[derive(Debug, Serialize)] +#[derive(Debug)] struct MonitoringAlertingStackInterpret { pub score: MonitoringAlertingStackScore, } +impl MonitoringAlertingStackInterpret { + pub async fn build_monitoring_stack( + &self, + monitoring_stack: MonitoringAlertingStackScore, + ) -> Result { + let inventory = Inventory::autoload(); + let topology = MonitoringAlertingTopology::new(); + let mut maestro = match Maestro::initialize(inventory, topology).await { + Ok(m) => m, + Err(e) => { + println!("failed to initialize Maestro: {}", e); + std::process::exit(1); + } + }; + maestro.register_all(monitoring_stack.monitoring_stack); + Ok(Outcome::success(format!( + "installed kube-prometheus monitoring and alerting stack" + ))) + } +} + #[async_trait] impl Interpret for MonitoringAlertingStackInterpret { - fn execute<'life0, 'life1, 'life2, 'async_trait>( - &'life0 self, - inventory: &'life1 Inventory, - topology: &'life2 T, - ) -> ::core::pin::Pin< - Box< - dyn ::core::future::Future> - + ::core::marker::Send - + 'async_trait, - >, - > - where - 'life0: 'async_trait, - 'life1: 'async_trait, - 'life2: 'async_trait, - Self: 'async_trait, - { - todo!() + async fn execute( + &self, + _inventory: &Inventory, + _topology: &T, + ) -> Result { + self.build_monitoring_stack(self.score.clone()).await } fn get_name(&self) -> InterpretName { diff --git a/harmony/src/modules/monitoring/resources/mod.rs b/harmony/src/modules/monitoring/resources/mod.rs deleted file mode 100644 index fd3d57a..0000000 --- a/harmony/src/modules/monitoring/resources/mod.rs +++ /dev/null @@ -1 +0,0 @@ -mod kube_prometheus;