use crate::config::MetricsCfg;
use once_cell::sync::OnceCell;
use opentelemetry::{
global,
sdk::{
export::metrics::aggregation,
metrics::{controllers, processors, selectors},
propagation::TraceContextPropagator,
},
};
use opentelemetry_prometheus::PrometheusExporter;
fn init_tracer(config: &MetricsCfg) {
if let Some(cfg) = &config.jaeger {
global::set_text_map_propagator(TraceContextPropagator::new()); opentelemetry_jaeger::new_agent_pipeline()
.with_endpoint(cfg.agent_endpoint.clone())
.with_service_name("bbox")
.install_batch(opentelemetry::runtime::Tokio)
.expect("Failed to initialize tracer");
}
}
pub(crate) fn init_metrics_exporter() -> Option<PrometheusExporter> {
let metrics_cfg = MetricsCfg::from_config()?;
init_tracer(&metrics_cfg);
metrics_cfg.prometheus.as_ref()?;
let controller = controllers::basic(
processors::factory(
selectors::simple::histogram([1.0, 2.0, 5.0, 10.0, 20.0, 50.0]),
aggregation::cumulative_temporality_selector(),
)
.with_memory(true),
)
.build();
let exporter = opentelemetry_prometheus::exporter(controller).init();
Some(exporter)
}
#[derive(Default)]
pub struct NoMetrics;
pub fn no_metrics() -> &'static NoMetrics {
static METRICS: OnceCell<NoMetrics> = OnceCell::new();
METRICS.get_or_init(NoMetrics::default)
}