From 44d48dade2d82bdf9616b434ea0a8380b7cf2761 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 29 Aug 2023 13:06:22 +0200 Subject: [PATCH 1/4] fix(nextjs): Mark errors from NextJS wrappers as unhandled --- packages/nextjs/src/common/_error.ts | 2 +- packages/nextjs/src/common/wrapApiHandlerWithSentry.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nextjs/src/common/_error.ts b/packages/nextjs/src/common/_error.ts index 624aabdb3b98..1ad27cc0b67f 100644 --- a/packages/nextjs/src/common/_error.ts +++ b/packages/nextjs/src/common/_error.ts @@ -45,7 +45,7 @@ export async function captureUnderscoreErrorException(contextOrProps: ContextOrP scope.addEventProcessor(event => { addExceptionMechanism(event, { type: 'instrument', - handled: true, + handled: false, data: { function: '_error.getInitialProps', }, diff --git a/packages/nextjs/src/common/wrapApiHandlerWithSentry.ts b/packages/nextjs/src/common/wrapApiHandlerWithSentry.ts index 85ec0cb4b1c2..a41fa4f0996a 100644 --- a/packages/nextjs/src/common/wrapApiHandlerWithSentry.ts +++ b/packages/nextjs/src/common/wrapApiHandlerWithSentry.ts @@ -190,7 +190,7 @@ export function withSentry(apiHandler: NextApiHandler, parameterizedRoute?: stri currentScope.addEventProcessor(event => { addExceptionMechanism(event, { type: 'instrument', - handled: true, + handled: false, data: { wrapped_handler: wrappingTarget.name, function: 'withSentry', From cd76e2537ff96827ad4fb7b72307c0743709532b Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 29 Aug 2023 17:23:51 +0200 Subject: [PATCH 2/4] add more wrappers/handlers --- .../nextjs/src/common/utils/wrapperUtils.ts | 29 ++++++++++++++++--- .../common/wrapServerComponentWithSentry.ts | 14 +++++++-- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/packages/nextjs/src/common/utils/wrapperUtils.ts b/packages/nextjs/src/common/utils/wrapperUtils.ts index a3cf13736900..aea7d3ab5934 100644 --- a/packages/nextjs/src/common/utils/wrapperUtils.ts +++ b/packages/nextjs/src/common/utils/wrapperUtils.ts @@ -4,9 +4,10 @@ import { getCurrentHub, runWithAsyncContext, startTransaction, + withScope, } from '@sentry/core'; import type { Span, Transaction } from '@sentry/types'; -import { isString, tracingContextFromHeaders } from '@sentry/utils'; +import { addExceptionMechanism, isString, tracingContextFromHeaders } from '@sentry/utils'; import type { IncomingMessage, ServerResponse } from 'http'; import { platformSupportsStreaming } from './platformSupportsStreaming'; @@ -46,8 +47,18 @@ export function withErrorInstrumentation any>( try { return await origFunction.apply(this, origFunctionArguments); } catch (e) { - // TODO: Extract error logic from `withSentry` in here or create a new wrapper with said logic or something like that. - captureException(e); + // TODO: Extract error logic from `withSentry` in here or create a new wrapper with said logic or something like that.# + captureException(e, scope => { + scope.addEventProcessor(event => { + addExceptionMechanism(event, { + handled: false, + }); + return event; + }); + + return scope; + }); + throw e; } }; @@ -217,7 +228,17 @@ export async function callDataFetcherTraced Promis span.finish(); // TODO Copy more robust error handling over from `withSentry` - captureException(err); + captureException(err, scope => { + scope.addEventProcessor(event => { + addExceptionMechanism(event, { + handled: false, + }); + return event; + }); + + return scope; + }); + throw err; } } diff --git a/packages/nextjs/src/common/wrapServerComponentWithSentry.ts b/packages/nextjs/src/common/wrapServerComponentWithSentry.ts index 81f030fa824c..019765c27ce9 100644 --- a/packages/nextjs/src/common/wrapServerComponentWithSentry.ts +++ b/packages/nextjs/src/common/wrapServerComponentWithSentry.ts @@ -5,7 +5,7 @@ import { runWithAsyncContext, startTransaction, } from '@sentry/core'; -import { tracingContextFromHeaders } from '@sentry/utils'; +import { addExceptionMechanism, tracingContextFromHeaders } from '@sentry/utils'; import { isNotFoundNavigationError, isRedirectNavigationError } from '../common/nextNavigationErrorUtils'; import type { ServerComponentContext } from '../common/types'; @@ -62,7 +62,17 @@ export function wrapServerComponentWithSentry any> // We don't want to report redirects } else { transaction.setStatus('internal_error'); - captureException(e); + + captureException(e, scope => { + scope.addEventProcessor(event => { + addExceptionMechanism(event, { + handled: false, + }); + return event; + }); + + return scope; + }); } transaction.finish(); From 37e3611a9e58b23683d6d463134001455912738f Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 29 Aug 2023 17:41:38 +0200 Subject: [PATCH 3/4] fix linter error --- packages/nextjs/src/common/utils/wrapperUtils.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/nextjs/src/common/utils/wrapperUtils.ts b/packages/nextjs/src/common/utils/wrapperUtils.ts index aea7d3ab5934..9043d928c2fc 100644 --- a/packages/nextjs/src/common/utils/wrapperUtils.ts +++ b/packages/nextjs/src/common/utils/wrapperUtils.ts @@ -4,7 +4,6 @@ import { getCurrentHub, runWithAsyncContext, startTransaction, - withScope, } from '@sentry/core'; import type { Span, Transaction } from '@sentry/types'; import { addExceptionMechanism, isString, tracingContextFromHeaders } from '@sentry/utils'; From ad4f7b2d3d893a549890c389e3b4a943b37b8cee Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Wed, 30 Aug 2023 12:53:03 +0200 Subject: [PATCH 4/4] Update packages/nextjs/src/common/utils/wrapperUtils.ts Co-authored-by: Luca Forstner --- packages/nextjs/src/common/utils/wrapperUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nextjs/src/common/utils/wrapperUtils.ts b/packages/nextjs/src/common/utils/wrapperUtils.ts index 9043d928c2fc..062822f8bb42 100644 --- a/packages/nextjs/src/common/utils/wrapperUtils.ts +++ b/packages/nextjs/src/common/utils/wrapperUtils.ts @@ -46,7 +46,7 @@ export function withErrorInstrumentation any>( try { return await origFunction.apply(this, origFunctionArguments); } catch (e) { - // TODO: Extract error logic from `withSentry` in here or create a new wrapper with said logic or something like that.# + // TODO: Extract error logic from `withSentry` in here or create a new wrapper with said logic or something like that. captureException(e, scope => { scope.addEventProcessor(event => { addExceptionMechanism(event, {