From 45cf6cbc1946580829a5d16832af35c2b112046c Mon Sep 17 00:00:00 2001 From: Ben Romano Date: Mon, 17 Aug 2026 20:02:49 +0000 Subject: [PATCH] Propagate caller metadata to rendezvous connections (#39073) ## What changed - Add `x-cluster-name` from `OPENAI_CLUSTER` and `x-openai-internal-caller` from `DD_SERVICE` to rendezvous WebSocket handshakes when the environment values are nonempty and valid HTTP header values. - Apply the rendezvous headers to both client and remote executor connections while preserving the existing W3C trace context headers. GitOrigin-RevId: fead0244ba24fa208990b92d2170a9ae76ff2ceb --- codex-rs/exec-server/src/client_transport.rs | 6 ++---- codex-rs/exec-server/src/remote.rs | 5 ++--- codex-rs/exec-server/src/trace_context.rs | 16 ++++++++++++++++ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/codex-rs/exec-server/src/client_transport.rs b/codex-rs/exec-server/src/client_transport.rs index 20fba49738..b4a75bb6b3 100644 --- a/codex-rs/exec-server/src/client_transport.rs +++ b/codex-rs/exec-server/src/client_transport.rs @@ -34,7 +34,7 @@ use crate::noise_relay::NoiseHarnessConnectionArgs; use crate::noise_relay::noise_harness_connection_from_websocket; use crate::noise_relay::noise_relay_websocket_config; use crate::relay::harness_connection_from_websocket; -use crate::trace_context::current_trace_context_headers; +use crate::trace_context::current_rendezvous_headers; const ENVIRONMENT_CLIENT_NAME: &str = "codex-environment"; @@ -342,9 +342,7 @@ impl ExecServerClient { url: diagnostic_url.clone(), source, })?; - request - .headers_mut() - .extend(current_trace_context_headers()); + request.headers_mut().extend(current_rendezvous_headers()); let (stream, _) = timeout( connect_timeout, WebSocketConnector::new_with_tls_mode( diff --git a/codex-rs/exec-server/src/remote.rs b/codex-rs/exec-server/src/remote.rs index 16deaa092c..9d372b104c 100644 --- a/codex-rs/exec-server/src/remote.rs +++ b/codex-rs/exec-server/src/remote.rs @@ -44,6 +44,7 @@ use crate::relay::HarnessKeyValidator; use crate::relay::run_multiplexed_environment; use crate::server::ConnectionProcessor; use crate::server::RequestDispatchMode; +use crate::trace_context::current_rendezvous_headers; use crate::trace_context::current_trace_context_headers; const ERROR_BODY_PREVIEW_BYTES: usize = 4096; @@ -673,9 +674,7 @@ async fn connect_rendezvous( let started_at = Instant::now(); let result = async { let mut request = url.into_client_request()?; - request - .headers_mut() - .extend(current_trace_context_headers()); + request.headers_mut().extend(current_rendezvous_headers()); let connector = WebSocketConnector::new_with_tls_mode( http_client_factory, WebSocketTlsMode::TungsteniteDefault, diff --git a/codex-rs/exec-server/src/trace_context.rs b/codex-rs/exec-server/src/trace_context.rs index 0d61ae1ea9..f6fd898c05 100644 --- a/codex-rs/exec-server/src/trace_context.rs +++ b/codex-rs/exec-server/src/trace_context.rs @@ -1,6 +1,22 @@ use http::HeaderMap; use http::HeaderValue; +pub(crate) fn current_rendezvous_headers() -> HeaderMap { + let mut headers = current_trace_context_headers(); + for (header, variable) in [ + ("x-cluster-name", "OPENAI_CLUSTER"), + ("x-openai-internal-caller", "DD_SERVICE"), + ] { + if let Ok(value) = std::env::var(variable) + && !value.is_empty() + && let Ok(value) = HeaderValue::try_from(value) + { + headers.insert(header, value); + } + } + headers +} + pub(crate) fn current_trace_context_headers() -> HeaderMap { let mut headers = HeaderMap::new(); let Some(trace) = codex_otel::current_span_w3c_trace_context() else {