use axum::extract::State;
use axum::http::header::CONTENT_TYPE;
use axum::response::IntoResponse;
use axum::routing::get;
use axum::Router;
use metrics_exporter_prometheus::PrometheusHandle;
use std::sync::Arc;
#[derive(Clone)]
pub struct MetricsState {
pub handle: Arc<PrometheusHandle>,
}
async fn metrics_handler(State(state): State<MetricsState>) -> impl IntoResponse {
let body = state.handle.render();
(
[(CONTENT_TYPE, "text/plain; version=0.0.4; charset=utf-8")],
body,
)
}
pub fn metrics_router<S>(handle: PrometheusHandle) -> Router<S>
where
S: Clone + Send + Sync + 'static,
{
let metrics_state = MetricsState {
handle: Arc::new(handle),
};
Router::new()
.route("/metrics", get(metrics_handler))
.with_state(metrics_state)
}