service/
lib.rs

1// Copyright 2018 Google LLC
2//
3// Use of this source code is governed by an MIT-style
4// license that can be found in the LICENSE file or at
5// https://opensource.org/licenses/MIT.
6
7use opentelemetry::trace::TracerProvider as _;
8use tracing_subscriber::{fmt::format::FmtSpan, prelude::*};
9
10/// This is the service definition. It looks a lot like a trait definition.
11/// It defines one RPC, hello, which takes one arg, name, and returns a String.
12#[tarpc::service]
13pub trait World {
14    /// Returns a greeting for name.
15    async fn hello(name: String) -> String;
16}
17
18/// Initializes an OpenTelemetry tracing subscriber with a OTLP backend.
19pub 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}