chore(otel): rename OtelManager to SessionTelemetry (#13808)

## Summary
This is a purely mechanical refactor of `OtelManager` ->
`SessionTelemetry` to better convey what the struct is doing. No
behavior change.

## Why

`OtelManager` ended up sounding much broader than what this type
actually does. It doesn't manage OTEL globally; it's the session-scoped
telemetry surface for emitting log/trace events and recording metrics
with consistent session metadata (`app_version`, `model`, `slug`,
`originator`, etc.).

`SessionTelemetry` is a more accurate name, and updating the call sites
makes that boundary a lot easier to follow.

## Validation

- `just fmt`
- `cargo test -p codex-otel`
- `cargo test -p codex-core`
This commit is contained in:
Owen Lin authored and GitHub committed 2026-03-06 16:23:30 -08:00
1 parent 3794363cac
commit 289ed549cf
45 files changed
+318 -290

No files matched your search

+35 -29
View File
@@ -57,7 +57,7 @@ use codex_core::models_manager::model_presets::HIDE_GPT_5_1_CODEX_MAX_MIGRATION_
use codex_core::models_manager::model_presets::HIDE_GPT5_1_MIGRATION_PROMPT_CONFIG;
#[cfg(target_os = "windows")]
use codex_core::windows_sandbox::WindowsSandboxLevelExt;
use codex_otel::OtelManager;
use codex_otel::SessionTelemetry;
use codex_otel::TelemetryAuthMode;
use codex_protocol::ThreadId;
use codex_protocol::config_types::Personality;
@@ -637,7 +637,7 @@ async fn handle_model_migration_prompt_if_needed(
pub(crate) struct App {
pub(crate) server: Arc<ThreadManager>,
pub(crate) otel_manager: OtelManager,
pub(crate) session_telemetry: SessionTelemetry,
pub(crate) app_event_tx: AppEventSender,
pub(crate) chat_widget: ChatWidget,
pub(crate) auth_manager: Arc<AuthManager>,
@@ -750,7 +750,7 @@ impl App {
model: Some(self.chat_widget.current_model().to_string()),
startup_tooltip_override: None,
status_line_invalid_items_warned: self.status_line_invalid_items_warned.clone(),
otel_manager: self.otel_manager.clone(),
session_telemetry: self.session_telemetry.clone(),
}
}
@@ -1437,7 +1437,7 @@ impl App {
model: Some(model),
startup_tooltip_override: None,
status_line_invalid_items_warned: self.status_line_invalid_items_warned.clone(),
otel_manager: self.otel_manager.clone(),
session_telemetry: self.session_telemetry.clone(),
};
self.chat_widget = ChatWidget::new(init, self.server.clone());
self.reset_thread_event_state();
@@ -1624,7 +1624,7 @@ impl App {
let auth_mode = auth_ref
.map(CodexAuth::auth_mode)
.map(TelemetryAuthMode::from);
let otel_manager = OtelManager::new(
let session_telemetry = SessionTelemetry::new(
ThreadId::new(),
model.as_str(),
model.as_str(),
@@ -1641,7 +1641,7 @@ impl App {
.as_ref()
.is_some_and(|cmd| !cmd.is_empty())
{
otel_manager.counter("codex.status_line", 1, &[]);
session_telemetry.counter("codex.status_line", 1, &[]);
}
let status_line_invalid_items_warned = Arc::new(AtomicBool::new(false));
@@ -1673,7 +1673,7 @@ impl App {
model: Some(model.clone()),
startup_tooltip_override,
status_line_invalid_items_warned: status_line_invalid_items_warned.clone(),
otel_manager: otel_manager.clone(),
session_telemetry: session_telemetry.clone(),
};
ChatWidget::new(init, thread_manager.clone())
}
@@ -1708,12 +1708,12 @@ impl App {
model: config.model.clone(),
startup_tooltip_override: None,
status_line_invalid_items_warned: status_line_invalid_items_warned.clone(),
otel_manager: otel_manager.clone(),
session_telemetry: session_telemetry.clone(),
};
ChatWidget::new_from_existing(init, resumed.thread, resumed.session_configured)
}
SessionSelection::Fork(target_session) => {
otel_manager.counter("codex.thread.fork", 1, &[("source", "cli_subcommand")]);
session_telemetry.counter("codex.thread.fork", 1, &[("source", "cli_subcommand")]);
let forked = thread_manager
.fork_thread(
usize::MAX,
@@ -1745,7 +1745,7 @@ impl App {
model: config.model.clone(),
startup_tooltip_override: None,
status_line_invalid_items_warned: status_line_invalid_items_warned.clone(),
otel_manager: otel_manager.clone(),
session_telemetry: session_telemetry.clone(),
};
ChatWidget::new_from_existing(init, forked.thread, forked.session_configured)
}
@@ -1760,7 +1760,7 @@ impl App {
let mut app = Self {
server: thread_manager.clone(),
otel_manager: otel_manager.clone(),
session_telemetry: session_telemetry.clone(),
app_event_tx,
chat_widget,
auth_manager: auth_manager.clone(),
@@ -2081,8 +2081,11 @@ impl App {
tui.frame_requester().schedule_frame();
}
AppEvent::ForkCurrentSession => {
self.otel_manager
.counter("codex.thread.fork", 1, &[("source", "slash_command")]);
self.session_telemetry.counter(
"codex.thread.fork",
1,
&[("source", "slash_command")],
);
let summary = session_summary(
self.chat_widget.token_usage(),
self.chat_widget.thread_id(),
@@ -2343,11 +2346,14 @@ impl App {
self.chat_widget.open_windows_sandbox_enable_prompt(preset);
}
AppEvent::OpenWindowsSandboxFallbackPrompt { preset } => {
self.otel_manager
.counter("codex.windows_sandbox.fallback_prompt_shown", 1, &[]);
self.session_telemetry.counter(
"codex.windows_sandbox.fallback_prompt_shown",
1,
&[],
);
self.chat_widget.clear_windows_sandbox_setup_status();
if let Some(started_at) = self.windows_sandbox.setup_started_at.take() {
self.otel_manager.record_duration(
self.session_telemetry.record_duration(
"codex.windows_sandbox.elevated_setup_duration_ms",
started_at.elapsed(),
&[("result", "failure")],
@@ -2380,7 +2386,7 @@ impl App {
self.chat_widget.show_windows_sandbox_setup_status();
self.windows_sandbox.setup_started_at = Some(Instant::now());
let otel_manager = self.otel_manager.clone();
let session_telemetry = self.session_telemetry.clone();
tokio::task::spawn_blocking(move || {
let result = codex_core::windows_sandbox::run_elevated_setup(
&policy,
@@ -2391,7 +2397,7 @@ impl App {
);
let event = match result {
Ok(()) => {
otel_manager.counter(
session_telemetry.counter(
"codex.windows_sandbox.elevated_setup_success",
1,
&[],
@@ -2419,7 +2425,7 @@ impl App {
if let Some(message) = message_tag.as_deref() {
tags.push(("message", message));
}
otel_manager.counter(
session_telemetry.counter(
codex_core::windows_sandbox::elevated_setup_failure_metric_name(
&err,
),
@@ -2451,7 +2457,7 @@ impl App {
std::env::vars().collect();
let codex_home = self.config.codex_home.clone();
let tx = self.app_event_tx.clone();
let otel_manager = self.otel_manager.clone();
let session_telemetry = self.session_telemetry.clone();
self.chat_widget.show_windows_sandbox_setup_status();
tokio::task::spawn_blocking(move || {
@@ -2462,7 +2468,7 @@ impl App {
&env_map,
codex_home.as_path(),
) {
otel_manager.counter(
session_telemetry.counter(
"codex.windows_sandbox.legacy_setup_preflight_failed",
1,
&[],
@@ -2545,7 +2551,7 @@ impl App {
{
self.chat_widget.clear_windows_sandbox_setup_status();
if let Some(started_at) = self.windows_sandbox.setup_started_at.take() {
self.otel_manager.record_duration(
self.session_telemetry.record_duration(
"codex.windows_sandbox.elevated_setup_duration_ms",
started_at.elapsed(),
&[("result", "success")],
@@ -3713,7 +3719,7 @@ mod tests {
use codex_core::config::ConfigBuilder;
use codex_core::config::ConfigOverrides;
use codex_core::config::types::ModelAvailabilityNuxConfig;
use codex_otel::OtelManager;
use codex_otel::SessionTelemetry;
use codex_protocol::ThreadId;
use codex_protocol::config_types::CollaborationMode;
use codex_protocol::config_types::CollaborationModeMask;
@@ -5276,11 +5282,11 @@ mod tests {
);
let file_search = FileSearchManager::new(config.cwd.clone(), app_event_tx.clone());
let model = codex_core::test_support::get_model_offline(config.model.as_deref());
let otel_manager = test_otel_manager(&config, model.as_str());
let session_telemetry = test_session_telemetry(&config, model.as_str());
App {
server,
otel_manager,
session_telemetry,
app_event_tx,
chat_widget,
auth_manager,
@@ -5335,12 +5341,12 @@ mod tests {
);
let file_search = FileSearchManager::new(config.cwd.clone(), app_event_tx.clone());
let model = codex_core::test_support::get_model_offline(config.model.as_deref());
let otel_manager = test_otel_manager(&config, model.as_str());
let session_telemetry = test_session_telemetry(&config, model.as_str());
(
App {
server,
otel_manager,
session_telemetry,
app_event_tx,
chat_widget,
auth_manager,
@@ -5391,9 +5397,9 @@ mod tests {
panic!("expected UserTurn op, saw: {seen:?}");
}
fn test_otel_manager(config: &Config, model: &str) -> OtelManager {
fn test_session_telemetry(config: &Config, model: &str) -> SessionTelemetry {
let model_info = codex_core::test_support::construct_model_info_offline(model, config);
OtelManager::new(
SessionTelemetry::new(
ThreadId::new(),
model,
model_info.slug.as_str(),