diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 7e4dcdb..90ffbbc 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -1896,6 +1896,7 @@ dependencies = [ "tower-layer", "tower-service 0.3.3", "tracing", + "uuid", ] [[package]] diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 88c12ce..0a24dbe 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -11,7 +11,7 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.141" tokio = { version = "1.0", features = ["full"] } tower = { version = "0.5.2", features = ["full"] } -tower-http = { version = "0.6.6", features = ["timeout", "trace", "auth"] } +tower-http = { version = "0.6.6", features = ["timeout", "trace", "auth", "request-id"] } tower-http-util = "0.1.0" tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/backend/src/router.rs b/backend/src/router.rs index 27abce8..0a028ce 100644 --- a/backend/src/router.rs +++ b/backend/src/router.rs @@ -7,12 +7,25 @@ use crate::config; use axum::extract::Request; use axum::routing::get; use axum::{Router, body::Body}; +use http::HeaderName; use tower::ServiceBuilder; +use tower_http::request_id::{MakeRequestId, RequestId, SetRequestIdLayer}; use tower_http::timeout::TimeoutLayer; use tower_http::trace::TraceLayer; use tracing::Level; use uuid::Uuid; +#[derive(Clone)] +struct RequestIdLayer; + +impl MakeRequestId for RequestIdLayer { + fn make_request_id(&mut self, _: &http::Request) -> Option { + let id = Uuid::now_v7().to_string(); + + Some(RequestId::new(id.parse().unwrap())) + } +} + pub fn app(config: &config::Config) -> (Router, mpsc::Receiver) { let (tx, rx) = mpsc::channel(); ( @@ -22,15 +35,29 @@ pub fn app(config: &config::Config) -> (Router, mpsc::Receiver) { .nest("/admin", admin::router(tx, config)) .layer( ServiceBuilder::new() + .layer(SetRequestIdLayer::new( + HeaderName::from_static("x-request-id"), + RequestIdLayer, + )) .layer( TraceLayer::new_for_http().make_span_with(|req: &Request| { - tracing::span!( - Level::DEBUG, - "request", - trace_id = Uuid::now_v7().to_string(), - method = format!("{}", req.method()), - uri = format!("{}", req.uri()), - ) + if let Some(req_id) = req.headers().get("x-request-id") { + tracing::span!( + Level::DEBUG, + "request", + req_id = req_id.to_str().unwrap(), + method = format!("{}", req.method()), + uri = format!("{}", req.uri()), + ) + } else { + tracing::span!( + Level::DEBUG, + "request", + req_id = "", + method = format!("{}", req.method()), + uri = format!("{}", req.uri()), + ) + } }), ) .layer(TimeoutLayer::new(Duration::from_secs(10))),