1use 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
18pub 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}