cat_gateway/service/utilities/middleware/
metrics_updater.rs1use poem::{
7 http::{Method, StatusCode},
8 Endpoint, Request, Response, Result,
9};
10use prometheus::{Encoder, Registry, TextEncoder};
11
12use crate::metrics::{init_prometheus, metrics_updater_fn};
13
14pub struct MetricsUpdaterMiddleware {
18 registry: Registry,
20}
21
22impl MetricsUpdaterMiddleware {
23 pub fn new() -> Self {
25 let registry = init_prometheus();
26 Self { registry }
27 }
28}
29
30impl Endpoint for MetricsUpdaterMiddleware {
31 type Output = Response;
32
33 async fn call(&self, req: Request) -> Result<Self::Output> {
34 if req.method() != Method::GET {
35 return Ok(StatusCode::METHOD_NOT_ALLOWED.into());
36 }
37
38 metrics_updater_fn().await;
39
40 let encoder = TextEncoder::new();
41 let metric_families = self.registry.gather();
42 let mut result = Vec::new();
43 match encoder.encode(&metric_families, &mut result) {
44 Ok(()) => {
45 Ok(Response::builder()
46 .content_type(encoder.format_type())
47 .body(result))
48 },
49 Err(_) => Err(StatusCode::INTERNAL_SERVER_ERROR.into()),
50 }
51 }
52}