#axum #hyper #warp #request-id #trace-id #request-response

hyper-trace-id

Hyper (axum, warp, poem, ...) 中间件,用于向请求添加跟踪ID

1 个不稳定版本

0.1.0 2023年7月28日

10#request-id

MIT 许可证

17KB
308

License Crates.io Docs.rs

hyper-trace-id

用于向请求添加跟踪ID的 Axum 中间件。

基本用法

添加 SetTraceIdLayer<T> 层会使 TraceId<T> 通过请求和响应扩展可用。对于特殊用途场景(例如,仅在http错误情况下懒生成跟踪ID),您可以为您自己的类型实现 MakeTraceId

use std::convert::Infallible;
use hyper::{Body, Request, Response};
use tower::ServiceBuilder;
use hyper_trace_id::{SetTraceIdLayer, TraceId};

let trace_id_header = "x-trace-id";
let svc = ServiceBuilder::new()
    .layer(SetTraceIdLayer::<String>::new().with_header_name(trace_id_header))
    .service_fn(|_req: Request<Body>| async {
        let res: Result<Response<Body>, Infallible> = Ok(Response::new(Body::empty()));
        res
    });

axum 一起使用

对于axum用户,crate通过 axum 功能提供了一个提取器,用于在处理器中访问跟踪ID。

use axum::{routing::get, Router};
use axum_trace_id::{SetTraceIdLayer, TraceId};

let app: Router = Router::new()
     .route(
         "/",
         get(|trace_id: TraceId<String>| async move { trace_id.to_string() }),
     )
     .layer(SetTraceIdLayer::<String>::new());

tracing 一起使用

要使用 tracing,您可以通过扩展访问请求的跟踪ID。

use axum::{http::Request, routing::get, Router};
use axum_trace_id::{SetTraceIdLayer, TraceId};
use tower_http::trace::TraceLayer;
use tracing::info_span;

let app = Router::new()
    .route("/", get(|| async { "" }))
    .layer(TraceLayer::new_for_http().make_span_with(|request: &Request<_>| {
        let trace_id = request.extensions().get::<TraceId<String>>().unwrap();

        info_span!("http_request", trace_id = trace_id)
    }));

许可证

本项目采用 MIT许可证

依赖关系

~6.5–8.5MB
~154K SLoC