feat: microsoft teams integration
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
mod prometheus_msteams;
|
||||
mod kube_prometheus;
|
||||
pub mod monitoring_alerting;
|
||||
mod discord_alert_manager;
|
||||
|
||||
@@ -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!()
|
||||
}
|
||||
|
||||
46
harmony/src/modules/monitoring/prometheus_msteams.rs
Normal file
46
harmony/src/modules/monitoring/prometheus_msteams.rs
Normal 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");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user