o_sfu/runtime/http_server/operator/
metrics.rs1use std::sync::Arc;
4
5use axum::{
6 extract::{FromRef, State},
7 http::header,
8 response::IntoResponse,
9};
10use tracing::Instrument;
11
12use crate::runtime::{
13 RuntimeMetrics, RuntimeState,
14 prometheus::{PROMETHEUS_CONTENT_TYPE, render_prometheus},
15 room::RoomManager,
16 telemetry,
17};
18
19#[derive(Debug, Clone)]
20pub(super) struct MetricsServices {
21 room_manager: Arc<RoomManager>,
22 metrics: Arc<RuntimeMetrics>,
23}
24
25impl FromRef<RuntimeState> for MetricsServices {
26 fn from_ref(state: &RuntimeState) -> Self {
27 Self {
28 room_manager: Arc::clone(&state.room_manager),
29 metrics: Arc::clone(&state.metrics),
30 }
31 }
32}
33
34pub(super) async fn scrape(State(services): State<MetricsServices>) -> impl IntoResponse {
36 async {
37 let room_gauges = services.room_manager.room_gauges().await;
38 (
39 [(header::CONTENT_TYPE, PROMETHEUS_CONTENT_TYPE)],
40 render_prometheus(&services.metrics, room_gauges),
41 )
42 }
43 .instrument(telemetry::http_request_span("metrics"))
44 .await
45}