tokio-rs / tracing-opentelemetry

MIT License
226 stars 75 forks source link

OpenTelemetryLayer::new - trait bound `BoxedTracer: PreSampledTracer` is not satisfied #167

Open ungerpeter opened 1 week ago

ungerpeter commented 1 week ago

Bug Report

Issue:

let otel_layer = OpenTelemetryLayer::new(tracer);
    |                      ----------------------- ^^^^^^ the trait `PreSampledTracer` is not implemented for `BoxedTracer`

Version

Cargo.toml:

opentelemetry = "0.25.0"
opentelemetry-otlp = "0.25.0"
opentelemetry-semantic-conventions = "0.25.0"
opentelemetry_sdk = { version = "0.25.0", features = ["rt-tokio"] }
serde = { version = "1.0.210", features = ["derive"] }
tokio = { version = "1.38.1", features = ["full"] }
tracing = "0.1.40"
tracing-opentelemetry = "0.26.0"
tracing-subscriber = { version = "0.3.18", features = ["env-filter", "fmt", "registry"] }

tracing:

├── tracing v0.1.40 (*)
├── tracing-opentelemetry v0.26.0
│   ├── tracing v0.1.40 (*)
│   ├── tracing-core v0.1.32 (*)
│   ├── tracing-log v0.2.0
│   │   └── tracing-core v0.1.32 (*)
│   └── tracing-subscriber v0.3.18
│       ├── tracing v0.1.40 (*)
│       ├── tracing-core v0.1.32 (*)
│       └── tracing-log v0.2.0 (*)
└── tracing-subscriber v0.3.18 (*)

opentelemetry:

├── opentelemetry v0.25.0
├── opentelemetry-otlp v0.25.0
│   ├── opentelemetry v0.25.0 (*)
│   ├── opentelemetry-proto v0.25.0
│   │   ├── opentelemetry v0.25.0 (*)
│   │   ├── opentelemetry_sdk v0.25.0
│   │   │   ├── opentelemetry v0.25.0 (*)
│   ├── opentelemetry_sdk v0.25.0 (*)
├── opentelemetry-semantic-conventions v0.25.0
├── opentelemetry_sdk v0.25.0 (*)
├── tracing-opentelemetry v0.26.0
│   ├── opentelemetry v0.25.0 (*)
│   ├── opentelemetry_sdk v0.25.0 (*)

Platform

Darwin mbp.local 23.6.0 Darwin Kernel Version 23.6.0: Mon Jul 29 21:13:04 PDT 2024; root:xnu-10063.141.2~1/RELEASE_ARM64_T6020 arm64

Description

I am new to OpenTelemetry in combination with Tracing in Rust and just setup a new crate in my project to get a basic setup running. For that i looked up some examples here and there to try to understand the basics but my code wont compile and I am not sure if I am missing something or it is still an issue with the compatibility of the different crates in use.

Here is my tracing.rs code:

use std::time::Duration;

use super::ObservabilityConfig;
use opentelemetry::{global, KeyValue};
use opentelemetry_otlp::WithExportConfig;
use opentelemetry_sdk::{runtime, trace, Resource};
use opentelemetry_semantic_conventions::{
    resource::{DEPLOYMENT_ENVIRONMENT_NAME, SERVICE_NAME, SERVICE_VERSION},
    SCHEMA_URL,
};
use tracing_opentelemetry::OpenTelemetryLayer;
use tracing_subscriber::{layer::SubscriberExt, Registry};

fn resource() -> Resource {
    Resource::from_schema_url(
        [
            KeyValue::new(SERVICE_NAME, env!("CARGO_PKG_NAME")),
            KeyValue::new(SERVICE_VERSION, env!("CARGO_PKG_VERSION")),
            KeyValue::new(DEPLOYMENT_ENVIRONMENT_NAME, "develop"),
        ],
        SCHEMA_URL,
    )
}

pub fn init_tracing(config: &ObservabilityConfig) {
    let otlp_exporter = opentelemetry_otlp::new_exporter()
        .tonic()
        .with_endpoint(&config.otel_endpoint)
        .with_timeout(Duration::from_secs(3));

    let tracer_provider = opentelemetry_otlp::new_pipeline()
        .tracing()
        .with_exporter(otlp_exporter)
        .with_trace_config(trace::Config::default().with_resource(resource()))
        .install_batch(runtime::Tokio)
        .expect("Failed to install tracer");

    global::set_tracer_provider(tracer_provider.clone());
    let tracer = global::tracer("BasicTracer");
    let otel_layer = OpenTelemetryLayer::new(tracer);
    let subscriber = Registry::default().with(otel_layer);
    tracing::subscriber::set_global_default(subscriber)
        .expect("Failed to set global tracing subscriber");
}

pub fn shutdown_tracing() {
    opentelemetry::global::shutdown_tracer_provider();
}

It seems like the tracer_provider is just using BoxedTracer in my version and this line causes a compiler error:

let otel_layer = OpenTelemetryLayer::new(tracer);
    |                      ----------------------- ^^^^^^ the trait `PreSampledTracer` is not implemented for `BoxedTracer`

Is my approach wrong?

Here is the relevant cargo build log:

error[E0277]: the trait bound `BoxedTracer: PreSampledTracer` is not satisfied
   --> crates/observability/src/tracing.rs:40:46
    |
40  |     let otel_layer = OpenTelemetryLayer::new(tracer);
    |                      ----------------------- ^^^^^^ the trait `PreSampledTracer` is not implemented for `BoxedTracer`
    |                      |
    |                      required by a bound introduced by this call
    |
    = help: the following other types implement trait `PreSampledTracer`:
              NoopTracer
              opentelemetry_sdk::trace::Tracer
note: required by a bound in `OpenTelemetryLayer::<S, T>::new`
   --> /Users/peterunger/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tracing-opentelemetry-0.26.0/src/layer.rs:506:23
    |
506 |     T: otel::Tracer + PreSampledTracer + 'static,
    |                       ^^^^^^^^^^^^^^^^ required by this bound in `OpenTelemetryLayer::<S, T>::new`
...
540 |     pub fn new(tracer: T) -> Self {
    |            --- required by a bound in this associated function

error[E0277]: the trait bound `BoxedTracer: PreSampledTracer` is not satisfied
    --> crates/observability/src/tracing.rs:41:47
     |
41   |     let subscriber = Registry::default().with(otel_layer);
     |                                          ---- ^^^^^^^^^^ the trait `PreSampledTracer` is not implemented for `BoxedTracer`, which is required by `OpenTelemetryLayer<_, BoxedTracer>: __tracing_subscriber_Layer<Registry>`
     |                                          |
     |                                          required by a bound introduced by this call
     |
     = help: the following other types implement trait `PreSampledTracer`:
               NoopTracer
               opentelemetry_sdk::trace::Tracer
     = note: required for `OpenTelemetryLayer<Registry, BoxedTracer>` to implement `__tracing_subscriber_Layer<Registry>`
note: required by a bound in `with`
    --> /Users/peterunger/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tracing-subscriber-0.3.18/src/layer/mod.rs:1503:12
     |
1501 |     fn with<L>(self, layer: L) -> Layered<L, Self>
     |        ---- required by a bound in this associated function
1502 |     where
1503 |         L: Layer<Self>,
     |            ^^^^^^^^^^^ required by this bound in `__tracing_subscriber_SubscriberExt::with`

error[E0277]: the trait bound `BoxedTracer: PreSampledTracer` is not satisfied
  --> crates/observability/src/tracing.rs:42:45
   |
42 |     tracing::subscriber::set_global_default(subscriber)
   |     --------------------------------------- ^^^^^^^^^^ the trait `PreSampledTracer` is not implemented for `BoxedTracer`, which is required by `Layered<OpenTelemetryLayer<Registry, BoxedTracer>, Registry>: tracing::Subscriber`
   |     |
   |     required by a bound introduced by this call
   |
   = help: the following other types implement trait `PreSampledTracer`:
             NoopTracer
             opentelemetry_sdk::trace::Tracer
   = note: required for `OpenTelemetryLayer<Registry, BoxedTracer>` to implement `__tracing_subscriber_Layer<Registry>`
   = note: required for `Layered<OpenTelemetryLayer<Registry, BoxedTracer>, Registry>` to implement `tracing::Subscriber`
note: required by a bound in `tracing::subscriber::set_global_default`
  --> /Users/peterunger/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tracing-0.1.40/src/subscriber.rs:41:8
   |
39 | pub fn set_global_default<S>(subscriber: S) -> Result<(), SetGlobalDefaultError>
   |        ------------------ required by a bound in this function
40 | where
41 |     S: Subscriber + Send + Sync + 'static,
   |        ^^^^^^^^^^ required by this bound in `set_global_default`

For more information about this error, try `rustc --explain E0277`.
djc commented 3 days ago

Would suggest having a look at the example code in https://github.com/tokio-rs/tracing-opentelemetry/blob/v0.1.x/examples/opentelemetry-otlp.rs. Unfortunately there's not much more I can do to help you on a volunteer basis.