From cc5494f680226ec9947083698a7a71f27497194e Mon Sep 17 00:00:00 2001 From: datron Date: Fri, 8 May 2026 12:38:59 +0530 Subject: [PATCH] fix: re-use x-request-id if sent in request Signed-off-by: datron --- .../src/middlewares/request_response_logging.rs | 14 +++++++++----- crates/superposition/src/log_span.rs | 7 ++++++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/crates/service_utils/src/middlewares/request_response_logging.rs b/crates/service_utils/src/middlewares/request_response_logging.rs index e27c7d63c..49a857f3f 100644 --- a/crates/service_utils/src/middlewares/request_response_logging.rs +++ b/crates/service_utils/src/middlewares/request_response_logging.rs @@ -133,10 +133,14 @@ where let query_string = req.query_string().to_string(); - let request_id = req - .extensions() - .get::() - .map(|req_id| header::HeaderValue::from_str(&req_id.to_string())); + // Check for x-request-id header first, fallback to generated one from extensions + let request_id = req.headers().get("x-request-id").cloned().or_else(|| { + req.extensions() + .get::() + .and_then(|req_id| { + header::HeaderValue::from_str(&req_id.to_string()).ok() + }) + }); let (http_req, mut payload) = req.into_parts(); let mut body_bytes = Vec::new(); @@ -181,7 +185,7 @@ where let start_time = Instant::now(); res = service.call(new_req).await?; - if let Some(Ok(request_id)) = request_id { + if let Some(request_id) = request_id { res.headers_mut() .insert(header::HeaderName::from_static("x-request-id"), request_id); } diff --git a/crates/superposition/src/log_span.rs b/crates/superposition/src/log_span.rs index c704bdcf1..2654de803 100644 --- a/crates/superposition/src/log_span.rs +++ b/crates/superposition/src/log_span.rs @@ -39,8 +39,13 @@ impl RootSpanBuilder for CustomRootSpanBuilder { let org = header_extractor(headers, "x-org-id").unwrap_or_else(|| { path_extractor(path, 0).unwrap_or_else(|| "no-org-header".to_string()) }); + let request_id = header_extractor(headers, "x-request-id"); let method = request.method().to_string(); - tracing_actix_web::root_span!(request, workspace, org, method, path,) + if let Some(request_id) = request_id { + tracing_actix_web::root_span!(request, request_id = %request_id, workspace, org, method, path,) + } else { + tracing_actix_web::root_span!(request, workspace, org, method, path,) + } } fn on_request_end(