Line data Source code
1 : use axum::body::Body;
2 : use axum::response::Response;
3 : use http::StatusCode;
4 : use http::header::CONTENT_TYPE;
5 : use metrics::proto::MetricFamily;
6 : use metrics::{Encoder, TextEncoder};
7 :
8 : use crate::http::JsonResponse;
9 : use crate::metrics::collect;
10 :
11 : /// Expose Prometheus metrics.
12 0 : pub(in crate::http) async fn get_metrics() -> Response {
13 0 : // When we call TextEncoder::encode() below, it will immediately return an
14 0 : // error if a metric family has no metrics, so we need to preemptively
15 0 : // filter out metric families with no metrics.
16 0 : let metrics = collect()
17 0 : .into_iter()
18 0 : .filter(|m| !m.get_metric().is_empty())
19 0 : .collect::<Vec<MetricFamily>>();
20 0 :
21 0 : let encoder = TextEncoder::new();
22 0 : let mut buffer = vec![];
23 :
24 0 : if let Err(e) = encoder.encode(&metrics, &mut buffer) {
25 0 : return JsonResponse::error(StatusCode::INTERNAL_SERVER_ERROR, e);
26 0 : }
27 0 :
28 0 : Response::builder()
29 0 : .status(StatusCode::OK)
30 0 : .header(CONTENT_TYPE, encoder.format_type())
31 0 : .body(Body::from(buffer))
32 0 : .unwrap()
33 0 : }
|