diff --git a/packages/metrics/src/Metrics.ts b/packages/metrics/src/Metrics.ts index abf798604b..7933b4ace5 100644 --- a/packages/metrics/src/Metrics.ts +++ b/packages/metrics/src/Metrics.ts @@ -93,10 +93,12 @@ class Metrics implements MetricsInterface { this.functionName = context.functionName; if (captureColdStartMetric) this.captureColdStart(); - const result = originalMethod?.apply(this, [event, context, callback]); - this.purgeStoredMetrics(); - - return result; + try { + const result = originalMethod?.apply(this, [event, context, callback]); + return result; + } finally { + this.purgeStoredMetrics(); + } }; }; } diff --git a/packages/metrics/tests/unit/Metrics.test.ts b/packages/metrics/tests/unit/Metrics.test.ts index fbd1aeb3ad..4192d1be2c 100644 --- a/packages/metrics/tests/unit/Metrics.test.ts +++ b/packages/metrics/tests/unit/Metrics.test.ts @@ -428,6 +428,31 @@ describe('Class: Metrics', () => { expect(loggedData[0]._aws.CloudWatchMetrics[0].Metrics.length).toBe(1); expect(loggedData[1]._aws.CloudWatchMetrics[0].Metrics.length).toBe(0); }); + + test('Using decorator should log even if exception thrown', async () => { + const metrics = new Metrics({ namespace: 'test' }); + class LambdaFunction implements LambdaInterface { + @metrics.logMetrics() + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + public handler( + _event: TEvent, + _context: Context, + _callback: Callback, + ): void | Promise { + metrics.addMetric('test_name_1', MetricUnits.Count, 1); + throw new Error('Test Error'); + } + } + + try { + await new LambdaFunction().handler(dummyEvent, dummyContext, () => console.log('Lambda invoked!')); + } catch (error) { + // DO NOTHING + } + + expect(console.log).toBeCalledTimes(1); + }); }); describe('Feature: Custom Config Service', () => {