Skip to content

Commit 668330a

Browse files
authored
feat(tracing): tag app-server turn spans with turn_id (#15206)
So we can find and filter spans by `turn.id`. We do this for the `turn/start`, `turn/steer`, and `turn/interrupt` APIs.
1 parent 60cd0cf commit 668330a

File tree

4 files changed

+31
-2
lines changed

4 files changed

+31
-2
lines changed

codex-rs/app-server/src/app_server_tracing.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ fn app_server_request_span_template(
107107
app_server.api_version = "v2",
108108
app_server.client_name = field::Empty,
109109
app_server.client_version = field::Empty,
110+
turn.id = field::Empty,
110111
)
111112
}
112113

codex-rs/app-server/src/codex_message_processor.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6024,6 +6024,9 @@ impl CodexMessageProcessor {
60246024

60256025
match turn_id {
60266026
Ok(turn_id) => {
6027+
self.outgoing
6028+
.record_request_turn_id(&request_id, &turn_id)
6029+
.await;
60276030
let turn = Turn {
60286031
id: turn_id.clone(),
60296032
items: vec![],
@@ -6076,6 +6079,9 @@ impl CodexMessageProcessor {
60766079
.await;
60776080
return;
60786081
}
6082+
self.outgoing
6083+
.record_request_turn_id(&request_id, &params.expected_turn_id)
6084+
.await;
60796085
if let Err(error) = Self::validate_v2_input_limit(&params.input) {
60806086
self.outgoing.send_error(request_id, error).await;
60816087
return;
@@ -6556,7 +6562,10 @@ impl CodexMessageProcessor {
65566562
request_id: ConnectionRequestId,
65576563
params: TurnInterruptParams,
65586564
) {
6559-
let TurnInterruptParams { thread_id, .. } = params;
6565+
let TurnInterruptParams { thread_id, turn_id } = params;
6566+
self.outgoing
6567+
.record_request_turn_id(&request_id, &turn_id)
6568+
.await;
65606569

65616570
let (thread_uuid, thread) = match self.load_thread(&thread_id).await {
65626571
Ok(v) => v,

codex-rs/app-server/src/message_processor/tracing_tests.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,7 @@ async fn turn_start_jsonrpc_span_parents_core_turn_spans() -> Result<()> {
580580
parent_span_id: remote_parent_span_id,
581581
context: remote_trace,
582582
} = RemoteTrace::new("00000000000000000000000000000077", "0000000000000088");
583-
let _: TurnStartResponse = harness
583+
let turn_start_response: TurnStartResponse = harness
584584
.request(
585585
ClientRequest::TurnStart {
586586
request_id: RequestId::Integer(3),
@@ -628,6 +628,10 @@ async fn turn_start_jsonrpc_span_parents_core_turn_spans() -> Result<()> {
628628
assert_eq!(server_request_span.parent_span_id, remote_parent_span_id);
629629
assert!(server_request_span.parent_span_is_remote);
630630
assert_eq!(server_request_span.span_context.trace_id(), remote_trace_id);
631+
assert_eq!(
632+
span_attr(server_request_span, "turn.id"),
633+
Some(turn_start_response.turn.id.as_str())
634+
);
631635
assert_span_descends_from(&spans, core_turn_span, server_request_span);
632636
harness.shutdown().await;
633637

codex-rs/app-server/src/outgoing_message.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ impl RequestContext {
7575
pub(crate) fn span(&self) -> Span {
7676
self.span.clone()
7777
}
78+
79+
fn record_turn_id(&self, turn_id: &str) {
80+
self.span.record("turn.id", turn_id);
81+
}
7882
}
7983

8084
#[derive(Debug, Clone)]
@@ -217,6 +221,17 @@ impl OutgoingMessageSender {
217221
.and_then(RequestContext::request_trace)
218222
}
219223

224+
pub(crate) async fn record_request_turn_id(
225+
&self,
226+
request_id: &ConnectionRequestId,
227+
turn_id: &str,
228+
) {
229+
let request_contexts = self.request_contexts.lock().await;
230+
if let Some(request_context) = request_contexts.get(request_id) {
231+
request_context.record_turn_id(turn_id);
232+
}
233+
}
234+
220235
async fn take_request_context(
221236
&self,
222237
request_id: &ConnectionRequestId,

0 commit comments

Comments
 (0)