diff --git a/packages/tracer/src/Tracer.ts b/packages/tracer/src/Tracer.ts index 6f04e90f03..a5c7aa1aaa 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..6644e25a46 100644 --- a/packages/tracer/tests/unit/Tracer.test.ts +++ b/packages/tracer/tests/unit/Tracer.test.ts @@ -17,10 +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); - callBackFn(subsegment); + await callBackFn(subsegment); }); }; @@ -865,7 +865,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,6 +894,7 @@ 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); @@ -960,10 +960,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 +969,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); });