client/containers/workflow/helpers/summarize-events.js (130 lines of code) (raw):

// Copyright (c) 2017-2024 Uber Technologies Inc. // // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import moment from 'moment'; import parentWorkflowLink from './parent-workflow-link'; import workflowLink from './workflow-link'; import { WORKFLOW_EVENT_TYPE } from '~constants'; import { shortName } from '~helpers'; export const summarizeEvents = ({ clusterName }) => ({ [WORKFLOW_EVENT_TYPE.ActivityTaskCanceled]: eventDetails => ({}), [WORKFLOW_EVENT_TYPE.ActivityTaskCancelRequested]: eventDetails => ({ ID: eventDetails.activityId, }), [WORKFLOW_EVENT_TYPE.ActivityTaskCompleted]: eventDetails => ({ result: eventDetails.result, }), [WORKFLOW_EVENT_TYPE.ActivityTaskFailed]: eventDetails => ({ details: eventDetails.details, reason: eventDetails.reason, }), [WORKFLOW_EVENT_TYPE.ActivityTaskScheduled]: eventDetails => ({ 'Close Timeout': moment .duration(eventDetails.scheduleToCloseTimeoutSeconds, 'seconds') .format(), ID: eventDetails.activityId, input: eventDetails.input, Name: shortName(eventDetails.activityType.name), }), [WORKFLOW_EVENT_TYPE.ActivityTaskStarted]: eventDetails => ({ attempt: eventDetails.attempt, identity: eventDetails.identity, requestId: eventDetails.requestId, }), [WORKFLOW_EVENT_TYPE.ActivityTaskTimedOut]: eventDetails => ({ 'Timeout Type': eventDetails.timeoutType, }), [WORKFLOW_EVENT_TYPE.ChildWorkflowExecutionCompleted]: eventDetails => ({ result: eventDetails.result, Workflow: workflowLink({ clusterName, eventDetails, short: true }), }), [WORKFLOW_EVENT_TYPE.ChildWorkflowExecutionStarted]: eventDetails => ({ Workflow: workflowLink({ clusterName, eventDetails }), }), [WORKFLOW_EVENT_TYPE.DecisionTaskCompleted]: eventDetails => ({ identity: eventDetails.identity, }), [WORKFLOW_EVENT_TYPE.DecisionTaskScheduled]: eventDetails => ({ Tasklist: eventDetails.taskList.name, Timeout: moment .duration(eventDetails.startToCloseTimeoutSeconds, 'seconds') .format(), }), [WORKFLOW_EVENT_TYPE.DecisionTaskStarted]: eventDetails => ({ requestId: eventDetails.requestId, }), [WORKFLOW_EVENT_TYPE.DecisionTaskTimedOut]: eventDetails => ({ 'Timeout Type': eventDetails.timeoutType, }), [WORKFLOW_EVENT_TYPE.ExternalWorkflowExecutionSignaled]: eventDetails => ({ Workflow: workflowLink({ clusterName, eventDetails }), }), [WORKFLOW_EVENT_TYPE.MarkerRecorded]: eventDetails => { const details = eventDetails.details || {}; if (eventDetails.markerName === 'LocalActivity') { const la = { 'Local Activity ID': details.ActivityID }; if (details.ErrJSON) { la.Error = JSON.tryParse(details.ErrJSON) || details.ErrJSON; } if (details.ErrReason) { la.reason = details.ErrReason; } if (details.ResultJSON) { la.result = JSON.tryParse(details.ResultJSON) || details.ResultJSON; } return la; } if (eventDetails.markerName === 'Version') { return { Details: details[0], Version: details[1], }; } if (eventDetails.markerName === 'SideEffect') { if (!Array.isArray(details)) { // Java client return { data: details, }; } // Go client return { data: JSON.tryParse(atob(details[1])) || details[1], 'Side Effect ID': details[0], }; } return eventDetails; }, [WORKFLOW_EVENT_TYPE.SignalExternalWorkflowExecutionInitiated]: eventDetails => ({ input: eventDetails.input, signal: eventDetails.signalName, Workflow: workflowLink({ clusterName, eventDetails }), }), [WORKFLOW_EVENT_TYPE.StartChildWorkflowExecutionInitiated]: eventDetails => ({ input: eventDetails.input, Tasklist: eventDetails.taskList.name, Workflow: shortName(eventDetails.workflowType.name), }), [WORKFLOW_EVENT_TYPE.TimerStarted]: eventDetails => ({ 'Fire Timeout': moment .duration(eventDetails.startToFireTimeoutSeconds, 'seconds') .format(), 'Timer ID': eventDetails.timerId, }), [WORKFLOW_EVENT_TYPE.WorkflowExecutionStarted]: eventDetails => { const summary = { 'Close Timeout': moment .duration(eventDetails.executionStartToCloseTimeoutSeconds, 'seconds') .format(), identity: eventDetails.identity, input: eventDetails.input, Parent: undefined, Workflow: eventDetails.workflowType ? shortName(eventDetails.workflowType.name) : '', }; const wfLink = parentWorkflowLink({ clusterName, eventDetails }); if (wfLink) { summary.Parent = { routeLink: wfLink.to, text: wfLink.text, }; } return summary; }, });