reth_tracing_otlp/
lib.rs

1//! Provides a tracing layer for `OpenTelemetry` that exports spans to an OTLP endpoint.
2//!
3//! This module simplifies the integration of `OpenTelemetry` tracing with OTLP export in Rust
4//! applications. It allows for easily capturing and exporting distributed traces to compatible
5//! backends like Jaeger, Zipkin, or any other OpenTelemetry-compatible tracing system.
6
7use opentelemetry::{trace::TracerProvider, KeyValue, Value};
8use opentelemetry_otlp::SpanExporter;
9use opentelemetry_sdk::{
10    trace::{SdkTracer, SdkTracerProvider},
11    Resource,
12};
13use opentelemetry_semantic_conventions::{attribute::SERVICE_VERSION, SCHEMA_URL};
14use tracing::Subscriber;
15use tracing_opentelemetry::OpenTelemetryLayer;
16use tracing_subscriber::registry::LookupSpan;
17
18/// Creates a tracing [`OpenTelemetryLayer`] that exports spans to an OTLP endpoint.
19///
20/// This layer can be added to a [`tracing_subscriber::Registry`] to enable `OpenTelemetry` tracing
21/// with OTLP export.
22pub fn layer<S>(service_name: impl Into<Value>) -> OpenTelemetryLayer<S, SdkTracer>
23where
24    for<'span> S: Subscriber + LookupSpan<'span>,
25{
26    let exporter = SpanExporter::builder().with_http().build().unwrap();
27
28    let resource = Resource::builder()
29        .with_service_name(service_name)
30        .with_schema_url([KeyValue::new(SERVICE_VERSION, env!("CARGO_PKG_VERSION"))], SCHEMA_URL)
31        .build();
32
33    let provider =
34        SdkTracerProvider::builder().with_resource(resource).with_batch_exporter(exporter).build();
35
36    let tracer = provider.tracer("reth-otlp");
37    tracing_opentelemetry::layer().with_tracer(tracer)
38}