diff --git a/dev-packages/e2e-tests/test-applications/nextjs-14/app/request-instrumentation/page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-14/app/request-instrumentation/page.tsx new file mode 100644 index 000000000000..7a226868d1bd --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nextjs-14/app/request-instrumentation/page.tsx @@ -0,0 +1,13 @@ +import http from 'http'; + +export const dynamic = 'force-dynamic'; + +export default async function Page() { + await fetch('http://example.com/'); + await new Promise(resolve => { + http.get('http://example.com/', () => { + resolve(); + }); + }); + return

Hello World!

; +} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-14/tests/request-instrumentation.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-14/tests/request-instrumentation.test.ts new file mode 100644 index 000000000000..ce17f725cf79 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nextjs-14/tests/request-instrumentation.test.ts @@ -0,0 +1,32 @@ +import { expect, test } from '@playwright/test'; +import { waitForTransaction } from '../event-proxy-server'; + +test('Should send a transaction with a fetch span', async ({ page }) => { + const transactionPromise = waitForTransaction('nextjs-14', async transactionEvent => { + return transactionEvent?.transaction === 'Page Server Component (/request-instrumentation)'; + }); + + await page.goto(`/request-instrumentation`); + + expect((await transactionPromise).spans).toContainEqual( + expect.objectContaining({ + data: expect.objectContaining({ + 'http.method': 'GET', + 'sentry.op': 'http.client', + 'sentry.origin': 'auto.http.node.undici', + }), + description: 'GET http://example.com/', + }), + ); + + expect((await transactionPromise).spans).toContainEqual( + expect.objectContaining({ + data: expect.objectContaining({ + 'http.method': 'GET', + 'sentry.op': 'http.client', + 'sentry.origin': 'auto.http.node.http', + }), + description: 'GET http://example.com/', + }), + ); +});