metrics_dashboard/
middleware.rs1use std::time::Instant;
2
3use poem::{Endpoint, IntoResponse, Middleware, Request, Response, Result};
4
5#[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
17pub 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}