From 24c19ef81a56938f524fc732b9e56f3b898baaf9 Mon Sep 17 00:00:00 2001 From: Stratou Date: Fri, 22 May 2026 16:21:08 +0200 Subject: [PATCH 1/2] [ES|QL] Handles dom exceptions (#270603) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary This is a regression caused by https://github.com/elastic/kibana/pull/242346. It changed the error: from the original throwError(() => new AbortError()) to throwError(() => new AbortError((e.target as AbortSignal)?.reason)), intending to preserve the abort reason in the error. The editor though was not handling this kind of errors correctly causing the following bug: - I am in Lens ES|QL - I cancel the query - I see an error at the footer of my editor - I click the error - 💥 This PR handles this kind of errors gracefully image ### Checklist - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios (cherry picked from commit 55690be1086a3f9316b0a0c150b41eca7de1af6e) # Conflicts: # src/platform/packages/private/kbn-esql-editor/src/helpers.ts --- .../private/kbn-esql-editor/src/helpers.test.ts | 12 ++++++++++++ .../packages/private/kbn-esql-editor/src/helpers.ts | 7 ++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/platform/packages/private/kbn-esql-editor/src/helpers.test.ts b/src/platform/packages/private/kbn-esql-editor/src/helpers.test.ts index b437ae0b352ab..b5bac15efe4b1 100644 --- a/src/platform/packages/private/kbn-esql-editor/src/helpers.test.ts +++ b/src/platform/packages/private/kbn-esql-editor/src/helpers.test.ts @@ -96,6 +96,18 @@ describe('helpers', function () { }, ]); }); + + it('should return a string message when error.message is a non-string (e.g. DOMException from aborted fetch)', function () { + const domException = new DOMException('signal is aborted without reason', 'AbortError'); + const error = new Error('placeholder'); + (error as unknown as { message: unknown }).message = domException; + + const result = parseErrors([error], 'FROM logs-*'); + + expect(result).toHaveLength(1); + expect(typeof result[0].message).toBe('string'); + expect(result[0].code).toBe('unknownError'); + }); }); describe('parseWarning', function () { diff --git a/src/platform/packages/private/kbn-esql-editor/src/helpers.ts b/src/platform/packages/private/kbn-esql-editor/src/helpers.ts index f3bd32388e913..1dc644b617fc3 100644 --- a/src/platform/packages/private/kbn-esql-editor/src/helpers.ts +++ b/src/platform/packages/private/kbn-esql-editor/src/helpers.ts @@ -117,12 +117,13 @@ export const parseWarning = (warning: string): MonacoMessage[] => { }; export const parseErrors = (errors: Error[], code: string): MonacoMessage[] => { - return errors.map((error) => { + return errors.flatMap((error): MonacoMessage[] => { + const errorMessage = typeof error.message === 'string' ? error.message : String(error.message); try { if ( // Found while testing random commands (as inlinestats) - !error.message.includes('esql_illegal_argument_exception') && - error.message.includes('line') + !errorMessage.includes('esql_illegal_argument_exception') && + errorMessage.includes('line') ) { const text = error.message.split('line')[1]; const [lineNumber, startPosition, errorMessage] = text.split(':'); From f6a80013e5ec3fe1571b1c2d360087b59bf7af92 Mon Sep 17 00:00:00 2001 From: Stratoula Date: Tue, 26 May 2026 07:51:39 +0200 Subject: [PATCH 2/2] Fix --- .../private/kbn-esql-editor/src/helpers.ts | 84 ++++++++++--------- 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/src/platform/packages/private/kbn-esql-editor/src/helpers.ts b/src/platform/packages/private/kbn-esql-editor/src/helpers.ts index 1dc644b617fc3..6fcc374ea503d 100644 --- a/src/platform/packages/private/kbn-esql-editor/src/helpers.ts +++ b/src/platform/packages/private/kbn-esql-editor/src/helpers.ts @@ -125,57 +125,65 @@ export const parseErrors = (errors: Error[], code: string): MonacoMessage[] => { !errorMessage.includes('esql_illegal_argument_exception') && errorMessage.includes('line') ) { - const text = error.message.split('line')[1]; - const [lineNumber, startPosition, errorMessage] = text.split(':'); + const text = errorMessage.split('line')[1]; + const [lineNumber, startPosition, lineErrorMessage] = text.split(':'); // initialize the length to 10 in case no error word found let errorLength = 10; - const [_, wordWithError] = errorMessage.split('['); + const [_, wordWithError] = lineErrorMessage.split('['); if (wordWithError) { errorLength = wordWithError.length - 1; } - return { - message: errorMessage, - startColumn: Number(startPosition), - startLineNumber: Number(lineNumber), - endColumn: Number(startPosition) + errorLength + 1, - endLineNumber: Number(lineNumber), - severity: monaco.MarkerSeverity.Error, - code: 'errorFromES', - }; - } else if (error.message.includes('expression was aborted')) { - return { - message: i18n.translate('esqlEditor.query.aborted', { - defaultMessage: 'Request was aborted', - }), - startColumn: 1, - startLineNumber: 1, - endColumn: 10, - endLineNumber: 1, - severity: monaco.MarkerSeverity.Warning, - code: 'abortedRequest', - }; + return [ + { + message: lineErrorMessage, + startColumn: Number(startPosition), + startLineNumber: Number(lineNumber), + endColumn: Number(startPosition) + errorLength + 1, + endLineNumber: Number(lineNumber), + severity: monaco.MarkerSeverity.Error, + code: 'errorFromES', + }, + ]; + } else if (errorMessage.includes('expression was aborted')) { + return [ + { + message: i18n.translate('esqlEditor.query.aborted', { + defaultMessage: 'Request was aborted', + }), + startColumn: 1, + startLineNumber: 1, + endColumn: 10, + endLineNumber: 1, + severity: monaco.MarkerSeverity.Warning, + code: 'abortedRequest', + }, + ]; } else { // unknown error message - return { - message: error.message, + return [ + { + message: errorMessage, + startColumn: 1, + startLineNumber: 1, + endColumn: 10, + endLineNumber: 1, + severity: monaco.MarkerSeverity.Error, + code: 'unknownError', + }, + ]; + } + } catch (e) { + return [ + { + message: errorMessage, startColumn: 1, startLineNumber: 1, endColumn: 10, endLineNumber: 1, severity: monaco.MarkerSeverity.Error, code: 'unknownError', - }; - } - } catch (e) { - return { - message: error.message, - startColumn: 1, - startLineNumber: 1, - endColumn: 10, - endLineNumber: 1, - severity: monaco.MarkerSeverity.Error, - code: 'unknownError', - }; + }, + ]; } }); };