Skip to content

Commit 2a3fdd2

Browse files
committed
added telemetry to execute modal for event-driven triggers
1 parent 3a38cbb commit 2a3fdd2

11 files changed

Lines changed: 150 additions & 19 deletions

File tree

src/platform/plugins/shared/workflows_management/public/common/lib/telemetry/events/workflows/execution/index.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,15 @@ const workflowTestRunInitiatedSchema: RootSchema<ReportWorkflowTestRunInitiatedA
105105
type: 'keyword',
106106
_meta: {
107107
description:
108-
'The trigger tab selected in the Test Workflow modal: manual, alert, index, or historical',
108+
'The trigger tab selected in the Test Workflow modal: manual, alert, index, event, or historical',
109+
optional: true,
110+
},
111+
},
112+
hasCustomEventTrigger: {
113+
type: 'boolean',
114+
_meta: {
115+
description:
116+
'Whether the workflow defines extension (event-driven) triggers at test-run time',
109117
optional: true,
110118
},
111119
},
@@ -182,7 +190,15 @@ const workflowRunInitiatedSchema: RootSchema<ReportWorkflowRunInitiatedActionPar
182190
triggerTab: {
183191
type: 'keyword',
184192
_meta: {
185-
description: 'The trigger tab selected in the Test Workflow modal: manual, alert, or index',
193+
description:
194+
'The trigger tab selected in the Run Workflow modal: manual, alert, index, event, or historical',
195+
optional: true,
196+
},
197+
},
198+
hasCustomEventTrigger: {
199+
type: 'boolean',
200+
_meta: {
201+
description: 'Whether the workflow defines extension (event-driven) triggers at run time',
186202
optional: true,
187203
},
188204
},

src/platform/plugins/shared/workflows_management/public/common/lib/telemetry/events/workflows/execution/types.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ export interface ReportWorkflowTestRunInitiatedActionParams extends BaseResultAc
6969
* The trigger tab selected in the Test Workflow modal
7070
*/
7171
triggerTab?: WorkflowTriggerTab;
72+
/**
73+
* Whether the workflow defines extension (event-driven) triggers at test-run time.
74+
*/
75+
hasCustomEventTrigger?: boolean;
7276
}
7377

7478
/**
@@ -124,9 +128,13 @@ export interface ReportWorkflowRunInitiatedActionParams extends BaseResultAction
124128
*/
125129
editorType?: WorkflowEditorType;
126130
/**
127-
* The trigger tab selected in the Test Workflow modal: 'manual', 'alert', or 'index'
131+
* The trigger tab selected in the Run Workflow modal: manual, alert, index, event, or historical.
128132
*/
129133
triggerTab?: WorkflowTriggerTab;
134+
/**
135+
* Whether the workflow defines extension (event-driven) triggers at run time.
136+
*/
137+
hasCustomEventTrigger?: boolean;
130138
}
131139

132140
/**

src/platform/plugins/shared/workflows_management/public/common/lib/telemetry/events/workflows/lifecycle/index.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,14 @@ const workflowEnabledStateChangedSchema: RootSchema<ReportWorkflowEnabledStateCh
351351
optional: true,
352352
},
353353
},
354+
hasCustomEventTrigger: {
355+
type: 'boolean',
356+
_meta: {
357+
description:
358+
'Whether the workflow defines extension (event-driven) triggers when enabled state changed',
359+
optional: true,
360+
},
361+
},
354362
};
355363

356364
export const workflowLifecycleEventSchemas = {

src/platform/plugins/shared/workflows_management/public/common/lib/telemetry/events/workflows/lifecycle/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,4 +232,8 @@ export interface ReportWorkflowEnabledStateChangedActionParams
232232
* Number of workflows in the bulk action (only present when isBulkAction is true)
233233
*/
234234
bulkActionCount?: number;
235+
/**
236+
* Whether the workflow defines extension (event-driven) triggers when enabled state changed.
237+
*/
238+
hasCustomEventTrigger?: boolean;
235239
}

src/platform/plugins/shared/workflows_management/public/common/lib/telemetry/utils/extract_workflow_metadata.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ describe('extractWorkflowMetadata', () => {
8282
inputCount: 0,
8383
constCount: 0,
8484
triggerCount: 0,
85+
hasCustomEventTrigger: false,
8586
hasTriggerConditions: false,
8687
hasTriggerWorkflowEventsIgnore: false,
8788
hasTriggerWorkflowEventsAllow: false,
@@ -108,6 +109,7 @@ describe('extractWorkflowMetadata', () => {
108109
inputCount: 0,
109110
constCount: 0,
110111
triggerCount: 0,
112+
hasCustomEventTrigger: false,
111113
hasTriggerConditions: false,
112114
hasTriggerWorkflowEventsIgnore: false,
113115
hasTriggerWorkflowEventsAllow: false,
@@ -471,6 +473,20 @@ describe('extractWorkflowMetadata', () => {
471473
expect(result.triggerTypes).toEqual(['scheduled']);
472474
expect(result.triggerCount).toBe(2);
473475
});
476+
477+
it('sets hasCustomEventTrigger when an extension trigger type is present', () => {
478+
const result = metadata({
479+
triggers: [{ type: 'scheduled' }, { type: 'cases.created' }],
480+
});
481+
expect(result.hasCustomEventTrigger).toBe(true);
482+
});
483+
484+
it('sets hasCustomEventTrigger false for built-in triggers only', () => {
485+
const result = metadata({
486+
triggers: [{ type: 'alert' }, { type: 'manual' }],
487+
});
488+
expect(result.hasCustomEventTrigger).toBe(false);
489+
});
474490
});
475491

476492
describe('inputs', () => {

src/platform/plugins/shared/workflows_management/public/common/lib/telemetry/utils/extract_workflow_metadata.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@
77
* License v3.0 only", or the "Server Side Public License, v 1".
88
*/
99

10-
import { isWellKnownWorkflowTriggerSource, WORKFLOW_EVENTS_VALUES_SET } from '@kbn/workflows';
10+
import {
11+
isTriggerType,
12+
isWellKnownWorkflowTriggerSource,
13+
WORKFLOW_EVENTS_VALUES_SET,
14+
} from '@kbn/workflows';
1115
import { getInputsFromDefinition } from '@kbn/workflows/spec/lib/field_conversion';
1216
import type { WorkflowYaml } from '@kbn/workflows/spec/schema';
1317
import { parseWorkflowYamlForAutocomplete } from '@kbn/workflows-yaml';
@@ -122,6 +126,11 @@ export interface WorkflowTelemetryMetadata {
122126
* Number of triggers defined in the workflow
123127
*/
124128
triggerCount: number;
129+
/**
130+
* Whether the workflow defines at least one extension (non-built-in) trigger type,
131+
* i.e. event-driven triggers that emit to `.workflows-events`.
132+
*/
133+
hasCustomEventTrigger: boolean;
125134
/**
126135
* Whether at least one trigger config includes an on.condition value.
127136
* The condition text is never emitted, only presence/absence.
@@ -192,6 +201,7 @@ export function extractWorkflowMetadata(
192201
inputCount: 0,
193202
constCount: 0,
194203
triggerCount: 0,
204+
hasCustomEventTrigger: false,
195205
hasTriggerConditions: false,
196206
hasTriggerWorkflowEventsIgnore: false,
197207
hasTriggerWorkflowEventsAllow: false,
@@ -256,6 +266,14 @@ export function extractWorkflowMetadata(
256266
triggers.filter((trigger) => trigger?.type).map((trigger) => trigger.type as string)
257267
),
258268
];
269+
const hasCustomEventTrigger = triggers.some((trigger) => {
270+
if (trigger == null || typeof trigger !== 'object' || !('type' in trigger)) {
271+
return false;
272+
}
273+
const triggerType = (trigger as { type: unknown }).type;
274+
return typeof triggerType === 'string' && !isTriggerType(triggerType);
275+
});
276+
259277
const hasTriggerConditions = triggers.some((trigger) => {
260278
if (trigger == null || typeof trigger !== 'object') {
261279
return false;
@@ -310,6 +328,7 @@ export function extractWorkflowMetadata(
310328
inputCount,
311329
constCount,
312330
triggerCount: triggers.length,
331+
hasCustomEventTrigger,
313332
hasTriggerConditions,
314333
hasTriggerWorkflowEventsIgnore,
315334
hasTriggerWorkflowEventsAllow,

src/platform/plugins/shared/workflows_management/public/common/service/telemetry.test.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,8 @@ describe('WorkflowsBaseTelemetry', () => {
788788
inputCount: 2,
789789
editorType: 'both',
790790
origin: 'workflow_detail',
791-
triggerTab: 'alert',
791+
triggerTab: 'event',
792+
hasCustomEventTrigger: true,
792793
});
793794

794795
expect(mockClient.reportEvent).toHaveBeenCalledWith(
@@ -800,7 +801,8 @@ describe('WorkflowsBaseTelemetry', () => {
800801
inputCount: 2,
801802
editorType: 'both',
802803
origin: 'workflow_detail',
803-
triggerTab: 'alert',
804+
triggerTab: 'event',
805+
hasCustomEventTrigger: true,
804806
result: 'success',
805807
})
806808
);

src/platform/plugins/shared/workflows_management/public/common/service/telemetry.ts

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ export class WorkflowsBaseTelemetry {
162162
if (enabledChanged) {
163163
const enabledValue = workflowUpdate.enabled ?? workflowDefinition?.enabled;
164164
if (enabledValue !== undefined) {
165+
const { hasCustomEventTrigger } = extractWorkflowMetadata(workflowDefinition);
165166
this.reportWorkflowEnabledStateChanged({
166167
workflowId,
167168
enabled: enabledValue,
@@ -172,6 +173,7 @@ export class WorkflowsBaseTelemetry {
172173
}),
173174
...(finalEditorType && { editorType: finalEditorType }),
174175
...(origin && { origin }),
176+
hasCustomEventTrigger,
175177
error,
176178
});
177179
return;
@@ -241,12 +243,21 @@ export class WorkflowsBaseTelemetry {
241243
enabled: boolean;
242244
isBulkAction: boolean;
243245
bulkActionCount?: number;
246+
hasCustomEventTrigger?: boolean;
244247
error?: Error;
245248
editorType?: WorkflowEditorType;
246249
origin?: WorkflowTelemetryOrigin;
247250
}) => {
248-
const { workflowId, enabled, isBulkAction, bulkActionCount, error, editorType, origin } =
249-
params;
251+
const {
252+
workflowId,
253+
enabled,
254+
isBulkAction,
255+
bulkActionCount,
256+
hasCustomEventTrigger,
257+
error,
258+
editorType,
259+
origin,
260+
} = params;
250261
this.telemetryService.reportEvent(WorkflowLifecycleEventTypes.WorkflowEnabledStateChanged, {
251262
eventName: workflowEventNames[WorkflowLifecycleEventTypes.WorkflowEnabledStateChanged],
252263
workflowId,
@@ -255,6 +266,7 @@ export class WorkflowsBaseTelemetry {
255266
...(bulkActionCount !== undefined && {
256267
bulkActionCount,
257268
}),
269+
...(hasCustomEventTrigger !== undefined && { hasCustomEventTrigger }),
258270
...(editorType && { editorType }),
259271
...(origin && { origin }),
260272
...this.getBaseResultParams(error),
@@ -348,8 +360,18 @@ export class WorkflowsBaseTelemetry {
348360
editorType?: WorkflowEditorType;
349361
origin?: WorkflowTelemetryOrigin;
350362
triggerTab?: WorkflowTriggerTab;
363+
hasCustomEventTrigger?: boolean;
351364
}) => {
352-
const { workflowId, hasInputs, inputCount, error, editorType, origin, triggerTab } = params;
365+
const {
366+
workflowId,
367+
hasInputs,
368+
inputCount,
369+
error,
370+
editorType,
371+
origin,
372+
triggerTab,
373+
hasCustomEventTrigger,
374+
} = params;
353375
this.telemetryService.reportEvent(WorkflowExecutionEventTypes.WorkflowTestRunInitiated, {
354376
eventName: workflowEventNames[WorkflowExecutionEventTypes.WorkflowTestRunInitiated],
355377
...(workflowId && { workflowId }),
@@ -358,6 +380,7 @@ export class WorkflowsBaseTelemetry {
358380
...(editorType && { editorType }),
359381
...(origin && { origin }),
360382
...(triggerTab && { triggerTab }),
383+
...(hasCustomEventTrigger !== undefined && { hasCustomEventTrigger }),
361384
...this.getBaseResultParams(error),
362385
});
363386
};
@@ -409,8 +432,18 @@ export class WorkflowsBaseTelemetry {
409432
editorType?: WorkflowEditorType;
410433
origin?: WorkflowTelemetryOrigin;
411434
triggerTab?: WorkflowTriggerTab;
435+
hasCustomEventTrigger?: boolean;
412436
}) => {
413-
const { workflowId, hasInputs, inputCount, error, editorType, origin, triggerTab } = params;
437+
const {
438+
workflowId,
439+
hasInputs,
440+
inputCount,
441+
error,
442+
editorType,
443+
origin,
444+
triggerTab,
445+
hasCustomEventTrigger,
446+
} = params;
414447
this.telemetryService.reportEvent(WorkflowExecutionEventTypes.WorkflowRunInitiated, {
415448
eventName: workflowEventNames[WorkflowExecutionEventTypes.WorkflowRunInitiated],
416449
workflowId,
@@ -419,6 +452,7 @@ export class WorkflowsBaseTelemetry {
419452
...(editorType && { editorType }),
420453
...(origin && { origin }),
421454
...(triggerTab && { triggerTab }),
455+
...(hasCustomEventTrigger !== undefined && { hasCustomEventTrigger }),
422456
...this.getBaseResultParams(error),
423457
});
424458
};

src/platform/plugins/shared/workflows_management/public/entities/workflows/model/use_workflow_actions.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,10 @@ export function useWorkflowActions() {
253253
},
254254
});
255255

256-
const runWorkflow = useRunWorkflow<{ triggerTab?: WorkflowTriggerTab }>({
256+
const runWorkflow = useRunWorkflow<{
257+
triggerTab?: WorkflowTriggerTab;
258+
hasCustomEventTrigger?: boolean;
259+
}>({
257260
onSuccess: (_, variables) => {
258261
const inputCount = Object.keys(variables.inputs || {}).length;
259262

@@ -265,6 +268,7 @@ export function useWorkflowActions() {
265268
origin: 'workflow_list',
266269
error: undefined,
267270
triggerTab: variables.triggerTab,
271+
hasCustomEventTrigger: variables.hasCustomEventTrigger,
268272
});
269273

270274
// FIX: ensure workflow execution document is created at the end of the mutation
@@ -284,6 +288,7 @@ export function useWorkflowActions() {
284288
origin: 'workflow_list',
285289
error: errorObj,
286290
triggerTab: variables.triggerTab,
291+
hasCustomEventTrigger: variables.hasCustomEventTrigger,
287292
});
288293
},
289294
});

src/platform/plugins/shared/workflows_management/public/entities/workflows/store/workflow_detail/thunks/test_workflow_thunk.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ import { createAsyncThunk } from '@reduxjs/toolkit';
1111
import { i18n } from '@kbn/i18n';
1212
import { WorkflowApi } from '@kbn/workflows-ui';
1313
import { WorkflowsBaseTelemetry } from '../../../../../common/service/telemetry';
14+
import { extractWorkflowMetadata } from '../../../../../common/lib/telemetry/utils/extract_workflow_metadata';
1415
import type { WorkflowTriggerTab } from '../../../../../features/run_workflow/ui/types';
1516
import type { WorkflowsServices } from '../../../../../types';
1617
import type { RootState } from '../../types';
17-
import { selectWorkflow, selectYamlString } from '../selectors';
18+
import { selectWorkflow, selectWorkflowDefinition, selectYamlString } from '../selectors';
1819

1920
export interface TestWorkflowParams {
2021
inputs: Record<string, unknown>;
@@ -40,8 +41,11 @@ export const testWorkflowThunk = createAsyncThunk<
4041
: null;
4142

4243
try {
43-
const yamlString = selectYamlString(getState());
44-
const workflow = selectWorkflow(getState());
44+
const state = getState();
45+
const yamlString = selectYamlString(state);
46+
const workflow = selectWorkflow(state);
47+
const workflowDefinition = selectWorkflowDefinition(state);
48+
const { hasCustomEventTrigger } = extractWorkflowMetadata(workflowDefinition);
4549

4650
if (!yamlString) {
4751
return rejectWithValue('No YAML content to test');
@@ -63,6 +67,7 @@ export const testWorkflowThunk = createAsyncThunk<
6367
editorType: 'yaml',
6468
origin: 'workflow_detail',
6569
triggerTab,
70+
hasCustomEventTrigger,
6671
});
6772

6873
// Show success notification
@@ -79,8 +84,10 @@ export const testWorkflowThunk = createAsyncThunk<
7984
const errorMessage = error.body?.message || error.message || 'Failed to test workflow';
8085
const errorObj = error instanceof Error ? error : new Error(errorMessage);
8186

82-
const state = getState();
83-
const workflow = selectWorkflow(state);
87+
const errorState = getState();
88+
const workflow = selectWorkflow(errorState);
89+
const workflowDefinition = selectWorkflowDefinition(errorState);
90+
const { hasCustomEventTrigger } = extractWorkflowMetadata(workflowDefinition);
8491
const inputCount = Object.keys(inputs).length;
8592

8693
// Report telemetry for failed test run
@@ -92,6 +99,7 @@ export const testWorkflowThunk = createAsyncThunk<
9299
origin: 'workflow_detail',
93100
editorType: 'yaml',
94101
triggerTab,
102+
hasCustomEventTrigger,
95103
});
96104

97105
notifications.toasts.addError(new Error(errorMessage), {

0 commit comments

Comments
 (0)