From 8d225264fa161379d6ef1b8afe4986eed8928008 Mon Sep 17 00:00:00 2001 From: Joel Date: Wed, 25 Dec 2024 16:25:09 +0800 Subject: [PATCH] feat: retry --- .../run/utils/format-log/iteration/data.ts | 2 +- .../utils/format-log/iteration/index.spec.ts | 4 +- .../run/utils/format-log/retry/data.ts | 133 ++++++++++++++++++ .../run/utils/format-log/retry/index.spec.ts | 11 ++ .../run/utils/format-log/retry/index.ts | 24 +++- 5 files changed, 170 insertions(+), 4 deletions(-) create mode 100644 web/app/components/workflow/run/utils/format-log/retry/data.ts create mode 100644 web/app/components/workflow/run/utils/format-log/retry/index.spec.ts diff --git a/web/app/components/workflow/run/utils/format-log/iteration/data.ts b/web/app/components/workflow/run/utils/format-log/iteration/data.ts index 54ad8c4dd1..0d08cd5350 100644 --- a/web/app/components/workflow/run/utils/format-log/iteration/data.ts +++ b/web/app/components/workflow/run/utils/format-log/iteration/data.ts @@ -178,7 +178,7 @@ export const simpleIterationData = (() => { return { in: [startNode, outputArrayNode, iterationNode, ...iterations, endNode], - output: [startNode, outputArrayNode, { + expect: [startNode, outputArrayNode, { ...iterationNode, details: [ [iterations[0]], diff --git a/web/app/components/workflow/run/utils/format-log/iteration/index.spec.ts b/web/app/components/workflow/run/utils/format-log/iteration/index.spec.ts index 245263ef4a..77b776f12c 100644 --- a/web/app/components/workflow/run/utils/format-log/iteration/index.spec.ts +++ b/web/app/components/workflow/run/utils/format-log/iteration/index.spec.ts @@ -1,11 +1,11 @@ import format from '.' import { simpleIterationData } from './data' -describe('format api data to tracing panel data', () => { +describe('iteration', () => { test('result should have no nodes in iteration node', () => { expect(format(simpleIterationData.in as any).find(item => !!(item as any).execution_metadata?.iteration_id)).toBeUndefined() }) test('iteration should put nodes in details', () => { - expect(format(simpleIterationData.in as any)).toEqual(simpleIterationData.output) + expect(format(simpleIterationData.in as any)).toEqual(simpleIterationData.expect) }) }) diff --git a/web/app/components/workflow/run/utils/format-log/retry/data.ts b/web/app/components/workflow/run/utils/format-log/retry/data.ts new file mode 100644 index 0000000000..e22c8b8982 --- /dev/null +++ b/web/app/components/workflow/run/utils/format-log/retry/data.ts @@ -0,0 +1,133 @@ +export const simpleRetryData = (() => { + const startNode = { + id: 'f7938b2b-77cd-43f0-814c-2f0ade7cbc60', + index: 1, + predecessor_node_id: null, + node_id: '1735112903395', + node_type: 'start', + title: 'Start', + inputs: { + 'sys.files': [], + 'sys.user_id': '6d8ad01f-edf9-43a6-b863-a034b1828ac7', + 'sys.app_id': '6180ead7-2190-4a61-975c-ec3bf29653da', + 'sys.workflow_id': 'eef6da45-244b-4c79-958e-f3573f7c12bb', + 'sys.workflow_run_id': 'fc8970ef-1406-484e-afde-8567dc22f34c', + }, + process_data: null, + outputs: { + 'sys.files': [], + 'sys.user_id': '6d8ad01f-edf9-43a6-b863-a034b1828ac7', + 'sys.app_id': '6180ead7-2190-4a61-975c-ec3bf29653da', + 'sys.workflow_id': 'eef6da45-244b-4c79-958e-f3573f7c12bb', + 'sys.workflow_run_id': 'fc8970ef-1406-484e-afde-8567dc22f34c', + }, + status: 'succeeded', + error: null, + elapsed_time: 0.008715, + execution_metadata: null, + extras: {}, + created_at: 1735112940, + created_by_role: 'account', + created_by_account: { + id: '6d8ad01f-edf9-43a6-b863-a034b1828ac7', + name: '九彩拼盘', + email: 'iamjoel007@gmail.com', + }, + created_by_end_user: null, + finished_at: 1735112940, + } + + const httpNode = { + id: '50220407-3420-4ad4-89da-c6959710d1aa', + index: 2, + predecessor_node_id: '1735112903395', + node_id: '1735112908006', + node_type: 'http-request', + title: 'HTTP Request', + inputs: null, + process_data: { + request: 'GET / HTTP/1.1\r\nHost: 404\r\n\r\n', + }, + outputs: null, + status: 'failed', + error: 'timed out', + elapsed_time: 30.247757, + execution_metadata: null, + extras: {}, + created_at: 1735112940, + created_by_role: 'account', + created_by_account: { + id: '6d8ad01f-edf9-43a6-b863-a034b1828ac7', + name: '九彩拼盘', + email: 'iamjoel007@gmail.com', + }, + created_by_end_user: null, + finished_at: 1735112970, + } + + const retry1 = { + id: 'ed352b36-27fb-49c6-9e8f-cc755bfc25fc', + index: 3, + predecessor_node_id: '1735112903395', + node_id: '1735112908006', + node_type: 'http-request', + title: 'HTTP Request', + inputs: null, + process_data: null, + outputs: null, + status: 'retry', + error: 'timed out', + elapsed_time: 10.011833, + execution_metadata: { + iteration_id: null, + parallel_mode_run_id: null, + }, + extras: {}, + created_at: 1735112940, + created_by_role: 'account', + created_by_account: { + id: '6d8ad01f-edf9-43a6-b863-a034b1828ac7', + name: '九彩拼盘', + email: 'iamjoel007@gmail.com', + }, + created_by_end_user: null, + finished_at: 1735112950, + } + + const retry2 = { + id: '74dfb3d3-dacf-44f2-8784-e36bfa2d6c4e', + index: 4, + predecessor_node_id: '1735112903395', + node_id: '1735112908006', + node_type: 'http-request', + title: 'HTTP Request', + inputs: null, + process_data: null, + outputs: null, + status: 'retry', + error: 'timed out', + elapsed_time: 10.010368, + execution_metadata: { + iteration_id: null, + parallel_mode_run_id: null, + }, + extras: {}, + created_at: 1735112950, + created_by_role: 'account', + created_by_account: { + id: '6d8ad01f-edf9-43a6-b863-a034b1828ac7', + name: '九彩拼盘', + email: 'iamjoel007@gmail.com', + }, + created_by_end_user: null, + finished_at: 1735112960, + } + + return { + in: [startNode, httpNode, retry1, retry2], + expect: [startNode, { + ...httpNode, + retryDetail: [retry1, retry2], + }], + } +})() diff --git a/web/app/components/workflow/run/utils/format-log/retry/index.spec.ts b/web/app/components/workflow/run/utils/format-log/retry/index.spec.ts new file mode 100644 index 0000000000..5ae6c385fd --- /dev/null +++ b/web/app/components/workflow/run/utils/format-log/retry/index.spec.ts @@ -0,0 +1,11 @@ +import format from '.' +import { simpleRetryData } from './data' + +describe('retry', () => { + test('should have no retry status nodes', () => { + expect(format(simpleRetryData.in as any).find(item => (item as any).status === 'retry')).toBeUndefined() + }) + test('should put retry nodes in retryDetail', () => { + expect(format(simpleRetryData.in as any)).toEqual(simpleRetryData.expect) + }) +}) diff --git a/web/app/components/workflow/run/utils/format-log/retry/index.ts b/web/app/components/workflow/run/utils/format-log/retry/index.ts index 37e68099d6..e2a61dd6b2 100644 --- a/web/app/components/workflow/run/utils/format-log/retry/index.ts +++ b/web/app/components/workflow/run/utils/format-log/retry/index.ts @@ -1,7 +1,29 @@ +import { BlockEnum } from '@/app/components/workflow/types' import type { NodeTracing } from '@/types/workflow' const format = (list: NodeTracing[]): NodeTracing[] => { - return list + const retryNodes = list.filter((item) => { + const { execution_metadata } = item + const isInIteration = !!execution_metadata?.iteration_id + if (isInIteration || item.node_type === BlockEnum.Iteration) return false + return item.status === 'retry' + }) + + const retryNodeIds = retryNodes.map(item => item.node_id) + // move retry nodes to retryDetail + const result = list.filter((item) => { + return item.status !== 'retry' + }).map((item) => { + const isRetryBelongNode = retryNodeIds.includes(item.node_id) + if (isRetryBelongNode) { + return { + ...item, + retryDetail: list.filter(node => node.status === 'retry' && node.node_id === item.node_id), + } + } + return item + }) + return result } export default format