#open-telemetry #tracing #tonic

tonic-tracing-opentelemetry

Middlewares and tools to integrate tonic + tracing + opentelemetry

28 releases (14 breaking)

0.32.1 Jan 12, 2026
0.32.0 Oct 1, 2025
0.30.0 Sep 27, 2025
0.29.0 Jun 3, 2025
0.12.0 Jul 2, 2023

#645 in Profiling

Download history 7547/week @ 2025-10-02 7187/week @ 2025-10-09 7150/week @ 2025-10-16 10347/week @ 2025-10-23 15950/week @ 2025-10-30 15682/week @ 2025-11-06 14505/week @ 2025-11-13 16905/week @ 2025-11-20 11708/week @ 2025-11-27 15072/week @ 2025-12-04 18243/week @ 2025-12-11 11853/week @ 2025-12-18 10105/week @ 2025-12-25 11930/week @ 2026-01-01 15963/week @ 2026-01-08 19074/week @ 2026-01-15

58,169 downloads per month
Used in 4 crates (2 directly)

CC0 license

49KB
706 lines

tonic-tracing-opentelemetry

crates license crate version

Project Status: Active – The project has reached a stable, usable state and is being actively developed.

Middlewares and tools to integrate tonic + tracing + opentelemetry for client and server.

Really early, missing lot of features, help is welcomed.

  • Read OpenTelemetry header from the incoming requests
  • Start a new trace if no trace is found in the incoming request
  • Trace is attached into tracing's span

For examples, you can look at the examples folder.

Extract of client.rs:

    let channel = Channel::from_static("http://127.0.0.1:50051")
        .connect()
        .await?; //Devskim: ignore DS137138
    let channel = ServiceBuilder::new()
        .layer(OtelGrpcLayer::default())
        .service(channel);

    let mut client = GreeterClient::new(channel);

    //...

    opentelemetry::global::shutdown_tracer_provider();

Extract of server.rs:

    Server::builder()
        // create trace for every request including health_service
        .layer(server::OtelGrpcLayer::default().filter(filters::reject_healthcheck))
        .add_service(health_service)
        .add_service(reflection_service)
        //.add_service(GreeterServer::new(greeter))
        .add_service(GreeterServer::new(greeter))
        .serve_with_shutdown(addr, shutdown_signal())
        .await?;

TODO

Changelog - History

CHANGELOG.md

Dependencies

~16MB
~188K SLoC