diff --git a/policy-controller/k8s/index/src/outbound.rs b/policy-controller/k8s/index/src/outbound.rs index f86debc32bc7f..1568b11300f72 100644 --- a/policy-controller/k8s/index/src/outbound.rs +++ b/policy-controller/k8s/index/src/outbound.rs @@ -1,3 +1,3 @@ pub mod index; -pub use index::{Index, ServiceRef, SharedIndex}; +pub use index::{metrics, Index, ServiceRef, SharedIndex}; diff --git a/policy-controller/k8s/index/src/outbound/index.rs b/policy-controller/k8s/index/src/outbound/index.rs index f488bbfcb8c47..be615c03e4536 100644 --- a/policy-controller/k8s/index/src/outbound/index.rs +++ b/policy-controller/k8s/index/src/outbound/index.rs @@ -25,6 +25,8 @@ pub struct Index { service_info: HashMap, } +pub mod metrics; + pub type SharedIndex = Arc>; #[derive(Debug, Clone, Hash, PartialEq, Eq)] diff --git a/policy-controller/k8s/index/src/outbound/index/metrics.rs b/policy-controller/k8s/index/src/outbound/index/metrics.rs new file mode 100644 index 0000000000000..bbde96ee72ed9 --- /dev/null +++ b/policy-controller/k8s/index/src/outbound/index/metrics.rs @@ -0,0 +1,67 @@ +use prometheus_client::{ + collector::Collector, + encoding::{DescriptorEncoder, EncodeMetric}, + metrics::{gauge::ConstGauge, MetricType}, + registry::Registry, +}; + +use super::SharedIndex; + +#[derive(Debug)] +struct Instrumented(SharedIndex); + +pub fn register(reg: &mut Registry, index: SharedIndex) { + reg.register_collector(Box::new(Instrumented(index))); +} + +impl Collector for Instrumented { + fn encode(&self, mut encoder: DescriptorEncoder<'_>) -> Result<(), std::fmt::Error> { + let this = self.0.read(); + + let service_encoder = encoder.encode_descriptor( + "service_index_size", + "The number of entires in service index", + None, + MetricType::Gauge, + )?; + let services = ConstGauge::new(this.services_by_ip.len() as u32); + services.encode(service_encoder)?; + + let service_info_encoder = encoder.encode_descriptor( + "service_info_index_size", + "The number of entires in the service info index", + None, + MetricType::Gauge, + )?; + let service_infos = ConstGauge::new(this.service_info.len() as u32); + service_infos.encode(service_info_encoder)?; + + let mut service_route_encoder = encoder.encode_descriptor( + "service_route_index_size", + "The number of entires in the service route index", + None, + MetricType::Gauge, + )?; + for (ns, index) in &this.namespaces.by_ns { + let labels = vec![("namespace", ns.as_str())]; + let service_routes = ConstGauge::new(index.service_routes.len() as u32); + let service_route_encoder = service_route_encoder.encode_family(&labels)?; + service_routes.encode(service_route_encoder)?; + } + + let mut service_port_route_encoder = encoder.encode_descriptor( + "service_port_route_index_size", + "The number of entires in the service port route index", + None, + MetricType::Gauge, + )?; + for (ns, index) in &this.namespaces.by_ns { + let labels = vec![("namespace", ns.as_str())]; + let service_port_routes = ConstGauge::new(index.service_port_routes.len() as u32); + let service_port_route_encoder = service_port_route_encoder.encode_family(&labels)?; + service_port_routes.encode(service_port_route_encoder)?; + } + + Ok(()) + } +} diff --git a/policy-controller/src/main.rs b/policy-controller/src/main.rs index ced70ce5b3310..126baf0e4a32c 100644 --- a/policy-controller/src/main.rs +++ b/policy-controller/src/main.rs @@ -149,6 +149,10 @@ async fn main() -> Result<()> { let status_metrics = status::ControllerMetrics::register(resource_status); let status_index_metrcs = status::IndexMetrics::register(resource_status); + outbound::metrics::register( + prom.sub_registry_with_prefix("outbound_index"), + outbound_index.clone(), + ); inbound::metrics::register( prom.sub_registry_with_prefix("inbound_index"), inbound_index.clone(),