diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3-dynamic-import/tests/tracing.client.test.ts b/dev-packages/e2e-tests/test-applications/nuxt-3-dynamic-import/tests/tracing.client.test.ts index d55a7ccadc8a..ddbad70d31cc 100644 --- a/dev-packages/e2e-tests/test-applications/nuxt-3-dynamic-import/tests/tracing.client.test.ts +++ b/dev-packages/e2e-tests/test-applications/nuxt-3-dynamic-import/tests/tracing.client.test.ts @@ -45,9 +45,9 @@ test('sends component tracking spans when `trackComponents` is enabled', async ( const errorButtonSpan = rootSpan.spans.find((span: Span) => span.description === 'Vue '); const expected = { - data: { 'sentry.origin': 'auto.ui.vue', 'sentry.op': 'ui.vue.mount' }, + data: { 'sentry.origin': 'auto.ui.vue', 'sentry.op': 'ui.mount' }, description: 'Vue ', - op: 'ui.vue.mount', + op: 'ui.mount', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), start_timestamp: expect.any(Number), diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3-min/tests/tracing.client.test.ts b/dev-packages/e2e-tests/test-applications/nuxt-3-min/tests/tracing.client.test.ts index 8e4ecab9bb89..2906aec8c032 100644 --- a/dev-packages/e2e-tests/test-applications/nuxt-3-min/tests/tracing.client.test.ts +++ b/dev-packages/e2e-tests/test-applications/nuxt-3-min/tests/tracing.client.test.ts @@ -46,9 +46,9 @@ test('sends component tracking spans when `trackComponents` is enabled', async ( const errorButtonSpan = rootSpan.spans.find(span => span.description === 'Vue '); const expected = { - data: { 'sentry.origin': 'auto.ui.vue', 'sentry.op': 'ui.vue.mount' }, + data: { 'sentry.origin': 'auto.ui.vue', 'sentry.op': 'ui.mount' }, description: 'Vue ', - op: 'ui.vue.mount', + op: 'ui.mount', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), start_timestamp: expect.any(Number), diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3-top-level-import/tests/tracing.client.test.ts b/dev-packages/e2e-tests/test-applications/nuxt-3-top-level-import/tests/tracing.client.test.ts index 971d3682c9d2..62be945c4c02 100644 --- a/dev-packages/e2e-tests/test-applications/nuxt-3-top-level-import/tests/tracing.client.test.ts +++ b/dev-packages/e2e-tests/test-applications/nuxt-3-top-level-import/tests/tracing.client.test.ts @@ -45,9 +45,9 @@ test('sends component tracking spans when `trackComponents` is enabled', async ( const errorButtonSpan = rootSpan.spans.find((span: Span) => span.description === 'Vue '); const expected = { - data: { 'sentry.origin': 'auto.ui.vue', 'sentry.op': 'ui.vue.mount' }, + data: { 'sentry.origin': 'auto.ui.vue', 'sentry.op': 'ui.mount' }, description: 'Vue ', - op: 'ui.vue.mount', + op: 'ui.mount', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), start_timestamp: expect.any(Number), diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/tests/tracing.client.test.ts b/dev-packages/e2e-tests/test-applications/nuxt-3/tests/tracing.client.test.ts index 50c396192177..92289c2e936b 100644 --- a/dev-packages/e2e-tests/test-applications/nuxt-3/tests/tracing.client.test.ts +++ b/dev-packages/e2e-tests/test-applications/nuxt-3/tests/tracing.client.test.ts @@ -45,9 +45,9 @@ test('sends component tracking spans when `trackComponents` is enabled', async ( const errorButtonSpan = rootSpan.spans.find((span: Span) => span.description === 'Vue '); const expected = { - data: { 'sentry.origin': 'auto.ui.vue', 'sentry.op': 'ui.vue.mount' }, + data: { 'sentry.origin': 'auto.ui.vue', 'sentry.op': 'ui.mount' }, description: 'Vue ', - op: 'ui.vue.mount', + op: 'ui.mount', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), start_timestamp: expect.any(Number), diff --git a/dev-packages/e2e-tests/test-applications/nuxt-4/tests/tracing.client.test.ts b/dev-packages/e2e-tests/test-applications/nuxt-4/tests/tracing.client.test.ts index 3e0aac67ac9c..d8c7966ed408 100644 --- a/dev-packages/e2e-tests/test-applications/nuxt-4/tests/tracing.client.test.ts +++ b/dev-packages/e2e-tests/test-applications/nuxt-4/tests/tracing.client.test.ts @@ -80,9 +80,9 @@ test('sends component tracking spans when `trackComponents` is enabled', async ( const errorButtonSpan = rootSpan.spans.find((span: Span) => span.description === 'Vue '); const expected = { - data: { 'sentry.origin': 'auto.ui.vue', 'sentry.op': 'ui.vue.mount' }, + data: { 'sentry.origin': 'auto.ui.vue', 'sentry.op': 'ui.mount' }, description: 'Vue ', - op: 'ui.vue.mount', + op: 'ui.mount', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), start_timestamp: expect.any(Number), diff --git a/dev-packages/e2e-tests/test-applications/nuxt-5/tests/tracing.client.test.ts b/dev-packages/e2e-tests/test-applications/nuxt-5/tests/tracing.client.test.ts index f4a53b1b4fb7..650d63731ab2 100644 --- a/dev-packages/e2e-tests/test-applications/nuxt-5/tests/tracing.client.test.ts +++ b/dev-packages/e2e-tests/test-applications/nuxt-5/tests/tracing.client.test.ts @@ -80,9 +80,9 @@ test('sends component tracking spans when `trackComponents` is enabled', async ( const errorButtonSpan = rootSpan.spans.find((span: Span) => span.description === 'Vue '); const expected = { - data: { 'sentry.origin': 'auto.ui.vue', 'sentry.op': 'ui.vue.mount' }, + data: { 'sentry.origin': 'auto.ui.vue', 'sentry.op': 'ui.mount' }, description: 'Vue ', - op: 'ui.vue.mount', + op: 'ui.mount', parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), span_id: expect.stringMatching(/[a-f0-9]{16}/), start_timestamp: expect.any(Number), diff --git a/dev-packages/e2e-tests/test-applications/svelte-5/tests/performance.test.ts b/dev-packages/e2e-tests/test-applications/svelte-5/tests/performance.test.ts index 05391ed88042..e3623b62eb47 100644 --- a/dev-packages/e2e-tests/test-applications/svelte-5/tests/performance.test.ts +++ b/dev-packages/e2e-tests/test-applications/svelte-5/tests/performance.test.ts @@ -26,18 +26,18 @@ test('sends a pageload transaction with component tracking init spans', async ({ expect(pageloadTransaction.spans).toEqual( expect.arrayContaining([ expect.objectContaining({ - op: 'ui.svelte.init', + op: 'ui.mount', description: '', data: { - 'sentry.op': 'ui.svelte.init', + 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte', }, }), expect.objectContaining({ - op: 'ui.svelte.init', + op: 'ui.mount', description: '', data: { - 'sentry.op': 'ui.svelte.init', + 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte', }, }), diff --git a/dev-packages/e2e-tests/test-applications/sveltekit-2-kit-tracing/tests/tracing.client.test.ts b/dev-packages/e2e-tests/test-applications/sveltekit-2-kit-tracing/tests/tracing.client.test.ts index 0945fb54fdd2..be027d84db2c 100644 --- a/dev-packages/e2e-tests/test-applications/sveltekit-2-kit-tracing/tests/tracing.client.test.ts +++ b/dev-packages/e2e-tests/test-applications/sveltekit-2-kit-tracing/tests/tracing.client.test.ts @@ -101,27 +101,27 @@ test.describe('client-specific performance events', () => { expect(componentTxnEvent.spans).toEqual( expect.arrayContaining([ expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.init', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', }), expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.init', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', }), expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.init', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', }), expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.init', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', }), ]), diff --git a/dev-packages/e2e-tests/test-applications/sveltekit-2-svelte-5/tests/performance.client.test.ts b/dev-packages/e2e-tests/test-applications/sveltekit-2-svelte-5/tests/performance.client.test.ts index 183591c38c38..ebf9dd764b21 100644 --- a/dev-packages/e2e-tests/test-applications/sveltekit-2-svelte-5/tests/performance.client.test.ts +++ b/dev-packages/e2e-tests/test-applications/sveltekit-2-svelte-5/tests/performance.client.test.ts @@ -101,27 +101,27 @@ test.describe('client-specific performance events', () => { expect(componentTxnEvent.spans).toEqual( expect.arrayContaining([ expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.init', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', }), expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.init', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', }), expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.init', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', }), expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.init', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', }), ]), diff --git a/dev-packages/e2e-tests/test-applications/sveltekit-2/tests/performance.client.test.ts b/dev-packages/e2e-tests/test-applications/sveltekit-2/tests/performance.client.test.ts index ee2263949e06..8d3eb63f774c 100644 --- a/dev-packages/e2e-tests/test-applications/sveltekit-2/tests/performance.client.test.ts +++ b/dev-packages/e2e-tests/test-applications/sveltekit-2/tests/performance.client.test.ts @@ -96,51 +96,51 @@ test.describe('client-specific performance events', () => { expect(componentTxnEvent.spans).toEqual( expect.arrayContaining([ expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.init', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', }), expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.init', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', }), expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.init', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', }), expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.init', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', }), expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.update', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.update', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.update', + op: 'ui.update', origin: 'auto.ui.svelte', }), expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.update', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.update', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.update', + op: 'ui.update', origin: 'auto.ui.svelte', }), expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.update', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.update', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.update', + op: 'ui.update', origin: 'auto.ui.svelte', }), expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.update', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.update', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.update', + op: 'ui.update', origin: 'auto.ui.svelte', }), ]), diff --git a/dev-packages/e2e-tests/test-applications/sveltekit-3/tests/tracing.client.test.ts b/dev-packages/e2e-tests/test-applications/sveltekit-3/tests/tracing.client.test.ts index d47359818c27..33a7804f37c2 100644 --- a/dev-packages/e2e-tests/test-applications/sveltekit-3/tests/tracing.client.test.ts +++ b/dev-packages/e2e-tests/test-applications/sveltekit-3/tests/tracing.client.test.ts @@ -86,27 +86,27 @@ test.describe('client-specific performance events', () => { expect(componentTxnEvent.spans).toEqual( expect.arrayContaining([ expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.init', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', }), expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.init', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', }), expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.init', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', }), expect.objectContaining({ - data: { 'sentry.op': 'ui.svelte.init', 'sentry.origin': 'auto.ui.svelte' }, + data: { 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte' }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', }), ]), diff --git a/dev-packages/e2e-tests/test-applications/vue-3/tests/performance.test.ts b/dev-packages/e2e-tests/test-applications/vue-3/tests/performance.test.ts index a1a9626d01cf..8570b1a04bb8 100644 --- a/dev-packages/e2e-tests/test-applications/vue-3/tests/performance.test.ts +++ b/dev-packages/e2e-tests/test-applications/vue-3/tests/performance.test.ts @@ -163,54 +163,54 @@ test('sends a lifecycle span for each tracked components', async ({ page }) => { // enabled by default expect.objectContaining({ data: { - 'sentry.op': 'ui.vue.render', + 'sentry.op': 'ui.render', 'sentry.origin': 'auto.ui.vue', }, description: 'Application Render', - op: 'ui.vue.render', + op: 'ui.render', origin: 'auto.ui.vue', }), // enabled by default expect.objectContaining({ data: { - 'sentry.op': 'ui.vue.mount', + 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.vue', }, description: 'Vue ', - op: 'ui.vue.mount', + op: 'ui.mount', origin: 'auto.ui.vue', }), // without `<>` expect.objectContaining({ data: { - 'sentry.op': 'ui.vue.mount', + 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.vue', }, description: 'Vue ', - op: 'ui.vue.mount', + op: 'ui.mount', origin: 'auto.ui.vue', }), // with `<>` expect.objectContaining({ data: { - 'sentry.op': 'ui.vue.mount', + 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.vue', }, description: 'Vue ', - op: 'ui.vue.mount', + op: 'ui.mount', origin: 'auto.ui.vue', }), // not tracked expect.not.objectContaining({ data: { - 'sentry.op': 'ui.vue.mount', + 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.vue', }, description: 'Vue ', - op: 'ui.vue.mount', + op: 'ui.mount', origin: 'auto.ui.vue', }), ]), diff --git a/packages/react/src/constants.ts b/packages/react/src/constants.ts deleted file mode 100644 index 87f5d5260889..000000000000 --- a/packages/react/src/constants.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const REACT_RENDER_OP = 'ui.react.render'; - -export const REACT_UPDATE_OP = 'ui.react.update'; - -export const REACT_MOUNT_OP = 'ui.react.mount'; diff --git a/packages/react/src/profiler.tsx b/packages/react/src/profiler.tsx index e7a85b0e86dd..305199d4eb06 100644 --- a/packages/react/src/profiler.tsx +++ b/packages/react/src/profiler.tsx @@ -1,8 +1,9 @@ import { startInactiveSpan } from '@sentry/browser'; import type { Span } from '@sentry/core'; import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, spanToJSON, timestampInSeconds, withActiveSpan } from '@sentry/core'; +import { SENTRY_OP } from '@sentry/conventions/attributes'; +import { BROWSER_UI_RENDER_SPAN_OP } from '@sentry/conventions/op'; import * as React from 'react'; -import { REACT_MOUNT_OP, REACT_RENDER_OP, REACT_UPDATE_OP } from './constants'; import { hoistNonReactStatics } from './hoist-non-react-statics'; export const UNKNOWN_COMPONENT = 'unknown'; @@ -49,8 +50,9 @@ class Profiler extends React.Component { this._mountSpan = startInactiveSpan({ name: `<${name}>`, onlyIfParent: true, - op: REACT_MOUNT_OP, attributes: { + // TODO(conventions): Replace `'ui.mount'` with the `ui.mount` span op constant once it is released in `@sentry/conventions`. + [SENTRY_OP]: 'ui.mount', [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler', 'ui.component_name': name, }, @@ -78,9 +80,10 @@ class Profiler extends React.Component { return startInactiveSpan({ name: `<${this.props.name}>`, onlyIfParent: true, - op: REACT_UPDATE_OP, startTime: now, attributes: { + // TODO(conventions): Replace `'ui.update'` with the `ui.update` span op constant once it is released in `@sentry/conventions`. + [SENTRY_OP]: 'ui.update', [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler', 'ui.component_name': this.props.name, 'ui.react.changed_props': changedProps, @@ -112,9 +115,9 @@ class Profiler extends React.Component { const renderSpan = startInactiveSpan({ onlyIfParent: true, name: `<${name}>`, - op: REACT_RENDER_OP, startTime, attributes: { + [SENTRY_OP]: BROWSER_UI_RENDER_SPAN_OP, [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler', 'ui.component_name': name, }, @@ -194,8 +197,9 @@ function useProfiler( return startInactiveSpan({ name: `<${name}>`, onlyIfParent: true, - op: REACT_MOUNT_OP, attributes: { + // TODO(conventions): Replace `'ui.mount'` with the `ui.mount` span op constant once it is released in `@sentry/conventions`. + [SENTRY_OP]: 'ui.mount', [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler', 'ui.component_name': name, }, @@ -215,9 +219,9 @@ function useProfiler( const renderSpan = startInactiveSpan({ name: `<${name}>`, onlyIfParent: true, - op: REACT_RENDER_OP, startTime, attributes: { + [SENTRY_OP]: BROWSER_UI_RENDER_SPAN_OP, [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler', 'ui.component_name': name, }, diff --git a/packages/react/test/profiler.test.tsx b/packages/react/test/profiler.test.tsx index 5150975212ee..c03f87efc860 100644 --- a/packages/react/test/profiler.test.tsx +++ b/packages/react/test/profiler.test.tsx @@ -7,7 +7,6 @@ import { render } from '@testing-library/react'; import { renderHook } from '@testing-library/react-hooks'; import * as React from 'react'; import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { REACT_MOUNT_OP, REACT_RENDER_OP, REACT_UPDATE_OP } from '../src/constants'; import { UNKNOWN_COMPONENT, useProfiler, withProfiler } from '../src/profiler'; const mockStartInactiveSpan = vi.fn((spanArgs: StartSpanOptions) => ({ ...spanArgs })); @@ -75,8 +74,8 @@ describe('withProfiler', () => { expect(mockStartInactiveSpan).toHaveBeenLastCalledWith({ name: `<${UNKNOWN_COMPONENT}>`, onlyIfParent: true, - op: REACT_MOUNT_OP, attributes: { + 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.react.profiler', 'ui.component_name': 'unknown', }, @@ -96,9 +95,9 @@ describe('withProfiler', () => { expect(mockStartInactiveSpan).toHaveBeenLastCalledWith({ name: `<${UNKNOWN_COMPONENT}>`, onlyIfParent: true, - op: REACT_RENDER_OP, startTime: undefined, attributes: { + 'sentry.op': 'ui.render', 'sentry.origin': 'auto.ui.react.profiler', 'ui.component_name': 'unknown', }, @@ -130,13 +129,13 @@ describe('withProfiler', () => { expect(mockStartInactiveSpan).toHaveBeenCalledTimes(2); expect(mockStartInactiveSpan).toHaveBeenLastCalledWith({ attributes: { + 'sentry.op': 'ui.update', 'sentry.origin': 'auto.ui.react.profiler', 'ui.react.changed_props': ['num'], 'ui.component_name': 'unknown', }, name: `<${UNKNOWN_COMPONENT}>`, onlyIfParent: true, - op: REACT_UPDATE_OP, startTime: expect.any(Number), }); expect(mockFinish).toHaveBeenCalledTimes(2); @@ -145,13 +144,13 @@ describe('withProfiler', () => { expect(mockStartInactiveSpan).toHaveBeenCalledTimes(3); expect(mockStartInactiveSpan).toHaveBeenLastCalledWith({ attributes: { + 'sentry.op': 'ui.update', 'sentry.origin': 'auto.ui.react.profiler', 'ui.react.changed_props': ['num'], 'ui.component_name': 'unknown', }, name: `<${UNKNOWN_COMPONENT}>`, onlyIfParent: true, - op: REACT_UPDATE_OP, startTime: expect.any(Number), }); expect(mockFinish).toHaveBeenCalledTimes(3); @@ -190,8 +189,8 @@ describe('useProfiler()', () => { expect(mockStartInactiveSpan).toHaveBeenLastCalledWith({ name: '', onlyIfParent: true, - op: REACT_MOUNT_OP, attributes: { + 'sentry.op': 'ui.mount', 'ui.component_name': 'Example', 'sentry.origin': 'auto.ui.react.profiler', }, @@ -217,8 +216,8 @@ describe('useProfiler()', () => { expect.objectContaining({ name: '', onlyIfParent: true, - op: REACT_RENDER_OP, attributes: { + 'sentry.op': 'ui.render', 'sentry.origin': 'auto.ui.react.profiler', 'ui.component_name': 'Example', }, diff --git a/packages/replay-internal/test/fixtures/transaction.ts b/packages/replay-internal/test/fixtures/transaction.ts index d989ae7a5316..3dfbea5e4dd8 100644 --- a/packages/replay-internal/test/fixtures/transaction.ts +++ b/packages/replay-internal/test/fixtures/transaction.ts @@ -28,7 +28,7 @@ export function Transaction(traceId?: string, obj?: Partial): any { // {{{ { description: '', - op: 'ui.react.mount', + op: 'ui.mount', parent_span_id: 'b44b173b1c74a782', span_id: '9ea106e8efbce4a0', start_timestamp: 1668184224.4743, @@ -37,7 +37,7 @@ export function Transaction(traceId?: string, obj?: Partial): any { }, { description: '', - op: 'ui.react.update', + op: 'ui.update', parent_span_id: 'b44b173b1c74a782', span_id: 'b4c7b421761d903a', start_timestamp: 1668184224.4843998, diff --git a/packages/svelte/package.json b/packages/svelte/package.json index 91c3e3f56249..6cd416c60bea 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -33,6 +33,7 @@ }, "dependencies": { "@sentry/browser": "10.67.0", + "@sentry/conventions": "^0.16.0", "@sentry/core": "10.67.0", "magic-string": "~0.30.0" }, diff --git a/packages/svelte/src/performance.ts b/packages/svelte/src/performance.ts index 2f4a377aa307..89c448988d8c 100644 --- a/packages/svelte/src/performance.ts +++ b/packages/svelte/src/performance.ts @@ -1,6 +1,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/browser'; import type { Span } from '@sentry/core'; import { debug, startInactiveSpan } from '@sentry/core'; +import { SENTRY_OP } from '@sentry/conventions/attributes'; import { afterUpdate, beforeUpdate, onMount } from 'svelte'; import { DEBUG_BUILD } from './debug_build'; import type { TrackComponentOptions } from './types'; @@ -49,9 +50,12 @@ export function trackComponent(options?: TrackComponentOptions): void { function recordInitSpan(componentName: string): void { const initSpan = startInactiveSpan({ onlyIfParent: true, - op: 'ui.svelte.init', name: componentName, - attributes: { [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.svelte' }, + attributes: { + // TODO(conventions): Replace `'ui.mount'` with the `ui.mount` span op constant once it is released in `@sentry/conventions`. + [SENTRY_OP]: 'ui.mount', + [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.svelte', + }, }); onMount(() => { @@ -64,9 +68,12 @@ function recordUpdateSpans(componentName: string): void { beforeUpdate(() => { updateSpan = startInactiveSpan({ onlyIfParent: true, - op: 'ui.svelte.update', name: componentName, - attributes: { [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.svelte' }, + attributes: { + // TODO(conventions): Replace `'ui.update'` with the `ui.update` span op constant once it is released in `@sentry/conventions`. + [SENTRY_OP]: 'ui.update', + [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.svelte', + }, }); }); diff --git a/packages/svelte/test/performance.test.ts b/packages/svelte/test/performance.test.ts index e20fb4f41f2f..c49c0cc7401c 100644 --- a/packages/svelte/test/performance.test.ts +++ b/packages/svelte/test/performance.test.ts @@ -53,11 +53,11 @@ describe('Sentry.trackComponent()', () => { expect(transaction.spans![0]).toEqual({ data: { - 'sentry.op': 'ui.svelte.init', + 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte', }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', parent_span_id: rootSpanId, span_id: initSpanId, @@ -94,11 +94,11 @@ describe('Sentry.trackComponent()', () => { expect(transaction.spans![0]).toEqual({ data: { - 'sentry.op': 'ui.svelte.init', + 'sentry.op': 'ui.mount', 'sentry.origin': 'auto.ui.svelte', }, description: '', - op: 'ui.svelte.init', + op: 'ui.mount', origin: 'auto.ui.svelte', parent_span_id: rootSpanId, span_id: initSpanId, @@ -110,11 +110,11 @@ describe('Sentry.trackComponent()', () => { expect(transaction.spans![1]).toEqual({ data: { - 'sentry.op': 'ui.svelte.update', + 'sentry.op': 'ui.update', 'sentry.origin': 'auto.ui.svelte', }, description: '', - op: 'ui.svelte.update', + op: 'ui.update', origin: 'auto.ui.svelte', parent_span_id: rootSpanId, span_id: expect.stringMatching(/[a-f0-9]{16}/), @@ -126,11 +126,11 @@ describe('Sentry.trackComponent()', () => { expect(transaction.spans![2]).toEqual({ data: { - 'sentry.op': 'ui.svelte.update', + 'sentry.op': 'ui.update', 'sentry.origin': 'auto.ui.svelte', }, description: '', - op: 'ui.svelte.update', + op: 'ui.update', origin: 'auto.ui.svelte', parent_span_id: rootSpanId, span_id: expect.stringMatching(/[a-f0-9]{16}/), @@ -154,7 +154,7 @@ describe('Sentry.trackComponent()', () => { const transaction = transactions[0]!; expect(transaction.spans).toHaveLength(1); - expect(transaction.spans![0]?.op).toEqual('ui.svelte.init'); + expect(transaction.spans![0]?.op).toEqual('ui.mount'); }); it('only creates update spans if trackInit is deactivated', async () => { @@ -170,7 +170,7 @@ describe('Sentry.trackComponent()', () => { const transaction = transactions[0]!; expect(transaction.spans).toHaveLength(1); - expect(transaction.spans![0]?.op).toEqual('ui.svelte.update'); + expect(transaction.spans![0]?.op).toEqual('ui.update'); }); it('creates no spans if trackInit and trackUpdates are deactivated', async () => { @@ -241,7 +241,7 @@ describe('Sentry.trackComponent()', () => { // One update span is triggered by the initial rendering, but the second one is not captured expect(transaction.spans).toHaveLength(2); - expect(transaction.spans![0]?.op).toEqual('ui.svelte.init'); - expect(transaction.spans![1]?.op).toEqual('ui.svelte.update'); + expect(transaction.spans![0]?.op).toEqual('ui.mount'); + expect(transaction.spans![1]?.op).toEqual('ui.update'); }); }); diff --git a/packages/vue/src/tracing.ts b/packages/vue/src/tracing.ts index f33c998701eb..f15ac81951e6 100644 --- a/packages/vue/src/tracing.ts +++ b/packages/vue/src/tracing.ts @@ -1,12 +1,23 @@ import { getActiveSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startInactiveSpan } from '@sentry/browser'; import type { Span } from '@sentry/core'; import { debug, timestampInSeconds, uniq } from '@sentry/core'; +import { SENTRY_OP } from '@sentry/conventions/attributes'; +import { BROWSER_UI_RENDER_SPAN_OP } from '@sentry/conventions/op'; import { DEFAULT_HOOKS } from './constants'; import { DEBUG_BUILD } from './debug-build'; import type { Hook, Operation, TracingOptions, ViewModel, Vue } from './types'; import { formatComponentName } from './vendor/components'; -const VUE_OP = 'ui.vue'; +// Maps each Vue lifecycle operation to a cross-framework span op. +// TODO(conventions): Replace `'ui.mount'`, `'ui.update'` and `'ui.unmount'` with their span op constants once they are released in `@sentry/conventions`. +const VUE_OPERATION_TO_SPAN_OP: Record = { + activate: 'ui.mount', + create: 'ui.mount', + mount: 'ui.mount', + update: 'ui.update', + unmount: 'ui.unmount', + destroy: 'ui.unmount', +}; type Mixins = Parameters[0]; @@ -84,8 +95,8 @@ export const createTracingMixins = (options: Partial = {}): Mixi this.$_sentryRootComponentSpan || startInactiveSpan({ name: 'Application Render', - op: `${VUE_OP}.render`, attributes: { + [SENTRY_OP]: BROWSER_UI_RENDER_SPAN_OP, [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.vue', }, onlyIfParent: true, @@ -131,8 +142,8 @@ export const createTracingMixins = (options: Partial = {}): Mixi this.$_sentryComponentSpans[operation] = startInactiveSpan({ name: `Vue ${componentName}`, - op: `${VUE_OP}.${operation}`, attributes: { + [SENTRY_OP]: VUE_OPERATION_TO_SPAN_OP[operation], [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.vue', }, // UI spans should only be created if there is an active root span (transaction) diff --git a/packages/vue/test/tracing/tracingMixin.test.ts b/packages/vue/test/tracing/tracingMixin.test.ts index 2c08a20c61cd..7857b23c5782 100644 --- a/packages/vue/test/tracing/tracingMixin.test.ts +++ b/packages/vue/test/tracing/tracingMixin.test.ts @@ -121,7 +121,7 @@ describe('Vue Tracing Mixins', () => { expect(startInactiveSpan).toHaveBeenCalledWith( expect.objectContaining({ name: 'Application Render', - op: 'ui.vue.render', + attributes: expect.objectContaining({ 'sentry.op': 'ui.render' }), }), ); }); @@ -158,7 +158,7 @@ describe('Vue Tracing Mixins', () => { expect(startInactiveSpan).toHaveBeenCalledWith( expect.objectContaining({ name: 'Vue TestComponent', - op: 'ui.vue.mount', + attributes: expect.objectContaining({ 'sentry.op': 'ui.mount' }), }), ); expect(mockVueInstance.$_sentryComponentSpans.mount).toBeDefined(); @@ -227,7 +227,7 @@ describe('Vue Tracing Mixins', () => { expect(startInactiveSpan).toHaveBeenCalledWith( expect.objectContaining({ name: 'Vue TestComponent', - op: 'ui.vue.mount', + attributes: expect.objectContaining({ 'sentry.op': 'ui.mount' }), }), ); });