Why does calling tracing::info_span! inside a middleware causes middleware::from_fn to fail

Hi folks,

I am trying to write a middleware for my axum http server which logs the requests and responses along with adding request_id to a span. Though when I try creating the span in the middleware, the from_fn starts throwing the following error:

the trait bound `axum::middleware::FromFn<fn(axum::http::Request<axum::body::Body>, axum::middleware::Next) -> impl std::future::Future<Output = axum::http::Response<axum::body::Body>> {my_middleware}, (), axum::routing::Route, _>: tower_service::Service<axum::http::Request<axum::body::Body>>` is not satisfied

This is the body of my_middleware:

async fn my_middleware(request: Request, next: Next) -> Response {
    // do something with `request`...
    let request_id = "some-id";
    let _span = tracing::info_span!("request", %request_id).entered();

    let response = next.run(request).await;

    // do something with `response`...

    response
}

If the span is removed from the middleware then the error goes away. Can someone please help me understand this behaviour?

I don't know about axum but you shouldn't hold a guard from a tracing span across an await point. See the documentation. You need to instrument the run future instead.

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.