metrics_dashboard/
middleware.rs

1use std::time::Instant;
2
3use poem::{Endpoint, IntoResponse, Middleware, Request, Response, Result};
4
5/// Middleware for [`tracing`](https://crates.io/crates/tracing).
6#[derive(Default)]
7pub struct HttpMetricMiddleware;
8
9impl<E: Endpoint> Middleware<E> for HttpMetricMiddleware {
10    type Output = HttpMetricMiddlewareEndpoint<E>;
11
12    fn transform(&self, ep: E) -> Self::Output {
13        HttpMetricMiddlewareEndpoint { inner: ep }
14    }
15}
16
17/// Endpoint for `Tracing` middleware.
18pub struct HttpMetricMiddlewareEndpoint<E> {
19    inner: E,
20}
21
22impl<E: Endpoint> Endpoint for HttpMetricMiddlewareEndpoint<E> {
23    type Output = Response;
24
25    async fn call(&self, req: Request) -> Result<Self::Output> {
26        let now = Instant::now();
27        let res = self.inner.call(req).await;
28        let latency = now.elapsed();
29
30        match res {
31            Ok(resp) => {
32                let resp = resp.into_response();
33                metrics::counter!("http_requests_total").increment(1);
34                metrics::histogram!("http_requests_duration_seconds").record(latency.as_secs_f64());
35                Ok(resp)
36            }
37            Err(err) => {
38                metrics::counter!("http_requests_error").increment(1);
39                Err(err)
40            }
41        }
42    }
43}