From fee6dee863a64579b8920ef0cf6f91956d61a604 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Sat, 3 Oct 2026 12:19:45 +0200 Subject: [PATCH 1/3] test(e2e): Port Astro 5 Cloudflare to span streaming Co-Authored-By: GPT-6 --- .../sentry.client.config.js | 1 - .../sentry.server.config.js | 16 ++++--- .../astro-5-cf-workers/tests/actions.test.ts | 40 ++++++++--------- .../tests/errors.server.test.ts | 44 +++++++++---------- .../astro-5-cf-workers/wrangler.jsonc | 1 - 5 files changed, 47 insertions(+), 55 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/sentry.client.config.js b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/sentry.client.config.js index e4cdc576c585..2b79ec0ed337 100644 --- a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/sentry.client.config.js +++ b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/sentry.client.config.js @@ -1,7 +1,6 @@ import * as Sentry from '@sentry/astro'; Sentry.init({ - traceLifecycle: 'static', dsn: import.meta.env.PUBLIC_E2E_TEST_DSN, environment: 'qa', tracesSampleRate: 1.0, diff --git a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/sentry.server.config.js b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/sentry.server.config.js index e4cdc576c585..516ba1a502fc 100644 --- a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/sentry.server.config.js +++ b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/sentry.server.config.js @@ -1,9 +1,11 @@ import * as Sentry from '@sentry/astro'; -Sentry.init({ - traceLifecycle: 'static', - dsn: import.meta.env.PUBLIC_E2E_TEST_DSN, - environment: 'qa', - tracesSampleRate: 1.0, - tunnel: 'http://localhost:3031/', // proxy server -}); +// The Worker wrapper already initializes a request-scoped Cloudflare client from the Wrangler bindings. +if (!Sentry.getClient()) { + Sentry.init({ + dsn: import.meta.env.PUBLIC_E2E_TEST_DSN, + environment: 'qa', + tracesSampleRate: 1.0, + tunnel: 'http://localhost:3031/', // proxy server + }); +} diff --git a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/actions.test.ts b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/actions.test.ts index 2a964941217a..1387e43de64d 100644 --- a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/actions.test.ts +++ b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/actions.test.ts @@ -1,43 +1,39 @@ import { expect, test } from '@playwright/test'; -import { waitForTransaction } from '@sentry-internal/test-utils'; +import { getSpanOp, waitForStreamedSpan } from '@sentry-internal/test-utils'; test.describe('Astro actions', () => { - test('captures transaction for action call', async ({ page }) => { - const transactionEventPromise = waitForTransaction('astro-5-cf-workers', transactionEvent => { - return transactionEvent.transaction === 'GET /action-test'; + test('captures a server span for the action page', async ({ page }) => { + const spanPromise = waitForStreamedSpan('astro-5-cf-workers', span => { + return getSpanOp(span) === 'http.server' && span.is_segment && span.name === 'GET /action-test'; }); await page.goto('/action-test'); - const transactionEvent = await transactionEventPromise; + const span = await spanPromise; - expect(transactionEvent).toMatchObject({ - transaction: 'GET /action-test', - }); - - const traceId = transactionEvent.contexts?.trace?.trace_id; - expect(traceId).toMatch(/[a-f0-9]{32}/); + expect(span.trace_id).toMatch(/^[a-f0-9]{32}$/); + expect(span.span_id).toMatch(/^[a-f0-9]{16}$/); }); - test('action submission creates a transaction', async ({ page }) => { + test('captures a server span for an action submission', async ({ page }) => { await page.goto('/action-test'); - const transactionEventPromise = waitForTransaction('astro-5-cf-workers', transactionEvent => { + const spanPromise = waitForStreamedSpan('astro-5-cf-workers', span => { return ( - transactionEvent.transaction?.includes('action-test') && transactionEvent.transaction !== 'GET /action-test' + getSpanOp(span) === 'http.server' && + span.is_segment && + span.attributes['http.request.method']?.value === 'POST' && + span.attributes['url.path']?.value === '/_actions/testAction/' ); }); await page.getByText('Submit Action').click(); - // Wait for the result to appear on the page - await page.waitForSelector('#result:not(:empty)'); - - const resultText = await page.locator('#result').textContent(); - expect(resultText).toContain('success'); + await expect(page.locator('#result')).toContainText('success'); - const transactionEvent = await transactionEventPromise; - expect(transactionEvent).toBeDefined(); - expect(transactionEvent.contexts?.trace?.trace_id).toMatch(/[a-f0-9]{32}/); + const span = await spanPromise; + expect(span.name).toBe('POST /_actions/[...path]'); + expect(span.trace_id).toMatch(/^[a-f0-9]{32}$/); + expect(span.span_id).toMatch(/^[a-f0-9]{16}$/); }); }); diff --git a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/errors.server.test.ts b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/errors.server.test.ts index df23d740e830..a72c7070d109 100644 --- a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/errors.server.test.ts +++ b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/errors.server.test.ts @@ -1,5 +1,5 @@ import { expect, test } from '@playwright/test'; -import { waitForError, waitForTransaction } from '@sentry-internal/test-utils'; +import { getSpanOp, waitForError, waitForStreamedSpan } from '@sentry-internal/test-utils'; test.describe('server-side errors', () => { test('captures SSR error', async ({ page }) => { @@ -7,8 +7,8 @@ test.describe('server-side errors', () => { return errorEvent?.exception?.values?.[0]?.value === "Cannot read properties of undefined (reading 'x')"; }); - const transactionEventPromise = waitForTransaction('astro-5-cf-workers', transactionEvent => { - return transactionEvent.transaction === 'GET /ssr-error'; + const spanPromise = waitForStreamedSpan('astro-5-cf-workers', span => { + return getSpanOp(span) === 'http.server' && span.is_segment && span.name === 'GET /ssr-error'; }); // This page returns an error status code, so we need to catch the navigation error @@ -17,14 +17,10 @@ test.describe('server-side errors', () => { }); const errorEvent = await errorEventPromise; - const transactionEvent = await transactionEventPromise; + const span = await spanPromise; - expect(transactionEvent).toMatchObject({ - transaction: 'GET /ssr-error', - }); - - const traceId = transactionEvent.contexts?.trace?.trace_id; - const spanId = transactionEvent.contexts?.trace?.span_id; + const traceId = span.trace_id; + const spanId = span.span_id; expect(traceId).toMatch(/[a-f0-9]{32}/); expect(spanId).toMatch(/[a-f0-9]{16}/); @@ -73,33 +69,33 @@ test.describe('server-side errors', () => { const errorEventPromise = waitForError('astro-5-cf-workers', errorEvent => { return errorEvent?.exception?.values?.[0]?.value === 'Endpoint Error'; }); - const transactionEventApiPromise = waitForTransaction('astro-5-cf-workers', transactionEvent => { - return transactionEvent.transaction === 'GET /endpoint-error/api'; + const apiSpanPromise = waitForStreamedSpan('astro-5-cf-workers', span => { + return getSpanOp(span) === 'http.server' && span.is_segment && span.name === 'GET /endpoint-error/api'; }); - const transactionEventEndpointPromise = waitForTransaction('astro-5-cf-workers', transactionEvent => { - return transactionEvent.transaction === 'GET /endpoint-error'; + const endpointSpanPromise = waitForStreamedSpan('astro-5-cf-workers', span => { + return getSpanOp(span) === 'http.server' && span.is_segment && span.name === 'GET /endpoint-error'; }); await page.goto('/endpoint-error'); await page.getByText('Get Data').click(); const errorEvent = await errorEventPromise; - const transactionEventApi = await transactionEventApiPromise; - const transactionEventEndpoint = await transactionEventEndpointPromise; + const apiSpan = await apiSpanPromise; + const endpointSpan = await endpointSpanPromise; - expect(transactionEventEndpoint).toMatchObject({ - transaction: 'GET /endpoint-error', - }); - - const traceId = transactionEventEndpoint.contexts?.trace?.trace_id; + const traceId = endpointSpan.trace_id; expect(traceId).toMatch(/[a-f0-9]{32}/); - expect(transactionEventApi).toMatchObject({ - transaction: 'GET /endpoint-error/api', - }); + expect(apiSpan.trace_id).toBe(traceId); expect(errorEvent).toMatchObject({ + contexts: { + trace: { + trace_id: apiSpan.trace_id, + span_id: apiSpan.span_id, + }, + }, exception: { values: [ { diff --git a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/wrangler.jsonc b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/wrangler.jsonc index 8ca6b10483d9..0b7b36047973 100644 --- a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/wrangler.jsonc +++ b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/wrangler.jsonc @@ -9,7 +9,6 @@ "SENTRY_ENVIRONMENT": "qa", "SENTRY_TRACES_SAMPLE_RATE": "1.0", "SENTRY_TUNNEL": "http://localhost:3031/", - "SENTRY_TRACE_LIFECYCLE": "static", }, "assets": { "binding": "ASSETS", From 5b88e03bd6ea093eff8dfb8bc2f8429bc2025500 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Sat, 3 Oct 2026 12:28:55 +0200 Subject: [PATCH 2/3] test(e2e): Keep Astro streaming migration minimal Co-Authored-By: GPT-6 --- .../sentry.server.config.js | 13 ++--------- .../astro-5-cf-workers/tests/actions.test.ts | 23 ++++++++++++------- .../tests/errors.server.test.ts | 18 +++++++++------ 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/sentry.server.config.js b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/sentry.server.config.js index 516ba1a502fc..afdc1e1f784e 100644 --- a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/sentry.server.config.js +++ b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/sentry.server.config.js @@ -1,11 +1,2 @@ -import * as Sentry from '@sentry/astro'; - -// The Worker wrapper already initializes a request-scoped Cloudflare client from the Wrangler bindings. -if (!Sentry.getClient()) { - Sentry.init({ - dsn: import.meta.env.PUBLIC_E2E_TEST_DSN, - environment: 'qa', - tracesSampleRate: 1.0, - tunnel: 'http://localhost:3031/', // proxy server - }); -} +// The Worker wrapper initializes Sentry from Wrangler bindings. +// Keep this file to prevent Astro from injecting its default Node SDK initialization. diff --git a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/actions.test.ts b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/actions.test.ts index 1387e43de64d..27d9b4127ff6 100644 --- a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/actions.test.ts +++ b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/actions.test.ts @@ -2,7 +2,7 @@ import { expect, test } from '@playwright/test'; import { getSpanOp, waitForStreamedSpan } from '@sentry-internal/test-utils'; test.describe('Astro actions', () => { - test('captures a server span for the action page', async ({ page }) => { + test('captures span for action call', async ({ page }) => { const spanPromise = waitForStreamedSpan('astro-5-cf-workers', span => { return getSpanOp(span) === 'http.server' && span.is_segment && span.name === 'GET /action-test'; }); @@ -11,11 +11,15 @@ test.describe('Astro actions', () => { const span = await spanPromise; - expect(span.trace_id).toMatch(/^[a-f0-9]{32}$/); - expect(span.span_id).toMatch(/^[a-f0-9]{16}$/); + expect(span).toMatchObject({ + name: 'GET /action-test', + }); + + const traceId = span.trace_id; + expect(traceId).toMatch(/[a-f0-9]{32}/); }); - test('captures a server span for an action submission', async ({ page }) => { + test('action submission creates a span', async ({ page }) => { await page.goto('/action-test'); const spanPromise = waitForStreamedSpan('astro-5-cf-workers', span => { @@ -29,11 +33,14 @@ test.describe('Astro actions', () => { await page.getByText('Submit Action').click(); - await expect(page.locator('#result')).toContainText('success'); + // Wait for the result to appear on the page + await page.waitForSelector('#result:not(:empty)'); + + const resultText = await page.locator('#result').textContent(); + expect(resultText).toContain('success'); const span = await spanPromise; - expect(span.name).toBe('POST /_actions/[...path]'); - expect(span.trace_id).toMatch(/^[a-f0-9]{32}$/); - expect(span.span_id).toMatch(/^[a-f0-9]{16}$/); + expect(span).toBeDefined(); + expect(span.trace_id).toMatch(/[a-f0-9]{32}/); }); }); diff --git a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/errors.server.test.ts b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/errors.server.test.ts index a72c7070d109..4e43b4599384 100644 --- a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/errors.server.test.ts +++ b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/errors.server.test.ts @@ -19,6 +19,10 @@ test.describe('server-side errors', () => { const errorEvent = await errorEventPromise; const span = await spanPromise; + expect(span).toMatchObject({ + name: 'GET /ssr-error', + }); + const traceId = span.trace_id; const spanId = span.span_id; @@ -83,19 +87,19 @@ test.describe('server-side errors', () => { const apiSpan = await apiSpanPromise; const endpointSpan = await endpointSpanPromise; + expect(endpointSpan).toMatchObject({ + name: 'GET /endpoint-error', + }); + const traceId = endpointSpan.trace_id; expect(traceId).toMatch(/[a-f0-9]{32}/); - expect(apiSpan.trace_id).toBe(traceId); + expect(apiSpan).toMatchObject({ + name: 'GET /endpoint-error/api', + }); expect(errorEvent).toMatchObject({ - contexts: { - trace: { - trace_id: apiSpan.trace_id, - span_id: apiSpan.span_id, - }, - }, exception: { values: [ { From d7bd7ff55e1ca10d6df96f3ff811b5262f9b5fcc Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Sat, 3 Oct 2026 12:38:25 +0200 Subject: [PATCH 3/3] test(e2e): Match Astro action span by route name Co-Authored-By: GPT-6 --- .../astro-5-cf-workers/tests/actions.test.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/actions.test.ts b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/actions.test.ts index 27d9b4127ff6..e5541b27321b 100644 --- a/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/actions.test.ts +++ b/dev-packages/e2e-tests/test-applications/astro-5-cf-workers/tests/actions.test.ts @@ -23,12 +23,7 @@ test.describe('Astro actions', () => { await page.goto('/action-test'); const spanPromise = waitForStreamedSpan('astro-5-cf-workers', span => { - return ( - getSpanOp(span) === 'http.server' && - span.is_segment && - span.attributes['http.request.method']?.value === 'POST' && - span.attributes['url.path']?.value === '/_actions/testAction/' - ); + return getSpanOp(span) === 'http.server' && span.is_segment && span.name === 'POST /_actions/[...path]'; }); await page.getByText('Submit Action').click();