feat: microsoft teams integration
This commit is contained in:
@@ -156,7 +156,7 @@ prometheus:
|
|||||||
for alert_channel in &config.alert_channel {
|
for alert_channel in &config.alert_channel {
|
||||||
match alert_channel {
|
match alert_channel {
|
||||||
AlertChannel::Discord { name, .. } => {
|
AlertChannel::Discord { name, .. } => {
|
||||||
let (receiver, route) = discord_alert_builder(name);
|
let (receiver, route) = discord_alert_receiver_builder(name);
|
||||||
info!("discord receiver: {} \nroute: {}", receiver, route);
|
info!("discord receiver: {} \nroute: {}", receiver, route);
|
||||||
receivers.push_str(&receiver);
|
receivers.push_str(&receiver);
|
||||||
routes.push_str(&route);
|
routes.push_str(&route);
|
||||||
@@ -165,10 +165,9 @@ prometheus:
|
|||||||
slack_channel,
|
slack_channel,
|
||||||
webhook_url,
|
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);
|
info!("slack receiver: {} \nroute: {}", receiver, route);
|
||||||
receivers.push_str(&receiver);
|
receivers.push_str(&receiver);
|
||||||
|
|
||||||
routes.push_str(&route);
|
routes.push_str(&route);
|
||||||
let global_config = format!(
|
let global_config = format!(
|
||||||
r#"
|
r#"
|
||||||
@@ -178,6 +177,12 @@ prometheus:
|
|||||||
|
|
||||||
global_configs.push_str(&global_config);
|
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!(),
|
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 discord_receiver_name = format!("Discord-{}", release_name);
|
||||||
let receiver = format!(
|
let receiver = format!(
|
||||||
r#"
|
r#"
|
||||||
@@ -240,7 +245,7 @@ fn discord_alert_builder(release_name: &String) -> (String, String) {
|
|||||||
(receiver, route)
|
(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 slack_receiver_name = format!("Slack-{}", slack_channel);
|
||||||
let receiver = format!(
|
let receiver = format!(
|
||||||
r#"
|
r#"
|
||||||
@@ -260,3 +265,22 @@ fn slack_alert_builder(slack_channel: &String) -> (String, String) {
|
|||||||
);
|
);
|
||||||
(receiver, route)
|
(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;
|
mod kube_prometheus;
|
||||||
pub mod monitoring_alerting;
|
pub mod monitoring_alerting;
|
||||||
mod discord_alert_manager;
|
mod discord_alert_manager;
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ use crate::{
|
|||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
config::KubePrometheusConfig, discord_alert_manager::discord_alert_manager_score,
|
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)]
|
#[derive(Debug, Clone, Serialize)]
|
||||||
@@ -28,6 +28,10 @@ pub enum AlertChannel {
|
|||||||
slack_channel: String,
|
slack_channel: String,
|
||||||
webhook_url: Url,
|
webhook_url: Url,
|
||||||
},
|
},
|
||||||
|
MSTeams {
|
||||||
|
connector: String,
|
||||||
|
webhook_url: Url,
|
||||||
|
},
|
||||||
//TODO test and implement in helm chart
|
//TODO test and implement in helm chart
|
||||||
//currently does not work
|
//currently does not work
|
||||||
Smpt {
|
Smpt {
|
||||||
@@ -109,6 +113,9 @@ impl MonitoringAlertingStackInterpret {
|
|||||||
AlertChannel::Slack { .. } => Ok(Outcome::success(
|
AlertChannel::Slack { .. } => Ok(Outcome::success(
|
||||||
"No extra configs for slack alerting".to_string(),
|
"No extra configs for slack alerting".to_string(),
|
||||||
)),
|
)),
|
||||||
|
AlertChannel::MSTeams { .. } => {
|
||||||
|
prometheus_msteams_score(config).create_interpret().execute(inventory, topology).await
|
||||||
|
}
|
||||||
AlertChannel::Smpt { .. } => {
|
AlertChannel::Smpt { .. } => {
|
||||||
todo!()
|
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