Skip to content

Commit e310c50

Browse files
authored
fix(logger): reset keys on error in middleware (#4122)
1 parent 7c3196f commit e310c50

File tree

2 files changed

+121
-0
lines changed

2 files changed

+121
-0
lines changed

packages/logger/src/middleware/middy.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,10 @@ const injectLambdaContext = (
123123
} else {
124124
logger.clearBuffer();
125125
}
126+
127+
if (isResetStateEnabled) {
128+
logger.resetKeys();
129+
}
126130
}
127131
};
128132

packages/logger/tests/unit/injectLambdaContext.test.ts

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,4 +415,121 @@ describe('Inject Lambda Context', () => {
415415
})
416416
);
417417
});
418+
419+
it.each([
420+
{
421+
case: 'middleware',
422+
getHandler: (logger: Logger) =>
423+
middy(async (event: { id: number }) => {
424+
logger.info('Processing event');
425+
logger.appendKeys({ id: event.id });
426+
throw new Error('Test error');
427+
}).use(
428+
injectLambdaContext(logger, {
429+
resetKeys: true,
430+
})
431+
),
432+
},
433+
{
434+
case: 'decorator',
435+
getHandler: (logger: Logger) => {
436+
class Lambda {
437+
@logger.injectLambdaContext({
438+
resetKeys: true,
439+
})
440+
public async handler(
441+
event: { id: number },
442+
_context: Context
443+
): Promise<void> {
444+
logger.info('Processing event');
445+
logger.appendKeys({ id: event.id });
446+
throw new Error('Test error');
447+
}
448+
}
449+
const lambda = new Lambda();
450+
return lambda.handler.bind(lambda);
451+
},
452+
},
453+
])(
454+
'resets keys when the handler throws an error $case',
455+
async ({ getHandler }) => {
456+
// Prepare
457+
const logger = new Logger();
458+
const handler = getHandler(logger);
459+
460+
// Act & Assess
461+
await expect(handler({ id: 1 }, context)).rejects.toThrow('Test error');
462+
await expect(handler({ id: 2 }, context)).rejects.toThrow('Test error');
463+
expect(console.info).toHaveBeenCalledTimes(2);
464+
expect(console.info).toHaveLoggedNth(
465+
1,
466+
expect.objectContaining({
467+
message: 'Processing event',
468+
})
469+
);
470+
expect(console.info).toHaveLoggedNth(
471+
2,
472+
expect.not.objectContaining({
473+
message: 'Processing event',
474+
id: 1,
475+
})
476+
);
477+
}
478+
);
479+
480+
it.each([
481+
{
482+
case: 'middleware',
483+
getHandler: (logger: Logger) =>
484+
middy(async (event: { id: number }) => {
485+
logger.info('Processing event');
486+
logger.appendKeys({ id: event.id });
487+
return true;
488+
}).use(
489+
injectLambdaContext(logger, {
490+
resetKeys: true,
491+
})
492+
),
493+
},
494+
{
495+
case: 'decorator',
496+
getHandler: (logger: Logger) => {
497+
class Lambda {
498+
@logger.injectLambdaContext({
499+
resetKeys: true,
500+
})
501+
public async handler(event: { id: number }, _context: Context) {
502+
logger.info('Processing event');
503+
logger.appendKeys({ id: event.id });
504+
return true;
505+
}
506+
}
507+
const lambda = new Lambda();
508+
return lambda.handler.bind(lambda);
509+
},
510+
},
511+
])('resets keys when the handler returns $case', async ({ getHandler }) => {
512+
// Prepare
513+
const logger = new Logger();
514+
const handler = getHandler(logger);
515+
// Act
516+
await handler({ id: 1 }, context);
517+
await handler({ id: 2 }, context);
518+
519+
// Assess
520+
expect(console.info).toHaveBeenCalledTimes(2);
521+
expect(console.info).toHaveLoggedNth(
522+
1,
523+
expect.objectContaining({
524+
message: 'Processing event',
525+
})
526+
);
527+
expect(console.info).toHaveLoggedNth(
528+
2,
529+
expect.not.objectContaining({
530+
message: 'Processing event',
531+
id: 1,
532+
})
533+
);
534+
});
418535
});

0 commit comments

Comments
 (0)