From 893ede80684c1775a307598a07ae0cd2e13b4f12 Mon Sep 17 00:00:00 2001 From: Mike Cote Date: Thu, 7 Nov 2024 20:21:45 -0500 Subject: [PATCH] Initial commit --- .../server/task_running/task_runner.test.ts | 26 ++++++++++++++++++- .../server/task_running/task_runner.ts | 6 +++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/task_manager/server/task_running/task_runner.test.ts b/x-pack/plugins/task_manager/server/task_running/task_runner.test.ts index a7072416a062e..bcff0417cdf9a 100644 --- a/x-pack/plugins/task_manager/server/task_running/task_runner.test.ts +++ b/x-pack/plugins/task_manager/server/task_running/task_runner.test.ts @@ -930,9 +930,33 @@ describe('TaskManagerRunner', () => { const loggerCall = logger.error.mock.calls[0][0]; const loggerMeta = logger.error.mock.calls[0][1]; expect(loggerCall as string).toMatchInlineSnapshot(`"Task bar \\"foo\\" failed: Error: rar"`); - expect(loggerMeta?.tags).toEqual(['bar', 'foo', 'task-run-failed']); + expect(loggerMeta?.tags).toEqual(['bar', 'foo', 'task-run-failed', 'framework-error']); expect(loggerMeta?.error?.stack_trace).toBeDefined(); }); + test('logs user errors as expected when task fails', async () => { + const { runner, logger } = await readyToRunStageSetup({ + instance: { + params: { a: 'b' }, + state: { hey: 'there' }, + }, + definitions: { + bar: { + title: 'Bar!', + createTaskRunner: () => ({ + async run() { + throw createTaskRunError(new Error('rar'), TaskErrorSource.USER); + }, + }), + }, + }, + }); + await runner.run(); + + const loggerCall = logger.error.mock.calls[0][0]; + const loggerMeta = logger.error.mock.calls[0][1]; + expect(loggerCall as string).toMatchInlineSnapshot(`"Task bar \\"foo\\" failed: Error: rar"`); + expect(loggerMeta?.tags).toEqual(['bar', 'foo', 'task-run-failed', 'user-error']); + }); test('provides execution context on run', async () => { const { runner } = await readyToRunStageSetup({ definitions: { diff --git a/x-pack/plugins/task_manager/server/task_running/task_runner.ts b/x-pack/plugins/task_manager/server/task_running/task_runner.ts index 10fac96fe7c0a..9f9dadbc27c93 100644 --- a/x-pack/plugins/task_manager/server/task_running/task_runner.ts +++ b/x-pack/plugins/task_manager/server/task_running/task_runner.ts @@ -55,11 +55,12 @@ import { TaskStatus, } from '../task'; import { TaskTypeDictionary } from '../task_type_dictionary'; -import { isUnrecoverableError } from './errors'; +import { isUnrecoverableError, isUserError } from './errors'; import { CLAIM_STRATEGY_MGET, type TaskManagerConfig } from '../config'; import { TaskValidator } from '../task_validator'; import { getRetryAt, getRetryDate, getTimeout } from '../lib/get_retry_at'; import { getNextRunAt } from '../lib/get_next_run_at'; +import { TaskErrorSource } from '../../common/constants'; export const EMPTY_RUN_RESULT: SuccessfulRunResult = { state: {} }; @@ -397,8 +398,9 @@ export class TaskManagerRunner implements TaskRunner { if (apmTrans) apmTrans.end('success'); return processedResult; } catch (err) { + const errorSource = isUserError(err) ? TaskErrorSource.USER : TaskErrorSource.FRAMEWORK; this.logger.error(`Task ${this} failed: ${err}`, { - tags: [this.taskType, this.instance.task.id, 'task-run-failed'], + tags: [this.taskType, this.instance.task.id, 'task-run-failed', `${errorSource}-error`], error: { stack_trace: err.stack }, }); // in error scenario, we can not get the RunResult