use crate::traits::MetricsProvider;
use axum::{
extract::State,
http::StatusCode,
response::{IntoResponse, Response},
routing::get,
Router,
};
use std::sync::Arc;
#[derive(Clone)]
pub struct MetricsState {
pub registry: Arc<dyn MetricsProvider>,
}
pub fn metrics_routes(state: MetricsState) -> Router {
Router::new()
.route("/metrics", get(prometheus_metrics))
.route("/metrics.json", get(json_metrics))
.with_state(state)
}
async fn prometheus_metrics(State(state): State<MetricsState>) -> impl IntoResponse {
let metrics = state.registry.export_prometheus();
Response::builder()
.status(StatusCode::OK)
.header("Content-Type", "text/plain; version=0.0.4")
.body(metrics)
.unwrap()
}
async fn json_metrics(State(state): State<MetricsState>) -> impl IntoResponse {
let metrics = state.registry.export_json();
(StatusCode::OK, axum::Json(metrics))
}