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
This commit is contained in:
Ben Romano
2026-08-17 20:02:49 +00:00
committed by copyberry
parent 682f57254f
commit 45cf6cbc19
3 changed files with 20 additions and 7 deletions

View File

@@ -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(

View File

@@ -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,

View File

@@ -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 {