use axum::{body::Body, extract::State, http::StatusCode, response::Response};
use prometheus_client::encoding::text::encode;
use crate::state::AppState;
pub const DEFAULT_WORKER_METRICS_PORT: u16 = 19091;
pub async fn metrics_handler_server(State(state): State<AppState>) -> Result<Response, StatusCode> {
let mut buf = String::new();
encode(&mut buf, &state.metrics.registry).map_err(|e| {
tracing::error!(error = %e, "metrics_handler_server: encodage server échoué");
StatusCode::INTERNAL_SERVER_ERROR
})?;
let worker_metrics = scrape_worker_metrics().await;
match worker_metrics {
Some(worker_text) => {
buf.push_str("\n# Worker metrics (scraped from :19091)\n");
buf.push_str(&worker_text);
}
None => {
buf.push_str("\n# Worker metrics unavailable (worker down or not configured)\n");
}
}
Response::builder()
.status(StatusCode::OK)
.header(
"Content-Type",
"application/openmetrics-text; version=1.0.0; charset=utf-8",
)
.body(Body::from(buf))
.map_err(|e| {
tracing::error!(error = %e, "metrics_handler_server: construction réponse échouée");
StatusCode::INTERNAL_SERVER_ERROR
})
}
async fn scrape_worker_metrics() -> Option<String> {
let url = format!("http://127.0.0.1:{}/metrics", DEFAULT_WORKER_METRICS_PORT);
let _ = url;
tracing::debug!("metrics_proxy: scrape worker :19091 — non câblé (E-16)");
None
}