diff options
Diffstat (limited to 'lib/warden-middleware/src/metrics.rs')
-rw-r--r-- | lib/warden-middleware/src/metrics.rs | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/lib/warden-middleware/src/metrics.rs b/lib/warden-middleware/src/metrics.rs new file mode 100644 index 0000000..8644160 --- /dev/null +++ b/lib/warden-middleware/src/metrics.rs @@ -0,0 +1,33 @@ +use std::time::Instant; + +use axum::{ + extract::{MatchedPath, Request}, + middleware::Next, + response::IntoResponse, +}; + +pub async fn apply_metrics_middleware(req: Request, next: Next) -> impl IntoResponse { + let start = Instant::now(); + let path = if let Some(matched_path) = req.extensions().get::<MatchedPath>() { + matched_path.as_str().to_owned() + } else { + req.uri().path().to_owned() + }; + let method = req.method().clone(); + + let response = next.run(req).await; + + let latency = start.elapsed().as_secs_f64(); + let status = response.status().as_u16().to_string(); + + let labels = [ + ("method", method.to_string()), + ("path", path), + ("status", status), + ]; + + metrics::counter!("http_requests_total", &labels).increment(1); + metrics::histogram!("http_requests_duration_seconds", &labels).record(latency); + + response +} |