From 2f9d25f6f81f43c2ae4543fea56de12a6429084c Mon Sep 17 00:00:00 2001 From: Benedek Izso Date: Wed, 8 Oct 2025 11:44:25 +0200 Subject: [PATCH] feat(logger): add error cause logging DIME-8714 Co-authored-by: Balint Barki --- src/logger/logger.spec.ts | 32 ++++++++++++++++++++++++++++++++ src/logger/logger.ts | 18 ++++++++++++------ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/logger/logger.spec.ts b/src/logger/logger.spec.ts index 952c582..0990bee 100644 --- a/src/logger/logger.spec.ts +++ b/src/logger/logger.spec.ts @@ -250,6 +250,38 @@ describe('Logger', () => { expect(logArguments.http.response.body.content).to.eql(JSON.stringify(error.response?.data)); }); + it('should log causes', () => { + const rootCause = new Error('Root cause error'); + rootCause.name = 'RootCauseError'; + rootCause.stack = 'RootCauseError: Root cause error\n at rootFunction()'; + + const intermediateError = new Error('Intermediate error'); + intermediateError.name = 'IntermediateError'; + intermediateError.stack = 'IntermediateError: Intermediate error\n at intermediateFunction()'; + intermediateError.cause = rootCause; + + const mainError = new Error('Main error occurred'); + mainError.name = 'MainError'; + mainError.stack = 'MainError: Main error occurred\n at mainFunction()'; + mainError.cause = intermediateError; + + logger.fromError('test_action', mainError, { details: 'test details' }); + + const logArguments = JSON.parse(outputStub.args[0][0]); + expect(logArguments.error.type).to.eql('MainError'); + expect(logArguments.error.message).to.eql('Main error occurred'); + expect(logArguments.error.cause).to.eql({ + type: 'IntermediateError', + message: 'Intermediate error', + stack_trace: intermediateError.stack, + cause: { + type: 'RootCauseError', + message: 'Root cause error', + stack_trace: rootCause.stack, + }, + }); + }); + describe('#customError', () => { it('should log error as the given severity with action', () => { const error: Error & { data?: any } = new Error('failed'); diff --git a/src/logger/logger.ts b/src/logger/logger.ts index 9420da2..31d33c5 100644 --- a/src/logger/logger.ts +++ b/src/logger/logger.ts @@ -181,18 +181,24 @@ export class Logger { } return { - error: { - type: error.name, - message: error.message, - context: this.shortenData((error as ErrorWithData).data), - stack_trace: this.shortenStackTrace(error.stack || ''), - }, + error: this.extractError(error), event: { reason: error.message, }, }; } + private extractError(error: Error): unknown { + const shortenedData = this.shortenData((error as ErrorWithData).data); + return { + type: error.name, + message: error.message, + ...(shortenedData && { context: shortenedData }), + stack_trace: this.shortenStackTrace(error.stack || ''), + ...(error.cause instanceof Error && { cause: this.extractError(error.cause) }), + }; + } + private getAxiosErrorDetails(error: AxiosError) { if (!error.isAxiosError) { return {};