diff --git a/crates/obs/src/metrics/collectors/mod.rs b/crates/obs/src/metrics/collectors/mod.rs index 902b3edb8..20f0761e0 100644 --- a/crates/obs/src/metrics/collectors/mod.rs +++ b/crates/obs/src/metrics/collectors/mod.rs @@ -28,7 +28,7 @@ pub mod node; pub mod notification; pub mod notification_target; pub mod replication; -pub mod request; +pub(crate) mod request; pub mod resource; pub mod scanner; pub mod system_cpu; @@ -59,7 +59,6 @@ pub use node::{DiskStats, collect_node_metrics}; pub use notification::{NotificationStats, collect_notification_metrics}; pub use notification_target::{NotificationTargetStats, collect_notification_target_metrics}; pub use replication::{ReplicationStats, collect_replication_metrics}; -pub use request::{ApiRequestStats, collect_request_metrics}; pub use resource::{ResourceStats, collect_resource_metrics}; pub use scanner::{ScannerStats, collect_scanner_metrics}; pub use system_cpu::{CpuStats, ProcessCpuStats, collect_cpu_metrics, collect_process_cpu_metrics}; diff --git a/crates/obs/src/metrics/collectors/request.rs b/crates/obs/src/metrics/collectors/request.rs index 66a1f4e0f..b7e0b8987 100644 --- a/crates/obs/src/metrics/collectors/request.rs +++ b/crates/obs/src/metrics/collectors/request.rs @@ -21,6 +21,7 @@ use crate::metrics::report::PrometheusMetric; use crate::metrics::schema::request::*; +use std::collections::HashMap; /// API request statistics for a specific API endpoint. #[derive(Debug, Clone, Default)] @@ -54,8 +55,13 @@ pub struct ApiRequestStats { /// Returns a vector of Prometheus metrics for API request statistics. pub fn collect_request_metrics(stats: &[ApiRequestStats]) -> Vec { let mut metrics = Vec::new(); + let mut traffic_by_type: HashMap<&str, (u64, u64)> = HashMap::with_capacity(stats.len()); for stat in stats { + let entry = traffic_by_type.entry(stat.req_type.as_str()).or_default(); + entry.0 = entry.0.saturating_add(stat.sent_bytes); + entry.1 = entry.1.saturating_add(stat.recv_bytes); + // In-flight requests metrics.push( PrometheusMetric::from_descriptor(&API_REQUESTS_IN_FLIGHT_TOTAL_MD, stat.in_flight as f64) @@ -107,15 +113,16 @@ pub fn collect_request_metrics(stats: &[ApiRequestStats]) -> Vec = metrics.iter().filter(|metric| metric.name == sent_name).collect(); + assert_eq!(sent_metrics.len(), 1); + assert_eq!(sent_metrics[0].value, 300.0); + assert!( + sent_metrics[0] + .labels + .iter() + .any(|(key, value)| *key == TYPE_LABEL && value == "s3") + ); + + let recv_name = API_TRAFFIC_RECV_BYTES_MD.get_full_metric_name(); + let recv_metrics: Vec<_> = metrics.iter().filter(|metric| metric.name == recv_name).collect(); + assert_eq!(recv_metrics.len(), 1); + assert_eq!(recv_metrics[0].value, 30.0); + assert!( + recv_metrics[0] + .labels + .iter() + .any(|(key, value)| *key == TYPE_LABEL && value == "s3") + ); + } } diff --git a/crates/obs/src/metrics/schema/mod.rs b/crates/obs/src/metrics/schema/mod.rs index be672fb17..4effef7ff 100644 --- a/crates/obs/src/metrics/schema/mod.rs +++ b/crates/obs/src/metrics/schema/mod.rs @@ -30,7 +30,7 @@ pub mod node_disk; pub mod notification_target; pub mod process_resource; pub mod replication; -pub mod request; +pub(crate) mod request; pub mod scanner; pub mod system_cpu; pub mod system_drive;