有没有办法将变量绑定到 tower-http / hyper / axum 中的请求?

imb*_*olc 2 rust hyper rust-tower rust-axum

我正在尝试向每个跟踪事件添加请求 ID。tower_http::trace我可以这样做:

#[derive(Clone)]
pub struct RequestSpan;

impl<B> tower_http::trace::MakeSpan<B> for RequestSpan {
    fn make_span(&mut self, request: &http::Request<B>) -> tracing::Span {
        tracing::error_span!(
            "rq",
            id = %ulid::Ulid::new().to_string(),
            method = %request.method(),
            uri = %request.uri(),
            version = ?request.version(),
        )
    }
}

...

let middleware_stack = tower::ServiceBuilder::new()
    .layer(TraceLayer::new_for_http().make_span_with(RequestSpan))
Run Code Online (Sandbox Code Playgroud)

它在服务器范围内工作,但我还需要将请求 ID 传递到外部任务队列中。有什么建议么?

kmd*_*eko 5

可以根据请求存储自定义数据Extensions。它们可以通过a.extensions().extensions_mut()on http::request::Request(适用于hypertower-http)或通过相同的方法访问axum::response::RequestParts(适用于axum)。

扩展主要用于将服务/中间件之间的数据移动到路由处理程序,反之亦然。该集合的作用就像一个映射,其中的值按其类型进行键控,因此,如果您想存储 a,Ulid您可能希望将其包装在一些更具描述性的类型中RequestId(Ulid),以确保它不会与其他用途发生冲突。

也可以看看: