bbox_core/
metrics.rs

1use crate::config::MetricsCfg;
2use once_cell::sync::OnceCell;
3use opentelemetry::{
4    global,
5    sdk::{
6        export::metrics::aggregation,
7        metrics::{controllers, processors, selectors},
8        propagation::TraceContextPropagator,
9    },
10};
11use opentelemetry_prometheus::PrometheusExporter;
12
13fn init_tracer(config: &MetricsCfg) {
14    if let Some(cfg) = &config.jaeger {
15        global::set_text_map_propagator(TraceContextPropagator::new()); // default header: traceparent
16        opentelemetry_jaeger::new_agent_pipeline()
17            .with_endpoint(cfg.agent_endpoint.clone())
18            .with_service_name("bbox")
19            .install_batch(opentelemetry::runtime::Tokio)
20            .expect("Failed to initialize tracer");
21    }
22}
23
24pub(crate) fn init_metrics_exporter() -> Option<PrometheusExporter> {
25    let metrics_cfg = MetricsCfg::from_config()?;
26
27    init_tracer(&metrics_cfg);
28
29    metrics_cfg.prometheus.as_ref()?;
30
31    // Prometheus request metrics handler
32    let controller = controllers::basic(
33        processors::factory(
34            selectors::simple::histogram([1.0, 2.0, 5.0, 10.0, 20.0, 50.0]),
35            aggregation::cumulative_temporality_selector(),
36        )
37        .with_memory(true),
38    )
39    .build();
40    let exporter = opentelemetry_prometheus::exporter(controller).init();
41    // let metrics_handler = PrometheusMetricsHandler::new(exporter);
42
43    // Run actix server, metrics are now available at http://localhost:8080/metrics
44    // HttpServer::new(move || {
45    //     App::new()
46    //         .wrap(RequestTracing::new())
47    //         .wrap(request_metrics.clone())
48    //         .route("/metrics", web::get().to(metrics_handler.clone()))
49    // })
50
51    Some(exporter)
52}
53
54#[derive(Default)]
55pub struct NoMetrics;
56
57pub fn no_metrics() -> &'static NoMetrics {
58    static METRICS: OnceCell<NoMetrics> = OnceCell::new();
59    METRICS.get_or_init(NoMetrics::default)
60}