Skip to main content

o_sfu/runtime/http_server/operator/
metrics.rs

1//! Prometheus HTTP projection of runtime counters and room gauges.
2
3use 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
34/// prometheus scrape endpoint for process, room, HTTP and media-transport metrics
35pub(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}