Include originator in plugin measurement analytics (#42445)

## What changed

- Add `originator` to plugin measurement inputs and emitted analytics events.
- Populate it from the turn originator when recording plugin measurements.
- Extend analytics tests to verify the originator is preserved in event payloads.

GitOrigin-RevId: 9998f829760222fc690dc8a10324794b5da27220
This commit is contained in:
jwang-openai authored and copyberry committed 2026-09-03 04:38:26 +00:00
1 parent 498d40b29f
commit 36984da442
7 files changed
+13

No files matched your search

@@ -860,6 +860,7 @@ fn plugin_measurements(rows: Vec<PluginMeasurementRow>) -> PluginMeasurementsInp
thread_id: "thread-1".to_string(), thread_id: "thread-1".to_string(),
turn_id: "turn-1".to_string(), turn_id: "turn-1".to_string(),
item_id: "item-1".to_string(), item_id: "item-1".to_string(),
originator: "codex_cli_rs".to_string(),
plugin_id: "sample@openai-curated".to_string(), plugin_id: "sample@openai-curated".to_string(),
execution_id: "execution-1".to_string(), execution_id: "execution-1".to_string(),
operation: "security_scan".to_string(), operation: "security_scan".to_string(),
@@ -2796,6 +2797,7 @@ async fn plugin_measurement_batch_emits_directly_and_filters_invalid_rows() {
"execution_id": "execution-1", "execution_id": "execution-1",
"operation": "security_scan", "operation": "security_scan",
"measurement_name": "finding_count", "measurement_name": "finding_count",
"originator": "codex_cli_rs",
"number_value": 3.0, "number_value": 3.0,
"dimensions": {"severity": "high"}, "dimensions": {"severity": "high"},
}, },
@@ -2810,6 +2812,7 @@ async fn plugin_measurement_batch_emits_directly_and_filters_invalid_rows() {
"execution_id": "execution-1", "execution_id": "execution-1",
"operation": "security_scan", "operation": "security_scan",
"measurement_name": "files_scanned", "measurement_name": "files_scanned",
"originator": "codex_cli_rs",
"number_value": 17.0, "number_value": 17.0,
"dimensions": null, "dimensions": null,
}, },
+2
View File
@@ -424,6 +424,7 @@ async fn api_key_auth_sends_only_plugin_events_to_codex_backend() {
thread_id: thread_id.to_string(), thread_id: thread_id.to_string(),
turn_id: "turn-1".to_string(), turn_id: "turn-1".to_string(),
item_id: "item-1".to_string(), item_id: "item-1".to_string(),
originator: "codex_cli_rs".to_string(),
plugin_id: plugin_id.to_string(), plugin_id: plugin_id.to_string(),
execution_id: "execution-1".to_string(), execution_id: "execution-1".to_string(),
operation: "security_scan".to_string(), operation: "security_scan".to_string(),
@@ -706,6 +707,7 @@ fn track_plugin_measurements_rejects_unbounded_inputs_before_queueing() {
thread_id: "thread-1".to_string(), thread_id: "thread-1".to_string(),
turn_id: "turn-1".to_string(), turn_id: "turn-1".to_string(),
item_id: "item-1".to_string(), item_id: "item-1".to_string(),
originator: "codex_cli_rs".to_string(),
plugin_id: "sample@openai-curated".to_string(), plugin_id: "sample@openai-curated".to_string(),
execution_id: "execution-1".to_string(), execution_id: "execution-1".to_string(),
operation: "security_scan".to_string(), operation: "security_scan".to_string(),
+1
View File
@@ -778,6 +778,7 @@ pub(crate) struct CodexPluginMeasurementEventParams {
pub(crate) thread_id: String, pub(crate) thread_id: String,
pub(crate) turn_id: String, pub(crate) turn_id: String,
pub(crate) item_id: String, pub(crate) item_id: String,
pub(crate) originator: String,
pub(crate) plugin_id: String, pub(crate) plugin_id: String,
pub(crate) execution_id: String, pub(crate) execution_id: String,
pub(crate) operation: String, pub(crate) operation: String,
+1
View File
@@ -604,6 +604,7 @@ pub struct PluginMeasurementsInput {
pub thread_id: String, pub thread_id: String,
pub turn_id: String, pub turn_id: String,
pub item_id: String, pub item_id: String,
pub originator: String,
pub plugin_id: String, pub plugin_id: String,
pub execution_id: String, pub execution_id: String,
pub operation: String, pub operation: String,
+2
View File
@@ -2055,6 +2055,7 @@ impl AnalyticsReducer {
thread_id, thread_id,
turn_id, turn_id,
item_id, item_id,
originator,
plugin_id, plugin_id,
execution_id, execution_id,
operation, operation,
@@ -2070,6 +2071,7 @@ impl AnalyticsReducer {
thread_id: thread_id.clone(), thread_id: thread_id.clone(),
turn_id: turn_id.clone(), turn_id: turn_id.clone(),
item_id: item_id.clone(), item_id: item_id.clone(),
originator: originator.clone(),
plugin_id: plugin_id.clone(), plugin_id: plugin_id.clone(),
execution_id: execution_id.clone(), execution_id: execution_id.clone(),
operation: operation.clone(), operation: operation.clone(),
@@ -788,6 +788,7 @@ enabled = true
let thread_request = mcp let thread_request = mcp
.send_thread_start_request_with_auto_env(ThreadStartParams { .send_thread_start_request_with_auto_env(ThreadStartParams {
model: Some("mock-model".to_string()), model: Some("mock-model".to_string()),
service_name: Some("codex_work_desktop".to_string()),
..Default::default() ..Default::default()
}) })
.await?; .await?;
@@ -953,6 +954,7 @@ enabled = true
"measurement_name", "measurement_name",
"number_value", "number_value",
"operation", "operation",
"originator",
"plugin_id", "plugin_id",
"thread_id", "thread_id",
"turn_id", "turn_id",
@@ -960,6 +962,7 @@ enabled = true
); );
assert_eq!(event_params["thread_id"], thread_id); assert_eq!(event_params["thread_id"], thread_id);
assert_eq!(event_params["turn_id"], turn_id); assert_eq!(event_params["turn_id"], turn_id);
assert_eq!(event_params["originator"], "codex_work_desktop");
} }
Ok(()) Ok(())
+1
View File
@@ -49,6 +49,7 @@ pub(crate) async fn finish_and_track_measurements(
thread_id: session.thread_id().to_string(), thread_id: session.thread_id().to_string(),
turn_id: turn.sub_id.clone(), turn_id: turn.sub_id.clone(),
item_id: item_id.to_string(), item_id: item_id.to_string(),
originator: turn.originator.clone(),
plugin_id: batch.plugin_id, plugin_id: batch.plugin_id,
execution_id: batch.execution_id, execution_id: batch.execution_id,
operation: batch.operation, operation: batch.operation,