feat: microsoft teams integration

This commit is contained in:
2025-05-22 16:10:48 -04:00
parent e1a8ee1c15
commit 77eb1228be
4 changed files with 84 additions and 6 deletions

View File

@@ -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)
}

View File

@@ -1,3 +1,4 @@
mod prometheus_msteams;
mod kube_prometheus;
pub mod monitoring_alerting;
mod discord_alert_manager;

View File

@@ -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!()
}

View File

@@ -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<HelmChartScore> {
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");
}
}