use std::sync::Arc;
use axum::extract::State;
use axum::http::StatusCode;
use axum::response::IntoResponse;
use prometheus::{Encoder, TextEncoder};
use crate::state::PrometheusMetrics;
pub async fn metrics_handler(
State(prom): State<Arc<PrometheusMetrics>>,
) -> impl IntoResponse {
let encoder = TextEncoder::new();
let families = prom.registry.gather();
let mut buf = Vec::with_capacity(8192);
match encoder.encode(&families, &mut buf) {
Ok(()) => (
StatusCode::OK,
[(
axum::http::header::CONTENT_TYPE,
"text/plain; version=0.0.4; charset=utf-8",
)],
buf,
)
.into_response(),
Err(e) => {
tracing::error!(error = %e, "failed to encode metrics");
StatusCode::INTERNAL_SERVER_ERROR.into_response()
}
}
}
pub async fn health_handler(
State(prom): State<Arc<PrometheusMetrics>>,
) -> impl IntoResponse {
let active = prom.collector_count();
(
StatusCode::OK,
format!("{{\"status\":\"ok\",\"collectors\":{active}}}"),
)
}