Search code examples
rustopen-telemetryjaegerrust-tracing

Can't compile since opentelemetry and opentelemetry-jaeger update


I have this function that is working perfectly fine with opentelemetry = { version = "0.17", features = ["tokio"] } and opentelemetry-jaeger = { version = "0.16", features = ["rt-tokio"] }

pub fn get_subscriber(name: String, env_filter: String) -> impl Subscriber + Sync + Send {
    // Building the jaeger layer, if needed
    let telemetry = if std::env::var("JAEGER_ENABLED").is_ok() {
        let tracer = opentelemetry_jaeger::new_pipeline()
            .with_service_name(&name)
            .install_batch(opentelemetry::runtime::Tokio)
            .unwrap();
        Some(tracing_opentelemetry::layer().with_tracer(tracer))
    } else {
        None
    };

    let env_filter =
        EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new(env_filter));
    let formatting_layer = BunyanFormattingLayer::new(name, std::io::stdout);

    Registry::default()
        .with(env_filter)
        .with(JsonStorageLayer)
        .with(formatting_layer)
        .with(sentry_tracing::layer())
        .with(telemetry)
}

Everything works fine like this, and I can find my trace in Jaeger when it is enabled.

Since I update to opentelemetry = { version = "0.18", features = ["rt-tokio"] } and opentelemetry-jaeger = { version = "0.17", features = ["rt-tokio"] } It won't compile anymore

   Compiling rss-common v0.1.0 (/home/eric/dev/rss-aggregator/rss-common)
error[E0277]: the trait bound `opentelemetry::sdk::trace::Tracer: opentelemetry::trace::tracer::Tracer` is not satisfied
   --> rss-common/src/observability.rs:14:57
    |
14  |         Some(tracing_opentelemetry::layer().with_tracer(tracer))
    |                                             ----------- ^^^^^^ the trait `opentelemetry::trace::tracer::Tracer` is not implemented for `opentelemetry::sdk::trace::Tracer`
    |                                             |
    |                                             required by a bound introduced by this call
    |
    = help: the following other types implement trait `opentelemetry::trace::tracer::Tracer`:
              opentelemetry::global::trace::BoxedTracer
              opentelemetry::sdk::trace::tracer::Tracer
              opentelemetry::trace::noop::NoopTracer
note: required by a bound in `OpenTelemetryLayer::<S, T>::with_tracer`
   --> /home/eric/.cargo/registry/src/github.com-1ecc6299db9ec823/tracing-opentelemetry-0.17.4/src/layer.rs:464:17
    |
464 |         Tracer: otel::Tracer + PreSampledTracer + 'static,
    |                 ^^^^^^^^^^^^ required by this bound in `OpenTelemetryLayer::<S, T>::with_tracer`

error[E0277]: the trait bound `opentelemetry::sdk::trace::Tracer: PreSampledTracer` is not satisfied
   --> rss-common/src/observability.rs:14:57
    |
14  |         Some(tracing_opentelemetry::layer().with_tracer(tracer))
    |                                             ----------- ^^^^^^ the trait `PreSampledTracer` is not implemented for `opentelemetry::sdk::trace::Tracer`
    |                                             |
    |                                             required by a bound introduced by this call
    |
    = help: the following other types implement trait `PreSampledTracer`:
              opentelemetry::sdk::trace::tracer::Tracer
              opentelemetry::trace::noop::NoopTracer
note: required by a bound in `OpenTelemetryLayer::<S, T>::with_tracer`
   --> /home/eric/.cargo/registry/src/github.com-1ecc6299db9ec823/tracing-opentelemetry-0.17.4/src/layer.rs:464:32
    |
464 |         Tracer: otel::Tracer + PreSampledTracer + 'static,
    |                                ^^^^^^^^^^^^^^^^ required by this bound in `OpenTelemetryLayer::<S, T>::with_tracer`

error[E0277]: the trait bound `opentelemetry::sdk::trace::Tracer: opentelemetry::trace::tracer::Tracer` is not satisfied
    --> rss-common/src/observability.rs:28:15
     |
28   |         .with(telemetry)
     |          ---- ^^^^^^^^^ the trait `opentelemetry::trace::tracer::Tracer` is not implemented for `opentelemetry::sdk::trace::Tracer`
     |          |
     |          required by a bound introduced by this call
     |
     = help: the following other types implement trait `opentelemetry::trace::tracer::Tracer`:
               opentelemetry::global::trace::BoxedTracer
               opentelemetry::sdk::trace::tracer::Tracer
               opentelemetry::trace::noop::NoopTracer
     = note: required because of the requirements on the impl of `__tracing_subscriber_Layer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>>` for `OpenTelemetryLayer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, opentelemetry::sdk::trace::Tracer>`
     = note: 1 redundant requirement hidden
     = note: required because of the requirements on the impl of `__tracing_subscriber_Layer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>>` for `Option<OpenTelemetryLayer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, opentelemetry::sdk::trace::Tracer>>`
note: required by a bound in `with`
    --> /home/eric/.cargo/registry/src/github.com-1ecc6299db9ec823/tracing-subscriber-0.3.15/src/layer/mod.rs:1440:12
     |
1440 |         L: Layer<Self>,
     |            ^^^^^^^^^^^ required by this bound in `with`

error[E0277]: the trait bound `opentelemetry::sdk::trace::Tracer: PreSampledTracer` is not satisfied
    --> rss-common/src/observability.rs:28:15
     |
28   |         .with(telemetry)
     |          ---- ^^^^^^^^^ the trait `PreSampledTracer` is not implemented for `opentelemetry::sdk::trace::Tracer`
     |          |
     |          required by a bound introduced by this call
     |
     = help: the following other types implement trait `PreSampledTracer`:
               opentelemetry::sdk::trace::tracer::Tracer
               opentelemetry::trace::noop::NoopTracer
     = note: required because of the requirements on the impl of `__tracing_subscriber_Layer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>>` for `OpenTelemetryLayer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, opentelemetry::sdk::trace::Tracer>`
     = note: 1 redundant requirement hidden
     = note: required because of the requirements on the impl of `__tracing_subscriber_Layer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>>` for `Option<OpenTelemetryLayer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, opentelemetry::sdk::trace::Tracer>>`
note: required by a bound in `with`
    --> /home/eric/.cargo/registry/src/github.com-1ecc6299db9ec823/tracing-subscriber-0.3.15/src/layer/mod.rs:1440:12
     |
1440 |         L: Layer<Self>,
     |            ^^^^^^^^^^^ required by this bound in `with`

error[E0277]: the trait bound `opentelemetry::sdk::trace::Tracer: opentelemetry::trace::tracer::Tracer` is not satisfied
 --> rss-common/src/observability.rs:7:60
  |
7 | pub fn get_subscriber(name: String, env_filter: String) -> impl Subscriber + Sync + Send {
  |                                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `opentelemetry::trace::tracer::Tracer` is not implemented for `opentelemetry::sdk::trace::Tracer`
  |
  = help: the following other types implement trait `opentelemetry::trace::tracer::Tracer`:
            opentelemetry::global::trace::BoxedTracer
            opentelemetry::sdk::trace::tracer::Tracer
            opentelemetry::trace::noop::NoopTracer
  = note: required because of the requirements on the impl of `__tracing_subscriber_Layer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>>` for `OpenTelemetryLayer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, opentelemetry::sdk::trace::Tracer>`
  = note: 1 redundant requirement hidden
  = note: required because of the requirements on the impl of `__tracing_subscriber_Layer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>>` for `Option<OpenTelemetryLayer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, opentelemetry::sdk::trace::Tracer>>`
  = note: required because of the requirements on the impl of `tracing::Subscriber` for `Layered<Option<OpenTelemetryLayer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, opentelemetry::sdk::trace::Tracer>>, Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>>`

error[E0277]: the trait bound `opentelemetry::sdk::trace::Tracer: PreSampledTracer` is not satisfied
 --> rss-common/src/observability.rs:7:60
  |
7 | pub fn get_subscriber(name: String, env_filter: String) -> impl Subscriber + Sync + Send {
  |                                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `PreSampledTracer` is not implemented for `opentelemetry::sdk::trace::Tracer`
  |
  = help: the following other types implement trait `PreSampledTracer`:
            opentelemetry::sdk::trace::tracer::Tracer
            opentelemetry::trace::noop::NoopTracer
  = note: required because of the requirements on the impl of `__tracing_subscriber_Layer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>>` for `OpenTelemetryLayer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, opentelemetry::sdk::trace::Tracer>`
  = note: 1 redundant requirement hidden
  = note: required because of the requirements on the impl of `__tracing_subscriber_Layer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>>` for `Option<OpenTelemetryLayer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, opentelemetry::sdk::trace::Tracer>>`
  = note: required because of the requirements on the impl of `tracing::Subscriber` for `Layered<Option<OpenTelemetryLayer<Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, opentelemetry::sdk::trace::Tracer>>, Layered<SentryLayer<Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>, Layered<BunyanFormattingLayer<fn() -> Stdout {stdout}>, Layered<JsonStorageLayer, Layered<EnvFilter, Registry>>>>>`

For more information about this error, try `rustc --explain E0277`.
error: could not compile `rss-common` due to 6 previous errors

I looked at the change log of the said crates, and find nothing obvious about what I should change to make it compile again

What should I change?


Solution

  • Simple. You're using tracing-opentelemetry to connect the tracing and opentelemetry ecosystems, but the crate has not been updated to support v0.18 of opentelementry as of yet. Without this layer of functionality, you cannot update to the latest opentelemetry version, unless you want to forgo tracing integration.

    I see the developers have merged in support for the latest version, but it appears to have not been published yet. Be patient. :)