[codex-analytics] denormalize thread metadata onto turn events

This commit is contained in:
rhan-oai
2026-04-09 16:39:39 -07:00
parent ba4de0d6d6
commit 69dd52ae19
7 changed files with 57 additions and 11 deletions
@@ -254,15 +254,6 @@ fn sample_turn_resolved_config(turn_id: &str) -> TurnResolvedConfigFact {
}
}
fn sample_runtime_metadata() -> CodexRuntimeMetadata {
CodexRuntimeMetadata {
codex_rs_version: "0.1.0".to_string(),
runtime_os: "macos".to_string(),
runtime_os_version: "15.3.1".to_string(),
runtime_arch: "aarch64".to_string(),
}
}
fn sample_turn_steer_request(
thread_id: &str,
expected_turn_id: &str,
+24
View File
@@ -367,3 +367,27 @@ fn subagent_parent_thread_id(subagent_source: &SubAgentSource) -> Option<String>
_ => None,
}
}
pub(crate) fn turn_subagent_source_name(thread_source: &SessionSource) -> Option<String> {
match thread_source {
SessionSource::SubAgent(subagent_source) => Some(subagent_source_name(subagent_source)),
SessionSource::Cli
| SessionSource::VSCode
| SessionSource::Exec
| SessionSource::Mcp
| SessionSource::Custom(_)
| SessionSource::Unknown => None,
}
}
pub(crate) fn turn_parent_thread_id(thread_source: &SessionSource) -> Option<String> {
match thread_source {
SessionSource::SubAgent(subagent_source) => subagent_parent_thread_id(subagent_source),
SessionSource::Cli
| SessionSource::VSCode
| SessionSource::Exec
| SessionSource::Mcp
| SessionSource::Custom(_)
| SessionSource::Unknown => None,
}
}
+4 -2
View File
@@ -20,6 +20,8 @@ use crate::events::codex_turn_steer_event_params;
use crate::events::plugin_state_event_type;
use crate::events::subagent_thread_started_event_request;
use crate::events::thread_source_name;
use crate::events::turn_parent_thread_id;
use crate::events::turn_subagent_source_name;
use crate::facts::AnalyticsFact;
use crate::facts::AnalyticsJsonRpcError;
use crate::facts::AppMentionedInput;
@@ -746,8 +748,8 @@ fn codex_turn_event_params(
ephemeral,
thread_source: thread_source_name(&session_source).map(str::to_string),
initialization_mode,
subagent_source: None,
parent_thread_id: None,
subagent_source: turn_subagent_source_name(&session_source),
parent_thread_id: turn_parent_thread_id(&session_source),
model: Some(model),
model_provider,
sandbox_policy: Some(sandbox_policy_mode(&sandbox_policy)),
@@ -9374,6 +9374,7 @@ mod tests {
reasoning_effort: None,
personality: None,
session_source: SessionSource::Cli,
initialization_mode: codex_analytics::ThreadInitializationMode::New,
};
assert_eq!(
@@ -395,6 +395,17 @@ async fn turn_start_tracks_turn_event_analytics() -> Result<()> {
assert_eq!(event["event_params"]["model"], "mock-model");
assert_eq!(event["event_params"]["model_provider"], "mock_provider");
assert_eq!(event["event_params"]["sandbox_policy"], "read_only");
assert_eq!(event["event_params"]["ephemeral"], false);
assert_eq!(event["event_params"]["thread_source"], "user");
assert_eq!(event["event_params"]["initialization_mode"], "new");
assert_eq!(
event["event_params"]["subagent_source"],
serde_json::Value::Null
);
assert_eq!(
event["event_params"]["parent_thread_id"],
serde_json::Value::Null
);
assert_eq!(event["event_params"]["num_input_images"], 1);
assert_eq!(event["event_params"]["status"], "completed");
assert!(event["event_params"]["started_at"].as_u64().is_some());
+10
View File
@@ -1092,6 +1092,14 @@ impl TurnContext {
}
}
fn thread_initialization_mode(initial_history: &InitialHistory) -> ThreadInitializationMode {
match initial_history {
InitialHistory::New => ThreadInitializationMode::New,
InitialHistory::Forked(_) => ThreadInitializationMode::Forked,
InitialHistory::Resumed(_) => ThreadInitializationMode::Resumed,
}
}
fn local_time_context() -> (String, String) {
match iana_time_zone::get_timezone() {
Ok(timezone) => (Local::now().format("%Y-%m-%d").to_string(), timezone),
@@ -1620,6 +1628,8 @@ impl Session {
session_configuration.collaboration_mode.model(),
session_configuration.provider
);
session_configuration.thread_initialization_mode =
thread_initialization_mode(&initial_history);
let forked_from_id = initial_history.forked_from_id();
let (conversation_id, rollout_params) = match &initial_history {
+7
View File
@@ -15,6 +15,7 @@ use crate::mcp_tool_exposure::build_mcp_tool_exposure;
use crate::shell::default_user_shell;
use crate::tools::format_exec_output_str;
use codex_analytics::ThreadInitializationMode;
use codex_features::Features;
use codex_login::CodexAuth;
use codex_mcp::CODEX_APPS_MCP_SERVER_NAME;
@@ -1987,6 +1988,7 @@ async fn set_rate_limits_retains_previous_credits() {
app_server_client_name: None,
app_server_client_version: None,
session_source: SessionSource::Exec,
thread_initialization_mode: ThreadInitializationMode::New,
dynamic_tools: Vec::new(),
persist_extended_history: false,
inherited_shell_snapshot: None,
@@ -2089,6 +2091,7 @@ async fn set_rate_limits_updates_plan_type_when_present() {
app_server_client_name: None,
app_server_client_version: None,
session_source: SessionSource::Exec,
thread_initialization_mode: ThreadInitializationMode::New,
dynamic_tools: Vec::new(),
persist_extended_history: false,
inherited_shell_snapshot: None,
@@ -2438,6 +2441,7 @@ pub(crate) async fn make_session_configuration_for_tests() -> SessionConfigurati
app_server_client_name: None,
app_server_client_version: None,
session_source: SessionSource::Exec,
thread_initialization_mode: ThreadInitializationMode::New,
dynamic_tools: Vec::new(),
persist_extended_history: false,
inherited_shell_snapshot: None,
@@ -2701,6 +2705,7 @@ async fn session_new_fails_when_zsh_fork_enabled_without_zsh_path() {
app_server_client_name: None,
app_server_client_version: None,
session_source: SessionSource::Exec,
thread_initialization_mode: ThreadInitializationMode::New,
dynamic_tools: Vec::new(),
persist_extended_history: false,
inherited_shell_snapshot: None,
@@ -2805,6 +2810,7 @@ pub(crate) async fn make_session_and_context() -> (Session, TurnContext) {
app_server_client_name: None,
app_server_client_version: None,
session_source: SessionSource::Exec,
thread_initialization_mode: ThreadInitializationMode::New,
dynamic_tools: Vec::new(),
persist_extended_history: false,
inherited_shell_snapshot: None,
@@ -3650,6 +3656,7 @@ pub(crate) async fn make_session_and_context_with_dynamic_tools_and_rx(
app_server_client_name: None,
app_server_client_version: None,
session_source: SessionSource::Exec,
thread_initialization_mode: ThreadInitializationMode::New,
dynamic_tools,
persist_extended_history: false,
inherited_shell_snapshot: None,