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.
This commit is contained in:
Armaël Guéneau 2024-05-01 11:40:52 +02:00
parent b2ba666a11
commit 9209f78a52

View file

@ -45,12 +45,12 @@ struct HttpsMetrics {
request_proxy_duration: metrics::Histogram<f64>, request_proxy_duration: metrics::Histogram<f64>,
} }
struct InFlightGuard<'a> { struct InFlightGuard<'a, 'b> {
metrics: Arc<HttpsMetrics>, metrics: &'a HttpsMetrics,
tags: &'a [KeyValue], tags: &'b [KeyValue],
} }
impl<'a> Drop for InFlightGuard<'a> { impl<'a, 'b> Drop for InFlightGuard<'a, 'b> {
fn drop(&mut self) { fn drop(&mut self) {
self.metrics.requests_in_flight.add(-1, self.tags) self.metrics.requests_in_flight.add(-1, self.tags)
} }
@ -179,8 +179,8 @@ async fn handle_request(
) -> Result<Response<Body>, Infallible> { ) -> Result<Response<Body>, Infallible> {
let method_tag = KeyValue::new("method", req.method().to_string()); let method_tag = KeyValue::new("method", req.method().to_string());
// The host tag is only included in the requests_received and requests_in_flight // The host tag is only included in the requests_received metric,
// metrics, as for other metrics it can easily lead to cardinality explosions. // as for other metrics it can easily lead to cardinality explosions.
let host_tag = KeyValue::new( let host_tag = KeyValue::new(
"host", "host",
req.uri() req.uri()
@ -194,17 +194,7 @@ async fn handle_request(
.unwrap_or_default(), .unwrap_or_default(),
); );
let tags = [host_tag, method_tag.clone()]; metrics.requests_received.add(1, &[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,
};
let mut tags = vec![method_tag]; let mut tags = vec![method_tag];
let resp = select_target_and_proxy( 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); 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 // Forward to backend
debug!("{}{} -> {}", host, path, proxy_to); debug!("{}{} -> {}", host, path, proxy_to);
trace!("Request: {:?}", req); trace!("Request: {:?}", req);