diff --git a/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/before-send/scenario.ts b/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/before-send/scenario.ts index 2b90554e068b..4c6f464b62f9 100644 --- a/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/before-send/scenario.ts +++ b/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/before-send/scenario.ts @@ -4,7 +4,6 @@ import { loggingTransport } from '@sentry-internal/node-integration-tests'; // eslint-disable-next-line @typescript-eslint/no-floating-promises (async () => { Sentry.init({ - traceLifecycle: 'static', dsn: 'https://public@dsn.ingest.sentry.io/1337', transport: loggingTransport, beforeSend(event) { diff --git a/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/event-processor-throws/scenario-async.ts b/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/event-processor-throws/scenario-async.ts index bade2d046447..f92604e5971d 100644 --- a/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/event-processor-throws/scenario-async.ts +++ b/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/event-processor-throws/scenario-async.ts @@ -2,7 +2,6 @@ import * as Sentry from '@sentry/node'; import { loggingTransport } from '@sentry-internal/node-integration-tests'; Sentry.init({ - traceLifecycle: 'static', dsn: 'https://public@dsn.ingest.sentry.io/1337', transport: loggingTransport, }); diff --git a/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/event-processors/scenario.ts b/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/event-processors/scenario.ts index 56a4eef4831b..70af7e321108 100644 --- a/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/event-processors/scenario.ts +++ b/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/event-processors/scenario.ts @@ -4,7 +4,6 @@ import { loggingTransport } from '@sentry-internal/node-integration-tests'; // eslint-disable-next-line @typescript-eslint/no-floating-promises (async () => { Sentry.init({ - traceLifecycle: 'static', dsn: 'https://public@dsn.ingest.sentry.io/1337', transport: loggingTransport, }); diff --git a/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/traces-sampler-throws/scenario-fallback.ts b/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/traces-sampler-throws/scenario-fallback.ts index 9d5524afe3ab..8f838322f5ec 100644 --- a/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/traces-sampler-throws/scenario-fallback.ts +++ b/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/traces-sampler-throws/scenario-fallback.ts @@ -2,7 +2,6 @@ import * as Sentry from '@sentry/node'; import { loggingTransport } from '@sentry-internal/node-integration-tests'; Sentry.init({ - traceLifecycle: 'static', dsn: 'https://public@dsn.ingest.sentry.io/1337', transport: loggingTransport, tracesSampleRate: 1, diff --git a/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/traces-sampler-throws/test.ts b/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/traces-sampler-throws/test.ts index e511fc97e8a9..965985ea78d0 100644 --- a/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/traces-sampler-throws/test.ts +++ b/dev-packages/node-integration-tests/suites/client-reports/drop-reasons/traces-sampler-throws/test.ts @@ -1,4 +1,4 @@ -import { afterAll, test } from 'vitest'; +import { afterAll, expect, test } from 'vitest'; import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; afterAll(() => { @@ -25,9 +25,11 @@ test('records a client report and no error event when tracesSampler throws', asy test('sends the span when tracesSampler throws but tracesSampleRate is 1', async () => { await createRunner(__dirname, 'scenario-fallback.ts') + .unordered() .expect({ - transaction: { - transaction: 'sampled via tracesSampleRate fallback', + span: container => { + const segment = container.items.find(span => span.is_segment); + expect(segment?.name).toBe('sampled via tracesSampleRate fallback'); }, }) .start() diff --git a/dev-packages/node-integration-tests/suites/featureFlags/featureFlagsIntegration/onSpan/scenario.ts b/dev-packages/node-integration-tests/suites/featureFlags/featureFlagsIntegration/onSpan/scenario.ts index 2f78fabdebe9..2c07e46b40ed 100644 --- a/dev-packages/node-integration-tests/suites/featureFlags/featureFlagsIntegration/onSpan/scenario.ts +++ b/dev-packages/node-integration-tests/suites/featureFlags/featureFlagsIntegration/onSpan/scenario.ts @@ -3,7 +3,6 @@ import * as Sentry from '@sentry/node'; import { loggingTransport } from '@sentry-internal/node-integration-tests'; Sentry.init({ - traceLifecycle: 'static', dsn: 'https://public@dsn.ingest.sentry.io/1337', sampleRate: 1.0, tracesSampleRate: 1.0, diff --git a/dev-packages/node-integration-tests/suites/featureFlags/featureFlagsIntegration/onSpan/test.ts b/dev-packages/node-integration-tests/suites/featureFlags/featureFlagsIntegration/onSpan/test.ts index 4a417a3c3959..b62c330ce81e 100644 --- a/dev-packages/node-integration-tests/suites/featureFlags/featureFlagsIntegration/onSpan/test.ts +++ b/dev-packages/node-integration-tests/suites/featureFlags/featureFlagsIntegration/onSpan/test.ts @@ -1,4 +1,4 @@ -import { _INTERNAL_MAX_FLAGS_PER_SPAN as MAX_FLAGS_PER_SPAN } from '@sentry/core'; +import { _INTERNAL_MAX_FLAGS_PER_SPAN as MAX_FLAGS_PER_SPAN, type SerializedStreamedSpanContainer } from '@sentry/core'; import { afterAll, expect, test } from 'vitest'; import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; @@ -8,24 +8,31 @@ afterAll(() => { test('Flags captured on span attributes with max limit', async () => { // Based on scenario.ts. - const expectedFlags: Record = {}; + const expectedFlags: Record = {}; for (let i = 1; i <= MAX_FLAGS_PER_SPAN; i++) { - expectedFlags[`flag.evaluation.feat${i}`] = i === 3; + expectedFlags[`flag.evaluation.feat${i}`] = { type: 'boolean', value: i === 3 }; } + const spans: SerializedStreamedSpanContainer['items'] = []; await createRunner(__dirname, 'scenario.ts') + .unordered() .expect({ - transaction: { - spans: [ - expect.objectContaining({ - description: 'test-span', - data: expect.objectContaining({}), - }), - expect.objectContaining({ - description: 'test-nested-span', - data: expect.objectContaining(expectedFlags), - }), - ], + span: container => { + spans.push(...container.items); + const children = spans.filter(span => !span.is_segment); + expect(children).toHaveLength(2); + expect(children).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + name: 'test-span', + attributes: expect.objectContaining({}), + }), + expect.objectContaining({ + name: 'test-nested-span', + attributes: expect.objectContaining(expectedFlags), + }), + ]), + ); }, }) .start() diff --git a/dev-packages/node-integration-tests/suites/featureFlags/growthbook/onSpan/scenario.ts b/dev-packages/node-integration-tests/suites/featureFlags/growthbook/onSpan/scenario.ts index 7f9da04fdbd8..b25f36f00951 100644 --- a/dev-packages/node-integration-tests/suites/featureFlags/growthbook/onSpan/scenario.ts +++ b/dev-packages/node-integration-tests/suites/featureFlags/growthbook/onSpan/scenario.ts @@ -44,7 +44,6 @@ class GrowthBookWrapper { const gb = new GrowthBookWrapper(); Sentry.init({ - traceLifecycle: 'static', dsn: 'https://public@dsn.ingest.sentry.io/1337', sampleRate: 1.0, tracesSampleRate: 1.0, diff --git a/dev-packages/node-integration-tests/suites/featureFlags/growthbook/onSpan/test.ts b/dev-packages/node-integration-tests/suites/featureFlags/growthbook/onSpan/test.ts index 3f0011b4f617..8f5d4fdbdf9b 100644 --- a/dev-packages/node-integration-tests/suites/featureFlags/growthbook/onSpan/test.ts +++ b/dev-packages/node-integration-tests/suites/featureFlags/growthbook/onSpan/test.ts @@ -7,26 +7,26 @@ afterAll(() => { test('GrowthBook flags are added to active span attributes on span end', async () => { await createRunner(__dirname, 'scenario.ts') + .unordered() .expect({ - transaction: { - contexts: { - trace: { - data: { - 'flag.evaluation.feat1': true, - 'flag.evaluation.feat2': false, - 'flag.evaluation.bool-feat': true, - // string-feat should NOT be here since it's not boolean - }, - op: 'function', - origin: 'manual', - status: 'ok', - span_id: expect.stringMatching(/[a-f\d]{16}/), - trace_id: expect.stringMatching(/[a-f\d]{32}/), + span: container => { + expect(container.items).toHaveLength(1); + const span = container.items.find(item => item.is_segment); + expect(span).toMatchObject({ + name: 'test-span', + status: 'ok', + span_id: expect.stringMatching(/[a-f\d]{16}/), + trace_id: expect.stringMatching(/[a-f\d]{32}/), + attributes: { + 'flag.evaluation.feat1': { type: 'boolean', value: true }, + 'flag.evaluation.feat2': { type: 'boolean', value: false }, + 'flag.evaluation.bool-feat': { type: 'boolean', value: true }, + 'sentry.op': { type: 'string', value: 'function' }, + 'sentry.origin': { type: 'string', value: 'manual' }, }, - }, - spans: [], - transaction: 'test-span', - type: 'transaction', + }); + // string-feat should NOT be here since it's not boolean + expect(span?.attributes['flag.evaluation.string-feat']).toBeUndefined(); }, }) .start() diff --git a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/ignore-custom-name.js b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/ignore-custom-name.js index 5005a1bc3e2c..f85ebfada002 100644 --- a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/ignore-custom-name.js +++ b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/ignore-custom-name.js @@ -2,7 +2,6 @@ const Sentry = require('@sentry/node'); const { expectProcessToExit } = require('../../../utils/expect-process-to-exit'); Sentry.init({ - traceLifecycle: 'static', dsn: 'https://public@dsn.ingest.sentry.io/1337', integrations: [ Sentry.onUnhandledRejectionIntegration({ diff --git a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/ignore-default.js b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/ignore-default.js index 84676901b052..d59cd557a4cb 100644 --- a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/ignore-default.js +++ b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/ignore-default.js @@ -2,7 +2,6 @@ const Sentry = require('@sentry/node'); const { expectProcessToExit } = require('../../../utils/expect-process-to-exit'); Sentry.init({ - traceLifecycle: 'static', dsn: 'https://public@dsn.ingest.sentry.io/1337', // Use default mode: 'warn' - integration is active but should ignore AI_NoOutputGeneratedError }); diff --git a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/mode-none.js b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/mode-none.js index 5db0588888ec..cad5ce1c8fe5 100644 --- a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/mode-none.js +++ b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/mode-none.js @@ -2,7 +2,6 @@ const Sentry = require('@sentry/node'); const { expectProcessToExit } = require('../../../utils/expect-process-to-exit'); Sentry.init({ - traceLifecycle: 'static', dsn: 'https://public@dsn.ingest.sentry.io/1337', integrations: [Sentry.onUnhandledRejectionIntegration({ mode: 'none' })], }); diff --git a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/mode-strict.js b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/mode-strict.js index 1eeaf1e71cab..841668b4b4ac 100644 --- a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/mode-strict.js +++ b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/mode-strict.js @@ -2,7 +2,6 @@ const Sentry = require('@sentry/node'); const { expectProcessToExit } = require('../../../utils/expect-process-to-exit'); Sentry.init({ - traceLifecycle: 'static', dsn: 'https://public@dsn.ingest.sentry.io/1337', integrations: [Sentry.onUnhandledRejectionIntegration({ mode: 'strict' })], }); diff --git a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/mode-warn-error.js b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/mode-warn-error.js index a9d3648132b8..45a84bbf5594 100644 --- a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/mode-warn-error.js +++ b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/mode-warn-error.js @@ -2,7 +2,6 @@ const Sentry = require('@sentry/node'); const { expectProcessToExit } = require('../../../utils/expect-process-to-exit'); Sentry.init({ - traceLifecycle: 'static', dsn: 'https://public@dsn.ingest.sentry.io/1337', }); diff --git a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/mode-warn-string.js b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/mode-warn-string.js index 2be232cfa92e..79ea78de095f 100644 --- a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/mode-warn-string.js +++ b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/mode-warn-string.js @@ -2,7 +2,6 @@ const Sentry = require('@sentry/node'); const { expectProcessToExit } = require('../../../utils/expect-process-to-exit'); Sentry.init({ - traceLifecycle: 'static', dsn: 'https://public@dsn.ingest.sentry.io/1337', }); diff --git a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/scenario-strict.ts b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/scenario-strict.ts index 053a73a4b790..a26e19de58d3 100644 --- a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/scenario-strict.ts +++ b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/scenario-strict.ts @@ -2,7 +2,6 @@ import * as Sentry from '@sentry/node'; import { loggingTransport } from '@sentry-internal/node-integration-tests'; Sentry.init({ - traceLifecycle: 'static', dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', transport: loggingTransport, diff --git a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/scenario-warn.ts b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/scenario-warn.ts index 9ed5ee4a447a..24b3093a554c 100644 --- a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/scenario-warn.ts +++ b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/scenario-warn.ts @@ -2,7 +2,6 @@ import * as Sentry from '@sentry/node'; import { loggingTransport } from '@sentry-internal/node-integration-tests'; Sentry.init({ - traceLifecycle: 'static', dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', transport: loggingTransport, diff --git a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/scenario-with-span-ended.ts b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/scenario-with-span-ended.ts index af022a693202..72d83d70ec72 100644 --- a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/scenario-with-span-ended.ts +++ b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/scenario-with-span-ended.ts @@ -2,7 +2,6 @@ import * as Sentry from '@sentry/node'; import { loggingTransport } from '@sentry-internal/node-integration-tests'; Sentry.init({ - traceLifecycle: 'static', dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', tracesSampleRate: 1, diff --git a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/scenario-with-span.ts b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/scenario-with-span.ts index 214ab0a52855..edff30f114ca 100644 --- a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/scenario-with-span.ts +++ b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/scenario-with-span.ts @@ -2,7 +2,6 @@ import * as Sentry from '@sentry/node'; import { loggingTransport } from '@sentry-internal/node-integration-tests'; Sentry.init({ - traceLifecycle: 'static', dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', tracesSampleRate: 1, diff --git a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/test.ts b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/test.ts index 0cc15ce97173..199f3dffe5aa 100644 --- a/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/test.ts +++ b/dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/test.ts @@ -1,4 +1,4 @@ -import type { Event } from '@sentry/node'; +import type { Event, SerializedStreamedSpanContainer } from '@sentry/node'; import * as childProcess from 'child_process'; import * as path from 'path'; import { afterAll, describe, expect, test } from 'vitest'; @@ -142,15 +142,16 @@ test rejection`); .completed(); }); - // Bun: the error event arrives before the transaction, or has a different span id. - test.skipIf(RUNTIME === 'bun')('handles unhandled rejection in spans', async () => { - let transactionEvent: Event | undefined; + test('handles unhandled rejection in spans', async () => { + let segment: SerializedStreamedSpanContainer['items'][number] | undefined; let errorEvent: Event | undefined; await createRunner(__dirname, 'scenario-with-span.ts') + .unordered() .expect({ - transaction: transaction => { - transactionEvent = transaction; + span: container => { + segment = container.items.find(span => span.is_segment); + expect(segment?.name).toBe('test-span'); }, }) .expect({ @@ -161,23 +162,24 @@ test rejection`); .start() .completed(); - expect(transactionEvent).toBeDefined(); + expect(segment).toBeDefined(); expect(errorEvent).toBeDefined(); - expect(transactionEvent!.transaction).toBe('test-span'); - - expect(transactionEvent!.contexts!.trace!.trace_id).toBe(errorEvent!.contexts!.trace!.trace_id); - expect(transactionEvent!.contexts!.trace!.span_id).toBe(errorEvent!.contexts!.trace!.span_id); + expect(segment!.trace_id).toBe(errorEvent!.contexts!.trace!.trace_id); + expect(segment!.span_id).toBe(errorEvent!.contexts!.trace!.span_id); }); + // Bun: the rejection event's span ID differs from the already-ended span's ID. test.skipIf(RUNTIME === 'bun')('handles unhandled rejection in spans that are ended early', async () => { - let transactionEvent: Event | undefined; + let segment: SerializedStreamedSpanContainer['items'][number] | undefined; let errorEvent: Event | undefined; await createRunner(__dirname, 'scenario-with-span-ended.ts') + .unordered() .expect({ - transaction: transaction => { - transactionEvent = transaction; + span: container => { + segment = container.items.find(span => span.is_segment); + expect(segment?.name).toBe('test-span'); }, }) .expect({ @@ -188,13 +190,11 @@ test rejection`); .start() .completed(); - expect(transactionEvent).toBeDefined(); + expect(segment).toBeDefined(); expect(errorEvent).toBeDefined(); - expect(transactionEvent!.transaction).toBe('test-span'); - - expect(transactionEvent!.contexts!.trace!.trace_id).toBe(errorEvent!.contexts!.trace!.trace_id); - expect(transactionEvent!.contexts!.trace!.span_id).toBe(errorEvent!.contexts!.trace!.span_id); + expect(segment!.trace_id).toBe(errorEvent!.contexts!.trace!.trace_id); + expect(segment!.span_id).toBe(errorEvent!.contexts!.trace!.span_id); }); test('should not warn when AI_NoOutputGeneratedError or AbortError is rejected (default ignore)', () =>