Compare commits

...

3 commits

Author SHA1 Message Date
Armaël Guéneau
2999e366d8 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.
2024-05-01 11:43:11 +02:00
Armaël Guéneau
1f621cd2a5 add small comment 2024-04-26 13:11:25 +02:00
Armaël Guéneau
68980642e1 Add a metrics counter measuring in-flight requests 2024-04-25 22:22:45 +02:00

View file

@ -41,9 +41,21 @@ pub struct HttpsConfig {
struct HttpsMetrics { struct HttpsMetrics {
requests_received: metrics::Counter<u64>, requests_received: metrics::Counter<u64>,
requests_served: metrics::Counter<u64>, requests_served: metrics::Counter<u64>,
requests_in_flight: metrics::UpDownCounter<i64>,
request_proxy_duration: metrics::Histogram<f64>, request_proxy_duration: metrics::Histogram<f64>,
} }
struct InFlightGuard<'a, 'b> {
metrics: &'a HttpsMetrics,
tags: &'b [KeyValue],
}
impl<'a, 'b> Drop for InFlightGuard<'a, 'b> {
fn drop(&mut self) {
self.metrics.requests_in_flight.add(-1, self.tags)
}
}
pub async fn serve_https( pub async fn serve_https(
config: HttpsConfig, config: HttpsConfig,
cert_store: Arc<CertStore>, cert_store: Arc<CertStore>,
@ -62,6 +74,10 @@ pub async fn serve_https(
.u64_counter("https_requests_served") .u64_counter("https_requests_served")
.with_description("Total number of requests served over HTTPS") .with_description("Total number of requests served over HTTPS")
.init(), .init(),
requests_in_flight: meter
.i64_up_down_counter("https_requests_in_flight")
.with_description("Current number of requests handled over HTTPS")
.init(),
request_proxy_duration: meter request_proxy_duration: meter
.f64_histogram("https_request_proxy_duration") .f64_histogram("https_request_proxy_duration")
.with_description("Duration between time when request was received, and time when backend returned status code and headers") .with_description("Duration between time when request was received, and time when backend returned status code and headers")
@ -178,9 +194,7 @@ async fn handle_request(
.unwrap_or_default(), .unwrap_or_default(),
); );
metrics metrics.requests_received.add(1, &[host_tag, method_tag.clone()]);
.requests_received
.add(1, &[host_tag, method_tag.clone()]);
let mut tags = vec![method_tag]; let mut tags = vec![method_tag];
let resp = select_target_and_proxy( let resp = select_target_and_proxy(
@ -272,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);