diff --git a/Cargo.lock b/Cargo.lock index 3a47a6d..5c51647 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1161,6 +1161,7 @@ dependencies = [ "harmony", "harmony_cli", "harmony_macros", + "serde_yaml", "tokio", "url", ] diff --git a/examples/monitoring/Cargo.toml b/examples/monitoring/Cargo.toml index 1c35330..1f27939 100644 --- a/examples/monitoring/Cargo.toml +++ b/examples/monitoring/Cargo.toml @@ -9,5 +9,6 @@ license.workspace = true harmony = { version = "0.1.0", path = "../../harmony" } harmony_cli = { version = "0.1.0", path = "../../harmony_cli" } harmony_macros = { version = "0.1.0", path = "../../harmony_macros" } +serde_yaml.workspace = true tokio.workspace = true url.workspace = true diff --git a/examples/monitoring/src/main.rs b/examples/monitoring/src/main.rs index e7d5f22..bb48ccf 100644 --- a/examples/monitoring/src/main.rs +++ b/examples/monitoring/src/main.rs @@ -19,6 +19,7 @@ use harmony::{ }; use harmony_macros::http_scheme; +use serde_yaml::{Mapping, Value}; #[tokio::main] async fn main() { @@ -55,13 +56,24 @@ async fn main() { relabelings: vec![], }; + let mut selector = Mapping::new(); + selector.insert( + Value::from("matchExpressions"), + serde_yaml::to_value(vec![Selector { + key: "monitored".to_string(), + operator: "In".to_string(), + values: vec!["test-service-1".to_string()], + }]) + .expect("couldn't create mapping value"), + ); + let service_monitor = ServiceMonitor { - name: "test service monitor".to_string(), + name: "test-service-monitor".to_string(), additional_labels: None, job_label: None, target_labels: vec![], pod_target_labels: vec![], - selector: None, + selector: selector, match_labels: None, namespace_selector: None, endpoints: vec![service_monitor_endpoint], diff --git a/harmony/src/modules/monitoring/kube_prometheus/types.rs b/harmony/src/modules/monitoring/kube_prometheus/types.rs index d3942ba..60c8168 100644 --- a/harmony/src/modules/monitoring/kube_prometheus/types.rs +++ b/harmony/src/modules/monitoring/kube_prometheus/types.rs @@ -143,6 +143,14 @@ pub struct ServiceMonitorEndpoint { pub relabelings: Vec, } +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Selector { + pub key: String, + pub operator: String, + pub values: Vec, +} + #[derive(Debug, Clone, Serialize)] #[serde(rename_all = "camelCase")] pub struct ServiceMonitor { @@ -170,7 +178,7 @@ pub struct ServiceMonitor { // values: // - example-service-1 // - example-service-2 - pub selector: Option, + pub selector: Mapping, // # label selector for services pub match_labels: Option,