Add context to sampling retry logs (#33963)

## What changed

- Add structured `turn_id`, `retries`, `max_retries`, and `sampling_error` fields to sampling-stream retry warnings.
- Add a focused test that captures the warning and verifies its retry and error context.

GitOrigin-RevId: dea868875d162b3f97b3c8a256359278f7267c1c
This commit is contained in:
Anton Panasenko
2026-07-18 06:34:53 +00:00
committed by copyberry
parent d26a9bf671
commit 5c0e582c59
2 changed files with 54 additions and 0 deletions
+8
View File
@@ -89,6 +89,10 @@ fn log_retry(
match request {
ResponsesStreamRequest::Sampling => {
warn!(
turn_id = %turn_context.sub_id,
retries,
max_retries,
sampling_error = %err,
"stream disconnected - retrying sampling request ({retries}/{max_retries} in {delay:?})...",
);
}
@@ -103,3 +107,7 @@ fn log_retry(
}
}
}
#[cfg(test)]
#[path = "responses_retry_tests.rs"]
mod tests;
@@ -0,0 +1,46 @@
use super::ResponsesStreamRequest;
use super::log_retry;
use crate::session::tests::make_session_and_context;
use codex_protocol::error::CodexErr;
use std::time::Duration;
use tracing_test::internal::MockWriter;
#[tokio::test]
async fn sampling_retry_logs_stream_error_context() {
let (_session, turn_context) = make_session_and_context().await;
let buffer: &'static std::sync::Mutex<Vec<u8>> =
Box::leak(Box::new(std::sync::Mutex::new(Vec::new())));
let subscriber = tracing_subscriber::fmt()
.with_ansi(false)
.with_max_level(tracing::Level::WARN)
.with_writer(MockWriter::new(buffer))
.finish();
let _subscriber_guard = tracing::subscriber::set_default(subscriber);
log_retry(
ResponsesStreamRequest::Sampling,
&turn_context,
&CodexErr::Stream(
"websocket closed by server before response.completed".to_string(),
None,
),
/*retries*/ 2,
/*max_retries*/ 5,
Duration::from_secs(1),
);
let logs = String::from_utf8(
buffer
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner)
.clone(),
)
.expect("retry log should be valid utf-8");
assert!(logs.contains("stream disconnected - retrying sampling request"));
assert!(logs.contains(&format!("turn_id={}", turn_context.sub_id)));
assert!(logs.contains("retries=2"));
assert!(logs.contains("max_retries=5"));
assert!(logs.contains(
"sampling_error=stream disconnected before completion: websocket closed by server before response.completed"
));
}