use std::time::Instant;
use axum::body::Body;
use axum::extract::Request;
use axum::middleware::Next;
use axum::response::Response;
use metrics::{counter, histogram};
pub use metrics_exporter_prometheus::PrometheusHandle;
pub fn install() -> PrometheusHandle {
let builder = metrics_exporter_prometheus::PrometheusBuilder::new();
builder
.install_recorder()
.expect("failed to install Prometheus recorder")
}
pub async fn track_metrics(req: Request<Body>, next: Next) -> Response {
let method = req.method().to_string();
let path = req.uri().path().to_string();
let start = Instant::now();
let response = next.run(req).await;
let duration = start.elapsed().as_secs_f64();
let status = response.status().as_u16().to_string();
let _ = counter!("http_requests_total", "method" => method.clone(), "path" => path.clone(), "status" => status);
histogram!("http_request_duration_seconds", "method" => method, "path" => path).record(duration);
response
}