From a2c731610a416bcd8a60db3f984d89305d9d4263 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 12 Jul 2022 13:24:50 +0100 Subject: [PATCH 1/4] wip --- packages/tracer/src/Tracer.ts | 9 +++++---- packages/tracer/tests/unit/Tracer.test.ts | 23 +++++++++++++++-------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/packages/tracer/src/Tracer.ts b/packages/tracer/src/Tracer.ts index 6f04e90f03..9edd5c4710 100644 --- a/packages/tracer/src/Tracer.ts +++ b/packages/tracer/src/Tracer.ts @@ -421,17 +421,18 @@ class Tracer extends Utility implements TracerInterface { return originalMethod.apply(target, [...args]); } - return this.provider.captureAsyncFunc(`### ${originalMethod.name}`, async subsegment => { + return this.provider.captureAsyncFunc(`### ${originalMethod.name}`, async subsegment => { let result; try { result = await originalMethod.apply(this, [...args]); this.addResponseAsMetadata(result, originalMethod.name); } catch (error) { - this.addErrorAsMetadata(error as Error); - // TODO: should this error be thrown?? If thrown we get a ERR_UNHANDLED_REJECTION. If not aren't we are basically catching a Customer error? - // throw error; + this.addErrorAsMetadata(error as Error); + + throw error; } finally { subsegment?.close(); + // subsegment?.flush(); } return result; diff --git a/packages/tracer/tests/unit/Tracer.test.ts b/packages/tracer/tests/unit/Tracer.test.ts index fb34bfb71f..7cd08a5182 100644 --- a/packages/tracer/tests/unit/Tracer.test.ts +++ b/packages/tracer/tests/unit/Tracer.test.ts @@ -20,7 +20,13 @@ const createCaptureAsyncFuncMock = function(provider: ProviderServiceInterface): .mockImplementation((methodName, callBackFn) => { const subsegment = new Subsegment(`### ${methodName}`); jest.spyOn(subsegment, 'flush').mockImplementation(() => null); - callBackFn(subsegment); + try { + callBackFn(subsegment); + } catch { + console.log('error was thrown'); + } finally { + console.log('finally'); + } }); }; @@ -865,7 +871,6 @@ describe('Class: Tracer', () => { const captureAsyncFuncSpy = jest.spyOn(tracer.provider, 'captureAsyncFunc'); class Lambda implements LambdaInterface { - // TODO: revisit return type & make it more specific @tracer.captureMethod() // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore @@ -895,10 +900,12 @@ describe('Class: Tracer', () => { // Prepare const tracer: Tracer = new Tracer(); const newSubsegment: Segment | Subsegment | undefined = new Subsegment('### dummyMethod'); + jest.spyOn(newSubsegment, 'flush').mockImplementation(() => null); jest.spyOn(tracer.provider, 'getSegment') .mockImplementation(() => newSubsegment); setContextMissingStrategy(() => null); - const captureAsyncFuncSpy = jest.spyOn(tracer.provider, 'captureAsyncFunc'); + // const captureAsyncFuncSpy = jest.spyOn(tracer.provider, 'captureAsyncFunc'); + const captureAsyncFuncSpy = createCaptureAsyncFuncMock(tracer.provider); class Lambda implements LambdaInterface { @tracer.captureMethod() @@ -941,7 +948,8 @@ describe('Class: Tracer', () => { jest.spyOn(tracer.provider, 'getSegment') .mockImplementation(() => newSubsegment); setContextMissingStrategy(() => null); - const captureAsyncFuncSpy = createCaptureAsyncFuncMock(tracer.provider); + const captureAsyncFuncSpy = jest.spyOn(tracer.provider, 'captureAsyncFunc'); + // const captureAsyncFuncSpy = createCaptureAsyncFuncMock(tracer.provider); const addErrorSpy = jest.spyOn(newSubsegment, 'addError'); class Lambda implements LambdaInterface { @@ -960,10 +968,8 @@ describe('Class: Tracer', () => { } - // Act - await new Lambda().handler(event, context, () => console.log('Lambda invoked!')); - - // Assess + // Act / Assess + await expect(new Lambda().handler({}, context, () => console.log('Lambda invoked!'))).rejects.toThrowError(Error); expect(captureAsyncFuncSpy).toHaveBeenCalledTimes(1); expect(newSubsegment).toEqual(expect.objectContaining({ name: '### dummyMethod', @@ -971,6 +977,7 @@ describe('Class: Tracer', () => { expect('cause' in newSubsegment).toBe(true); expect(addErrorSpy).toHaveBeenCalledTimes(1); expect(addErrorSpy).toHaveBeenCalledWith(new Error('Exception thrown!'), false); + expect.assertions(6); }); From 63bf6b8cf59d7bbb926426aedb25aae6b251a123 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 12 Jul 2022 13:59:00 +0100 Subject: [PATCH 2/4] wip --- packages/tracer/tests/unit/Tracer.test.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/tracer/tests/unit/Tracer.test.ts b/packages/tracer/tests/unit/Tracer.test.ts index 7cd08a5182..0a4b991904 100644 --- a/packages/tracer/tests/unit/Tracer.test.ts +++ b/packages/tracer/tests/unit/Tracer.test.ts @@ -904,8 +904,7 @@ describe('Class: Tracer', () => { jest.spyOn(tracer.provider, 'getSegment') .mockImplementation(() => newSubsegment); setContextMissingStrategy(() => null); - // const captureAsyncFuncSpy = jest.spyOn(tracer.provider, 'captureAsyncFunc'); - const captureAsyncFuncSpy = createCaptureAsyncFuncMock(tracer.provider); + const captureAsyncFuncSpy = jest.spyOn(tracer.provider, 'captureAsyncFunc'); class Lambda implements LambdaInterface { @tracer.captureMethod() @@ -948,8 +947,8 @@ describe('Class: Tracer', () => { jest.spyOn(tracer.provider, 'getSegment') .mockImplementation(() => newSubsegment); setContextMissingStrategy(() => null); - const captureAsyncFuncSpy = jest.spyOn(tracer.provider, 'captureAsyncFunc'); - // const captureAsyncFuncSpy = createCaptureAsyncFuncMock(tracer.provider); + // const captureAsyncFuncSpy = jest.spyOn(tracer.provider, 'captureAsyncFunc'); + const captureAsyncFuncSpy = createCaptureAsyncFuncMock(tracer.provider); const addErrorSpy = jest.spyOn(newSubsegment, 'addError'); class Lambda implements LambdaInterface { From bcc9e1b750b5d6e264666827a1783aa817bd3822 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 12 Jul 2022 14:25:05 +0100 Subject: [PATCH 3/4] fix: captureMethod now throws --- packages/tracer/src/Tracer.ts | 2 +- packages/tracer/tests/unit/Tracer.test.ts | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/tracer/src/Tracer.ts b/packages/tracer/src/Tracer.ts index 9edd5c4710..a5c7aa1aaa 100644 --- a/packages/tracer/src/Tracer.ts +++ b/packages/tracer/src/Tracer.ts @@ -432,7 +432,7 @@ class Tracer extends Utility implements TracerInterface { throw error; } finally { subsegment?.close(); - // subsegment?.flush(); + subsegment?.flush(); } return result; diff --git a/packages/tracer/tests/unit/Tracer.test.ts b/packages/tracer/tests/unit/Tracer.test.ts index 0a4b991904..93510c0c4d 100644 --- a/packages/tracer/tests/unit/Tracer.test.ts +++ b/packages/tracer/tests/unit/Tracer.test.ts @@ -17,16 +17,10 @@ interface LambdaInterface { type CaptureAsyncFuncMock = jest.SpyInstance unknown, parent?: Segment | Subsegment]>; const createCaptureAsyncFuncMock = function(provider: ProviderServiceInterface): CaptureAsyncFuncMock { return jest.spyOn(provider, 'captureAsyncFunc') - .mockImplementation((methodName, callBackFn) => { + .mockImplementation(async (methodName, callBackFn) => { const subsegment = new Subsegment(`### ${methodName}`); jest.spyOn(subsegment, 'flush').mockImplementation(() => null); - try { - callBackFn(subsegment); - } catch { - console.log('error was thrown'); - } finally { - console.log('finally'); - } + await callBackFn(subsegment); }); }; From fcf3a54a9d2144bd0a29e5de0d1300c431be9d9d Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 13 Jul 2022 09:53:22 +0100 Subject: [PATCH 4/4] chore: removed leftover comment --- packages/tracer/tests/unit/Tracer.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/tracer/tests/unit/Tracer.test.ts b/packages/tracer/tests/unit/Tracer.test.ts index 93510c0c4d..6644e25a46 100644 --- a/packages/tracer/tests/unit/Tracer.test.ts +++ b/packages/tracer/tests/unit/Tracer.test.ts @@ -941,7 +941,6 @@ describe('Class: Tracer', () => { jest.spyOn(tracer.provider, 'getSegment') .mockImplementation(() => newSubsegment); setContextMissingStrategy(() => null); - // const captureAsyncFuncSpy = jest.spyOn(tracer.provider, 'captureAsyncFunc'); const captureAsyncFuncSpy = createCaptureAsyncFuncMock(tracer.provider); const addErrorSpy = jest.spyOn(newSubsegment, 'addError'); class Lambda implements LambdaInterface {