diff --git a/harmony/src/modules/monitoring/kube_prometheus.rs b/harmony/src/modules/monitoring/kube_prometheus.rs index b694f515..c82a782c 100644 --- a/harmony/src/modules/monitoring/kube_prometheus.rs +++ b/harmony/src/modules/monitoring/kube_prometheus.rs @@ -156,7 +156,7 @@ prometheus: for alert_channel in &config.alert_channel { match alert_channel { AlertChannel::Discord { name, .. } => { - let (receiver, route) = discord_alert_builder(name); + let (receiver, route) = discord_alert_receiver_builder(name); info!("discord receiver: {} \nroute: {}", receiver, route); receivers.push_str(&receiver); routes.push_str(&route); @@ -165,10 +165,9 @@ prometheus: slack_channel, webhook_url, } => { - let (receiver, route) = slack_alert_builder(slack_channel); + let (receiver, route) = slack_alert_receiver_builder(slack_channel); info!("slack receiver: {} \nroute: {}", receiver, route); receivers.push_str(&receiver); - routes.push_str(&route); let global_config = format!( r#" @@ -178,6 +177,12 @@ prometheus: global_configs.push_str(&global_config); } + AlertChannel::MSTeams { connector, .. } => { + let (receiver, route) = msteams_alert_receiver_builder(connector); + info!("msteams receiver: {} \nroute: {}", receiver, route); + receivers.push_str(&receiver); + routes.push_str(&route); + } AlertChannel::Smpt { .. } => todo!(), } } @@ -221,7 +226,7 @@ alertmanager: } } -fn discord_alert_builder(release_name: &String) -> (String, String) { +fn discord_alert_receiver_builder(release_name: &String) -> (String, String) { let discord_receiver_name = format!("Discord-{}", release_name); let receiver = format!( r#" @@ -240,7 +245,7 @@ fn discord_alert_builder(release_name: &String) -> (String, String) { (receiver, route) } -fn slack_alert_builder(slack_channel: &String) -> (String, String) { +fn slack_alert_receiver_builder(slack_channel: &String) -> (String, String) { let slack_receiver_name = format!("Slack-{}", slack_channel); let receiver = format!( r#" @@ -260,3 +265,22 @@ fn slack_alert_builder(slack_channel: &String) -> (String, String) { ); (receiver, route) } + +fn msteams_alert_receiver_builder(connector: &String) -> (String, String) { + let msteams_receiver_name = format!("MSTeams-{}", connector); + let receiver = format!( + r#" + - name: '{msteams_receiver_name}' + webhook_configs: + - send_resolved: true + url: 'http://prometheus-msteams-prometheus-msteams.monitoring.svc.cluster.local:2000/alertmanager'"#, + ); + let route = format!( + r#" + - receiver: '{msteams_receiver_name}' + matchers: + - alertname!=Watchdog + continue: true"#, + ); + (receiver, route) +} diff --git a/harmony/src/modules/monitoring/mod.rs b/harmony/src/modules/monitoring/mod.rs index d880a671..4c20ca77 100644 --- a/harmony/src/modules/monitoring/mod.rs +++ b/harmony/src/modules/monitoring/mod.rs @@ -1,3 +1,4 @@ +mod prometheus_msteams; mod kube_prometheus; pub mod monitoring_alerting; mod discord_alert_manager; diff --git a/harmony/src/modules/monitoring/monitoring_alerting.rs b/harmony/src/modules/monitoring/monitoring_alerting.rs index 0e7c2d41..7f1e3582 100644 --- a/harmony/src/modules/monitoring/monitoring_alerting.rs +++ b/harmony/src/modules/monitoring/monitoring_alerting.rs @@ -15,7 +15,7 @@ use crate::{ use super::{ config::KubePrometheusConfig, discord_alert_manager::discord_alert_manager_score, - kube_prometheus::kube_prometheus_helm_chart_score, + kube_prometheus::kube_prometheus_helm_chart_score, prometheus_msteams::prometheus_msteams_score, }; #[derive(Debug, Clone, Serialize)] @@ -28,6 +28,10 @@ pub enum AlertChannel { slack_channel: String, webhook_url: Url, }, + MSTeams { + connector: String, + webhook_url: Url, + }, //TODO test and implement in helm chart //currently does not work Smpt { @@ -109,6 +113,9 @@ impl MonitoringAlertingStackInterpret { AlertChannel::Slack { .. } => Ok(Outcome::success( "No extra configs for slack alerting".to_string(), )), + AlertChannel::MSTeams { .. } => { + prometheus_msteams_score(config).create_interpret().execute(inventory, topology).await + } AlertChannel::Smpt { .. } => { todo!() } diff --git a/harmony/src/modules/monitoring/prometheus_msteams.rs b/harmony/src/modules/monitoring/prometheus_msteams.rs new file mode 100644 index 00000000..6f023ade --- /dev/null +++ b/harmony/src/modules/monitoring/prometheus_msteams.rs @@ -0,0 +1,46 @@ +use std::str::FromStr; + +use non_blank_string_rs::NonBlankString; + +use crate::modules::helm::chart::HelmChartScore; + +use super::{config::KubePrometheusConfig, monitoring_alerting::AlertChannel}; + +fn build_prometheus_msteams_score(config: &KubePrometheusConfig) -> Option { + let (url, name) = config.alert_channel.iter().find_map(|channel| { + if let AlertChannel::MSTeams { webhook_url, connector } = channel { + Some((webhook_url, connector)) + } else { + None + } + })?; + + let values = format!( + r#" +connectors: + - default: "{url}" +"#, + ); + + Some(HelmChartScore { + namespace: Some(NonBlankString::from_str(&config.namespace).unwrap()), + release_name: NonBlankString::from_str(&name).unwrap(), + chart_name: NonBlankString::from_str("oci://hub.nationtech.io/library/prometheus-msteams") + .unwrap(), + chart_version: None, + values_overrides: None, + values_yaml: Some(values.to_string()), + create_namespace: true, + install_only: true, + repository: None, + }) +} + +pub fn prometheus_msteams_score(config: &KubePrometheusConfig) -> HelmChartScore { + if let Some(chart) = build_prometheus_msteams_score(config) { + chart + } else { + panic!("Expected discord alert manager helm chart"); + } +} +