diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 20d94690c4..25d7643367 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -4454,6 +4454,7 @@ dependencies = [ "codex-login", "codex-model-provider", "codex-model-provider-info", + "codex-otel", "codex-protocol", "codex-tools", "http 1.4.0", diff --git a/codex-rs/ext/web-search/Cargo.toml b/codex-rs/ext/web-search/Cargo.toml index d9ea4b0260..84d5a8cad1 100644 --- a/codex-rs/ext/web-search/Cargo.toml +++ b/codex-rs/ext/web-search/Cargo.toml @@ -20,6 +20,7 @@ codex-extension-items = { workspace = true } codex-login = { workspace = true } codex-model-provider = { workspace = true } codex-model-provider-info = { workspace = true } +codex-otel = { workspace = true } codex-protocol = { workspace = true } codex-tools = { workspace = true } http = { workspace = true } diff --git a/codex-rs/ext/web-search/src/tool.rs b/codex-rs/ext/web-search/src/tool.rs index 127be6854c..9b7924b09d 100644 --- a/codex-rs/ext/web-search/src/tool.rs +++ b/codex-rs/ext/web-search/src/tool.rs @@ -40,6 +40,7 @@ use crate::schema::commands_schema; pub(crate) const WEB_NAMESPACE: &str = "web"; pub(crate) const RUN_TOOL_NAME: &str = "run"; const WEB_RUN_DESCRIPTION: &str = include_str!("../web_run_description.md"); +const RESULTS_PAYLOAD_BYTES_METRIC: &str = "codex.web_search.results.payload_bytes"; pub(crate) struct WebSearchTool { pub(crate) session_id: String, @@ -140,6 +141,13 @@ impl WebSearchTool { .map_err(|err| FunctionCallError::Fatal(err.to_string()))?; let output = response.output; let results = response.results; + if let Some(results) = results.as_ref() + && let Some(metrics) = codex_otel::global() + && let Ok(payload) = serde_json::to_vec(results) + { + let payload_bytes = i64::try_from(payload.len()).unwrap_or(i64::MAX); + let _ = metrics.histogram(RESULTS_PAYLOAD_BYTES_METRIC, payload_bytes, &[]); + } let legacy_action = match &command_action { WebSearchAction::Search { query, queries } => CoreWebSearchAction::Search { query: query.clone(),