From 52d463b76c14ec0cd3ee8e29c0f083fbb9c369e8 Mon Sep 17 00:00:00 2001 From: Chingis Gomboev Date: Wed, 23 Feb 2022 12:33:14 +0800 Subject: [PATCH 1/3] added ignoreSentryErrors option with tests --- packages/serverless/src/awslambda.ts | 11 ++++-- packages/serverless/test/awslambda.test.ts | 39 ++++++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/packages/serverless/src/awslambda.ts b/packages/serverless/src/awslambda.ts index 4d1df2d9fec9..071671009b4e 100644 --- a/packages/serverless/src/awslambda.ts +++ b/packages/serverless/src/awslambda.ts @@ -11,7 +11,7 @@ import { } from '@sentry/node'; import { extractTraceparentData } from '@sentry/tracing'; import { Integration } from '@sentry/types'; -import { isString, logger } from '@sentry/utils'; +import { isString, logger, SentryError } from '@sentry/utils'; // NOTE: I have no idea how to fix this right now, and don't want to waste more time, as it builds just fine — Kamil // eslint-disable-next-line import/no-unresolved import { Context, Handler } from 'aws-lambda'; @@ -53,6 +53,7 @@ export interface WrapperOptions { * @default false */ captureAllSettledReasons: boolean; + ignoreSentryErrors: boolean; } export const defaultIntegrations: Integration[] = [...Sentry.defaultIntegrations, new AWSServices({ optional: true })]; @@ -224,6 +225,7 @@ export function wrapHandler( captureTimeoutWarning: true, timeoutWarningLimit: 500, captureAllSettledReasons: false, + ignoreSentryErrors: false, ...wrapOptions, }; let timeoutWarningTimer: NodeJS.Timeout; @@ -314,7 +316,12 @@ export function wrapHandler( clearTimeout(timeoutWarningTimer); transaction.finish(); hub.popScope(); - await flush(options.flushTimeout); + await flush(options.flushTimeout).catch(e => { + if (options.ignoreSentryErrors && e instanceof SentryError) { + return; + } + throw e; + }); } return rv; }; diff --git a/packages/serverless/test/awslambda.test.ts b/packages/serverless/test/awslambda.test.ts index a44f3281ba66..14ed9b8c0f93 100644 --- a/packages/serverless/test/awslambda.test.ts +++ b/packages/serverless/test/awslambda.test.ts @@ -1,5 +1,6 @@ // NOTE: I have no idea how to fix this right now, and don't want to waste more time, as it builds just fine — Kamil // eslint-disable-next-line import/no-unresolved +import { SentryError } from '@sentry/utils'; import { Callback, Handler } from 'aws-lambda'; import * as Sentry from '../src'; @@ -177,6 +178,44 @@ describe('AWSLambda', () => { expect(Sentry.captureException).toHaveBeenNthCalledWith(2, error2); expect(Sentry.captureException).toBeCalledTimes(2); }); + + test('ignoreSentryErrors - with successful handler', async () => { + const sentryError = new SentryError('HTTP Error (429)'); + jest.spyOn(Sentry, 'flush').mockRejectedValueOnce(sentryError); + + const handledError = new Error('handled error, and we want to monitor it'); + const expectedSuccessStatus = { status: 'success', reason: 'we handled error, so success' }; + const handler = () => { + Sentry.captureException(handledError); + return Promise.resolve(expectedSuccessStatus); + }; + const wrappedHandlerWithoutIgnoringSentryErrors = wrapHandler(handler, { ignoreSentryErrors: false }); + const wrappedHandlerWithIgnoringSentryErrors = wrapHandler(handler, { ignoreSentryErrors: true }); + + await expect(wrappedHandlerWithoutIgnoringSentryErrors(fakeEvent, fakeContext, fakeCallback)).rejects.toThrow( + sentryError, + ); + await expect(wrappedHandlerWithIgnoringSentryErrors(fakeEvent, fakeContext, fakeCallback)).resolves.toBe( + expectedSuccessStatus, + ); + }); + + test('ignoreSentryErrors - with failed handler', async () => { + const sentryError = new SentryError('HTTP Error (429)'); + jest.spyOn(Sentry, 'flush').mockRejectedValueOnce(sentryError); + + const criticalUnhandledError = new Error('critical unhandled error '); + const handler = () => Promise.reject(criticalUnhandledError); + const wrappedHandlerWithoutIgnoringSentryErrors = wrapHandler(handler, { ignoreSentryErrors: false }); + const wrappedHandlerWithIgnoringSentryErrors = wrapHandler(handler, { ignoreSentryErrors: true }); + + await expect(wrappedHandlerWithoutIgnoringSentryErrors(fakeEvent, fakeContext, fakeCallback)).rejects.toThrow( + sentryError, + ); + await expect(wrappedHandlerWithIgnoringSentryErrors(fakeEvent, fakeContext, fakeCallback)).resolves.not.toThrow( + criticalUnhandledError, + ); + }); }); describe('wrapHandler() on sync handler', () => { From b5d3a4d38e105f8167ec052fac9acd6d647000e3 Mon Sep 17 00:00:00 2001 From: Chingis Gomboev Date: Wed, 23 Feb 2022 14:31:25 +0800 Subject: [PATCH 2/3] added error logging --- packages/serverless/src/awslambda.ts | 1 + packages/serverless/test/awslambda.test.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/serverless/src/awslambda.ts b/packages/serverless/src/awslambda.ts index 071671009b4e..31b91ed4811f 100644 --- a/packages/serverless/src/awslambda.ts +++ b/packages/serverless/src/awslambda.ts @@ -318,6 +318,7 @@ export function wrapHandler( hub.popScope(); await flush(options.flushTimeout).catch(e => { if (options.ignoreSentryErrors && e instanceof SentryError) { + logger.error(e); return; } throw e; diff --git a/packages/serverless/test/awslambda.test.ts b/packages/serverless/test/awslambda.test.ts index 14ed9b8c0f93..16e0fadcfcbe 100644 --- a/packages/serverless/test/awslambda.test.ts +++ b/packages/serverless/test/awslambda.test.ts @@ -212,7 +212,7 @@ describe('AWSLambda', () => { await expect(wrappedHandlerWithoutIgnoringSentryErrors(fakeEvent, fakeContext, fakeCallback)).rejects.toThrow( sentryError, ); - await expect(wrappedHandlerWithIgnoringSentryErrors(fakeEvent, fakeContext, fakeCallback)).resolves.not.toThrow( + await expect(wrappedHandlerWithIgnoringSentryErrors(fakeEvent, fakeContext, fakeCallback)).rejects.toThrow( criticalUnhandledError, ); }); From df39880291a61553035f34c88cf42add641a6c91 Mon Sep 17 00:00:00 2001 From: Chingis Gomboev Date: Wed, 23 Feb 2022 21:46:14 +0800 Subject: [PATCH 3/3] lint fixes --- packages/serverless/test/awslambda.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/serverless/test/awslambda.test.ts b/packages/serverless/test/awslambda.test.ts index 16e0fadcfcbe..ab0c38d2f08a 100644 --- a/packages/serverless/test/awslambda.test.ts +++ b/packages/serverless/test/awslambda.test.ts @@ -1,6 +1,6 @@ +import { SentryError } from '@sentry/utils'; // NOTE: I have no idea how to fix this right now, and don't want to waste more time, as it builds just fine — Kamil // eslint-disable-next-line import/no-unresolved -import { SentryError } from '@sentry/utils'; import { Callback, Handler } from 'aws-lambda'; import * as Sentry from '../src';