Skip to main content

ave_bridge/prometheus/
mod.rs

1use std::sync::Arc;
2
3use axum::{Extension, Router, response::IntoResponse, routing::get};
4use prometheus_client::{encoding::text::encode, registry::Registry};
5use tokio::sync::Mutex;
6
7pub async fn handler_prometheus_data(
8    Extension(state): Extension<Arc<Mutex<Registry>>>,
9) -> impl IntoResponse {
10    let mut body = String::new();
11    let registry = state.lock().await;
12    if let Err(e) = encode(&mut body, &registry) {
13        return (
14            [("Content-Type", "text/plain; version=0.0.4; charset=utf-8")],
15            format!("Error encoding Prometheus metrics: {}", e),
16        );
17    };
18
19    (
20        [("Content-Type", "text/plain; version=0.0.4; charset=utf-8")],
21        body,
22    )
23}
24
25pub fn build_routes(registry: Arc<Mutex<Registry>>) -> Router {
26    Router::new()
27        .route("/metrics", get(handler_prometheus_data))
28        .layer(Extension(registry))
29}