From 51d0f6d66e0dbc8b728e2b0174ccdeaf18ad125b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Marti=CC=81nez=20Bernardo?= Date: Thu, 12 Feb 2026 12:03:35 +0100 Subject: [PATCH 1/2] extract_request_body before exiting handle_end_invocation --- bottlecap/src/lifecycle/listener.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/bottlecap/src/lifecycle/listener.rs b/bottlecap/src/lifecycle/listener.rs index afbe78d52..6611ddd76 100644 --- a/bottlecap/src/lifecycle/listener.rs +++ b/bottlecap/src/lifecycle/listener.rs @@ -168,16 +168,16 @@ impl Listener { State((invocation_processor_handle, _, tasks)): State, request: Request, ) -> Response { + let (parts, body) = match extract_request_body(request).await { + Ok(r) => r, + Err(e) => { + error!("Failed to extract request body: {e}"); + return (StatusCode::OK, json!({}).to_string()).into_response(); + } + }; + let mut join_set = tasks.lock().await; join_set.spawn(async move { - let (parts, body) = match extract_request_body(request).await { - Ok(r) => r, - Err(e) => { - error!("Failed to extract request body: {e}"); - return; - } - }; - Self::universal_instrumentation_end(&parts.headers, body, invocation_processor_handle) .await; }); From 4ab60fc999612da6210b8e98c666886bee354e20 Mon Sep 17 00:00:00 2001 From: Jordan Gonzalez <30836115+duncanista@users.noreply.github.com> Date: Thu, 5 Mar 2026 15:37:57 -0500 Subject: [PATCH 2/2] add comment on why the change --- bottlecap/src/lifecycle/listener.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bottlecap/src/lifecycle/listener.rs b/bottlecap/src/lifecycle/listener.rs index 6611ddd76..a77625bba 100644 --- a/bottlecap/src/lifecycle/listener.rs +++ b/bottlecap/src/lifecycle/listener.rs @@ -168,6 +168,9 @@ impl Listener { State((invocation_processor_handle, _, tasks)): State, request: Request, ) -> Response { + // IMPORTANT: Extract the body synchronously before returning the response. + // If this is moved into the spawned task, PlatformRuntimeDone may be + // processed before the body is read, causing orphaned traces. (SLES-2666) let (parts, body) = match extract_request_body(request).await { Ok(r) => r, Err(e) => {