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 传递到外部任务队列中。有什么建议么?
可以根据请求存储自定义数据Extensions。它们可以通过a.extensions()和.extensions_mut()on http::request::Request(适用于hyper和tower-http)或通过相同的方法访问axum::response::RequestParts(适用于axum)。
扩展主要用于将服务/中间件之间的数据移动到路由处理程序,反之亦然。该集合的作用就像一个映射,其中的值按其类型进行键控,因此,如果您想存储 a,Ulid您可能希望将其包装在一些更具描述性的类型中RequestId(Ulid),以确保它不会与其他用途发生冲突。
也可以看看:
| 归档时间: |
|
| 查看次数: |
1419 次 |
| 最近记录: |