init_tracing_opentelemetry/
stdio.rs

1use crate::Error;
2use opentelemetry::trace::TracerProvider as _;
3use opentelemetry::InstrumentationScope;
4use opentelemetry_sdk::trace as sdktrace;
5use opentelemetry_sdk::trace::BatchSpanProcessor;
6use opentelemetry_sdk::trace::SdkTracerProvider;
7use opentelemetry_sdk::trace::TracerProviderBuilder;
8use opentelemetry_sdk::Resource;
9use std::fmt::Debug;
10use std::io::Write;
11
12#[must_use]
13pub fn identity<W: Write>(v: TracerProviderBuilder) -> TracerProviderBuilder {
14    v
15}
16
17pub fn init_tracer<F, W>(resource: Resource, transform: F) -> Result<sdktrace::Tracer, Error>
18where
19    F: FnOnce(TracerProviderBuilder) -> TracerProviderBuilder,
20    W: Write + Debug + Send + Sync + 'static,
21{
22    let exporter = opentelemetry_stdout::SpanExporter::default();
23    let processor = BatchSpanProcessor::builder(exporter).build();
24    let mut provider_builder = SdkTracerProvider::builder()
25        .with_span_processor(processor)
26        .with_resource(resource)
27        .with_sampler(sdktrace::Sampler::AlwaysOn);
28    provider_builder = transform(provider_builder);
29    // tracer used in libraries/crates that optionally includes version and schema url
30    let scope = InstrumentationScope::builder(env!("CARGO_PKG_NAME"))
31        .with_version(env!("CARGO_PKG_VERSION"))
32        .with_schema_url("https://opentelemetry.io/schema/1.0.0")
33        .build();
34    Ok(provider_builder.build().tracer_with_scope(scope))
35}
36
37#[derive(Debug, Default)]
38pub struct WriteNoWhere;
39
40impl Write for WriteNoWhere {
41    fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
42        Ok(buf.len())
43    }
44
45    fn flush(&mut self) -> std::io::Result<()> {
46        Ok(())
47    }
48}