Skip to content

#[instrument] doesn't get send to jaeger/opentelemetry when used on rocket.rs request handlers #721

Open
@MTRNord

Description

@MTRNord

Bug Report

Version

├── tracing v0.1.14 ()
├── tracing-attributes v0.1.8 (
)
├── tracing-futures v0.2.4 ()
├── tracing-opentelemetry v0.4.0 (
)
└── tracing-subscriber v0.2.5 (*)

As well as the rocket-middleware (which works)

├── rocket-tracing v0.1.0 (https://github.com/Nordgedanken/rocket-tracing.git#0c166efc)
│ ├── opentelemetry v0.5.0 ()
│ ├── tracing v0.1.14
│ │ ├── tracing-attributes v0.1.8
│ │ └── tracing-core v0.1.10
│ ├── tracing-futures v0.2.4
│ │ └── tracing v0.1.14 (
)
│ └── tracing-opentelemetry v0.4.0
│ ├── opentelemetry v0.5.0 ()
│ ├── rand v0.7.3 (
)
│ ├── tracing v0.1.14 ()
│ ├── tracing-core v0.1.10 (
)
│ └── tracing-subscriber v0.2.5
│ └── tracing-core v0.1.10 (*)

As well as opentracing-jaeger: v0.4.0

And as well as rocket v0.5.0-dev (branch "async" commit "78c8ac8c"

Platform

Windows 10 64-bit

Description

Using the tracing lib with rocket seems to make problems with #[instrument].

It doesn't come up in the jaeger overview while a manually created span does show up just fine.

use tracing_opentelemetry::OpenTelemetryLayer;
use tracing_subscriber::Registry;
use opentelemetry::sdk::Tracer;
use rocket::get;
use rocket::routes;

#[get("/world")]
#[tracing::instrument]
fn world() -> &'static str {
    "hello, world!"
}

fn init_tracer() -> std::result::Result<(), Box<dyn std::error::Error>> {
    use opentelemetry::api::Provider;
    use opentelemetry::sdk;
    use tracing_subscriber::prelude::*;

    let exporter = opentelemetry_jaeger::Exporter::builder()
        .with_agent_endpoint("127.0.0.1:6831".parse().unwrap())
        .with_process(opentelemetry_jaeger::Process {
            service_name: "conduit".to_string(),
            tags: Vec::new(),
        })
        .init()?;
    let provider = sdk::Provider::builder()
        .with_simple_exporter(exporter)
        .with_config(sdk::Config {
            default_sampler: Box::new(sdk::Sampler::Always),
            ..Default::default()
        })
        .build();
    let tracer = provider.get_tracer("tracing");

    let opentelemetry: OpenTelemetryLayer<Registry, Tracer> =
        tracing_opentelemetry::layer().with_tracer(tracer);
    tracing_subscriber::registry()
        .with(opentelemetry)
        .try_init()?;

    Ok(())
}

fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
    init_tracer()?;
    rocket::ignite().mount("/", routes![world]).launch.unwrap();
    Ok(())
}

I made sure to also check the proc macro order. Both don't seem to work.

Adding a rocket middleware/fairing and adding the proc macro to "on_request" or "on_response" in it does work with this code. It only seems to happen on the request handlers

Metadata

Metadata

Assignees

No one assigned

    Labels

    crate/opentelemetryRelated to the `tracing-opentelemetry` crate.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions