diff --git a/examples/ms_teams_alert_channel/Cargo.toml b/examples/ms_teams_alert_channel/Cargo.toml new file mode 100644 index 0000000..f3e3c30 --- /dev/null +++ b/examples/ms_teams_alert_channel/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "ms_teams_alert_channel" +edition = "2024" +version.workspace = true +readme.workspace = true +license.workspace = true + +[dependencies] +harmony = { version = "0.1.0", path = "../../harmony" } +harmony_cli = { version = "0.1.0", path = "../../harmony_cli" } +serde = "1.0.219" +tokio.workspace = true +typetag = "0.2.20" +url.workspace = true diff --git a/examples/ms_teams_alert_channel/src/main.rs b/examples/ms_teams_alert_channel/src/main.rs new file mode 100644 index 0000000..c7bdf01 --- /dev/null +++ b/examples/ms_teams_alert_channel/src/main.rs @@ -0,0 +1,65 @@ +mod prometheus_msteams; +use harmony::{ + interpret::InterpretError, inventory::Inventory, maestro::Maestro, modules::{helm::chart::HelmChartScore, monitoring::{kube_prometheus::{prometheus_alert_channel::PrometheusAlertChannel, types::{AlertChannelConfig, AlertChannelReceiver, AlertChannelRoute, WebhookConfig}}, monitoring_alerting::MonitoringAlertingScore}}, topology::K8sAnywhereTopology +}; +use prometheus_msteams::prometheus_msteams_score; +use url::Url; +use serde::{Serialize, Deserialize}; + +#[tokio::main] +async fn main() { + let alert_channels: Vec> = vec![Box::new(MSTeamsChannel { + connector: "teams-test".to_string(), + webhook_url: url::Url::parse( + "https://msteams.com/services/dummy/dummy/dummy", + ) + .expect("invalid URL"), + })]; + + let monitoring_score = MonitoringAlertingScore { + alert_channels, + namespace: None, + }; + + let mut maestro = Maestro::::initialize( + Inventory::autoload(), + K8sAnywhereTopology::new(), + ) + .await + .unwrap(); + + maestro.register_all(vec![Box::new(monitoring_score)]); + harmony_cli::init(maestro, None).await.unwrap(); +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct MSTeamsChannel { + connector: String, + webhook_url: Url, +} + +#[typetag::serde] +impl PrometheusAlertChannel for MSTeamsChannel { + fn get_alert_manager_config_contribution(&self) -> Result { + Ok(AlertChannelConfig{ + receiver: AlertChannelReceiver{ + name: format!("MSTeams-{}",self.connector), + slack_configs: None, + webhook_configs: Some(vec![WebhookConfig{ + url: url::Url::parse("http://prometheus-msteams-prometheus-msteams.monitoring.svc.cluster.local:2000/alertmanager").expect("invalid url"), + send_resolved: true,}]) + }, + route: AlertChannelRoute{ + receiver: format!("MSTeams-{}", self.connector), + matchers: vec!["alertname!=Watchdog".to_string()], + r#continue: true, + }, + global_config: None, }) + } + fn get_dependency_score(&self, ns: String) -> Option { + Some(prometheus_msteams_score(self.connector.clone(), self.webhook_url.clone(), ns.clone())) + } +} + + + diff --git a/examples/ms_teams_alert_channel/src/prometheus_msteams.rs b/examples/ms_teams_alert_channel/src/prometheus_msteams.rs new file mode 100644 index 0000000..89c190b --- /dev/null +++ b/examples/ms_teams_alert_channel/src/prometheus_msteams.rs @@ -0,0 +1,30 @@ +use std::str::FromStr; + +use harmony::modules::helm::chart::{HelmChartScore, NonBlankString}; +use url::Url; + +pub fn prometheus_msteams_score( + name: String, + webhook_url: Url, + namespace: String, +) -> HelmChartScore { + let values = format!( + r#" + connectors: + - default: "{webhook_url}" + "#, + ); + + HelmChartScore { + namespace: Some(NonBlankString::from_str(&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, + } +}