From 9209f78a52c0d8223f3c70f95c87812ee6bc798a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arma=C3=ABl=20Gu=C3=A9neau?= Date: Wed, 1 May 2024 11:40:52 +0200 Subject: [PATCH] Have more tags in the in_flight_requests meter (eg "service") The host tag is not currently included, but could be added later with some refactorings if we need it. --- src/https.rs | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/https.rs b/src/https.rs index ebdac6d..701f9f2 100644 --- a/src/https.rs +++ b/src/https.rs @@ -45,12 +45,12 @@ struct HttpsMetrics { request_proxy_duration: metrics::Histogram, } -struct InFlightGuard<'a> { - metrics: Arc, - tags: &'a [KeyValue], +struct InFlightGuard<'a, 'b> { + metrics: &'a HttpsMetrics, + tags: &'b [KeyValue], } -impl<'a> Drop for InFlightGuard<'a> { +impl<'a, 'b> Drop for InFlightGuard<'a, 'b> { fn drop(&mut self) { self.metrics.requests_in_flight.add(-1, self.tags) } @@ -179,8 +179,8 @@ async fn handle_request( ) -> Result, Infallible> { let method_tag = KeyValue::new("method", req.method().to_string()); - // The host tag is only included in the requests_received and requests_in_flight - // metrics, as for other metrics it can easily lead to cardinality explosions. + // The host tag is only included in the requests_received metric, + // as for other metrics it can easily lead to cardinality explosions. let host_tag = KeyValue::new( "host", req.uri() @@ -194,17 +194,7 @@ async fn handle_request( .unwrap_or_default(), ); - let tags = [host_tag, method_tag.clone()]; - metrics.requests_received.add(1, &tags); - metrics.requests_in_flight.add(1, &tags); - - // The guard ensures that we decrement requests_in_flight in all cases where - // the current tasks ends, including the case where it gets canceled and - // doesn't run to completion (which may happen e.g. if it timeouts). - let _guard = InFlightGuard { - metrics: Arc::clone(&metrics), - tags: &tags, - }; + metrics.requests_received.add(1, &[host_tag, method_tag.clone()]); let mut tags = vec![method_tag]; let resp = select_target_and_proxy( @@ -296,6 +286,17 @@ async fn select_target_and_proxy( ); proxy_to.calls_in_progress.fetch_add(1, Ordering::SeqCst); + let tags_in_flight = &tags.clone(); + metrics.requests_in_flight.add(1, &tags_in_flight); + // The guard ensures that we decrement requests_in_flight in all cases where + // the current tasks ends, including the case where it gets canceled and + // doesn't run to completion (which may happen e.g. if it timeouts). + // (Crucially we create the guard before the first .await in this function.) + let _guard = InFlightGuard { + metrics: &metrics, + tags: &tags_in_flight, + }; + // Forward to backend debug!("{}{} -> {}", host, path, proxy_to); trace!("Request: {:?}", req);