From 394d6ae5358d3dfc32d9e2ee019afe3042ce6193 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Wed, 21 Oct 2026 11:32:26 +0200 Subject: [PATCH 1/3] ref!: Make span origins spec compliant Use a span op category as the second origin part, keep origins at most four parts, and stop encoding the instrumentation mechanism: - auto.amqplib.* -> auto.queue.amqplib.* - auto.kafkajs.* -> auto.queue.kafkajs.* - auto.vercelai.channel -> auto.ai.vercelai - auto.firebase.firestore -> auto.db.firebase.firestore - auto.firebase.functions -> auto.function.firebase - auto.aws.aws_sdk -> auto.rpc.aws_sdk - auto.aws_lambda -> auto.function.aws_lambda - auto.mcp.notification -> auto.function.mcp_server.notification - auto.db.cloudflare.durable_object.sql -> auto.db.cloudflare.durable_object_sql - auto.http.browser.{lcp,cls,inp} -> auto.ui.browser.{lcp,cls,inp} Also spell out the origin rules in AGENTS.md and BUGBOT.md so new origins follow them. Co-Authored-By: Claude Opus 5.5 --- .cursor/BUGBOT.md | 3 ++ AGENTS.md | 6 ++++ .../tracing/metrics/web-vitals-cls/test.ts | 2 +- .../metrics/web-vitals-inp-late/test.ts | 2 +- .../metrics/web-vitals-inp-navigate/test.ts | 4 +-- .../web-vitals-inp-parametrized-late/test.ts | 2 +- .../web-vitals-inp-parametrized/test.ts | 2 +- .../tracing/metrics/web-vitals-inp/test.ts | 2 +- .../tracing/metrics/web-vitals-lcp/test.ts | 2 +- .../suites/tracing/durableobject-sql/test.ts | 4 +-- .../diagnostics-channel/vercelai-6/test.ts | 4 +-- .../suites/orchestrion-amqplib/test.ts | 2 +- .../suites/orchestrion-aws/test.ts | 2 +- .../suites/orchestrion-firebase/test.ts | 2 +- .../suites/orchestrion-kafkajs/test.ts | 2 +- .../suites/orchestrion-vercel-ai/test.ts | 2 +- .../aws-serverless-layer/tests/layer.test.ts | 16 ++++----- .../aws-serverless/tests/npm.test.ts | 2 +- .../cloudflare-mastra/tests/mastra.test.ts | 2 +- .../cloudflare-think/tests/errors.test.ts | 2 +- .../cloudflare-think/tests/think.test.ts | 2 +- .../tests/index.test.ts | 4 +-- .../node-eve/tests/eve.test.ts | 6 ++-- .../node-firebase/tests/functions.test.ts | 6 ++-- .../node-firebase/tests/spans.test.ts | 2 +- .../node-mastra/tests/mastra.test.ts | 2 +- .../tests/transactions.test.ts | 2 +- .../react-17/tests/spans.test.ts | 2 +- .../react-router-6/tests/spans.test.ts | 2 +- .../tests/spans.test.ts | 2 +- .../react-router-7-spa/tests/spans.test.ts | 2 +- .../react-router-8-spa/tests/spans.test.ts | 2 +- .../tests/routing-instrumentation.test.ts | 2 +- .../tests/routing-instrumentation.test.ts | 2 +- .../aws-serverless/aws-integration/test.ts | 2 +- .../suites/aws-serverless/bedrock/test.ts | 4 +-- .../suites/tracing/amqplib/test.ts | 20 +++++------ .../suites/tracing/kafkajs/test.ts | 4 +-- .../suites/tracing/vercelai/v4-static/test.ts | 2 +- .../suites/tracing/vercelai/v5/test.ts | 6 ++-- .../suites/tracing/vercelai/v6_v7/test.ts | 34 +++++++++---------- .../aws-serverless/src/requestSpanOptions.ts | 2 +- .../browser-utils/src/web-vitals/spans.ts | 6 ++-- .../test/web-vitals/spans.test.ts | 32 ++++++++--------- .../instrumentations/instrumentSqlStorage.ts | 2 +- .../instrumentDurableObjectStorage.test.ts | 2 +- .../test/instrumentSqlStorage.test.ts | 8 ++--- .../src/integrations/mcp-server/attributes.ts | 2 +- .../mcp-server/capturePolicy.test.ts | 2 +- .../mcp-server/semanticConventions.test.ts | 12 +++---- .../transportInstrumentation.test.ts | 2 +- .../server-utils/src/integrations/amqplib.ts | 4 +-- .../src/integrations/aws-sdk/constants.ts | 2 +- .../src/integrations/firebase/firestore.ts | 2 +- .../src/integrations/firebase/functions.ts | 2 +- .../src/integrations/kafkajs/spans.ts | 4 +-- .../vercel-ai/vercel-ai-dc-subscriber.ts | 4 +-- .../test/orchestrion/firebase.test.ts | 6 ++-- 58 files changed, 139 insertions(+), 130 deletions(-) diff --git a/.cursor/BUGBOT.md b/.cursor/BUGBOT.md index 8212b1b8489e..8addad7acd8d 100644 --- a/.cursor/BUGBOT.md +++ b/.cursor/BUGBOT.md @@ -49,6 +49,9 @@ Keep reviews high-signal. Prefer actionable, high-confidence findings over specu - When calling any `startSpan` API (`startInactiveSpan`, `startSpanManual`, etc), always ensure that the following span attributes are set: - `SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN` (`'sentry.origin'`) with a proper span origin - a proper origin must only contain [a-z], [A-Z], [0-9], `_` and `.` characters. + - a proper origin has at most four parts, `...`, and must not skip a part. `type` is `auto` or `manual`. + - `category` must be a span op category (e.g. `http`, `db`, `queue`, `function`, `ai`, `ui`, `rpc`), matching the span's op. Flag origins that put a library or vendor in the category slot (e.g. `auto.kafkajs.producer` instead of `auto.queue.kafkajs.producer`). + - the origin identifies the integration, not the tooling behind it. Flag leftover implementation markers like `otel` or `orchestrion` used as a part. - flag any non-conforming origin values as invalid and link to the trace origin specification (https://develop.sentry.dev/sdk/telemetry/traces/trace-origin/) - `SEMANTIC_ATTRIBUTE_SENTRY_OP` (`'sentry.op'`) with a proper span op - Span ops should be lower case only, and use snake_case. The `.` character is used to delimit op parts. diff --git a/AGENTS.md b/AGENTS.md index 1539af03e28e..71f47f9164af 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -79,6 +79,12 @@ Uses **Git Flow** (see `docs/gitflow.md`). - `Sentry.init()` follows one rule for repeated calls: the first call wins. See `docs/repeated-init.md` before you add or change an `init()`. +- Span origins must follow the [trace origin spec](https://develop.sentry.dev/sdk/telemetry/traces/trace-origin/): + `...`, at most four parts, no skipped + parts, only `[a-zA-Z0-9_]` within a part. `category` is the span op category + (`auto.queue.kafkajs.producer`, not `auto.kafkajs.producer`). Don't encode tooling like + `otel` or `orchestrion` in the origin. + ## Linting & Formatting - This project uses **Oxlint** and **Oxfmt** — NOT ESLint or Prettier diff --git a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-cls/test.ts b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-cls/test.ts index a42e7a6542e4..3a402ae3c2d2 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-cls/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-cls/test.ts @@ -43,7 +43,7 @@ sentryTest('captures CLS as a streamed span with source attributes', async ({ ge const pageloadSpan = await pageloadSpanPromise; expect(clsSpan.attributes[SENTRY_OP]).toEqual({ type: 'string', value: 'ui.webvital.cls' }); - expect(clsSpan.attributes[SENTRY_ORIGIN]).toEqual({ type: 'string', value: 'auto.http.browser.cls' }); + expect(clsSpan.attributes[SENTRY_ORIGIN]).toEqual({ type: 'string', value: 'auto.ui.browser.cls' }); expect(clsSpan.attributes[SENTRY_EXCLUSIVE_TIME]).toEqual({ type: 'integer', value: 0 }); expect(clsSpan.attributes[USER_AGENT_ORIGINAL]?.value).toEqual(expect.stringContaining('Chrome')); diff --git a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp-late/test.ts b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp-late/test.ts index 63f6f5ca17a6..3847ee0df51a 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp-late/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp-late/test.ts @@ -101,7 +101,7 @@ sentryTest( status: 'ok', attributes: { [SENTRY_IS_LOCALHOST]: { value: false, type: 'boolean' }, - [SENTRY_ORIGIN]: { value: 'auto.http.browser.inp', type: 'string' }, + [SENTRY_ORIGIN]: { value: 'auto.ui.browser.inp', type: 'string' }, [SENTRY_OP]: { value: UI_INTERACTION_CLICK, type: 'string' }, [UI_COMPONENT_NAME]: { value: 'NormalButton', type: 'string' }, [BROWSER_WEB_VITAL_INP_TARGET]: { value: 'body > NormalButton', type: 'string' }, diff --git a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp-navigate/test.ts b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp-navigate/test.ts index 8cdafe4870c0..edacd3444d55 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp-navigate/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp-navigate/test.ts @@ -101,7 +101,7 @@ sentryTest( status: 'ok', attributes: { [SENTRY_IS_LOCALHOST]: { value: false, type: 'boolean' }, - [SENTRY_ORIGIN]: { value: 'auto.http.browser.inp', type: 'string' }, + [SENTRY_ORIGIN]: { value: 'auto.ui.browser.inp', type: 'string' }, [SENTRY_OP]: { value: UI_INTERACTION_CLICK, type: 'string' }, [UI_COMPONENT_NAME]: { value: 'NavigationLink', type: 'string' }, [BROWSER_WEB_VITAL_INP_TARGET]: { value: 'body > nav#navigation > NavigationLink', type: 'string' }, @@ -192,7 +192,7 @@ sentryTest( status: 'ok', attributes: { [SENTRY_IS_LOCALHOST]: { value: false, type: 'boolean' }, - [SENTRY_ORIGIN]: { value: 'auto.http.browser.inp', type: 'string' }, + [SENTRY_ORIGIN]: { value: 'auto.ui.browser.inp', type: 'string' }, [SENTRY_OP]: { value: UI_INTERACTION_CLICK, type: 'string' }, [BROWSER_WEB_VITAL_INP_TARGET]: { value: 'body > nav#navigation > NavigationLink', type: 'string' }, [SENTRY_EXCLUSIVE_TIME]: { value: inpValue, type: expect.stringMatching(/^(integer)|(double)$/) }, diff --git a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp-parametrized-late/test.ts b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp-parametrized-late/test.ts index 81d264959eb5..d06da7a58912 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp-parametrized-late/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp-parametrized-late/test.ts @@ -102,7 +102,7 @@ sentryTest( status: 'ok', attributes: { [SENTRY_IS_LOCALHOST]: { value: false, type: 'boolean' }, - [SENTRY_ORIGIN]: { value: 'auto.http.browser.inp', type: 'string' }, + [SENTRY_ORIGIN]: { value: 'auto.ui.browser.inp', type: 'string' }, [SENTRY_OP]: { value: UI_INTERACTION_CLICK, type: 'string' }, [UI_COMPONENT_NAME]: { value: 'NormalButton', type: 'string' }, [BROWSER_WEB_VITAL_INP_TARGET]: { value: 'body > NormalButton', type: 'string' }, diff --git a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp-parametrized/test.ts b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp-parametrized/test.ts index cda0412f8d4e..269c543c4dec 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp-parametrized/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp-parametrized/test.ts @@ -102,7 +102,7 @@ sentryTest( status: 'ok', attributes: { [SENTRY_IS_LOCALHOST]: { value: false, type: 'boolean' }, - [SENTRY_ORIGIN]: { value: 'auto.http.browser.inp', type: 'string' }, + [SENTRY_ORIGIN]: { value: 'auto.ui.browser.inp', type: 'string' }, [SENTRY_OP]: { value: UI_INTERACTION_CLICK, type: 'string' }, [UI_COMPONENT_NAME]: { value: 'NormalButton', type: 'string' }, [BROWSER_WEB_VITAL_INP_TARGET]: { value: 'body > NormalButton', type: 'string' }, diff --git a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp/test.ts b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp/test.ts index 3510b5bb1d9b..ac0f4ea88aa4 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-inp/test.ts @@ -43,7 +43,7 @@ sentryTest('captures INP click as a streamed span', async ({ getLocalTestUrl, pa const pageloadSpan = await pageloadSpanPromise; expect(inpSpan.attributes[SENTRY_OP]).toEqual({ type: 'string', value: UI_INTERACTION_CLICK }); - expect(inpSpan.attributes[SENTRY_ORIGIN]).toEqual({ type: 'string', value: 'auto.http.browser.inp' }); + expect(inpSpan.attributes[SENTRY_ORIGIN]).toEqual({ type: 'string', value: 'auto.ui.browser.inp' }); expect(inpSpan.attributes[USER_AGENT_ORIGINAL]?.value).toEqual(expect.stringContaining('Chrome')); // Check the INP span carries the transaction/segment name it belongs to diff --git a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-lcp/test.ts b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-lcp/test.ts index 263b31d96660..5753e13389c0 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-lcp/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-lcp/test.ts @@ -52,7 +52,7 @@ sentryTest('captures LCP as a streamed span with element attributes', async ({ g const pageloadSpan = await pageloadSpanPromise; expect(lcpSpan.attributes[SENTRY_OP]).toEqual({ type: 'string', value: 'ui.webvital.lcp' }); - expect(lcpSpan.attributes[SENTRY_ORIGIN]).toEqual({ type: 'string', value: 'auto.http.browser.lcp' }); + expect(lcpSpan.attributes[SENTRY_ORIGIN]).toEqual({ type: 'string', value: 'auto.ui.browser.lcp' }); expect(lcpSpan.attributes[SENTRY_EXCLUSIVE_TIME]).toEqual({ type: 'integer', value: 0 }); expect(lcpSpan.attributes[USER_AGENT_ORIGINAL]?.value).toEqual(expect.stringContaining('Chrome')); diff --git a/dev-packages/cloudflare-integration-tests/suites/tracing/durableobject-sql/test.ts b/dev-packages/cloudflare-integration-tests/suites/tracing/durableobject-sql/test.ts index 1f8e514601a8..7898bb3feebe 100644 --- a/dev-packages/cloudflare-integration-tests/suites/tracing/durableobject-sql/test.ts +++ b/dev-packages/cloudflare-integration-tests/suites/tracing/durableobject-sql/test.ts @@ -23,7 +23,7 @@ it('instruments SQL exec operations on Durable Object storage', async ({ signal expect(segmentSpan?.attributes['url.path']).toEqual({ type: 'string', value: '/exec' }); const sqlSpans = spans.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.db.cloudflare.durable_object.sql', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.db.cloudflare.durable_object_sql', ); expect(sqlSpans).toHaveLength(3); @@ -33,7 +33,7 @@ it('instruments SQL exec operations on Durable Object storage', async ({ signal name: 'CREATE TABLE users', attributes: expect.objectContaining({ [SENTRY_OP]: { type: 'string', value: 'db.query' }, - [SENTRY_ORIGIN]: { type: 'string', value: 'auto.db.cloudflare.durable_object.sql' }, + [SENTRY_ORIGIN]: { type: 'string', value: 'auto.db.cloudflare.durable_object_sql' }, 'db.system.name': { type: 'string', value: 'cloudflare-durable-object-sql' }, 'db.operation.name': { type: 'string', value: 'exec' }, 'db.query.text': { diff --git a/dev-packages/cloudflare-integration-tests/suites/vite/diagnostics-channel/vercelai-6/test.ts b/dev-packages/cloudflare-integration-tests/suites/vite/diagnostics-channel/vercelai-6/test.ts index 3e886958978f..2eac8c531796 100644 --- a/dev-packages/cloudflare-integration-tests/suites/vite/diagnostics-channel/vercelai-6/test.ts +++ b/dev-packages/cloudflare-integration-tests/suites/vite/diagnostics-channel/vercelai-6/test.ts @@ -27,7 +27,7 @@ it('captures Vercel AI v6 spans via @sentry/cloudflare vercelAIIntegration', asy status: 'ok', attributes: expect.objectContaining({ 'sentry.op': { type: 'string', value: 'gen_ai.invoke_agent' }, - 'sentry.origin': { type: 'string', value: 'auto.vercelai.channel' }, + 'sentry.origin': { type: 'string', value: 'auto.ai.vercelai' }, [GEN_AI_OPERATION_NAME]: { type: 'string', value: 'invoke_agent' }, [GEN_AI_USAGE_INPUT_TOKENS]: { type: 'integer', value: 10 }, [GEN_AI_USAGE_OUTPUT_TOKENS]: { type: 'integer', value: 20 }, @@ -40,7 +40,7 @@ it('captures Vercel AI v6 spans via @sentry/cloudflare vercelAIIntegration', asy status: 'ok', attributes: expect.objectContaining({ 'sentry.op': { type: 'string', value: 'gen_ai.generate_content' }, - 'sentry.origin': { type: 'string', value: 'auto.vercelai.channel' }, + 'sentry.origin': { type: 'string', value: 'auto.ai.vercelai' }, [GEN_AI_OPERATION_NAME]: { type: 'string', value: 'generate_content' }, }), }), diff --git a/dev-packages/deno-integration-tests/suites/orchestrion-amqplib/test.ts b/dev-packages/deno-integration-tests/suites/orchestrion-amqplib/test.ts index 9c1031ed9ee3..4514b59d377c 100644 --- a/dev-packages/deno-integration-tests/suites/orchestrion-amqplib/test.ts +++ b/dev-packages/deno-integration-tests/suites/orchestrion-amqplib/test.ts @@ -65,5 +65,5 @@ Deno.test('amqplib instrumentation: orchestrion:amqplib:publish channel produces assertEquals(publishSpan.name, 'send my-exchange'); assertEquals(publishSpan.attributes['messaging.destination.name']?.value, 'my-exchange'); assertEquals(publishSpan.attributes['messaging.system']?.value, 'rabbitmq'); - assertEquals(publishSpan.attributes['sentry.origin']?.value, 'auto.amqplib.publisher'); + assertEquals(publishSpan.attributes['sentry.origin']?.value, 'auto.queue.amqplib.publisher'); }); diff --git a/dev-packages/deno-integration-tests/suites/orchestrion-aws/test.ts b/dev-packages/deno-integration-tests/suites/orchestrion-aws/test.ts index 1beb142f3313..b040db2da39d 100644 --- a/dev-packages/deno-integration-tests/suites/orchestrion-aws/test.ts +++ b/dev-packages/deno-integration-tests/suites/orchestrion-aws/test.ts @@ -88,5 +88,5 @@ Deno.test('aws-sdk instrumentation: orchestrion @smithy/smithy-client:send chann assertEquals(awsSpan.attributes['rpc.service']?.value, 'CloudWatch'); assertEquals(awsSpan.attributes['rpc.method']?.value, 'DescribeAlarms'); assertEquals(awsSpan.attributes['cloud.region']?.value, 'us-east-1'); - assertEquals(awsSpan.attributes['sentry.origin']?.value, 'auto.aws.aws_sdk'); + assertEquals(awsSpan.attributes['sentry.origin']?.value, 'auto.rpc.aws_sdk'); }); diff --git a/dev-packages/deno-integration-tests/suites/orchestrion-firebase/test.ts b/dev-packages/deno-integration-tests/suites/orchestrion-firebase/test.ts index 4f6440b8a677..cb131997dca9 100644 --- a/dev-packages/deno-integration-tests/suites/orchestrion-firebase/test.ts +++ b/dev-packages/deno-integration-tests/suites/orchestrion-firebase/test.ts @@ -70,5 +70,5 @@ Deno.test('firebase instrumentation: orchestrion @firebase/firestore:add-doc cha assertEquals(fsSpan.attributes['db.namespace']?.value, '[DEFAULT]'); assertEquals(fsSpan.attributes['db.system.name']?.value, 'firebase.firestore'); assertEquals(fsSpan.attributes['firebase.firestore.options.projectId']?.value, 'demo-project'); - assertEquals(fsSpan.attributes['sentry.origin']?.value, 'auto.firebase.firestore'); + assertEquals(fsSpan.attributes['sentry.origin']?.value, 'auto.db.firebase.firestore'); }); diff --git a/dev-packages/deno-integration-tests/suites/orchestrion-kafkajs/test.ts b/dev-packages/deno-integration-tests/suites/orchestrion-kafkajs/test.ts index 0265468722a3..694426b326f0 100644 --- a/dev-packages/deno-integration-tests/suites/orchestrion-kafkajs/test.ts +++ b/dev-packages/deno-integration-tests/suites/orchestrion-kafkajs/test.ts @@ -57,5 +57,5 @@ Deno.test('kafkajs instrumentation: orchestrion:kafkajs:send_batch channel produ assertEquals(kafkaSpan.name, 'send my-topic'); assertEquals(kafkaSpan.attributes['messaging.system']?.value, 'kafka'); assertEquals(kafkaSpan.attributes['messaging.destination.name']?.value, 'my-topic'); - assertEquals(kafkaSpan.attributes['sentry.origin']?.value, 'auto.kafkajs.producer'); + assertEquals(kafkaSpan.attributes['sentry.origin']?.value, 'auto.queue.kafkajs.producer'); }); diff --git a/dev-packages/deno-integration-tests/suites/orchestrion-vercel-ai/test.ts b/dev-packages/deno-integration-tests/suites/orchestrion-vercel-ai/test.ts index fdd20fd3239d..fbc0658a6b51 100644 --- a/dev-packages/deno-integration-tests/suites/orchestrion-vercel-ai/test.ts +++ b/dev-packages/deno-integration-tests/suites/orchestrion-vercel-ai/test.ts @@ -66,5 +66,5 @@ Deno.test('vercel-ai instrumentation: orchestrion:ai:generateText channel produc assertEquals(aiSpan.attributes['gen_ai.request.model']?.value, 'gpt-4o'); assertEquals(aiSpan.attributes['vercel.ai.operationId']?.value, 'ai.generateText'); assertEquals(aiSpan.attributes['gen_ai.usage.total_tokens']?.value, 15); - assertEquals(aiSpan.attributes['sentry.origin']?.value, 'auto.vercelai.channel'); + assertEquals(aiSpan.attributes['sentry.origin']?.value, 'auto.ai.vercelai'); }); diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-layer/tests/layer.test.ts b/dev-packages/e2e-tests/test-applications/aws-serverless-layer/tests/layer.test.ts index 8e47ac4255a4..4491c599b41c 100644 --- a/dev-packages/e2e-tests/test-applications/aws-serverless-layer/tests/layer.test.ts +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-layer/tests/layer.test.ts @@ -37,7 +37,7 @@ test.describe('Lambda layer', () => { data: { 'sentry.sample_rate': 1, 'sentry.segment.name.source': 'component', - 'sentry.origin': 'auto.aws_lambda', + 'sentry.origin': 'auto.function.aws_lambda', 'sentry.op': 'function.aws', 'cloud.account.id': '012345678912', 'cloud.platform': 'aws_lambda', @@ -49,7 +49,7 @@ test.describe('Lambda layer', () => { 'sentry.kind': 'server', }, op: 'function.aws', - origin: 'auto.aws_lambda', + origin: 'auto.function.aws_lambda', span_id: expect.stringMatching(/[a-f0-9]{16}/), status: 'ok', trace_id: expect.stringMatching(/[a-f0-9]{32}/), @@ -108,7 +108,7 @@ test.describe('Lambda layer', () => { data: { 'sentry.sample_rate': 1, 'sentry.segment.name.source': 'component', - 'sentry.origin': 'auto.aws_lambda', + 'sentry.origin': 'auto.function.aws_lambda', 'sentry.op': 'function.aws', 'cloud.account.id': '012345678912', 'cloud.platform': 'aws_lambda', @@ -120,7 +120,7 @@ test.describe('Lambda layer', () => { 'sentry.kind': 'server', }, op: 'function.aws', - origin: 'auto.aws_lambda', + origin: 'auto.function.aws_lambda', span_id: expect.stringMatching(/[a-f0-9]{16}/), status: 'ok', trace_id: expect.stringMatching(/[a-f0-9]{32}/), @@ -234,7 +234,7 @@ test.describe('Lambda layer', () => { data: { 'sentry.sample_rate': 1, 'sentry.segment.name.source': 'component', - 'sentry.origin': 'auto.aws_lambda', + 'sentry.origin': 'auto.function.aws_lambda', 'sentry.op': 'function.aws', 'cloud.account.id': '012345678912', 'cloud.platform': 'aws_lambda', @@ -246,7 +246,7 @@ test.describe('Lambda layer', () => { 'sentry.kind': 'server', }, op: 'function.aws', - origin: 'auto.aws_lambda', + origin: 'auto.function.aws_lambda', span_id: expect.stringMatching(/[a-f0-9]{16}/), status: 'ok', trace_id: expect.stringMatching(/[a-f0-9]{32}/), @@ -283,11 +283,11 @@ test.describe('Lambda layer', () => { expect(transactionEvent.contexts?.trace).toEqual( expect.objectContaining({ op: 'function.aws', - origin: 'auto.aws_lambda', + origin: 'auto.function.aws_lambda', status: 'ok', data: expect.objectContaining({ 'sentry.op': 'function.aws', - 'sentry.origin': 'auto.aws_lambda', + 'sentry.origin': 'auto.function.aws_lambda', 'sentry.kind': 'server', 'cloud.resource_id': 'arn:aws:lambda:us-east-1:012345678912:function:LayerCallback', 'faas.name': 'LayerCallback', diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless/tests/npm.test.ts b/dev-packages/e2e-tests/test-applications/aws-serverless/tests/npm.test.ts index e9f687cdf2be..78bd9bc40f64 100644 --- a/dev-packages/e2e-tests/test-applications/aws-serverless/tests/npm.test.ts +++ b/dev-packages/e2e-tests/test-applications/aws-serverless/tests/npm.test.ts @@ -16,7 +16,7 @@ function assertLambdaTrace(spans: SerializedStreamedSpan[], functionName: string expect(segmentSpan?.attributes).toMatchObject({ 'sentry.op': { value: 'function.aws', type: 'string' }, - 'sentry.origin': { value: 'auto.aws_lambda', type: 'string' }, + 'sentry.origin': { value: 'auto.function.aws_lambda', type: 'string' }, 'sentry.kind': { value: 'server', type: 'string' }, 'sentry.segment.name.source': { value: 'component', type: 'string' }, 'cloud.account.id': { value: '012345678912', type: 'string' }, diff --git a/dev-packages/e2e-tests/test-applications/cloudflare-mastra/tests/mastra.test.ts b/dev-packages/e2e-tests/test-applications/cloudflare-mastra/tests/mastra.test.ts index d07faa5b2931..a7a291a596c3 100644 --- a/dev-packages/e2e-tests/test-applications/cloudflare-mastra/tests/mastra.test.ts +++ b/dev-packages/e2e-tests/test-applications/cloudflare-mastra/tests/mastra.test.ts @@ -54,7 +54,7 @@ test('captures Mastra agent spans (invoke_agent, chat, execute_tool) with inputs ).toEqual([]); expect( traceSpans - .filter(span => String(attrValue(span, 'sentry.origin') ?? '').startsWith('auto.vercelai')) + .filter(span => String(attrValue(span, 'sentry.origin') ?? '').startsWith('auto.ai.vercelai')) .map(describeSpan), ).toEqual([]); diff --git a/dev-packages/e2e-tests/test-applications/cloudflare-think/tests/errors.test.ts b/dev-packages/e2e-tests/test-applications/cloudflare-think/tests/errors.test.ts index 76f65c74e01b..d373d9e00cb0 100644 --- a/dev-packages/e2e-tests/test-applications/cloudflare-think/tests/errors.test.ts +++ b/dev-packages/e2e-tests/test-applications/cloudflare-think/tests/errors.test.ts @@ -33,7 +33,7 @@ test('captures an error thrown inside a Think tool and marks its span errored', const exception = error.exception?.values?.[0]; expect(exception?.type).toBe('Error'); expect(exception?.value).toBe('Think tool failed on purpose'); - expect(exception?.mechanism?.type).toBe('auto.vercelai.channel'); + expect(exception?.mechanism?.type).toBe('auto.ai.vercelai'); const toolSpan = spans.find(span => span.attributes?.['gen_ai.tool.name']?.value === 'fail_now'); expect(getSpanOp(toolSpan!)).toBe('gen_ai.execute_tool'); diff --git a/dev-packages/e2e-tests/test-applications/cloudflare-think/tests/think.test.ts b/dev-packages/e2e-tests/test-applications/cloudflare-think/tests/think.test.ts index 1368b59298a7..6190178bb72a 100644 --- a/dev-packages/e2e-tests/test-applications/cloudflare-think/tests/think.test.ts +++ b/dev-packages/e2e-tests/test-applications/cloudflare-think/tests/think.test.ts @@ -36,7 +36,7 @@ test('captures the invoke_agent / generate_content / execute_tool hierarchy for const generateContent = spans.find(span => getSpanOp(span) === 'gen_ai.generate_content'); const executeTool = spans.find(span => getSpanOp(span) === 'gen_ai.execute_tool'); - expect(attr(invokeAgent, 'sentry.origin')).toBe('auto.vercelai.channel'); + expect(attr(invokeAgent, 'sentry.origin')).toBe('auto.ai.vercelai'); expect(attr(invokeAgent, 'gen_ai.operation.name')).toBe('invoke_agent'); // Think passes `this.constructor.name` to the AI SDK as the `functionId`, so this only holds while // the build-time wrapper leaves the user's class name alone (#24700). diff --git a/dev-packages/e2e-tests/test-applications/cloudflare-vercelai-v7/tests/index.test.ts b/dev-packages/e2e-tests/test-applications/cloudflare-vercelai-v7/tests/index.test.ts index 1645f34851a7..3b72d063622b 100644 --- a/dev-packages/e2e-tests/test-applications/cloudflare-vercelai-v7/tests/index.test.ts +++ b/dev-packages/e2e-tests/test-applications/cloudflare-vercelai-v7/tests/index.test.ts @@ -30,7 +30,7 @@ test('captures Vercel AI v7 spans with nodejs_compat using tracing channels', as 'gen_ai.usage.output_tokens': { value: 20, type: 'integer' }, 'gen_ai.usage.total_tokens': { value: 30, type: 'integer' }, 'sentry.op': { value: 'gen_ai.invoke_agent', type: 'string' }, - 'sentry.origin': { value: 'auto.vercelai.channel', type: 'string' }, + 'sentry.origin': { value: 'auto.ai.vercelai', type: 'string' }, }), }); @@ -49,7 +49,7 @@ test('captures Vercel AI v7 spans with nodejs_compat using tracing channels', as 'gen_ai.usage.output_tokens': { value: 20, type: 'integer' }, 'gen_ai.usage.total_tokens': { value: 30, type: 'integer' }, 'sentry.op': { value: 'gen_ai.generate_content', type: 'string' }, - 'sentry.origin': { value: 'auto.vercelai.channel', type: 'string' }, + 'sentry.origin': { value: 'auto.ai.vercelai', type: 'string' }, }), }); }); diff --git a/dev-packages/e2e-tests/test-applications/node-eve/tests/eve.test.ts b/dev-packages/e2e-tests/test-applications/node-eve/tests/eve.test.ts index de45eacd39d2..60998bf9ff26 100644 --- a/dev-packages/e2e-tests/test-applications/node-eve/tests/eve.test.ts +++ b/dev-packages/e2e-tests/test-applications/node-eve/tests/eve.test.ts @@ -53,7 +53,7 @@ test('captures Vercel AI agent spans (invoke_agent, generate_content, execute_to const generateContent = traceSpans.find(span => getSpanOp(span) === 'gen_ai.generate_content'); const executeTool = traceSpans.find(span => getSpanOp(span) === 'gen_ai.execute_tool'); - expect(invokeAgent?.attributes?.['sentry.origin']?.value).toBe('auto.vercelai.channel'); + expect(invokeAgent?.attributes?.['sentry.origin']?.value).toBe('auto.ai.vercelai'); expect(invokeAgent?.attributes?.['gen_ai.operation.name']?.value).toBe('invoke_agent'); expect(invokeAgent?.attributes?.['gen_ai.request.model']?.value).toBe('openai/gpt-4o-mini'); expect(invokeAgent?.attributes?.['gen_ai.provider.name']?.value).toBe('openrouter'); @@ -134,7 +134,7 @@ test('captures errors thrown inside an eve tool', async ({ baseURL }) => { type: 'Error', value: expect.stringContaining('Intentional eve tool failure'), mechanism: { - type: 'auto.vercelai.channel', + type: 'auto.ai.vercelai', handled: false, }, }, @@ -165,7 +165,7 @@ test('captures a gen_ai.decide span for a Jev call inside an eve tool', async ({ expect(decide?.name).toBe('decide typesafe-ai/jev'); expect(decide?.status).toBe('ok'); - expect(decide?.attributes?.[SENTRY_ORIGIN]?.value).toBe('auto.vercelai.channel'); + expect(decide?.attributes?.[SENTRY_ORIGIN]?.value).toBe('auto.ai.vercelai'); expect(decide?.attributes?.[GEN_AI_OPERATION_NAME]?.value).toBe('decide'); expect(decide?.attributes?.[GEN_AI_REQUEST_MODEL]?.value).toBe('typesafe-ai/jev'); expect(decide?.attributes?.[GEN_AI_USAGE_INPUT_TOKENS]?.value).toBe(275); diff --git a/dev-packages/e2e-tests/test-applications/node-firebase/tests/functions.test.ts b/dev-packages/e2e-tests/test-applications/node-firebase/tests/functions.test.ts index 7accea39f1b1..46091b06fb29 100644 --- a/dev-packages/e2e-tests/test-applications/node-firebase/tests/functions.test.ts +++ b/dev-packages/e2e-tests/test-applications/node-firebase/tests/functions.test.ts @@ -31,7 +31,7 @@ test('should create one segment for an HTTP function', async () => { 'faas.trigger': { value: 'http.request', type: 'string' }, 'gcp.function.context.type': { value: 'firebase.function.http.request', type: 'string' }, 'sentry.kind': { value: 'server', type: 'string' }, - 'sentry.origin': { value: 'auto.firebase.functions', type: 'string' }, + 'sentry.origin': { value: 'auto.function.firebase', type: 'string' }, 'sentry.sample_rate': { value: expect.any(Number), type: 'integer' }, 'sentry.segment.name.source': { value: 'component', type: 'string' }, }), @@ -60,7 +60,7 @@ test('should send failed span when the function fails', async () => { expect.objectContaining({ type: 'Error', value: 'There is an error!', - mechanism: { type: 'auto.firebase.functions', handled: false }, + mechanism: { type: 'auto.function.firebase', handled: false }, }), ]); }); @@ -96,7 +96,7 @@ test('should create a document and trigger onDocumentCreated and another with au 'gcp.function.context.type': { value: `firebase.function.${trigger}`, type: 'string' }, 'sentry.kind': { value: 'server', type: 'string' }, 'sentry.op': { value: 'function.gcp', type: 'string' }, - 'sentry.origin': { value: 'auto.firebase.functions', type: 'string' }, + 'sentry.origin': { value: 'auto.function.firebase', type: 'string' }, 'sentry.sample_rate': { value: expect.any(Number), type: 'integer' }, 'sentry.segment.name.source': { value: 'component', type: 'string' }, }), diff --git a/dev-packages/e2e-tests/test-applications/node-firebase/tests/spans.test.ts b/dev-packages/e2e-tests/test-applications/node-firebase/tests/spans.test.ts index dd4b11aa7586..cd9717ccdea0 100644 --- a/dev-packages/e2e-tests/test-applications/node-firebase/tests/spans.test.ts +++ b/dev-packages/e2e-tests/test-applications/node-firebase/tests/spans.test.ts @@ -2,7 +2,7 @@ import { expect, test } from '@playwright/test'; import { collectStreamedSpansUntilSegment } from '@sentry-internal/test-utils'; // The orchestrion spans are Sentry-native, so they carry no span-kind attribute (`sentry.kind`). -const origin = 'auto.firebase.firestore'; +const origin = 'auto.db.firebase.firestore'; function firestoreSpan(operation: string): unknown { return expect.objectContaining({ diff --git a/dev-packages/e2e-tests/test-applications/node-mastra/tests/mastra.test.ts b/dev-packages/e2e-tests/test-applications/node-mastra/tests/mastra.test.ts index 7927a8f9531a..c12f9e9ed3e7 100644 --- a/dev-packages/e2e-tests/test-applications/node-mastra/tests/mastra.test.ts +++ b/dev-packages/e2e-tests/test-applications/node-mastra/tests/mastra.test.ts @@ -67,7 +67,7 @@ test('captures Mastra agent spans (invoke_agent, chat, execute_tool) with inputs ).toEqual([]); expect( traceSpans - .filter(span => String(attrValue(span, 'sentry.origin') ?? '').startsWith('auto.vercelai')) + .filter(span => String(attrValue(span, 'sentry.origin') ?? '').startsWith('auto.ai.vercelai')) .map(describeSpan), ).toEqual([]); diff --git a/dev-packages/e2e-tests/test-applications/react-17-static/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/react-17-static/tests/transactions.test.ts index 835998af23b3..c57a52e6b891 100644 --- a/dev-packages/e2e-tests/test-applications/react-17-static/tests/transactions.test.ts +++ b/dev-packages/e2e-tests/test-applications/react-17-static/tests/transactions.test.ts @@ -105,7 +105,7 @@ test('sends an INP span', async ({ page }) => { expect(inpSpan.attributes).toEqual( expect.objectContaining({ 'sentry.op': { value: 'ui.interaction.click', type: 'string' }, - 'sentry.origin': { value: 'auto.http.browser.inp', type: 'string' }, + 'sentry.origin': { value: 'auto.ui.browser.inp', type: 'string' }, 'sentry.exclusive_time': { value: inpValue, type: expect.stringMatching(/^(integer)|(double)$/) }, 'browser.web_vital.inp.value': { value: inpValue, type: expect.stringMatching(/^(integer)|(double)$/) }, 'sentry.transaction': { value: '/', type: 'string' }, diff --git a/dev-packages/e2e-tests/test-applications/react-17/tests/spans.test.ts b/dev-packages/e2e-tests/test-applications/react-17/tests/spans.test.ts index 6eba5f11e4a2..d5fdf3e9342d 100644 --- a/dev-packages/e2e-tests/test-applications/react-17/tests/spans.test.ts +++ b/dev-packages/e2e-tests/test-applications/react-17/tests/spans.test.ts @@ -88,7 +88,7 @@ test('sends an INP span', async ({ page }) => { expect(inpSpan.attributes).toEqual( expect.objectContaining({ 'sentry.op': { value: 'ui.interaction.click', type: 'string' }, - 'sentry.origin': { value: 'auto.http.browser.inp', type: 'string' }, + 'sentry.origin': { value: 'auto.ui.browser.inp', type: 'string' }, 'browser.web_vital.inp.target': { value: 'body > div#root > input#exception-button[type="button"]', type: 'string', diff --git a/dev-packages/e2e-tests/test-applications/react-router-6/tests/spans.test.ts b/dev-packages/e2e-tests/test-applications/react-router-6/tests/spans.test.ts index ecd63899dfee..a47722acba77 100644 --- a/dev-packages/e2e-tests/test-applications/react-router-6/tests/spans.test.ts +++ b/dev-packages/e2e-tests/test-applications/react-router-6/tests/spans.test.ts @@ -88,7 +88,7 @@ test('sends an INP span', async ({ page }) => { expect(inpSpan.attributes).toEqual( expect.objectContaining({ 'sentry.op': { value: 'ui.interaction.click', type: 'string' }, - 'sentry.origin': { value: 'auto.http.browser.inp', type: 'string' }, + 'sentry.origin': { value: 'auto.ui.browser.inp', type: 'string' }, 'browser.web_vital.inp.target': { value: 'body > div#root > input#exception-button[type="button"]', type: 'string', diff --git a/dev-packages/e2e-tests/test-applications/react-router-7-spa-streaming/tests/spans.test.ts b/dev-packages/e2e-tests/test-applications/react-router-7-spa-streaming/tests/spans.test.ts index 3d0e91e50b60..2c09be78eb0f 100644 --- a/dev-packages/e2e-tests/test-applications/react-router-7-spa-streaming/tests/spans.test.ts +++ b/dev-packages/e2e-tests/test-applications/react-router-7-spa-streaming/tests/spans.test.ts @@ -70,6 +70,6 @@ test('sends an INP span', async ({ page }) => { expect(inpSpan.span_id).toMatch(/[a-f0-9]{16}/); expect(inpSpan.end_timestamp).toBeGreaterThan(inpSpan.start_timestamp); expect(inpSpan.attributes['sentry.op']?.value).toBe('ui.interaction.click'); - expect(inpSpan.attributes['sentry.origin']?.value).toBe('auto.http.browser.inp'); + expect(inpSpan.attributes['sentry.origin']?.value).toBe('auto.ui.browser.inp'); expect(inpSpan.attributes['sentry.exclusive_time']?.value).toEqual(expect.any(Number)); }); diff --git a/dev-packages/e2e-tests/test-applications/react-router-7-spa/tests/spans.test.ts b/dev-packages/e2e-tests/test-applications/react-router-7-spa/tests/spans.test.ts index 65ae46c0e1d4..b177a028ded0 100644 --- a/dev-packages/e2e-tests/test-applications/react-router-7-spa/tests/spans.test.ts +++ b/dev-packages/e2e-tests/test-applications/react-router-7-spa/tests/spans.test.ts @@ -88,7 +88,7 @@ test('sends an INP span', async ({ page }) => { expect(inpSpan.attributes).toEqual( expect.objectContaining({ 'sentry.op': { value: 'ui.interaction.click', type: 'string' }, - 'sentry.origin': { value: 'auto.http.browser.inp', type: 'string' }, + 'sentry.origin': { value: 'auto.ui.browser.inp', type: 'string' }, 'browser.web_vital.inp.target': { value: 'body > div#root > input#exception-button[type="button"]', type: 'string', diff --git a/dev-packages/e2e-tests/test-applications/react-router-8-spa/tests/spans.test.ts b/dev-packages/e2e-tests/test-applications/react-router-8-spa/tests/spans.test.ts index 6c9ad5efc502..a6bf22054ff5 100644 --- a/dev-packages/e2e-tests/test-applications/react-router-8-spa/tests/spans.test.ts +++ b/dev-packages/e2e-tests/test-applications/react-router-8-spa/tests/spans.test.ts @@ -88,7 +88,7 @@ test('sends an INP span', async ({ page }) => { expect(inpSpan.attributes).toEqual( expect.objectContaining({ 'sentry.op': { value: 'ui.interaction.click', type: 'string' }, - 'sentry.origin': { value: 'auto.http.browser.inp', type: 'string' }, + 'sentry.origin': { value: 'auto.ui.browser.inp', type: 'string' }, 'browser.web_vital.inp.target': { value: 'body > div#root > input#exception-button[type="button"]', type: 'string', diff --git a/dev-packages/e2e-tests/test-applications/solid-tanstack-router/tests/routing-instrumentation.test.ts b/dev-packages/e2e-tests/test-applications/solid-tanstack-router/tests/routing-instrumentation.test.ts index 2e29eed35616..aea4a266822c 100644 --- a/dev-packages/e2e-tests/test-applications/solid-tanstack-router/tests/routing-instrumentation.test.ts +++ b/dev-packages/e2e-tests/test-applications/solid-tanstack-router/tests/routing-instrumentation.test.ts @@ -175,7 +175,7 @@ test('sends a pageload span with web vital attributes and a standalone LCP span' expect(lcpSpan.attributes).toMatchObject({ 'sentry.op': { value: 'ui.webvital.lcp', type: 'string' }, - 'sentry.origin': { value: 'auto.http.browser.lcp', type: 'string' }, + 'sentry.origin': { value: 'auto.ui.browser.lcp', type: 'string' }, 'sentry.pageload.span_id': { value: pageloadSpan.span_id, type: 'string' }, 'browser.web_vital.lcp.value': webVitalNumber, }); diff --git a/dev-packages/e2e-tests/test-applications/vue-tanstack-router/tests/routing-instrumentation.test.ts b/dev-packages/e2e-tests/test-applications/vue-tanstack-router/tests/routing-instrumentation.test.ts index 0f243a9ea0c0..2141b22d9330 100644 --- a/dev-packages/e2e-tests/test-applications/vue-tanstack-router/tests/routing-instrumentation.test.ts +++ b/dev-packages/e2e-tests/test-applications/vue-tanstack-router/tests/routing-instrumentation.test.ts @@ -67,7 +67,7 @@ test('sends a pageload span for the root route with web vital attributes and a s expect(lcpSpan.attributes).toMatchObject({ 'sentry.op': { type: 'string', value: 'ui.webvital.lcp' }, - 'sentry.origin': { type: 'string', value: 'auto.http.browser.lcp' }, + 'sentry.origin': { type: 'string', value: 'auto.ui.browser.lcp' }, 'sentry.pageload.span_id': { type: 'string', value: pageloadSpan.span_id }, 'browser.web_vital.lcp.value': webVitalNumber, }); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/test.ts index 951a0e437e38..cf83f4e69260 100644 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/test.ts +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/test.ts @@ -5,7 +5,7 @@ import { cleanupChildProcesses, createEsmAndCjsTests } from '../../../utils/runn // The suite runs twice on CI: once with the OTel `Aws` integration (default) and once with the // orchestrion diagnostics-channel integration auto-injected (`INJECT_ORCHESTRION`). Both emit the // same spans; only the origin differs. -const ORIGIN = 'auto.aws.aws_sdk'; +const ORIGIN = 'auto.rpc.aws_sdk'; // The aws-sdk instrumentation creates spans by patching the underlying smithy middleware stack. The // patch target differs between aws-sdk versions, so we run the exact same assertions against both: diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/bedrock/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/bedrock/test.ts index a7bc374499b4..60ac118380bf 100644 --- a/dev-packages/node-integration-tests/suites/aws-serverless/bedrock/test.ts +++ b/dev-packages/node-integration-tests/suites/aws-serverless/bedrock/test.ts @@ -24,7 +24,7 @@ function assertBedrockSpans(container: SerializedStreamedSpanContainer): void { // Converse (non-streaming) const converseSpan = container.items.find(span => span.name === `chat ${MODEL_ID}`); expect(converseSpan!.status).toBe('ok'); - expect(converseSpan!.attributes[SENTRY_ORIGIN].value).toBe('auto.aws.aws_sdk'); + expect(converseSpan!.attributes[SENTRY_ORIGIN].value).toBe('auto.rpc.aws_sdk'); expect(converseSpan!.attributes[SENTRY_OP].value).toBe('gen_ai.chat'); expect(converseSpan!.attributes[GEN_AI_PROVIDER_NAME].value).toBe('aws.bedrock'); expect(converseSpan!.attributes[GEN_AI_OPERATION_NAME].value).toBe('chat'); @@ -39,7 +39,7 @@ function assertBedrockSpans(container: SerializedStreamedSpanContainer): void { // InvokeModel (non-streaming, anthropic.claude request/response body) const invokeModelSpan = container.items.find(span => span.name === `generate_content ${MODEL_ID}`); expect(invokeModelSpan!.status).toBe('ok'); - expect(invokeModelSpan!.attributes[SENTRY_ORIGIN].value).toBe('auto.aws.aws_sdk'); + expect(invokeModelSpan!.attributes[SENTRY_ORIGIN].value).toBe('auto.rpc.aws_sdk'); expect(invokeModelSpan!.attributes[SENTRY_OP].value).toBe('gen_ai.generate_content'); expect(invokeModelSpan!.attributes[GEN_AI_PROVIDER_NAME].value).toBe('aws.bedrock'); expect(invokeModelSpan!.attributes[GEN_AI_OPERATION_NAME].value).toBe('generate_content'); diff --git a/dev-packages/node-integration-tests/suites/tracing/amqplib/test.ts b/dev-packages/node-integration-tests/suites/tracing/amqplib/test.ts index cd86d01459ec..5dd002898bff 100644 --- a/dev-packages/node-integration-tests/suites/tracing/amqplib/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/amqplib/test.ts @@ -36,7 +36,7 @@ const expectedProducerSpan = (routingKey: string) => [URL_FULL]: { type: 'string', value: 'amqp://sentry:***@localhost:5672/' }, [SENTRY_KIND]: { type: 'string', value: 'producer' }, [SENTRY_OP]: { type: 'string', value: QUEUE_PUBLISH }, - [SENTRY_ORIGIN]: { type: 'string', value: 'auto.amqplib.publisher' }, + [SENTRY_ORIGIN]: { type: 'string', value: 'auto.queue.amqplib.publisher' }, }), status: 'ok', }); @@ -51,7 +51,7 @@ const EXPECTED_MESSAGE_SPAN_CONSUMER = expect.objectContaining({ [MESSAGING_OPERATION_TYPE]: { type: 'string', value: 'process' }, [SENTRY_KIND]: { type: 'string', value: 'consumer' }, [SENTRY_OP]: { type: 'string', value: QUEUE_PROCESS }, - [SENTRY_ORIGIN]: { type: 'string', value: 'auto.amqplib.consumer' }, + [SENTRY_ORIGIN]: { type: 'string', value: 'auto.queue.amqplib.consumer' }, }), status: 'ok', }); @@ -77,7 +77,7 @@ describeWithDockerCompose('amqplib auto-instrumentation', { workingDirectory: [_ span: container => { const producer = container.items.find(span => span.is_segment && span.name === 'root span'); const consumer = container.items.find( - t => t.attributes[SENTRY_ORIGIN]?.value === 'auto.amqplib.consumer', + t => t.attributes[SENTRY_ORIGIN]?.value === 'auto.queue.amqplib.consumer', ); expect(producer).toBeDefined(); @@ -87,7 +87,7 @@ describeWithDockerCompose('amqplib auto-instrumentation', { workingDirectory: [_ expect(consumer!.name).toBe('process queue1'); const producerSpan = container.items.find( - s => s.attributes[SENTRY_ORIGIN]?.value === 'auto.amqplib.publisher', + s => s.attributes[SENTRY_ORIGIN]?.value === 'auto.queue.amqplib.publisher', ); expect(producerSpan?.name).toBe('send queue1'); expect(producerSpan).toMatchObject(expectedProducerSpan('queue1')); @@ -112,7 +112,7 @@ describeWithDockerCompose('amqplib auto-instrumentation', { workingDirectory: [_ .expect({ span: container => { const consumer = container.items.find( - t => t.attributes[SENTRY_ORIGIN]?.value === 'auto.amqplib.consumer', + t => t.attributes[SENTRY_ORIGIN]?.value === 'auto.queue.amqplib.consumer', ); expect(consumer).toBeDefined(); @@ -124,7 +124,7 @@ describeWithDockerCompose('amqplib auto-instrumentation', { workingDirectory: [_ [MESSAGING_SYSTEM]: { type: 'string', value: 'rabbitmq' }, [SENTRY_KIND]: { type: 'string', value: 'consumer' }, [SENTRY_OP]: { type: 'string', value: QUEUE_PROCESS }, - [SENTRY_ORIGIN]: { type: 'string', value: 'auto.amqplib.consumer' }, + [SENTRY_ORIGIN]: { type: 'string', value: 'auto.queue.amqplib.consumer' }, }), }), ); @@ -152,7 +152,7 @@ describeWithDockerCompose('amqplib auto-instrumentation', { workingDirectory: [_ expect(container.items.find(span => span.is_segment)?.name).toBe('root span'); const producerSpans = container.items.filter( - s => s.attributes[SENTRY_ORIGIN]?.value === 'auto.amqplib.publisher', + s => s.attributes[SENTRY_ORIGIN]?.value === 'auto.queue.amqplib.publisher', ); // The confirm channel internally calls the base publish; the instrumentation must not @@ -179,7 +179,7 @@ describeWithDockerCompose('amqplib auto-instrumentation', { workingDirectory: [_ .expect({ span: container => { const consumer = container.items.find( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.amqplib.consumer', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.queue.amqplib.consumer', ); expect(consumer).toBeDefined(); @@ -205,12 +205,12 @@ describeWithDockerCompose('amqplib auto-instrumentation', { workingDirectory: [_ .expect({ span: container => { const producerSpan = container.items.find( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.amqplib.publisher', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.queue.amqplib.publisher', ); expect(producerSpan?.name).toBe('send callback-queue'); const consumerSpan = container.items.find( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.amqplib.consumer', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.queue.amqplib.consumer', ); expect(consumerSpan?.name).toBe('process callback-queue'); expect(consumerSpan?.status).toBe('ok'); diff --git a/dev-packages/node-integration-tests/suites/tracing/kafkajs/test.ts b/dev-packages/node-integration-tests/suites/tracing/kafkajs/test.ts index 8593a1f124ff..cd814ff541d7 100644 --- a/dev-packages/node-integration-tests/suites/tracing/kafkajs/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/kafkajs/test.ts @@ -2,8 +2,8 @@ import type { TransactionEvent } from '@sentry/core'; import { afterAll, expect } from 'vitest'; import { cleanupChildProcesses, createEsmAndCjsTests, describeWithDockerCompose } from '../../../utils/runner'; -const producerOrigin = 'auto.kafkajs.producer'; -const consumerOrigin = 'auto.kafkajs.consumer'; +const producerOrigin = 'auto.queue.kafkajs.producer'; +const consumerOrigin = 'auto.queue.kafkajs.consumer'; describeWithDockerCompose('kafkajs', { workingDirectory: [__dirname] }, () => { afterAll(() => { diff --git a/dev-packages/node-integration-tests/suites/tracing/vercelai/v4-static/test.ts b/dev-packages/node-integration-tests/suites/tracing/vercelai/v4-static/test.ts index 99604cb8a599..01d9aa1450e3 100644 --- a/dev-packages/node-integration-tests/suites/tracing/vercelai/v4-static/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/vercelai/v4-static/test.ts @@ -25,7 +25,7 @@ import { GEN_AI_TOOL_CALL_ID_ATTRIBUTE } from '../../../../../../packages/server import { cleanupChildProcesses, createEsmAndCjsTests } from '../../../../utils/runner'; import { getStringAttributeValue } from '../../../../utils'; -const expectedOrigin = 'auto.vercelai.channel'; +const expectedOrigin = 'auto.ai.vercelai'; const toolCallArgs = '{\\"location\\":\\"San Francisco\\"}'; describe('Vercel AI integration (v4)', () => { diff --git a/dev-packages/node-integration-tests/suites/tracing/vercelai/v5/test.ts b/dev-packages/node-integration-tests/suites/tracing/vercelai/v5/test.ts index b608a1f717fc..7c82eb3f9a91 100644 --- a/dev-packages/node-integration-tests/suites/tracing/vercelai/v5/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/vercelai/v5/test.ts @@ -39,7 +39,7 @@ describe('Vercel AI integration (v5)', () => { const segment = container.items.find(span => span.is_segment && span.name === 'main'); expect(segment).toBeDefined(); const spans = container.items.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai', ); expect(spans).toHaveLength(7); const firstInvokeAgentSpan = spans.find( @@ -131,7 +131,7 @@ describe('Vercel AI integration (v5)', () => { const segment = container.items.find(span => span.is_segment && span.name === 'main'); expect(segment).toBeDefined(); const spans = container.items.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai', ); expect(spans).toHaveLength(7); const firstInvokeAgentSpan = spans.find( @@ -247,7 +247,7 @@ describe('Vercel AI integration (v5)', () => { .completed(); const segment = receivedSpans.find(span => span.is_segment && span.name === 'main'); - const spans = receivedSpans.filter(span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel'); + const spans = receivedSpans.filter(span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai'); expect(spans).toHaveLength(3); const invokeAgentSpan = spans.find(span => span.name === 'invoke_agent'); expect(invokeAgentSpan!.attributes[SENTRY_OP].value).toBe('gen_ai.invoke_agent'); diff --git a/dev-packages/node-integration-tests/suites/tracing/vercelai/v6_v7/test.ts b/dev-packages/node-integration-tests/suites/tracing/vercelai/v6_v7/test.ts index 077d96e0d9bb..ea89bf21ddaf 100644 --- a/dev-packages/node-integration-tests/suites/tracing/vercelai/v6_v7/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/vercelai/v6_v7/test.ts @@ -40,7 +40,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe cleanupChildProcesses(); }); - const expectedOrigin = 'auto.vercelai.channel'; + const expectedOrigin = 'auto.ai.vercelai'; // We only run this in ESM and CJS to verify full support // Other suites we only run in ESM to simplify the test setup @@ -56,7 +56,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe const segment = container.items.find(span => span.is_segment && span.name === 'main'); expect(segment).toBeDefined(); const spans = container.items.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai', ); expect(spans).toHaveLength(7); const firstInvokeAgentSpan = spans.find( @@ -309,7 +309,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe const segment = container.items.find(span => span.is_segment && span.name === 'main'); expect(segment).toBeDefined(); const spans = container.items.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai', ); expect(spans).toHaveLength(7); const firstInvokeAgentSpan = spans.find( @@ -539,7 +539,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe .completed(); const segment = receivedSpans.find(span => span.is_segment && span.name === 'main'); - const spans = receivedSpans.filter(span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel'); + const spans = receivedSpans.filter(span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai'); expect(spans).toHaveLength(3); const invokeAgentSpan = spans.find(span => span.name === 'invoke_agent')!; expect(invokeAgentSpan!.attributes[SENTRY_ORIGIN]).toEqual({ type: 'string', value: expectedOrigin }); @@ -611,7 +611,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe const segment = container.items.find(span => span.is_segment && span.name === 'main'); expect(segment).toBeDefined(); const spans = container.items.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai', ); expect(spans).toHaveLength(7); const invokeAgentSpans = spans.filter( @@ -651,7 +651,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe const segment = container.items.find(span => span.is_segment && span.name === 'main'); expect(segment).toBeDefined(); const spans = container.items.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai', ); expect(spans).toHaveLength(4); const invokeAgentSpan = spans.find(span => span.name === 'invoke_agent weather_agent')!; @@ -707,7 +707,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe const segment = container.items.find(span => span.is_segment && span.name === 'main'); expect(segment).toBeDefined(); const spans = container.items.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai', ); const invokeAgents = spans.filter(span => span.attributes[SENTRY_OP]?.value === 'gen_ai.invoke_agent'); const generateContents = spans.filter( @@ -756,7 +756,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe const segment = container.items.find(span => span.is_segment && span.name === 'main'); expect(segment).toBeDefined(); const spans = container.items.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai', ); const invokeAgents = spans.filter(span => span.attributes[SENTRY_OP]?.value === 'gen_ai.invoke_agent'); const generateContents = spans.filter( @@ -802,7 +802,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe const segment = container.items.find(span => span.is_segment && span.name === 'main'); expect(segment).toBeDefined(); const spans = container.items.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai', ); const invokeAgent = spans.find(span => span.attributes[SENTRY_OP]?.value === 'gen_ai.invoke_agent')!; expect(invokeAgent.attributes['vercel.ai.operationId']?.value).toBe('ai.streamText'); @@ -857,7 +857,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe const segment = container.items.find(span => span.is_segment && span.name === 'main'); expect(segment).toBeDefined(); const spans = container.items.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai', ); const invokeAgent = spans.find(span => span.attributes[SENTRY_OP]?.value === 'gen_ai.invoke_agent')!; expect(invokeAgent.status).toBe('ok'); @@ -921,7 +921,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe const segment = container.items.find(span => span.is_segment && span.name === 'main'); expect(segment).toBeDefined(); const spans = container.items.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai', ); const invokeAgent = spans.find(span => span.attributes[SENTRY_OP]?.value === 'gen_ai.invoke_agent')!; expect(invokeAgent.status).toBe('ok'); @@ -965,7 +965,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe const segment = container.items.find(span => span.is_segment && span.name === 'main'); expect(segment).toBeDefined(); const spans = container.items.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai', ); // The model throws, so the operation rejects. The spans must still be *finished* (and // therefore present in the transaction) with an error status — not left open. @@ -1001,7 +1001,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe const segment = container.items.find(span => span.is_segment && span.name === 'main'); expect(segment).toBeDefined(); const spans = container.items.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai', ); const generateContent = spans.find( span => span.attributes[SENTRY_OP]?.value === 'gen_ai.generate_content', @@ -1108,7 +1108,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe const segment = container.items.find(span => span.is_segment && span.name === 'main'); expect(segment).toBeDefined(); const spans = container.items.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai', ); const generateContent = spans.find( span => span.attributes[SENTRY_OP]?.value === 'gen_ai.generate_content', @@ -1151,7 +1151,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe const segment = container.items.find(span => span.is_segment && span.name === 'main'); expect(segment).toBeDefined(); const spans = container.items.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai', ); const embedSpan = spans.find( @@ -1203,7 +1203,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe const segment = container.items.find(span => span.is_segment && span.name === 'main'); expect(segment).toBeDefined(); const spans = container.items.filter( - span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.vercelai.channel', + span => span.attributes[SENTRY_ORIGIN]?.value === 'auto.ai.vercelai', ); const invokeAgentSpan = spans.find(span => span.name === 'invoke_agent'); @@ -1293,7 +1293,7 @@ describe('Vercel AI integration experimental_decide', () => { const decideSpan = container.items.find(span => span.attributes[SENTRY_OP]?.value === GEN_AI_DECIDE)!; expect(decideSpan.name).toBe('decide typesafe-ai/jev'); expect(decideSpan.status).toBe('ok'); - expect(decideSpan.attributes[SENTRY_ORIGIN]?.value).toBe('auto.vercelai.channel'); + expect(decideSpan.attributes[SENTRY_ORIGIN]?.value).toBe('auto.ai.vercelai'); expect(decideSpan.attributes[GEN_AI_OPERATION_NAME]?.value).toBe('decide'); expect(decideSpan.attributes[GEN_AI_PROVIDER_NAME]?.value).toBe('gateway'); expect(decideSpan.attributes[GEN_AI_REQUEST_MODEL]?.value).toBe('typesafe-ai/jev'); diff --git a/packages/aws-serverless/src/requestSpanOptions.ts b/packages/aws-serverless/src/requestSpanOptions.ts index 82c10b13852a..0ef2d529179d 100644 --- a/packages/aws-serverless/src/requestSpanOptions.ts +++ b/packages/aws-serverless/src/requestSpanOptions.ts @@ -63,7 +63,7 @@ export function getRequestSpanOptions(event: unknown, context: Context, requestI : context.functionName, attributes: { [SENTRY_OP]: FUNCTION_AWS, - [SENTRY_ORIGIN]: 'auto.aws_lambda', + [SENTRY_ORIGIN]: 'auto.function.aws_lambda', [SENTRY_SEGMENT_NAME_SOURCE]: 'component', [SENTRY_KIND]: 'server', [FAAS_INVOCATION_ID]: context.awsRequestId, diff --git a/packages/browser-utils/src/web-vitals/spans.ts b/packages/browser-utils/src/web-vitals/spans.ts index 1660a44cf273..3361254ffc1d 100644 --- a/packages/browser-utils/src/web-vitals/spans.ts +++ b/packages/browser-utils/src/web-vitals/spans.ts @@ -228,7 +228,7 @@ export function _sendLcpSpan( _emitWebVitalSpan({ name, op: UI_WEBVITAL_LCP, - origin: 'auto.http.browser.lcp', + origin: 'auto.ui.browser.lcp', metricName: 'lcp', value: lcpValue, attributes, @@ -329,7 +329,7 @@ export function _sendClsSpan( _emitWebVitalSpan({ name, op: UI_WEBVITAL_CLS, - origin: 'auto.http.browser.cls', + origin: 'auto.ui.browser.cls', metricName: 'cls', value: clsValue, attributes, @@ -457,7 +457,7 @@ export function _sendInpSpan( _emitWebVitalSpan({ name, op: INTERACTION_TYPE_TO_SPAN_OP[interactionType], - origin: 'auto.http.browser.inp', + origin: 'auto.ui.browser.inp', metricName: 'inp', value: inpValue, attributes, diff --git a/packages/browser-utils/test/web-vitals/spans.test.ts b/packages/browser-utils/test/web-vitals/spans.test.ts index 92c86637cbf2..ebbb00ab9331 100644 --- a/packages/browser-utils/test/web-vitals/spans.test.ts +++ b/packages/browser-utils/test/web-vitals/spans.test.ts @@ -99,7 +99,7 @@ describe('_emitWebVitalSpan', () => { _emitWebVitalSpan({ name: 'Test Vital', op: 'ui.webvital.lcp', - origin: 'auto.http.browser.lcp', + origin: 'auto.ui.browser.lcp', metricName: 'lcp', value: 100, startTime: 1.5, @@ -108,7 +108,7 @@ describe('_emitWebVitalSpan', () => { expect(SentryCoreBrowser.startInactiveSpan).toHaveBeenCalledWith({ name: 'Test Vital', attributes: { - 'sentry.origin': 'auto.http.browser.lcp', + 'sentry.origin': 'auto.ui.browser.lcp', 'sentry.op': 'ui.webvital.lcp', 'sentry.exclusive_time': 0, 'browser.web_vital.lcp.value': 100, @@ -135,7 +135,7 @@ describe('_emitWebVitalSpan', () => { _emitWebVitalSpan({ name: 'Test Vital', op: 'ui.webvital.lcp', - origin: 'auto.http.browser.lcp', + origin: 'auto.ui.browser.lcp', metricName: 'lcp', value: 100, startTime: 1.5, @@ -156,7 +156,7 @@ describe('_emitWebVitalSpan', () => { _emitWebVitalSpan({ name: 'Test', op: 'ui.interaction.click', - origin: 'auto.http.browser.inp', + origin: 'auto.ui.browser.inp', metricName: 'inp', value: 100, startTime: 1.5, @@ -176,7 +176,7 @@ describe('_emitWebVitalSpan', () => { _emitWebVitalSpan({ name: 'Test', op: 'ui.interaction.click', - origin: 'auto.http.browser.inp', + origin: 'auto.ui.browser.inp', metricName: 'inp', value: 100, startTime: 1.5, @@ -201,7 +201,7 @@ describe('_emitWebVitalSpan', () => { _emitWebVitalSpan({ name: 'Test', op: 'ui.interaction.click', - origin: 'auto.http.browser.inp', + origin: 'auto.ui.browser.inp', metricName: 'inp', value: 100, startTime: 1.5, @@ -223,7 +223,7 @@ describe('_emitWebVitalSpan', () => { _emitWebVitalSpan({ name: 'Test', op: 'ui.interaction.click', - origin: 'auto.http.browser.inp', + origin: 'auto.ui.browser.inp', metricName: 'inp', value: 100, startTime: 1.5, @@ -244,7 +244,7 @@ describe('_emitWebVitalSpan', () => { _emitWebVitalSpan({ name: 'Test', op: 'ui.webvital.lcp', - origin: 'auto.http.browser.lcp', + origin: 'auto.ui.browser.lcp', metricName: 'lcp', value: 50, parentSpan: mockPageloadSpan as any, @@ -270,7 +270,7 @@ describe('_emitWebVitalSpan', () => { _emitWebVitalSpan({ name: 'Test', op: 'ui.interaction.click', - origin: 'auto.http.browser.inp', + origin: 'auto.ui.browser.inp', metricName: 'inp', value: 50, parentSpan: mockNonPageloadSpan as any, @@ -290,7 +290,7 @@ describe('_emitWebVitalSpan', () => { _emitWebVitalSpan({ name: 'Test', op: 'ui.webvital.lcp', - origin: 'auto.http.browser.lcp', + origin: 'auto.ui.browser.lcp', metricName: 'lcp', value: 50, attributes: { 'custom.attr': 'value' }, @@ -313,7 +313,7 @@ describe('_emitWebVitalSpan', () => { _emitWebVitalSpan({ name: 'Test', op: 'ui.webvital.lcp', - origin: 'auto.http.browser.lcp', + origin: 'auto.ui.browser.lcp', metricName: 'lcp', value: 50, startTime: 1.0, @@ -333,7 +333,7 @@ describe('_emitWebVitalSpan', () => { _emitWebVitalSpan({ name: 'Test', op: 'ui.webvital.lcp', - origin: 'auto.http.browser.lcp', + origin: 'auto.ui.browser.lcp', metricName: 'lcp', value: 50, startTime: 1.0, @@ -351,7 +351,7 @@ describe('_emitWebVitalSpan', () => { _emitWebVitalSpan({ name: 'Test', op: 'ui.webvital.lcp', - origin: 'auto.http.browser.lcp', + origin: 'auto.ui.browser.lcp', metricName: 'lcp', value: 50, startTime: 1.0, @@ -419,7 +419,7 @@ describe('_sendLcpSpan', () => { expect.objectContaining({ name: '', attributes: expect.objectContaining({ - 'sentry.origin': 'auto.http.browser.lcp', + 'sentry.origin': 'auto.ui.browser.lcp', 'sentry.op': 'ui.webvital.lcp', 'sentry.exclusive_time': 0, 'sentry.pageload.span_id': 'pageload-123', @@ -567,7 +567,7 @@ describe('_sendClsSpan', () => { expect.objectContaining({ name: '
', attributes: expect.objectContaining({ - 'sentry.origin': 'auto.http.browser.cls', + 'sentry.origin': 'auto.ui.browser.cls', 'sentry.op': 'ui.webvital.cls', 'sentry.pageload.span_id': 'pageload-789', 'browser.web_vital.cls.source.1': '
', @@ -676,7 +676,7 @@ describe('_sendInpSpan', () => { name: '