use crate::config::TracingConfig;
use opentelemetry::trace::TracerProvider as _;
use opentelemetry_otlp::WithExportConfig as _;
use opentelemetry_sdk::propagation::TraceContextPropagator;
use opentelemetry_sdk::trace::{Sampler, SdkTracerProvider};
pub fn init_otel_pipeline(
config: &TracingConfig,
) -> Result<(SdkTracerProvider, opentelemetry_sdk::trace::Tracer), Box<dyn std::error::Error>> {
opentelemetry::global::set_text_map_propagator(TraceContextPropagator::new());
let sampler = if config.sample_rate >= 1.0 {
Sampler::AlwaysOn
} else if config.sample_rate <= 0.0 {
Sampler::AlwaysOff
} else {
Sampler::TraceIdRatioBased(config.sample_rate)
};
let exporter = opentelemetry_otlp::SpanExporter::builder()
.with_tonic()
.with_endpoint(&config.otlp_endpoint)
.build()?;
let provider = SdkTracerProvider::builder()
.with_batch_exporter(exporter)
.with_sampler(sampler)
.with_resource(
opentelemetry_sdk::Resource::builder()
.with_service_name(config.service_name.clone())
.build(),
)
.build();
let tracer = provider.tracer("orion");
opentelemetry::global::set_tracer_provider(provider.clone());
Ok((provider, tracer))
}