loco_extras/initializers/
prometheus.rs1use async_trait::async_trait;
2use axum::Router as AxumRouter;
3use axum_prometheus::PrometheusMetricLayer;
4use loco_rs::prelude::*;
5
6pub struct AxumPrometheusInitializer;
7
8#[async_trait]
9impl Initializer for AxumPrometheusInitializer {
10 fn name(&self) -> String {
11 "axum-prometheus".to_string()
12 }
13
14 async fn after_routes(&self, router: AxumRouter, _ctx: &AppContext) -> Result<AxumRouter> {
15 let (prometheus_layer, metric_handle) = PrometheusMetricLayer::pair();
16 let router = router
17 .route("/metrics", get(|| async move { metric_handle.render() }))
18 .layer(prometheus_layer);
19 Ok(router)
20 }
21}