use opentelemetry_otlp::{SpanExporter, WithExportConfig, WithHttpConfig}; use opentelemetry_sdk::Resource; use opentelemetry_sdk::trace::{Sampler, SdkTracerProvider}; use crate::config::{SamplerKind, TelemetryConfig}; pub fn build( config: &TelemetryConfig, resource: Resource, warnings: &mut Vec, ) -> SdkTracerProvider { let mut builder = SdkTracerProvider::builder() .with_resource(resource) .with_sampler(sampler(config)); if let Some(endpoint) = config.traces_url() { match exporter(config, &endpoint) { Ok(exporter) => builder = builder.with_batch_exporter(exporter), Err(error) => warnings.push(format!( "otlp span exporter disabled: {error} (endpoint {endpoint})" )), } } builder.build() } fn exporter( config: &TelemetryConfig, endpoint: &str, ) -> Result { let mut builder = SpanExporter::builder() .with_http() .with_endpoint(endpoint) .with_timeout(config.timeout); if !config.traces.headers.is_empty() { builder = builder.with_headers(config.traces.headers.clone()); } builder.build() } fn sampler(config: &TelemetryConfig) -> Sampler { match config.sampler { SamplerKind::AlwaysOn => Sampler::AlwaysOn, SamplerKind::AlwaysOff => Sampler::AlwaysOff, SamplerKind::ParentBasedAlwaysOn => Sampler::ParentBased(Box::new(Sampler::AlwaysOn)), SamplerKind::ParentBasedAlwaysOff => Sampler::ParentBased(Box::new(Sampler::AlwaysOff)), SamplerKind::TraceIdRatio => Sampler::TraceIdRatioBased(config.sample_ratio), SamplerKind::ParentBasedTraceIdRatio => { Sampler::ParentBased(Box::new(Sampler::TraceIdRatioBased(config.sample_ratio))) } } }