use std::time::Duration;
use std::time::Instant;
use crate::plugins::telemetry::span_factory;
pub(crate) fn record_bypassed_request(status_code: u16, duration: Duration) {
f64_histogram_with_unit!(
"http.server.request.duration",
"Duration of HTTP server requests.",
"s",
duration.as_secs_f64(),
"http.response.status_code" = status_code as i64
);
}
pub(crate) fn record_rejected_request(status_code: u16, start: Instant) {
let elapsed = start.elapsed();
record_bypassed_request(status_code, elapsed);
let entered = span_factory::create_router_rejection().entered();
entered.record("http.response.status_code", status_code as i64);
entered.record("apollo_private.duration_ns", elapsed.as_nanos() as i64);
}
#[cfg(test)]
mod tests {
use super::*;
use crate::metrics::FutureMetricsExt;
use crate::plugins::telemetry::config_new::instruments::HTTP_SERVER_REQUEST_DURATION_METRIC;
#[tokio::test]
async fn records_a_rejected_request() {
async {
record_rejected_request(431, Instant::now());
assert_histogram_count!(
"http.server.request.duration",
1,
"http.response.status_code" = 431i64
);
}
.with_metrics()
.await;
}
#[tokio::test]
async fn records_a_bypassed_request_on_the_router_instrument() {
async {
record_bypassed_request(503, Duration::from_millis(5));
assert_histogram_count!(
"http.server.request.duration",
1,
"http.response.status_code" = 503i64
);
let collected = crate::metrics::collect_metrics();
let metric = collected
.find(HTTP_SERVER_REQUEST_DURATION_METRIC)
.expect("should emit the instrument the router pipeline builds");
assert_eq!(metric.unit(), "s");
assert_eq!(metric.description(), "Duration of HTTP server requests.");
}
.with_metrics()
.await;
}
}