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()); 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 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 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}