Skip to main content

actionqueue_daemon/http/
metrics.rs

1//! Metrics route module.
2//!
3//! This module provides `GET /metrics`, which exports daemon-local Prometheus
4//! metrics in text exposition format.
5
6use axum::extract::State;
7use axum::http::{HeaderValue, StatusCode};
8use axum::response::IntoResponse;
9
10/// Handles `GET /metrics` export requests.
11#[tracing::instrument(skip_all)]
12pub async fn handle(state: State<super::RouterState>) -> impl IntoResponse {
13    crate::metrics::runs::update(state.0.as_ref());
14    crate::metrics::attempts::update(state.0.as_ref());
15    crate::metrics::wal::update(state.0.as_ref());
16    crate::metrics::recovery::update(state.0.as_ref());
17
18    match state.metrics.encode_text() {
19        Ok(encoded) => {
20            let mut response = encoded.body.into_response();
21            if let Ok(value) = HeaderValue::from_str(&encoded.content_type) {
22                response.headers_mut().insert(axum::http::header::CONTENT_TYPE, value);
23            }
24            response
25        }
26        Err(_) => {
27            (StatusCode::INTERNAL_SERVER_ERROR, "metrics_encode_failed: failed to encode metrics\n")
28                .into_response()
29        }
30    }
31}
32
33/// Registers metrics routes when enabled.
34pub fn register_routes(
35    router: axum::Router<super::RouterState>,
36    metrics_enabled: bool,
37) -> axum::Router<super::RouterState> {
38    if !metrics_enabled {
39        return router;
40    }
41
42    router.route("/metrics", axum::routing::get(handle))
43}