wick-logger 0.4.0

Wick's logging library
Documentation
use opentelemetry::sdk::trace::{self, Builder, Sampler};
use opentelemetry::sdk::{self, Resource};
use opentelemetry::trace::{TraceError, TracerProvider};
use opentelemetry::KeyValue;
use opentelemetry_otlp::{SpanExporter, SpanExporterBuilder, WithExportConfig};

fn exporter_builder(endpoint: &str) -> SpanExporter {
  SpanExporterBuilder::from(opentelemetry_otlp::new_exporter().tonic().with_endpoint(endpoint))
    .build_span_exporter()
    .unwrap()
}

fn trace_config() -> Option<trace::Config> {
  Some(
    trace::config()
      .with_sampler(Sampler::AlwaysOn)
      .with_resource(Resource::new(vec![KeyValue::new("service.name", "wick")])),
  )
}

pub(super) fn build_batch(endpoint: &str) -> Result<(sdk::trace::Tracer, sdk::trace::TracerProvider), TraceError> {
  Ok(build_with_exporter(
    sdk::trace::TracerProvider::builder()
      .with_batch_exporter(exporter_builder(endpoint), opentelemetry::runtime::Tokio),
    trace_config(),
  ))
}

pub(super) fn build_simple(endpoint: &str) -> Result<(sdk::trace::Tracer, sdk::trace::TracerProvider), TraceError> {
  Ok(build_with_exporter(
    sdk::trace::TracerProvider::builder().with_simple_exporter(exporter_builder(endpoint)),
    trace_config(),
  ))
}

pub(super) fn build_with_exporter(
  mut provider_builder: Builder,
  trace_config: Option<sdk::trace::Config>,
) -> (sdk::trace::Tracer, sdk::trace::TracerProvider) {
  if let Some(config) = trace_config {
    provider_builder = provider_builder.with_config(config);
  }
  let provider = provider_builder.build();
  let tracer = provider.versioned_tracer("opentelemetry-otlp", Some(env!("CARGO_PKG_VERSION")), None);
  (tracer, provider)
}