diff --git a/harmony/src/modules/monitoring/alert_channel/discord_alert_channel.rs b/harmony/src/modules/monitoring/alert_channel/discord_alert_channel.rs index 2cdc7ec..748c677 100644 --- a/harmony/src/modules/monitoring/alert_channel/discord_alert_channel.rs +++ b/harmony/src/modules/monitoring/alert_channel/discord_alert_channel.rs @@ -65,6 +65,10 @@ impl AlertReceiver for DiscordWebhook { }, spec, }; + debug!( + "alertmanager_configs yaml:\n{:#?}", + serde_yaml::to_string(&alertmanager_configs) + ); debug!( "alert manager configs: \n{:#?}", alertmanager_configs.clone() diff --git a/harmony/src/modules/monitoring/kube_prometheus/crd/mod.rs b/harmony/src/modules/monitoring/kube_prometheus/crd/mod.rs index 81476f4..4dbea74 100644 --- a/harmony/src/modules/monitoring/kube_prometheus/crd/mod.rs +++ b/harmony/src/modules/monitoring/kube_prometheus/crd/mod.rs @@ -16,5 +16,6 @@ pub mod rhob_monitoring_stack; pub mod rhob_prometheus_rules; pub mod rhob_prometheuses; pub mod rhob_role; +pub mod rhob_service_monitor; pub mod role; pub mod service_monitor; diff --git a/harmony/src/modules/monitoring/kube_prometheus/crd/rhob_alertmanager_config.rs b/harmony/src/modules/monitoring/kube_prometheus/crd/rhob_alertmanager_config.rs index c37eb80..a53b24e 100644 --- a/harmony/src/modules/monitoring/kube_prometheus/crd/rhob_alertmanager_config.rs +++ b/harmony/src/modules/monitoring/kube_prometheus/crd/rhob_alertmanager_config.rs @@ -12,7 +12,7 @@ use crate::topology::{ #[derive(CustomResource, Serialize, Deserialize, Debug, Clone, JsonSchema)] #[kube( group = "monitoring.rhobs", - version = "v1alpha", + version = "v1alpha1", kind = "AlertmanagerConfig", plural = "alertmanagerconfigs", namespaced diff --git a/harmony/src/modules/monitoring/kube_prometheus/crd/rhob_prometheus_rules.rs b/harmony/src/modules/monitoring/kube_prometheus/crd/rhob_prometheus_rules.rs index 1792104..e2b5b60 100644 --- a/harmony/src/modules/monitoring/kube_prometheus/crd/rhob_prometheus_rules.rs +++ b/harmony/src/modules/monitoring/kube_prometheus/crd/rhob_prometheus_rules.rs @@ -8,7 +8,7 @@ use crate::modules::monitoring::alert_rule::prometheus_alert_rule::PrometheusAle #[derive(CustomResource, Debug, Serialize, Deserialize, Clone, JsonSchema)] #[kube( - group = "monitoring.rhobs.com", + group = "monitoring.rhobs", version = "v1", kind = "PrometheusRule", plural = "prometheusrules", diff --git a/harmony/src/modules/monitoring/kube_prometheus/crd/rhob_service_monitor.rs b/harmony/src/modules/monitoring/kube_prometheus/crd/rhob_service_monitor.rs new file mode 100644 index 0000000..6a981f2 --- /dev/null +++ b/harmony/src/modules/monitoring/kube_prometheus/crd/rhob_service_monitor.rs @@ -0,0 +1,87 @@ +use std::collections::HashMap; + +use kube::CustomResource; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use crate::modules::monitoring::kube_prometheus::types::{ + HTTPScheme, MatchExpression, NamespaceSelector, Operator, Selector, + ServiceMonitor as KubeServiceMonitor, ServiceMonitorEndpoint, +}; + +/// This is the top-level struct for the ServiceMonitor Custom Resource. +/// The `#[derive(CustomResource)]` macro handles all the boilerplate for you, +/// including the `impl Resource`. +#[derive(CustomResource, Serialize, Deserialize, Debug, Clone, JsonSchema)] +#[kube( + group = "monitoring.rhobs", + version = "v1", + kind = "ServiceMonitor", + plural = "servicemonitors", + namespaced +)] +#[serde(rename_all = "camelCase")] +pub struct ServiceMonitorSpec { + /// A label selector to select services to monitor. + pub selector: Selector, + + /// A list of endpoints on the selected services to be monitored. + pub endpoints: Vec, + + /// Selector to select which namespaces the Kubernetes Endpoints objects + /// are discovered from. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub namespace_selector: Option, + + /// The label to use to retrieve the job name from. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub job_label: Option, + + /// Pod-based target labels to transfer from the Kubernetes Pod onto the target. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub pod_target_labels: Vec, + + /// TargetLabels transfers labels on the Kubernetes Service object to the target. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub target_labels: Vec, +} + +impl Default for ServiceMonitorSpec { + fn default() -> Self { + let labels = HashMap::new(); + Self { + selector: Selector { + match_labels: { labels }, + match_expressions: vec![MatchExpression { + key: "app.kubernetes.io/name".into(), + operator: Operator::Exists, + values: vec![], + }], + }, + endpoints: vec![ServiceMonitorEndpoint { + port: Some("http".to_string()), + path: Some("/metrics".into()), + interval: Some("30s".into()), + scheme: Some(HTTPScheme::HTTP), + ..Default::default() + }], + namespace_selector: None, // only the same namespace + job_label: Some("app".into()), + pod_target_labels: vec![], + target_labels: vec![], + } + } +} + +impl From for ServiceMonitorSpec { + fn from(value: KubeServiceMonitor) -> Self { + Self { + selector: value.selector, + endpoints: value.endpoints, + namespace_selector: value.namespace_selector, + job_label: value.job_label, + pod_target_labels: value.pod_target_labels, + target_labels: value.target_labels, + } + } +} diff --git a/harmony/src/modules/prometheus/rhob_alerting_score.rs b/harmony/src/modules/prometheus/rhob_alerting_score.rs index ee3e5cc..8acfef1 100644 --- a/harmony/src/modules/prometheus/rhob_alerting_score.rs +++ b/harmony/src/modules/prometheus/rhob_alerting_score.rs @@ -23,13 +23,9 @@ use crate::modules::monitoring::kube_prometheus::crd::rhob_monitoring_stack::{ use crate::modules::monitoring::kube_prometheus::crd::rhob_prometheus_rules::{ PrometheusRule, PrometheusRuleSpec, RuleGroup, }; -use crate::modules::monitoring::kube_prometheus::crd::rhob_prometheuses::{ - AlertmanagerEndpoints, LabelSelector, Prometheus, PrometheusSpec, PrometheusSpecAlerting, -}; -use crate::modules::monitoring::kube_prometheus::crd::role::{ - build_prom_role, build_prom_rolebinding, build_prom_service_account, -}; -use crate::modules::monitoring::kube_prometheus::crd::service_monitor::{ +use crate::modules::monitoring::kube_prometheus::crd::rhob_prometheuses::LabelSelector; + +use crate::modules::monitoring::kube_prometheus::crd::rhob_service_monitor::{ ServiceMonitor, ServiceMonitorSpec, }; use crate::score::Score; @@ -90,12 +86,12 @@ impl