main
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<String>,
) -> 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<SpanExporter, opentelemetry_otlp::ExporterBuildError> {
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)))
}
}
}