#axum #open-telemetry #tracing #tracing-layer

axum-tracing-opentelemetry

Middlewares and tools to integrate axum + tracing + opentelemetry

43 releases (22 breaking)

0.26.1 Feb 26, 2025
0.25.0 Jan 2, 2025
0.24.1 Nov 24, 2024
0.19.0 Jun 30, 2024
0.2.1 Jun 11, 2022

#347 in Debugging

Download history 87401/week @ 2024-12-06 113851/week @ 2024-12-13 30811/week @ 2024-12-20 34166/week @ 2024-12-27 93588/week @ 2025-01-03 151618/week @ 2025-01-10 141994/week @ 2025-01-17 177696/week @ 2025-01-24 190438/week @ 2025-01-31 212721/week @ 2025-02-07 149006/week @ 2025-02-14 122982/week @ 2025-02-21 343076/week @ 2025-02-28 405397/week @ 2025-03-07 399510/week @ 2025-03-14 985279/week @ 2025-03-21

2,151,702 downloads per month
Used in 12 crates (11 directly)

CC0 license

50KB
722 lines

axum-tracing-opentelemetry

crates license crate version

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

Middlewares to integrate axum + tracing + opentelemetry.

  • Read OpenTelemetry header from incoming request
  • Start a new trace if no trace found in the incoming request
  • Trace is attached into tracing'span
  • OpenTelemetry Span is created on close of the tracing's span (behavior from [tracing-opentelemetry])

For examples, you can look at the examples folder.

//...
use axum_tracing_opentelemetry::opentelemetry_tracing_layer;

#[tokio::main]
async fn main() -> Result<(), axum::BoxError> {
    // very opinionated init of tracing, look at the source to make your own
    let _guard = init_tracing_opentelemetry::tracing_subscriber_ext::init_subscribers()?;

    let app = app();
    // run it
    let addr = &"0.0.0.0:3000".parse::<SocketAddr>()?;
    tracing::warn!("listening on {}", addr);
    let listener = tokio::net::TcpListener::bind(addr).await?;
    axum::serve(listener, app.into_make_service()).await?;
    Ok(())
}

fn app() -> Router {
    Router::new()
        .route("/", get(index)) // request processed inside span
        // include trace context as header into the response
        .layer(OtelInResponseLayer::default())
        //start OpenTelemetry trace on incoming request
        .layer(OtelAxumLayer::default())
        .route("/health", get(health)) // request processed without span / trace
}

For more info about how to initialize, you can look at crate init-tracing-opentelemetry or tracing-opentelemetry.

Changelog - History

CHANGELOG.md

Dependencies

~8.5MB
~149K SLoC