diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index c6e11b137..e67779438 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -525,7 +525,6 @@ impl Session { session_configuration.collaboration_mode.model(), model_info.slug.as_str(), ); - let per_turn_config = Arc::new(per_turn_config); let client = ModelClient::new( per_turn_config.clone(), diff --git a/codex-rs/core/src/state/turn.rs b/codex-rs/core/src/state/turn.rs index ddc9efafe..3dfc5132d 100644 --- a/codex-rs/core/src/state/turn.rs +++ b/codex-rs/core/src/state/turn.rs @@ -37,7 +37,6 @@ pub(crate) enum TaskKind { Compact, } -#[derive(Clone)] pub(crate) struct RunningTask { pub(crate) done: Arc, pub(crate) kind: TaskKind, @@ -45,6 +44,8 @@ pub(crate) struct RunningTask { pub(crate) cancellation_token: CancellationToken, pub(crate) handle: Arc>, pub(crate) turn_context: Arc, + // Timer recorded when the task drops to capture the full turn duration. + pub(crate) _timer: Option, } impl ActiveTurn { diff --git a/codex-rs/core/src/tasks/mod.rs b/codex-rs/core/src/tasks/mod.rs index d6754c23c..83326b1f0 100644 --- a/codex-rs/core/src/tasks/mod.rs +++ b/codex-rs/core/src/tasks/mod.rs @@ -144,6 +144,12 @@ impl Session { }) }; + let timer = turn_context + .client + .get_otel_manager() + .start_timer("codex.turn.e2e_duration_ms", &[]) + .ok(); + let running_task = RunningTask { done, handle: Arc::new(AbortOnDropHandle::new(handle)), @@ -151,6 +157,7 @@ impl Session { task, cancellation_token, turn_context: Arc::clone(&turn_context), + _timer: timer, }; self.register_new_active_task(running_task).await; } diff --git a/codex-rs/otel/src/lib.rs b/codex-rs/otel/src/lib.rs index 868a97773..fa7cc93bb 100644 --- a/codex-rs/otel/src/lib.rs +++ b/codex-rs/otel/src/lib.rs @@ -9,7 +9,7 @@ use crate::metrics::MetricsClient; use crate::metrics::MetricsConfig; use crate::metrics::MetricsError; use crate::metrics::Result as MetricsResult; -use crate::metrics::timer::Timer; +pub use crate::metrics::timer::Timer; use crate::metrics::validation::validate_tag_key; use crate::metrics::validation::validate_tag_value; use crate::otel_provider::OtelProvider; diff --git a/codex-rs/otel/src/metrics/timer.rs b/codex-rs/otel/src/metrics/timer.rs index b1624fda1..6c85f413b 100644 --- a/codex-rs/otel/src/metrics/timer.rs +++ b/codex-rs/otel/src/metrics/timer.rs @@ -2,6 +2,7 @@ use crate::metrics::MetricsClient; use crate::metrics::error::Result; use std::time::Instant; +#[derive(Debug)] pub struct Timer { name: String, tags: Vec<(String, String)>,