Crates.io | hyper-trace-id |
lib.rs | hyper-trace-id |
version | 0.1.0 |
source | src |
created_at | 2023-07-28 08:34:58.966904 |
updated_at | 2023-07-28 08:34:58.966904 |
description | Hyper (axum, warp, poem, ...) middleware for adding trace ids to requests. |
homepage | |
repository | https://github.com/dominik-seeger/hyper-trace-id |
max_upload_size | |
id | 928290 |
size | 17,384 |
Axum middleware for adding trace ids to requests.
Adding the SetTraceIdLayer<T>
layer will make TraceId<T>
available via the request and
response extensions. For special use-cases (e.g. lazily generating trace ids only in case of http errors) you can implement MakeTraceId
on your own types.
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
});
For axum users, crate optionally provides an extractor (via the axum
feature) to access the trace id in a handler.
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());
To use with tracing, you can access the requests tracing id via the extensions.
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)
}));
This project is licensed under the MIT license.