diff --git a/dev-packages/e2e-tests/test-applications/nextjs-14/tests/generation-functions.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-14/tests/generation-functions.test.ts index da08ccb481bf..93eba1fb7537 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-14/tests/generation-functions.test.ts +++ b/dev-packages/e2e-tests/test-applications/nextjs-14/tests/generation-functions.test.ts @@ -40,6 +40,8 @@ test('Should send a transaction and an error event for a faulty generateMetadata const errorEvent = await errorEventPromise; const transactionEvent = await transactionPromise; + expect(errorEvent.transaction).toBe('Page.generateMetadata (/generation-functions)'); + // Assert that isolation scope works properly expect(errorEvent.tags?.['my-isolated-tag']).toBe(true); expect(errorEvent.tags?.['my-global-scope-isolated-tag']).not.toBeDefined(); @@ -82,6 +84,10 @@ test('Should send a transaction and an error event for a faulty generateViewport expect(await transactionPromise).toBeDefined(); expect(await errorEventPromise).toBeDefined(); + + const errorEvent = await errorEventPromise; + + expect(errorEvent.transaction).toBe('Page.generateViewport (/generation-functions)'); }); test('Should send a transaction event with correct status for a generateMetadata() function invokation with redirect()', async ({ diff --git a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/edge-route.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/edge-route.test.ts index 33bf951337a8..4b9c807f082c 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/edge-route.test.ts +++ b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/edge-route.test.ts @@ -60,4 +60,6 @@ test('Should record exceptions for faulty edge routes', async ({ request }) => { // Assert that isolation scope works properly expect(errorEvent.tags?.['my-isolated-tag']).toBe(true); expect(errorEvent.tags?.['my-global-scope-isolated-tag']).not.toBeDefined(); + + expect(errorEvent.transaction).toBe('GET /api/error-edge-endpoint'); }); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/edge.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/edge.test.ts index f5f3e70c9770..e8070ea64b20 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/edge.test.ts +++ b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/edge.test.ts @@ -15,6 +15,8 @@ test('Should record exceptions for faulty edge server components', async ({ page // Assert that isolation scope works properly expect(errorEvent.tags?.['my-isolated-tag']).toBe(true); expect(errorEvent.tags?.['my-global-scope-isolated-tag']).not.toBeDefined(); + + expect(errorEvent.transaction).toBe(`Page Server Component (/edge-server-components/error)`); }); test('Should record transaction for edge server components', async ({ page }) => { diff --git a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/middleware.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/middleware.test.ts index da0c4f303604..b457b4bcbdee 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/middleware.test.ts +++ b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/middleware.test.ts @@ -52,6 +52,7 @@ test('Records exceptions happening in middleware', async ({ request }) => { // Assert that isolation scope works properly expect(errorEvent.tags?.['my-isolated-tag']).toBe(true); expect(errorEvent.tags?.['my-global-scope-isolated-tag']).not.toBeDefined(); + expect(errorEvent.transaction).toBe('middleware'); }); test('Should trace outgoing fetch requests inside middleware and create breadcrumbs for it', async ({ request }) => { diff --git a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/route-handlers.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/route-handlers.test.ts index 21e0bf4c745f..d47d0adaea74 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/route-handlers.test.ts +++ b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/route-handlers.test.ts @@ -59,8 +59,8 @@ test('Should record exceptions and transactions for faulty route handlers', asyn expect(routehandlerTransaction.contexts?.trace?.origin).toBe('auto.function.nextjs'); expect(routehandlerError.exception?.values?.[0].value).toBe('route-handler-error'); - // TODO: Uncomment once we update the scope transaction name on the server side - // expect(routehandlerError.transaction).toBe('PUT /route-handlers/[param]/error'); + + expect(routehandlerError.transaction).toBe('PUT /route-handlers/[param]/error'); }); test.describe('Edge runtime', () => { @@ -106,6 +106,8 @@ test.describe('Edge runtime', () => { expect(routehandlerError.exception?.values?.[0].value).toBe('route-handler-edge-error'); expect(routehandlerError.contexts?.runtime?.name).toBe('vercel-edge'); + + expect(routehandlerError.transaction).toBe('DELETE /route-handlers/[param]/edge'); }); }); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/server-components.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/server-components.test.ts index 00aeae924fcc..309d9c4b9fd4 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/server-components.test.ts +++ b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/server-components.test.ts @@ -98,6 +98,8 @@ test('Should capture an error and transaction with correct status for a faulty s expect(transactionEvent.contexts?.trace?.status).toBe('internal_error'); + expect(errorEvent.transaction).toBe(`Page Server Component (/server-component/faulty)`); + expect(errorEvent.tags?.['my-isolated-tag']).toBe(true); expect(errorEvent.tags?.['my-global-scope-isolated-tag']).not.toBeDefined(); expect(transactionEvent.tags?.['my-isolated-tag']).toBe(true); diff --git a/packages/nextjs/src/common/utils/edgeWrapperUtils.ts b/packages/nextjs/src/common/utils/edgeWrapperUtils.ts index df12a99259fa..9324d59829c1 100644 --- a/packages/nextjs/src/common/utils/edgeWrapperUtils.ts +++ b/packages/nextjs/src/common/utils/edgeWrapperUtils.ts @@ -38,6 +38,8 @@ export function withEdgeWrapping( }); } + isolationScope.setTransactionName(options.spanDescription); + return continueTrace( { sentryTrace, diff --git a/packages/nextjs/src/common/utils/wrapperUtils.ts b/packages/nextjs/src/common/utils/wrapperUtils.ts index dd510ec7f06f..d1d1cd961b3f 100644 --- a/packages/nextjs/src/common/utils/wrapperUtils.ts +++ b/packages/nextjs/src/common/utils/wrapperUtils.ts @@ -93,6 +93,7 @@ export function withTracedServerSideDataFetcher Pr return escapeNextjsTracing(() => { const isolationScope = commonObjectToIsolationScope(req); return withIsolationScope(isolationScope, () => { + isolationScope.setTransactionName(`${options.dataFetchingMethodName} (${options.dataFetcherRouteName})`); isolationScope.setSDKProcessingMetadata({ request: req, }); diff --git a/packages/nextjs/src/common/withServerActionInstrumentation.ts b/packages/nextjs/src/common/withServerActionInstrumentation.ts index a97d8fc17888..e70e1682aa9c 100644 --- a/packages/nextjs/src/common/withServerActionInstrumentation.ts +++ b/packages/nextjs/src/common/withServerActionInstrumentation.ts @@ -75,6 +75,7 @@ async function withServerActionInstrumentationImplementation a const propagationContext = commonObjectToPropagationContext(headers, incomingPropagationContext); return withIsolationScope(isolationScope, () => { + isolationScope.setTransactionName(`${componentType}.${generationFunctionIdentifier} (${componentRoute})`); isolationScope.setSDKProcessingMetadata({ request: { headers: headers ? winterCGHeadersToDict(headers) : undefined, diff --git a/packages/nextjs/src/common/wrapRouteHandlerWithSentry.ts b/packages/nextjs/src/common/wrapRouteHandlerWithSentry.ts index ec074bb3075e..b5da2743d97d 100644 --- a/packages/nextjs/src/common/wrapRouteHandlerWithSentry.ts +++ b/packages/nextjs/src/common/wrapRouteHandlerWithSentry.ts @@ -52,6 +52,7 @@ export function wrapRouteHandlerWithSentry any>( const propagationContext = commonObjectToPropagationContext(headers, incomingPropagationContext); return withIsolationScope(isolationScope, async () => { + isolationScope.setTransactionName(`${method} ${parameterizedRoute}`); getCurrentScope().setPropagationContext(propagationContext); try { return startSpan( diff --git a/packages/nextjs/src/common/wrapServerComponentWithSentry.ts b/packages/nextjs/src/common/wrapServerComponentWithSentry.ts index 165754614a22..7785cb0df2fa 100644 --- a/packages/nextjs/src/common/wrapServerComponentWithSentry.ts +++ b/packages/nextjs/src/common/wrapServerComponentWithSentry.ts @@ -55,6 +55,7 @@ export function wrapServerComponentWithSentry any> const propagationContext = commonObjectToPropagationContext(context.headers, incomingPropagationContext); return withIsolationScope(isolationScope, () => { + isolationScope.setTransactionName(`${componentType} Server Component (${componentRoute})`); getCurrentScope().setPropagationContext(propagationContext); return startSpanManual( { diff --git a/packages/nextjs/test/integration/test/server/errorServerSideProps.test.ts b/packages/nextjs/test/integration/test/server/errorServerSideProps.test.ts index 43c43f51fe96..9148fe90c3ac 100644 --- a/packages/nextjs/test/integration/test/server/errorServerSideProps.test.ts +++ b/packages/nextjs/test/integration/test/server/errorServerSideProps.test.ts @@ -11,6 +11,7 @@ describe('Error Server-side Props', () => { }); expect(envelope[2]).toMatchObject({ + transaction: `getServerSideProps (/withErrorServerSideProps)`, exception: { values: [ {