use opentelemetry::{global, trace::TracerProvider};
use opentelemetry_otlp::{SpanExporter, WithExportConfig, WithTonicConfig};
use opentelemetry_sdk::{
    propagation::TraceContextPropagator,
    trace::{SdkTracerProvider, Span, Tracer},
    Resource,
};
use tonic::metadata::MetadataMap;
use tracing_opentelemetry::OpenTelemetryLayer;
use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry};

fn metadata() -> MetadataMap {
    let mut metadata = MetadataMap::new();
    /* fill metadata with creds */
    metadata
}

fn resource() -> Resource {
    Resource::builder()
        .with_service_name("YOUR SERVICE NAME")
        .build()
}

fn init_tracing_subscriber(tracer: Tracer) {
    // SHUT UP ALL NOISY STUFF
    let filter_otel = EnvFilter::new("info")
        .add_directive("hyper=off".parse().unwrap())
        .add_directive("opentelemetry=off".parse().unwrap())
        .add_directive("tonic=off".parse().unwrap())
        .add_directive("h2=off".parse().unwrap())
        .add_directive("reqwest=off".parse().unwrap());

    let opentelemetry_layer = OpenTelemetryLayer::new(tracer);

    let subscriber = Registry::default()
        .with(filter_otel)
        .with(opentelemetry_layer);
    tracing::subscriber::set_global_default(subscriber).expect("Setting tracing subscriber failed");
}

pub fn init_tracing() -> impl Fn() -> () {
    // To send traces to jaeger or something like this
    let exporter = SpanExporter::builder()
        .with_tonic()
        .with_endpoint("http://localhost:5081/api/development") // put here your own endpoint
        .with_metadata(metadata())
        .build()
        .expect("Failed to init otlp exporter");

    global::set_text_map_propagator(TraceContextPropagator::new());

    // To connect traces to exporter
    let provider = SdkTracerProvider::builder()
        .with_batch_exporter(exporter)
        .with_resource(resource())
        .build();
    init_tracing_subscriber(provider.tracer("img dupes bot"));

    global::set_tracer_provider(provider.clone());

    return Box::new(move || {
        provider.shutdown().unwrap();
    });
}

Изменить пасту