From 0ac94f835be7e44c95e8aab4acf4b107d93827b5 Mon Sep 17 00:00:00 2001 From: Fabian Schindler Date: Wed, 8 Apr 2026 16:08:51 +0200 Subject: [PATCH 1/8] feat(event-normalization): add `gen_ai.input.messages` and `gen_ai.output.messages` as distinct fields for SpanData --- relay-event-schema/src/protocol/span.rs | 10 ++++++++++ relay-event-schema/src/protocol/span/convert.rs | 2 ++ 2 files changed, 12 insertions(+) diff --git a/relay-event-schema/src/protocol/span.rs b/relay-event-schema/src/protocol/span.rs index 18ec5b848a..ce353e5ee5 100644 --- a/relay-event-schema/src/protocol/span.rs +++ b/relay-event-schema/src/protocol/span.rs @@ -700,6 +700,14 @@ pub struct SpanData { #[metastructure(field = "gen_ai.function_id", pii = "maybe")] pub gen_ai_function_id: Annotated, + /// The input messages to the model call. + #[metastructure(field = "gen_ai.input.messages", pii = "maybe")] + pub gen_ai_input_messages: Annotated, + + /// The output messages from the model call. + #[metastructure(field = "gen_ai.output.messages", pii = "maybe")] + pub gen_ai_output_messages: Annotated, + /// The result of the MCP prompt. #[metastructure(field = "mcp.prompt.result", pii = "maybe")] pub mcp_prompt_result: Annotated, @@ -1529,6 +1537,8 @@ mod tests { gen_ai_operation_type: ~, gen_ai_agent_name: ~, gen_ai_function_id: ~, + gen_ai_input_messages: ~, + gen_ai_output_messages: ~, mcp_prompt_result: ~, mcp_tool_result_content: ~, browser_name: ~, diff --git a/relay-event-schema/src/protocol/span/convert.rs b/relay-event-schema/src/protocol/span/convert.rs index 8f314a45b9..cb2aed0f2e 100644 --- a/relay-event-schema/src/protocol/span/convert.rs +++ b/relay-event-schema/src/protocol/span/convert.rs @@ -197,6 +197,8 @@ mod tests { gen_ai_operation_type: ~, gen_ai_agent_name: ~, gen_ai_function_id: ~, + gen_ai_input_messages: ~, + gen_ai_output_messages: ~, mcp_prompt_result: ~, mcp_tool_result_content: ~, browser_name: "Chrome", From 28ec8906712dba2b73955f3afd5c96301d6ba7ba Mon Sep 17 00:00:00 2001 From: Fabian Schindler Date: Wed, 8 Apr 2026 16:13:10 +0200 Subject: [PATCH 2/8] chore: add changelog line --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1790d1b5d9..bf4fdae81a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ - Allow configuring Objectstore client auth parameters. ([#5720](https://github.com/getsentry/relay/pull/5720)) - Metric size limit per metric default changed to 1mib. ([#5779](https://github.com/getsentry/relay/pull/5779)) - Use `gen_ai.function_id` as a fallback for `gen_ai.agent.name`. ([#5776](https://github.com/getsentry/relay/pull/5776)) +- Add `gen_ai.input.messages` and `gen_ai.output.messages` as distinct fields for SpanData. ([#5797](https://github.com/getsentry/relay/pull/5797)) **Internal**: From 82f5b93afd5365473087a4a126e6c6349ba4bdc0 Mon Sep 17 00:00:00 2001 From: Fabian Schindler Date: Wed, 8 Apr 2026 16:22:04 +0200 Subject: [PATCH 3/8] fix: add getters for the attributes --- relay-event-schema/src/protocol/span.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/relay-event-schema/src/protocol/span.rs b/relay-event-schema/src/protocol/span.rs index ce353e5ee5..84b540e301 100644 --- a/relay-event-schema/src/protocol/span.rs +++ b/relay-event-schema/src/protocol/span.rs @@ -1039,6 +1039,8 @@ impl Getter for SpanData { "gen_ai\\.cost\\.total_tokens" => self.gen_ai_cost_total_tokens.value()?.into(), "gen_ai\\.cost\\.input_tokens" => self.gen_ai_cost_input_tokens.value()?.into(), "gen_ai\\.cost\\.output_tokens" => self.gen_ai_cost_output_tokens.value()?.into(), + "gen_ai\\.input\\.messages" => self.gen_ai_input_messages.value()?.into(), + "gen_ai\\.output\\.messages" => self.gen_ai_output_messages.value()?.into(), "http\\.decoded_response_content_length" => { self.http_decoded_response_content_length.value()?.into() } From 2b47cbca50402165be9376e2bb591c4b9b231f42 Mon Sep 17 00:00:00 2001 From: Fabian Schindler Date: Wed, 8 Apr 2026 16:28:11 +0200 Subject: [PATCH 4/8] fix: add gen_ai.input.messages and gen_ai.output.messages to the REPLACE_ONLY_SELECTOR --- relay-pii/src/convert.rs | 14 +++++++++----- ...__convert__tests__regression_more_odd_keys.snap | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/relay-pii/src/convert.rs b/relay-pii/src/convert.rs index f19f11bdb5..a0a523d665 100644 --- a/relay-pii/src/convert.rs +++ b/relay-pii/src/convert.rs @@ -101,6 +101,10 @@ static REPLACE_ONLY_SELECTOR: LazyLock = LazyLock::new(|| { "attributes.'gen_ai.request.available_tools'.value", "$span.data.'gen_ai.tool.name'", "attributes.'gen_ai.tool.name'.value", + "$span.data.'gen_ai.input.messages'", + "attributes.'gen_ai.input.messages'.value", + "$span.data.'gen_ai.output.messages'", + "attributes.'gen_ai.output.messages'.value", "$span.data.'mcp.prompt.result'", "attributes.'mcp.prompt.result'.value", "$span.data.'mcp.tool.result.content'", @@ -358,7 +362,7 @@ THd+9FBxiHLGXNKhG/FRSyREXEt+NyYIf/0cyByc9tNksat794ddUqnLOg0vwSkv "$http.env.REMOTE_ADDR || $user.ip_address || $sdk.client_ip || $span.sentry_tags.'user.ip'": [ "@anything:remove" ], - "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ + "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ "@email:replace", "@creditcard:replace", "@iban:replace", @@ -390,7 +394,7 @@ THd+9FBxiHLGXNKhG/FRSyREXEt+NyYIf/0cyByc9tNksat794ddUqnLOg0vwSkv "$http.env.REMOTE_ADDR || $user.ip_address || $sdk.client_ip || $span.sentry_tags.'user.ip'": [ "@anything:remove" ], - "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ + "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ "@email:replace", "@creditcard:replace", "@iban:replace", @@ -433,7 +437,7 @@ THd+9FBxiHLGXNKhG/FRSyREXEt+NyYIf/0cyByc9tNksat794ddUqnLOg0vwSkv "$http.env.REMOTE_ADDR || $user.ip_address || $sdk.client_ip || $span.sentry_tags.'user.ip'": [ "@anything:remove" ], - "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ + "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ "@email:replace", "@creditcard:replace", "@iban:replace", @@ -465,7 +469,7 @@ THd+9FBxiHLGXNKhG/FRSyREXEt+NyYIf/0cyByc9tNksat794ddUqnLOg0vwSkv "$http.env.REMOTE_ADDR || $user.ip_address || $sdk.client_ip || $span.sentry_tags.'user.ip'": [ "@anything:remove" ], - "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ + "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ "@email:replace", "@creditcard:replace", "@iban:replace", @@ -1386,7 +1390,7 @@ THd+9FBxiHLGXNKhG/FRSyREXEt+NyYIf/0cyByc9tNksat794ddUqnLOg0vwSkv "$http.env.REMOTE_ADDR || $user.ip_address || $sdk.client_ip || $span.sentry_tags.'user.ip'": [ "@anything:remove" ], - "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ + "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ "@email:replace", "@creditcard:replace", "@iban:replace", diff --git a/relay-pii/src/snapshots/relay_pii__convert__tests__regression_more_odd_keys.snap b/relay-pii/src/snapshots/relay_pii__convert__tests__regression_more_odd_keys.snap index 5fdca03803..94f444fc7f 100644 --- a/relay-pii/src/snapshots/relay_pii__convert__tests__regression_more_odd_keys.snap +++ b/relay-pii/src/snapshots/relay_pii__convert__tests__regression_more_odd_keys.snap @@ -11,7 +11,7 @@ expression: pii_config "$http.env.REMOTE_ADDR || $user.ip_address || $sdk.client_ip || $span.sentry_tags.'user.ip'": [ "@anything:remove" ], - "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ + "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ "@email:replace", "@creditcard:replace", "@iban:replace", From b8ff0e4c8884c8ea2cf842778dbb8332a164c906 Mon Sep 17 00:00:00 2001 From: Fabian Schindler Date: Wed, 8 Apr 2026 16:34:10 +0200 Subject: [PATCH 5/8] feat(event-schema): updating `gen_ai` attributes --- relay-conventions/src/consts.rs | 2 +- relay-event-schema/src/protocol/span.rs | 91 ++++++++----------- .../src/protocol/span/convert.rs | 18 ++-- relay-pii/src/convert.rs | 35 ++++--- ...vert__tests__regression_more_odd_keys.snap | 2 +- relay-spans/src/v2_to_v1.rs | 5 +- 6 files changed, 69 insertions(+), 84 deletions(-) diff --git a/relay-conventions/src/consts.rs b/relay-conventions/src/consts.rs index 575d967101..74e3eb05bb 100644 --- a/relay-conventions/src/consts.rs +++ b/relay-conventions/src/consts.rs @@ -42,7 +42,7 @@ convention_attributes!( GEN_AI_REQUEST_MODEL => "gen_ai.request.model", GEN_AI_RESPONSE_MODEL => "gen_ai.response.model", GEN_AI_RESPONSE_TPS => "gen_ai.response.tokens_per_second", - GEN_AI_SYSTEM => "gen_ai.system", + GEN_AI_PROVIDER_NAME => "gen_ai.provider.name", GEN_AI_USAGE_INPUT_CACHED_TOKENS => "gen_ai.usage.input_tokens.cached", GEN_AI_USAGE_INPUT_CACHE_WRITE_TOKENS => "gen_ai.usage.input_tokens.cache_write", GEN_AI_USAGE_INPUT_TOKENS => "gen_ai.usage.input_tokens", diff --git a/relay-event-schema/src/protocol/span.rs b/relay-event-schema/src/protocol/span.rs index 84b540e301..220b8f804f 100644 --- a/relay-event-schema/src/protocol/span.rs +++ b/relay-event-schema/src/protocol/span.rs @@ -553,51 +553,46 @@ pub struct SpanData { #[metastructure(field = "gen_ai.cost.output_tokens", pii = "maybe")] pub gen_ai_cost_output_tokens: Annotated, - /// Prompt passed to LLM (Vercel AI SDK) - #[metastructure(field = "gen_ai.prompt", pii = "maybe")] - pub gen_ai_prompt: Annotated, - - /// Prompt passed to LLM + /// The input messages to the model call. #[metastructure( - field = "gen_ai.request.messages", + field = "gen_ai.input.messages", pii = "maybe", + legacy_alias = "gen_ai.prompt", + legacy_alias = "gen_ai.request.messages", legacy_alias = "ai.prompt.messages" )] - pub gen_ai_request_messages: Annotated, + pub gen_ai_input_messages: Annotated, - /// Tool call arguments + /// Tool call arguments. #[metastructure( - field = "gen_ai.tool.input", + field = "gen_ai.tool.call.arguments", pii = "maybe", + legacy_alias = "gen_ai.tool.input", legacy_alias = "ai.toolCall.args" )] - pub gen_ai_tool_input: Annotated, + pub gen_ai_tool_call_arguments: Annotated, - /// Tool call result + /// Tool call result. #[metastructure( - field = "gen_ai.tool.output", + field = "gen_ai.tool.call.result", pii = "maybe", + legacy_alias = "gen_ai.tool.output", legacy_alias = "ai.toolCall.result" )] - pub gen_ai_tool_output: Annotated, + pub gen_ai_tool_call_result: Annotated, - /// LLM decisions to use tools + /// The output messages from the model call. #[metastructure( - field = "gen_ai.response.tool_calls", + field = "gen_ai.output.messages", + legacy_alias = "gen_ai.response.tool_calls", legacy_alias = "ai.response.toolCalls", legacy_alias = "ai.tool_calls", - pii = "maybe" - )] - pub gen_ai_response_tool_calls: Annotated, - - /// LLM response text (Vercel AI, generateText) - #[metastructure( - field = "gen_ai.response.text", + legacy_alias = "gen_ai.response.text", legacy_alias = "ai.response.text", legacy_alias = "ai.responses", pii = "maybe" )] - pub gen_ai_response_text: Annotated, + pub gen_ai_output_messages: Annotated, /// LLM response object (Vercel AI, generateObject) #[metastructure(field = "gen_ai.response.object", pii = "maybe")] @@ -615,13 +610,14 @@ pub struct SpanData { #[metastructure(field = "gen_ai.response.time_to_first_token", pii = "maybe")] pub gen_ai_response_time_to_first_token: Annotated, - /// The available tools for a request to an LLM + /// The tool definitions available for a request to an LLM. #[metastructure( - field = "gen_ai.request.available_tools", + field = "gen_ai.tool.definitions", + legacy_alias = "gen_ai.request.available_tools", legacy_alias = "ai.tools", pii = "maybe" )] - pub gen_ai_request_available_tools: Annotated, + pub gen_ai_tool_definitions: Annotated, /// The frequency penalty for a request to an LLM #[metastructure( @@ -653,20 +649,25 @@ pub struct SpanData { #[metastructure(field = "gen_ai.request.top_p", legacy_alias = "ai.top_p")] pub gen_ai_request_top_p: Annotated, - /// The finish reason for a response from an LLM + /// The finish reasons for a response from an LLM. #[metastructure( - field = "gen_ai.response.finish_reason", + field = "gen_ai.response.finish_reasons", + legacy_alias = "gen_ai.response.finish_reason", legacy_alias = "ai.finish_reason" )] - pub gen_ai_response_finish_reason: Annotated, + pub gen_ai_response_finish_reasons: Annotated, /// The unique identifier for a response from an LLM #[metastructure(field = "gen_ai.response.id", legacy_alias = "ai.generation_id")] pub gen_ai_response_id: Annotated, - /// The GenAI system identifier - #[metastructure(field = "gen_ai.system", legacy_alias = "ai.model.provider")] - pub gen_ai_system: Annotated, + /// The GenAI provider name. + #[metastructure( + field = "gen_ai.provider.name", + legacy_alias = "gen_ai.system", + legacy_alias = "ai.model.provider" + )] + pub gen_ai_provider_name: Annotated, /// The system instructions passed to the model. #[metastructure( @@ -700,14 +701,6 @@ pub struct SpanData { #[metastructure(field = "gen_ai.function_id", pii = "maybe")] pub gen_ai_function_id: Annotated, - /// The input messages to the model call. - #[metastructure(field = "gen_ai.input.messages", pii = "maybe")] - pub gen_ai_input_messages: Annotated, - - /// The output messages from the model call. - #[metastructure(field = "gen_ai.output.messages", pii = "maybe")] - pub gen_ai_output_messages: Annotated, - /// The result of the MCP prompt. #[metastructure(field = "mcp.prompt.result", pii = "maybe")] pub mcp_prompt_result: Annotated, @@ -1513,34 +1506,30 @@ mod tests { gen_ai_cost_total_tokens: ~, gen_ai_cost_input_tokens: ~, gen_ai_cost_output_tokens: ~, - gen_ai_prompt: ~, - gen_ai_request_messages: ~, - gen_ai_tool_input: ~, - gen_ai_tool_output: ~, - gen_ai_response_tool_calls: ~, - gen_ai_response_text: ~, + gen_ai_input_messages: ~, + gen_ai_tool_call_arguments: ~, + gen_ai_tool_call_result: ~, + gen_ai_output_messages: ~, gen_ai_response_object: ~, gen_ai_response_streaming: ~, gen_ai_response_tokens_per_second: ~, gen_ai_response_time_to_first_token: ~, - gen_ai_request_available_tools: ~, + gen_ai_tool_definitions: ~, gen_ai_request_frequency_penalty: ~, gen_ai_request_presence_penalty: ~, gen_ai_request_seed: ~, gen_ai_request_temperature: ~, gen_ai_request_top_k: ~, gen_ai_request_top_p: ~, - gen_ai_response_finish_reason: ~, + gen_ai_response_finish_reasons: ~, gen_ai_response_id: ~, - gen_ai_system: ~, + gen_ai_provider_name: ~, gen_ai_system_instructions: ~, gen_ai_tool_name: ~, gen_ai_operation_name: ~, gen_ai_operation_type: ~, gen_ai_agent_name: ~, gen_ai_function_id: ~, - gen_ai_input_messages: ~, - gen_ai_output_messages: ~, mcp_prompt_result: ~, mcp_tool_result_content: ~, browser_name: ~, diff --git a/relay-event-schema/src/protocol/span/convert.rs b/relay-event-schema/src/protocol/span/convert.rs index cb2aed0f2e..1eafe26608 100644 --- a/relay-event-schema/src/protocol/span/convert.rs +++ b/relay-event-schema/src/protocol/span/convert.rs @@ -171,34 +171,30 @@ mod tests { gen_ai_cost_total_tokens: ~, gen_ai_cost_input_tokens: ~, gen_ai_cost_output_tokens: ~, - gen_ai_prompt: ~, - gen_ai_request_messages: ~, - gen_ai_tool_input: ~, - gen_ai_tool_output: ~, - gen_ai_response_tool_calls: ~, - gen_ai_response_text: ~, + gen_ai_input_messages: ~, + gen_ai_tool_call_arguments: ~, + gen_ai_tool_call_result: ~, + gen_ai_output_messages: ~, gen_ai_response_object: ~, gen_ai_response_streaming: ~, gen_ai_response_tokens_per_second: ~, gen_ai_response_time_to_first_token: ~, - gen_ai_request_available_tools: ~, + gen_ai_tool_definitions: ~, gen_ai_request_frequency_penalty: ~, gen_ai_request_presence_penalty: ~, gen_ai_request_seed: ~, gen_ai_request_temperature: ~, gen_ai_request_top_k: ~, gen_ai_request_top_p: ~, - gen_ai_response_finish_reason: ~, + gen_ai_response_finish_reasons: ~, gen_ai_response_id: ~, - gen_ai_system: ~, + gen_ai_provider_name: ~, gen_ai_system_instructions: ~, gen_ai_tool_name: ~, gen_ai_operation_name: ~, gen_ai_operation_type: ~, gen_ai_agent_name: ~, gen_ai_function_id: ~, - gen_ai_input_messages: ~, - gen_ai_output_messages: ~, mcp_prompt_result: ~, mcp_tool_result_content: ~, browser_name: "Chrome", diff --git a/relay-pii/src/convert.rs b/relay-pii/src/convert.rs index a0a523d665..6a8a74ef1b 100644 --- a/relay-pii/src/convert.rs +++ b/relay-pii/src/convert.rs @@ -83,28 +83,27 @@ static REPLACE_ONLY_SELECTOR: LazyLock = LazyLock::new(|| { [ "$logentry.formatted", "$log.body", - "$span.data.'gen_ai.prompt'", + "$span.data.'gen_ai.input.messages'", + "attributes.'gen_ai.input.messages'.value", "attributes.'gen_ai.prompt'.value", - "$span.data.'gen_ai.request.messages'", "attributes.'gen_ai.request.messages'.value", - "$span.data.'gen_ai.tool.input'", + "$span.data.'gen_ai.tool.call.arguments'", + "attributes.'gen_ai.tool.call.arguments'.value", "attributes.'gen_ai.tool.input'.value", - "$span.data.'gen_ai.tool.output'", + "$span.data.'gen_ai.tool.call.result'", + "attributes.'gen_ai.tool.call.result'.value", "attributes.'gen_ai.tool.output'.value", - "$span.data.'gen_ai.response.tool_calls'", + "$span.data.'gen_ai.output.messages'", + "attributes.'gen_ai.output.messages'.value", "attributes.'gen_ai.response.tool_calls'.value", - "$span.data.'gen_ai.response.text'", "attributes.'gen_ai.response.text'.value", "$span.data.'gen_ai.response.object'", "attributes.'gen_ai.response.object'.value", - "$span.data.'gen_ai.request.available_tools'", + "$span.data.'gen_ai.tool.definitions'", + "attributes.'gen_ai.tool.definitions'.value", "attributes.'gen_ai.request.available_tools'.value", "$span.data.'gen_ai.tool.name'", "attributes.'gen_ai.tool.name'.value", - "$span.data.'gen_ai.input.messages'", - "attributes.'gen_ai.input.messages'.value", - "$span.data.'gen_ai.output.messages'", - "attributes.'gen_ai.output.messages'.value", "$span.data.'mcp.prompt.result'", "attributes.'mcp.prompt.result'.value", "$span.data.'mcp.tool.result.content'", @@ -362,7 +361,7 @@ THd+9FBxiHLGXNKhG/FRSyREXEt+NyYIf/0cyByc9tNksat794ddUqnLOg0vwSkv "$http.env.REMOTE_ADDR || $user.ip_address || $sdk.client_ip || $span.sentry_tags.'user.ip'": [ "@anything:remove" ], - "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ + "$logentry.formatted || $log.body || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || attributes.'gen_ai.prompt'.value || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.call.arguments' || attributes.'gen_ai.tool.call.arguments'.value || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.call.result' || attributes.'gen_ai.tool.call.result'.value || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || attributes.'gen_ai.response.tool_calls'.value || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.tool.definitions' || attributes.'gen_ai.tool.definitions'.value || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ "@email:replace", "@creditcard:replace", "@iban:replace", @@ -394,7 +393,7 @@ THd+9FBxiHLGXNKhG/FRSyREXEt+NyYIf/0cyByc9tNksat794ddUqnLOg0vwSkv "$http.env.REMOTE_ADDR || $user.ip_address || $sdk.client_ip || $span.sentry_tags.'user.ip'": [ "@anything:remove" ], - "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ + "$logentry.formatted || $log.body || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || attributes.'gen_ai.prompt'.value || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.call.arguments' || attributes.'gen_ai.tool.call.arguments'.value || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.call.result' || attributes.'gen_ai.tool.call.result'.value || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || attributes.'gen_ai.response.tool_calls'.value || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.tool.definitions' || attributes.'gen_ai.tool.definitions'.value || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ "@email:replace", "@creditcard:replace", "@iban:replace", @@ -437,7 +436,7 @@ THd+9FBxiHLGXNKhG/FRSyREXEt+NyYIf/0cyByc9tNksat794ddUqnLOg0vwSkv "$http.env.REMOTE_ADDR || $user.ip_address || $sdk.client_ip || $span.sentry_tags.'user.ip'": [ "@anything:remove" ], - "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ + "$logentry.formatted || $log.body || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || attributes.'gen_ai.prompt'.value || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.call.arguments' || attributes.'gen_ai.tool.call.arguments'.value || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.call.result' || attributes.'gen_ai.tool.call.result'.value || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || attributes.'gen_ai.response.tool_calls'.value || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.tool.definitions' || attributes.'gen_ai.tool.definitions'.value || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ "@email:replace", "@creditcard:replace", "@iban:replace", @@ -469,7 +468,7 @@ THd+9FBxiHLGXNKhG/FRSyREXEt+NyYIf/0cyByc9tNksat794ddUqnLOg0vwSkv "$http.env.REMOTE_ADDR || $user.ip_address || $sdk.client_ip || $span.sentry_tags.'user.ip'": [ "@anything:remove" ], - "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ + "$logentry.formatted || $log.body || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || attributes.'gen_ai.prompt'.value || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.call.arguments' || attributes.'gen_ai.tool.call.arguments'.value || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.call.result' || attributes.'gen_ai.tool.call.result'.value || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || attributes.'gen_ai.response.tool_calls'.value || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.tool.definitions' || attributes.'gen_ai.tool.definitions'.value || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ "@email:replace", "@creditcard:replace", "@iban:replace", @@ -1390,7 +1389,7 @@ THd+9FBxiHLGXNKhG/FRSyREXEt+NyYIf/0cyByc9tNksat794ddUqnLOg0vwSkv "$http.env.REMOTE_ADDR || $user.ip_address || $sdk.client_ip || $span.sentry_tags.'user.ip'": [ "@anything:remove" ], - "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ + "$logentry.formatted || $log.body || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || attributes.'gen_ai.prompt'.value || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.call.arguments' || attributes.'gen_ai.tool.call.arguments'.value || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.call.result' || attributes.'gen_ai.tool.call.result'.value || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || attributes.'gen_ai.response.tool_calls'.value || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.tool.definitions' || attributes.'gen_ai.tool.definitions'.value || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ "@email:replace", "@creditcard:replace", "@iban:replace", @@ -1992,7 +1991,7 @@ THd+9FBxiHLGXNKhG/FRSyREXEt+NyYIf/0cyByc9tNksat794ddUqnLOg0vwSkv "spans": [ { "data": { - "gen_ai.prompt": "Buy me a drink with my creditcard [creditcard]" + "gen_ai.input.messages": "Buy me a drink with my creditcard [creditcard]" } } ], @@ -2000,7 +1999,7 @@ THd+9FBxiHLGXNKhG/FRSyREXEt+NyYIf/0cyByc9tNksat794ddUqnLOg0vwSkv "spans": { "0": { "data": { - "gen_ai.prompt": { + "gen_ai.input.messages": { "": { "rem": [ [ diff --git a/relay-pii/src/snapshots/relay_pii__convert__tests__regression_more_odd_keys.snap b/relay-pii/src/snapshots/relay_pii__convert__tests__regression_more_odd_keys.snap index 94f444fc7f..cd56a88440 100644 --- a/relay-pii/src/snapshots/relay_pii__convert__tests__regression_more_odd_keys.snap +++ b/relay-pii/src/snapshots/relay_pii__convert__tests__regression_more_odd_keys.snap @@ -11,7 +11,7 @@ expression: pii_config "$http.env.REMOTE_ADDR || $user.ip_address || $sdk.client_ip || $span.sentry_tags.'user.ip'": [ "@anything:remove" ], - "$logentry.formatted || $log.body || $span.data.'gen_ai.prompt' || attributes.'gen_ai.prompt'.value || $span.data.'gen_ai.request.messages' || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.input' || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.output' || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.response.tool_calls' || attributes.'gen_ai.response.tool_calls'.value || $span.data.'gen_ai.response.text' || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.request.available_tools' || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ + "$logentry.formatted || $log.body || $span.data.'gen_ai.input.messages' || attributes.'gen_ai.input.messages'.value || attributes.'gen_ai.prompt'.value || attributes.'gen_ai.request.messages'.value || $span.data.'gen_ai.tool.call.arguments' || attributes.'gen_ai.tool.call.arguments'.value || attributes.'gen_ai.tool.input'.value || $span.data.'gen_ai.tool.call.result' || attributes.'gen_ai.tool.call.result'.value || attributes.'gen_ai.tool.output'.value || $span.data.'gen_ai.output.messages' || attributes.'gen_ai.output.messages'.value || attributes.'gen_ai.response.tool_calls'.value || attributes.'gen_ai.response.text'.value || $span.data.'gen_ai.response.object' || attributes.'gen_ai.response.object'.value || $span.data.'gen_ai.tool.definitions' || attributes.'gen_ai.tool.definitions'.value || attributes.'gen_ai.request.available_tools'.value || $span.data.'gen_ai.tool.name' || attributes.'gen_ai.tool.name'.value || $span.data.'mcp.prompt.result' || attributes.'mcp.prompt.result'.value || $span.data.'mcp.tool.result.content' || attributes.'mcp.tool.result.content'.value": [ "@email:replace", "@creditcard:replace", "@iban:replace", diff --git a/relay-spans/src/v2_to_v1.rs b/relay-spans/src/v2_to_v1.rs index cb0f566da1..d712b2eb97 100644 --- a/relay-spans/src/v2_to_v1.rs +++ b/relay-spans/src/v2_to_v1.rs @@ -252,7 +252,8 @@ pub fn derive_op_for_v2_span(attributes: &Annotated) -> String { return String::from("db"); } - if attributes.contains_key(GEN_AI_SYSTEM) { + // TODO: `gen_ai.system` is deprecated. This should probably be taken care of during normalization. + if attributes.contains_key(GEN_AI_PROVIDER_NAME) || attributes.contains_key("gen_ai.system") { return String::from("gen_ai"); } @@ -1019,7 +1020,7 @@ mod tests { "trace_id": "89143b0763095bd9c9955e8175d1fb23", "status": "unknown", "data": { - "gen_ai.system": "openai", + "gen_ai.provider.name": "openai", "gen_ai.agent.name": "Seer" }, "kind": "client" From 1a27bf0d14f78b7a26e3a1762e1d3834967dbb3d Mon Sep 17 00:00:00 2001 From: Fabian Schindler Date: Wed, 8 Apr 2026 16:37:02 +0200 Subject: [PATCH 6/8] chore: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf4fdae81a..f334709bee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ - Metric size limit per metric default changed to 1mib. ([#5779](https://github.com/getsentry/relay/pull/5779)) - Use `gen_ai.function_id` as a fallback for `gen_ai.agent.name`. ([#5776](https://github.com/getsentry/relay/pull/5776)) - Add `gen_ai.input.messages` and `gen_ai.output.messages` as distinct fields for SpanData. ([#5797](https://github.com/getsentry/relay/pull/5797)) +- Update several `gen_ai` attributes to their latest representation. ([#5798](https://github.com/getsentry/relay/pull/5798)) **Internal**: From 5e1b631d6e6f83957b84fef726ff50eeb9d0cced Mon Sep 17 00:00:00 2001 From: Fabian Schindler Date: Thu, 9 Apr 2026 09:49:08 +0200 Subject: [PATCH 7/8] test: fixing integration tests gen_ai attributes --- tests/integration/test_ai.py | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/tests/integration/test_ai.py b/tests/integration/test_ai.py index 51c765a3ea..d355c06c1a 100644 --- a/tests/integration/test_ai.py +++ b/tests/integration/test_ai.py @@ -393,9 +393,9 @@ def test_ai_spans_example_transaction( "gen_ai.agent.name": {"type": "string", "value": "weather-chat"}, "gen_ai.function_id": {"type": "string", "value": "weather-chat"}, "gen_ai.operation.type": {"type": "string", "value": "agent"}, - "gen_ai.prompt": {"type": "string", "value": "Weather Prompt"}, + "gen_ai.input.messages": {"type": "string", "value": "Weather Prompt"}, "gen_ai.response.model": {"type": "string", "value": "gpt-4o"}, - "gen_ai.response.text": { + "gen_ai.output.messages": { "type": "string", "value": "True. \n\n- London: 61°F \n- San Francisco: 13°C", }, @@ -482,11 +482,11 @@ def test_ai_spans_example_transaction( "gen_ai.agent.name": {"type": "string", "value": "weather-chat"}, "gen_ai.function_id": {"type": "string", "value": "weather-chat"}, "gen_ai.operation.type": {"type": "string", "value": "ai_client"}, - "gen_ai.request.available_tools": { + "gen_ai.tool.definitions": { "type": "string", "value": '["tools1"]', }, - "gen_ai.request.messages": { + "gen_ai.input.messages": { "type": "string", "value": "Another weather prompt", }, @@ -504,11 +504,11 @@ def test_ai_spans_example_transaction( "value": "gpt-4o-2024-08-06", }, "gen_ai.response.tokens_per_second": {"type": "double", "value": 92.0}, - "gen_ai.response.tool_calls": { + "gen_ai.output.messages": { "type": "string", "value": "some_tool_calls", }, - "gen_ai.system": {"type": "string", "value": "openai.responses"}, + "gen_ai.provider.name": {"type": "string", "value": "openai.responses"}, "gen_ai.usage.input_tokens": {"type": "integer", "value": 37}, "gen_ai.usage.output_tokens": {"type": "integer", "value": 46}, "gen_ai.usage.total_tokens": {"type": "integer", "value": 83}, @@ -684,12 +684,12 @@ def test_ai_spans_example_transaction( "type": "string", "value": "call_jRcFbOh5zNVeV2l2mEqpRiI4", }, - "gen_ai.tool.input": { + "gen_ai.tool.call.arguments": { "type": "string", "value": '{"city":"San Francisco"}', }, "gen_ai.tool.name": {"type": "string", "value": "getWeather"}, - "gen_ai.tool.output": { + "gen_ai.tool.call.result": { "type": "string", "value": '{"location":"San Francisco, ' "United States of " @@ -826,9 +826,12 @@ def test_ai_spans_example_transaction( "type": "string", "value": "call_yXdgMJXsotHOn19VdlDjrc7c", }, - "gen_ai.tool.input": {"type": "string", "value": '{"city":"London"}'}, + "gen_ai.tool.call.arguments": { + "type": "string", + "value": '{"city":"London"}', + }, "gen_ai.tool.name": {"type": "string", "value": "getWeather"}, - "gen_ai.tool.output": { + "gen_ai.tool.call.result": { "type": "string", "value": '{"location":"London, United ' 'Kingdom","temperature":"16°C ' @@ -971,11 +974,11 @@ def test_ai_spans_example_transaction( "gen_ai.agent.name": {"type": "string", "value": "weather-chat"}, "gen_ai.function_id": {"type": "string", "value": "weather-chat"}, "gen_ai.operation.type": {"type": "string", "value": "ai_client"}, - "gen_ai.request.available_tools": { + "gen_ai.tool.definitions": { "type": "string", "value": '["tool_1"]', }, - "gen_ai.request.messages": { + "gen_ai.input.messages": { "type": "string", "value": "Some AI Prompt about " "the Wheather", }, @@ -992,7 +995,7 @@ def test_ai_spans_example_transaction( "type": "string", "value": "gpt-4o-2024-08-06", }, - "gen_ai.response.text": { + "gen_ai.output.messages": { "type": "string", "value": "True. \n" "\n" @@ -1000,7 +1003,7 @@ def test_ai_spans_example_transaction( "- San Francisco: 13°C", }, "gen_ai.response.tokens_per_second": {"type": "double", "value": 38.0}, - "gen_ai.system": {"type": "string", "value": "openai.responses"}, + "gen_ai.provider.name": {"type": "string", "value": "openai.responses"}, "gen_ai.usage.input_tokens": {"type": "integer", "value": 208}, "gen_ai.usage.output_tokens": {"type": "integer", "value": 19}, "gen_ai.usage.total_tokens": {"type": "integer", "value": 227}, From 369e6a97c3f0f3a857ab7295a0edffcc8d325a56 Mon Sep 17 00:00:00 2001 From: Fabian Schindler Date: Thu, 9 Apr 2026 10:12:57 +0200 Subject: [PATCH 8/8] fix: merge cleanup --- relay-event-schema/src/protocol/span.rs | 10 ---------- relay-event-schema/src/protocol/span/convert.rs | 2 -- relay-pii/src/convert.rs | 4 ---- 3 files changed, 16 deletions(-) diff --git a/relay-event-schema/src/protocol/span.rs b/relay-event-schema/src/protocol/span.rs index 9e26f9b114..a22ef06f4e 100644 --- a/relay-event-schema/src/protocol/span.rs +++ b/relay-event-schema/src/protocol/span.rs @@ -701,14 +701,6 @@ pub struct SpanData { #[metastructure(field = "gen_ai.function_id", pii = "maybe")] pub gen_ai_function_id: Annotated, - /// The input messages to the model call. - #[metastructure(field = "gen_ai.input.messages", pii = "maybe")] - pub gen_ai_input_messages: Annotated, - - /// The output messages from the model call. - #[metastructure(field = "gen_ai.output.messages", pii = "maybe")] - pub gen_ai_output_messages: Annotated, - /// The result of the MCP prompt. #[metastructure(field = "mcp.prompt.result", pii = "maybe")] pub mcp_prompt_result: Annotated, @@ -1551,8 +1543,6 @@ mod tests { gen_ai_operation_type: ~, gen_ai_agent_name: ~, gen_ai_function_id: ~, - gen_ai_input_messages: ~, - gen_ai_output_messages: ~, mcp_prompt_result: ~, mcp_tool_result_content: ~, browser_name: ~, diff --git a/relay-event-schema/src/protocol/span/convert.rs b/relay-event-schema/src/protocol/span/convert.rs index d2932a14ac..636f4279b9 100644 --- a/relay-event-schema/src/protocol/span/convert.rs +++ b/relay-event-schema/src/protocol/span/convert.rs @@ -207,8 +207,6 @@ mod tests { gen_ai_operation_type: ~, gen_ai_agent_name: ~, gen_ai_function_id: ~, - gen_ai_input_messages: ~, - gen_ai_output_messages: ~, mcp_prompt_result: ~, mcp_tool_result_content: ~, browser_name: "Chrome", diff --git a/relay-pii/src/convert.rs b/relay-pii/src/convert.rs index 5807d03428..6a8a74ef1b 100644 --- a/relay-pii/src/convert.rs +++ b/relay-pii/src/convert.rs @@ -104,10 +104,6 @@ static REPLACE_ONLY_SELECTOR: LazyLock = LazyLock::new(|| { "attributes.'gen_ai.request.available_tools'.value", "$span.data.'gen_ai.tool.name'", "attributes.'gen_ai.tool.name'.value", - "$span.data.'gen_ai.input.messages'", - "attributes.'gen_ai.input.messages'.value", - "$span.data.'gen_ai.output.messages'", - "attributes.'gen_ai.output.messages'.value", "$span.data.'mcp.prompt.result'", "attributes.'mcp.prompt.result'.value", "$span.data.'mcp.tool.result.content'",