1use opentelemetry::trace::TracerProvider as _;
8use tracing_subscriber::{fmt::format::FmtSpan, prelude::*};
9
10#[tarpc::service]
13pub trait World {
14 async fn hello(name: String) -> String;
16}
17
18pub fn init_tracing(
20 service_name: &'static str,
21) -> anyhow::Result<opentelemetry_sdk::trace::SdkTracerProvider> {
22 let tracer_provider = opentelemetry_sdk::trace::SdkTracerProvider::builder()
23 .with_resource(
24 opentelemetry_sdk::Resource::builder()
25 .with_service_name(service_name)
26 .build(),
27 )
28 .with_batch_exporter(
29 opentelemetry_otlp::SpanExporter::builder()
30 .with_tonic()
31 .build()
32 .unwrap(),
33 )
34 .build();
35 opentelemetry::global::set_tracer_provider(tracer_provider.clone());
36 let tracer = tracer_provider.tracer(service_name);
37
38 tracing_subscriber::registry()
39 .with(tracing_subscriber::EnvFilter::from_default_env())
40 .with(tracing_subscriber::fmt::layer().with_span_events(FmtSpan::NEW | FmtSpan::CLOSE))
41 .with(tracing_opentelemetry::layer().with_tracer(tracer))
42 .try_init()?;
43
44 Ok(tracer_provider)
45}