use opentelemetry::{global, trace::TracerProvider};
use opentelemetry_otlp::{ExporterBuildError, SpanExporter, WithExportConfig};
use opentelemetry_sdk::{
trace::{BatchSpanProcessor, Sampler, SdkTracerProvider, Tracer},
Resource,
};
use std::time::Duration;
const TIMEOUT: Duration = Duration::from_secs(15);
pub struct Config {
pub endpoint: String,
pub name: String,
pub rate: f64,
}
pub fn export(cfg: Config) -> Result<Tracer, ExporterBuildError> {
let exporter = SpanExporter::builder()
.with_http()
.with_endpoint(cfg.endpoint)
.with_timeout(TIMEOUT)
.build()?;
let batch_processor = BatchSpanProcessor::builder(exporter).build();
let resource = Resource::builder_empty()
.with_service_name(cfg.name.clone())
.build();
let sampler = Sampler::TraceIdRatioBased(cfg.rate);
let tracer_provider = SdkTracerProvider::builder()
.with_span_processor(batch_processor)
.with_resource(resource)
.with_sampler(sampler)
.build();
let tracer = tracer_provider.tracer(cfg.name);
global::set_tracer_provider(tracer_provider);
Ok(tracer)
}