@workflow/web-shared 4.0.1-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +76 -0
- package/dist/api/workflow-api-client.d.ts +303 -0
- package/dist/api/workflow-api-client.d.ts.map +1 -0
- package/dist/api/workflow-api-client.js +797 -0
- package/dist/api/workflow-api-client.js.map +1 -0
- package/dist/api/workflow-server-actions.d.ts +97 -0
- package/dist/api/workflow-server-actions.d.ts.map +1 -0
- package/dist/api/workflow-server-actions.js +329 -0
- package/dist/api/workflow-server-actions.js.map +1 -0
- package/dist/components/ui/alert.d.ts +9 -0
- package/dist/components/ui/alert.d.ts.map +1 -0
- package/dist/components/ui/alert.jsx +22 -0
- package/dist/components/ui/alert.jsx.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/utils.d.ts +11 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +19 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/run-trace-view.d.ts +8 -0
- package/dist/run-trace-view.d.ts.map +1 -0
- package/dist/run-trace-view.jsx +25 -0
- package/dist/run-trace-view.jsx.map +1 -0
- package/dist/sidebar/attribute-panel.d.ts +11 -0
- package/dist/sidebar/attribute-panel.d.ts.map +1 -0
- package/dist/sidebar/attribute-panel.jsx +153 -0
- package/dist/sidebar/attribute-panel.jsx.map +1 -0
- package/dist/sidebar/detail-card.d.ts +6 -0
- package/dist/sidebar/detail-card.d.ts.map +1 -0
- package/dist/sidebar/detail-card.jsx +13 -0
- package/dist/sidebar/detail-card.jsx.map +1 -0
- package/dist/sidebar/events-list.d.ts +8 -0
- package/dist/sidebar/events-list.d.ts.map +1 -0
- package/dist/sidebar/events-list.jsx +67 -0
- package/dist/sidebar/events-list.jsx.map +1 -0
- package/dist/sidebar/workflow-detail-panel.d.ts +8 -0
- package/dist/sidebar/workflow-detail-panel.d.ts.map +1 -0
- package/dist/sidebar/workflow-detail-panel.jsx +59 -0
- package/dist/sidebar/workflow-detail-panel.jsx.map +1 -0
- package/dist/trace-viewer/components/map.d.ts +8 -0
- package/dist/trace-viewer/components/map.d.ts.map +1 -0
- package/dist/trace-viewer/components/map.jsx +164 -0
- package/dist/trace-viewer/components/map.jsx.map +1 -0
- package/dist/trace-viewer/components/markers.d.ts +22 -0
- package/dist/trace-viewer/components/markers.d.ts.map +1 -0
- package/dist/trace-viewer/components/markers.jsx +400 -0
- package/dist/trace-viewer/components/markers.jsx.map +1 -0
- package/dist/trace-viewer/components/node.d.ts +31 -0
- package/dist/trace-viewer/components/node.d.ts.map +1 -0
- package/dist/trace-viewer/components/node.jsx +116 -0
- package/dist/trace-viewer/components/node.jsx.map +1 -0
- package/dist/trace-viewer/components/search-input.d.ts +9 -0
- package/dist/trace-viewer/components/search-input.d.ts.map +1 -0
- package/dist/trace-viewer/components/search-input.jsx +16 -0
- package/dist/trace-viewer/components/search-input.jsx.map +1 -0
- package/dist/trace-viewer/components/search.d.ts +3 -0
- package/dist/trace-viewer/components/search.d.ts.map +1 -0
- package/dist/trace-viewer/components/search.jsx +27 -0
- package/dist/trace-viewer/components/search.jsx.map +1 -0
- package/dist/trace-viewer/components/span-detail-panel.d.ts +10 -0
- package/dist/trace-viewer/components/span-detail-panel.d.ts.map +1 -0
- package/dist/trace-viewer/components/span-detail-panel.jsx +388 -0
- package/dist/trace-viewer/components/span-detail-panel.jsx.map +1 -0
- package/dist/trace-viewer/components/ui.d.ts +28 -0
- package/dist/trace-viewer/components/ui.d.ts.map +1 -0
- package/dist/trace-viewer/components/ui.jsx +54 -0
- package/dist/trace-viewer/components/ui.jsx.map +1 -0
- package/dist/trace-viewer/components/zoom-button.d.ts +3 -0
- package/dist/trace-viewer/components/zoom-button.d.ts.map +1 -0
- package/dist/trace-viewer/components/zoom-button.jsx +40 -0
- package/dist/trace-viewer/components/zoom-button.jsx.map +1 -0
- package/dist/trace-viewer/components/zoom-icons.d.ts +11 -0
- package/dist/trace-viewer/components/zoom-icons.d.ts.map +1 -0
- package/dist/trace-viewer/components/zoom-icons.jsx +23 -0
- package/dist/trace-viewer/components/zoom-icons.jsx.map +1 -0
- package/dist/trace-viewer/context.d.ts +183 -0
- package/dist/trace-viewer/context.d.ts.map +1 -0
- package/dist/trace-viewer/context.jsx +326 -0
- package/dist/trace-viewer/context.jsx.map +1 -0
- package/dist/trace-viewer/index.d.ts +5 -0
- package/dist/trace-viewer/index.d.ts.map +1 -0
- package/dist/trace-viewer/index.jsx +4 -0
- package/dist/trace-viewer/index.jsx.map +1 -0
- package/dist/trace-viewer/trace-viewer.d.ts +22 -0
- package/dist/trace-viewer/trace-viewer.d.ts.map +1 -0
- package/dist/trace-viewer/trace-viewer.jsx +311 -0
- package/dist/trace-viewer/trace-viewer.jsx.map +1 -0
- package/dist/trace-viewer/trace-viewer.module.css +1275 -0
- package/dist/trace-viewer/types.d.ts +201 -0
- package/dist/trace-viewer/types.d.ts.map +1 -0
- package/dist/trace-viewer/types.js +2 -0
- package/dist/trace-viewer/types.js.map +1 -0
- package/dist/trace-viewer/util/constants.d.ts +9 -0
- package/dist/trace-viewer/util/constants.d.ts.map +1 -0
- package/dist/trace-viewer/util/constants.js +9 -0
- package/dist/trace-viewer/util/constants.js.map +1 -0
- package/dist/trace-viewer/util/scrollbar-width.d.ts +2 -0
- package/dist/trace-viewer/util/scrollbar-width.d.ts.map +1 -0
- package/dist/trace-viewer/util/scrollbar-width.js +14 -0
- package/dist/trace-viewer/util/scrollbar-width.js.map +1 -0
- package/dist/trace-viewer/util/timing.d.ts +8 -0
- package/dist/trace-viewer/util/timing.d.ts.map +1 -0
- package/dist/trace-viewer/util/timing.js +29 -0
- package/dist/trace-viewer/util/timing.js.map +1 -0
- package/dist/trace-viewer/util/tree.d.ts +13 -0
- package/dist/trace-viewer/util/tree.d.ts.map +1 -0
- package/dist/trace-viewer/util/tree.js +223 -0
- package/dist/trace-viewer/util/tree.js.map +1 -0
- package/dist/trace-viewer/util/use-immediate-style.d.ts +15 -0
- package/dist/trace-viewer/util/use-immediate-style.d.ts.map +1 -0
- package/dist/trace-viewer/util/use-immediate-style.js +22 -0
- package/dist/trace-viewer/util/use-immediate-style.js.map +1 -0
- package/dist/trace-viewer/util/use-streaming-spans.d.ts +8 -0
- package/dist/trace-viewer/util/use-streaming-spans.d.ts.map +1 -0
- package/dist/trace-viewer/util/use-streaming-spans.js +332 -0
- package/dist/trace-viewer/util/use-streaming-spans.js.map +1 -0
- package/dist/trace-viewer/util/use-trackpad-zoom.d.ts +6 -0
- package/dist/trace-viewer/util/use-trackpad-zoom.d.ts.map +1 -0
- package/dist/trace-viewer/util/use-trackpad-zoom.jsx +38 -0
- package/dist/trace-viewer/util/use-trackpad-zoom.jsx.map +1 -0
- package/dist/trace-viewer/worker.d.ts +2 -0
- package/dist/trace-viewer/worker.d.ts.map +1 -0
- package/dist/trace-viewer/worker.js +107 -0
- package/dist/trace-viewer/worker.js.map +1 -0
- package/dist/workflow-trace-view.d.ts +12 -0
- package/dist/workflow-trace-view.d.ts.map +1 -0
- package/dist/workflow-trace-view.jsx +129 -0
- package/dist/workflow-trace-view.jsx.map +1 -0
- package/dist/workflow-traces/event-colors.d.ts +31 -0
- package/dist/workflow-traces/event-colors.d.ts.map +1 -0
- package/dist/workflow-traces/event-colors.js +68 -0
- package/dist/workflow-traces/event-colors.js.map +1 -0
- package/dist/workflow-traces/trace-colors.d.ts +15 -0
- package/dist/workflow-traces/trace-colors.d.ts.map +1 -0
- package/dist/workflow-traces/trace-colors.js +89 -0
- package/dist/workflow-traces/trace-colors.js.map +1 -0
- package/dist/workflow-traces/trace-span-construction.d.ts +31 -0
- package/dist/workflow-traces/trace-span-construction.d.ts.map +1 -0
- package/dist/workflow-traces/trace-span-construction.js +173 -0
- package/dist/workflow-traces/trace-span-construction.js.map +1 -0
- package/dist/workflow-traces/trace-time-utils.d.ts +13 -0
- package/dist/workflow-traces/trace-time-utils.d.ts.map +1 -0
- package/dist/workflow-traces/trace-time-utils.js +34 -0
- package/dist/workflow-traces/trace-time-utils.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { Loader2 } from 'lucide-react';
|
|
2
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { toast } from 'sonner';
|
|
4
|
+
import { WorkflowDetailPanel } from './sidebar/workflow-detail-panel';
|
|
5
|
+
import { TraceViewerContextProvider, TraceViewerTimeline, } from './trace-viewer';
|
|
6
|
+
import { getCustomSpanClassName, getCustomSpanEventClassName, } from './workflow-traces/trace-colors';
|
|
7
|
+
import { hookToSpan, runToSpan, stepToSpan, WORKFLOW_LIBRARY, waitToSpan, } from './workflow-traces/trace-span-construction';
|
|
8
|
+
import { otelTimeToMs } from './workflow-traces/trace-time-utils';
|
|
9
|
+
const RE_RENDER_INTERVAL_MS = 2000;
|
|
10
|
+
export const WorkflowTraceViewer = ({ run, steps, hooks, events, env, isLoading, error, }) => {
|
|
11
|
+
const [now, setNow] = useState(() => new Date());
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (!run?.completedAt) {
|
|
14
|
+
const interval = setInterval(() => {
|
|
15
|
+
setNow(new Date());
|
|
16
|
+
}, RE_RENDER_INTERVAL_MS);
|
|
17
|
+
return () => clearInterval(interval);
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
}, [run?.completedAt]);
|
|
21
|
+
const trace = useMemo(() => {
|
|
22
|
+
if (!run) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
// Group events by their correlation ID to associate with steps/hooks
|
|
26
|
+
const eventsByStepId = new Map();
|
|
27
|
+
const eventsByHookId = new Map();
|
|
28
|
+
const runLevelEvents = [];
|
|
29
|
+
const timerEvents = new Map();
|
|
30
|
+
for (const event of events) {
|
|
31
|
+
if (event.eventType === 'wait_created' ||
|
|
32
|
+
event.eventType === 'wait_completed') {
|
|
33
|
+
const existing = timerEvents.get(event.correlationId) || [];
|
|
34
|
+
existing.push(event);
|
|
35
|
+
timerEvents.set(event.correlationId, existing);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// Try to associate event with a step or hook via correlationId
|
|
39
|
+
// For now, all other events are collected at run level
|
|
40
|
+
const correlationId = event.correlationId;
|
|
41
|
+
if (correlationId) {
|
|
42
|
+
// Check if correlation ID matches a step or hook
|
|
43
|
+
const matchingStep = steps.find((s) => s.stepId === correlationId);
|
|
44
|
+
const matchingHook = hooks.find((h) => h.hookId === correlationId);
|
|
45
|
+
if (matchingStep) {
|
|
46
|
+
const existing = eventsByStepId.get(correlationId) || [];
|
|
47
|
+
existing.push(event);
|
|
48
|
+
eventsByStepId.set(correlationId, existing);
|
|
49
|
+
}
|
|
50
|
+
else if (matchingHook) {
|
|
51
|
+
const existing = eventsByHookId.get(correlationId) || [];
|
|
52
|
+
existing.push(event);
|
|
53
|
+
eventsByHookId.set(correlationId, existing);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
runLevelEvents.push(event);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
runLevelEvents.push(event);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Chain steps together so each one appears on its own row
|
|
64
|
+
// First step is child of root, each subsequent step is child of previous
|
|
65
|
+
const stepSpans = steps.map((step) => {
|
|
66
|
+
const stepEvents = eventsByStepId.get(step.stepId) || [];
|
|
67
|
+
return stepToSpan(step, stepEvents, now);
|
|
68
|
+
});
|
|
69
|
+
const hookSpans = hooks.map((hook) => {
|
|
70
|
+
const hookEvents = eventsByHookId.get(hook.hookId) || [];
|
|
71
|
+
return hookToSpan(hook, hookEvents);
|
|
72
|
+
});
|
|
73
|
+
const waitSpans = Array.from(timerEvents.entries()).map(([correlationId, events]) => {
|
|
74
|
+
return waitToSpan(correlationId, events, now);
|
|
75
|
+
});
|
|
76
|
+
const runSpan = runToSpan(run, runLevelEvents, now);
|
|
77
|
+
const spans = [...stepSpans, ...hookSpans, ...waitSpans];
|
|
78
|
+
const sortedSpans = [
|
|
79
|
+
runSpan,
|
|
80
|
+
...spans.slice().sort((a, b) => {
|
|
81
|
+
const aStart = otelTimeToMs(a.startTime);
|
|
82
|
+
const bStart = otelTimeToMs(b.startTime);
|
|
83
|
+
return aStart - bStart;
|
|
84
|
+
}),
|
|
85
|
+
];
|
|
86
|
+
const sortedCascadingSpans = sortedSpans.map((span, index) => {
|
|
87
|
+
const parentSpanId = index === 0 ? undefined : String(sortedSpans[index - 1].spanId);
|
|
88
|
+
return {
|
|
89
|
+
...span,
|
|
90
|
+
parentSpanId,
|
|
91
|
+
};
|
|
92
|
+
});
|
|
93
|
+
return {
|
|
94
|
+
traceId: run.runId,
|
|
95
|
+
rootSpanId: run.runId,
|
|
96
|
+
spans: sortedCascadingSpans,
|
|
97
|
+
resources: [
|
|
98
|
+
{
|
|
99
|
+
name: 'workflow',
|
|
100
|
+
attributes: {
|
|
101
|
+
'service.name': WORKFLOW_LIBRARY.name,
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
};
|
|
106
|
+
}, [run, steps, hooks, events, now]);
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
if (error && !isLoading) {
|
|
109
|
+
console.error(error);
|
|
110
|
+
toast.error('Error loading workflow trace data', {
|
|
111
|
+
description: error.message,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}, [error, isLoading]);
|
|
115
|
+
return (<div className="relative">
|
|
116
|
+
{isLoading && (<div className="absolute inset-0 z-50 flex items-center justify-center bg-background/80 backdrop-blur-sm">
|
|
117
|
+
<div className="flex flex-col items-center gap-3">
|
|
118
|
+
<Loader2 className="h-8 w-8 animate-spin text-muted-foreground"/>
|
|
119
|
+
<p className="text-sm text-muted-foreground">
|
|
120
|
+
Loading trace data...
|
|
121
|
+
</p>
|
|
122
|
+
</div>
|
|
123
|
+
</div>)}
|
|
124
|
+
<TraceViewerContextProvider withPanel customSpanClassNameFunc={getCustomSpanClassName} customSpanEventClassNameFunc={getCustomSpanEventClassName} customPanelComponent={<WorkflowDetailPanel env={env}/>}>
|
|
125
|
+
<TraceViewerTimeline height={800} trace={trace} withPanel/>
|
|
126
|
+
</TraceViewerContextProvider>
|
|
127
|
+
</div>);
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=workflow-trace-view.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-trace-view.jsx","sourceRoot":"","sources":["../src/workflow-trace-view.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Color utilities for workflow event markers
|
|
3
|
+
*/
|
|
4
|
+
import type { Event } from '@workflow/world';
|
|
5
|
+
export interface EventColorPalette {
|
|
6
|
+
/** Color of the diamond/marker itself */
|
|
7
|
+
color: string;
|
|
8
|
+
/** Background color for hover info popup */
|
|
9
|
+
background: string;
|
|
10
|
+
/** Border color for hover info popup */
|
|
11
|
+
border: string;
|
|
12
|
+
/** Text color for event name in hover popup */
|
|
13
|
+
text: string;
|
|
14
|
+
/** Secondary text color for timestamp in hover popup */
|
|
15
|
+
secondary: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get the color palette for an event based on its type
|
|
19
|
+
* - Red for failures (step_failed, workflow_failed)
|
|
20
|
+
* - Orange/yellow for retries (step_retrying)
|
|
21
|
+
* - Purple for webhook-related events
|
|
22
|
+
* - Blue otherwise (default)
|
|
23
|
+
*/
|
|
24
|
+
export declare function getEventColor(eventType: Event['eventType']): EventColorPalette;
|
|
25
|
+
/**
|
|
26
|
+
* Determine whether to show a vertical line for an event
|
|
27
|
+
* - Show vertical lines for hook-related events
|
|
28
|
+
* - Hide vertical lines for all other workflow events by default
|
|
29
|
+
*/
|
|
30
|
+
export declare function shouldShowVerticalLine(eventType: Event['eventType']): boolean;
|
|
31
|
+
//# sourceMappingURL=event-colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-colors.d.ts","sourceRoot":"","sources":["../../src/workflow-traces/event-colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,GAC5B,iBAAiB,CA8CnB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,OAAO,CAY7E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Color utilities for workflow event markers
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Get the color palette for an event based on its type
|
|
6
|
+
* - Red for failures (step_failed, workflow_failed)
|
|
7
|
+
* - Orange/yellow for retries (step_retrying)
|
|
8
|
+
* - Purple for webhook-related events
|
|
9
|
+
* - Blue otherwise (default)
|
|
10
|
+
*/
|
|
11
|
+
export function getEventColor(eventType) {
|
|
12
|
+
// Failures - Red
|
|
13
|
+
if (eventType === 'step_failed' || eventType === 'workflow_failed') {
|
|
14
|
+
return {
|
|
15
|
+
color: 'var(--ds-red-600)',
|
|
16
|
+
background: 'var(--ds-red-100)',
|
|
17
|
+
border: 'var(--ds-red-500)',
|
|
18
|
+
text: 'var(--ds-red-900)',
|
|
19
|
+
secondary: 'var(--ds-red-700)',
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// Retries - Orange/Yellow
|
|
23
|
+
if (eventType === 'step_retrying') {
|
|
24
|
+
return {
|
|
25
|
+
color: 'var(--ds-amber-600)',
|
|
26
|
+
background: 'var(--ds-amber-100)',
|
|
27
|
+
border: 'var(--ds-amber-500)',
|
|
28
|
+
text: 'var(--ds-amber-900)',
|
|
29
|
+
secondary: 'var(--ds-amber-700)',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
// Webhook-related - Purple
|
|
33
|
+
if (eventType === 'hook_created' ||
|
|
34
|
+
eventType === 'hook_received' ||
|
|
35
|
+
eventType === 'hook_disposed') {
|
|
36
|
+
return {
|
|
37
|
+
color: 'var(--ds-purple-600)',
|
|
38
|
+
background: 'var(--ds-purple-100)',
|
|
39
|
+
border: 'var(--ds-purple-500)',
|
|
40
|
+
text: 'var(--ds-purple-900)',
|
|
41
|
+
secondary: 'var(--ds-purple-700)',
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Default - Blue
|
|
45
|
+
return {
|
|
46
|
+
color: 'var(--ds-blue-600)',
|
|
47
|
+
background: 'var(--ds-blue-100)',
|
|
48
|
+
border: 'var(--ds-blue-500)',
|
|
49
|
+
text: 'var(--ds-blue-900)',
|
|
50
|
+
secondary: 'var(--ds-blue-700)',
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Determine whether to show a vertical line for an event
|
|
55
|
+
* - Show vertical lines for hook-related events
|
|
56
|
+
* - Hide vertical lines for all other workflow events by default
|
|
57
|
+
*/
|
|
58
|
+
export function shouldShowVerticalLine(eventType) {
|
|
59
|
+
// Show vertical lines for hook-related events
|
|
60
|
+
if (eventType === 'hook_created' ||
|
|
61
|
+
eventType === 'hook_received' ||
|
|
62
|
+
eventType === 'hook_disposed') {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
// Hide vertical lines for all other workflow events
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=event-colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-colors.js","sourceRoot":"","sources":["../../src/workflow-traces/event-colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,SAA6B;IAE7B,iBAAiB;IACjB,IAAI,SAAS,KAAK,aAAa,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;QACnE,OAAO;YACL,KAAK,EAAE,mBAAmB;YAC1B,UAAU,EAAE,mBAAmB;YAC/B,MAAM,EAAE,mBAAmB;YAC3B,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,mBAAmB;SAC/B,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;QAClC,OAAO;YACL,KAAK,EAAE,qBAAqB;YAC5B,UAAU,EAAE,qBAAqB;YACjC,MAAM,EAAE,qBAAqB;YAC7B,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,qBAAqB;SACjC,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,IACE,SAAS,KAAK,cAAc;QAC5B,SAAS,KAAK,eAAe;QAC7B,SAAS,KAAK,eAAe,EAC7B,CAAC;QACD,OAAO;YACL,KAAK,EAAE,sBAAsB;YAC7B,UAAU,EAAE,sBAAsB;YAClC,MAAM,EAAE,sBAAsB;YAC9B,IAAI,EAAE,sBAAsB;YAC5B,SAAS,EAAE,sBAAsB;SAClC,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,OAAO;QACL,KAAK,EAAE,oBAAoB;QAC3B,UAAU,EAAE,oBAAoB;QAChC,MAAM,EAAE,oBAAoB;QAC5B,IAAI,EAAE,oBAAoB;QAC1B,SAAS,EAAE,oBAAoB;KAChC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAA6B;IAClE,8CAA8C;IAC9C,IACE,SAAS,KAAK,cAAc;QAC5B,SAAS,KAAK,eAAe;QAC7B,SAAS,KAAK,eAAe,EAC7B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oDAAoD;IACpD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Color utilities for workflow traces
|
|
3
|
+
*/
|
|
4
|
+
import type { SpanNode, SpanNodeEvent } from '../trace-viewer/types';
|
|
5
|
+
/**
|
|
6
|
+
* Get custom CSS class name for a span based on its attributes
|
|
7
|
+
* This is called dynamically by the trace viewer to style spans
|
|
8
|
+
*/
|
|
9
|
+
export declare const getCustomSpanClassName: (span: SpanNode) => string;
|
|
10
|
+
/**
|
|
11
|
+
* Get custom CSS class name for a span event based on its type
|
|
12
|
+
* This is called dynamically by the trace viewer to style event markers
|
|
13
|
+
*/
|
|
14
|
+
export declare const getCustomSpanEventClassName: (spanEvent: SpanNodeEvent) => string;
|
|
15
|
+
//# sourceMappingURL=trace-colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-colors.d.ts","sourceRoot":"","sources":["../../src/workflow-traces/trace-colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAsCrE;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,MAAM,QAAQ,KAAG,MAiCvD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,GACtC,WAAW,aAAa,KACvB,MAwBF,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Color utilities for workflow traces
|
|
3
|
+
*/
|
|
4
|
+
import styles from '../trace-viewer/trace-viewer.module.css';
|
|
5
|
+
/**
|
|
6
|
+
* Get the CSS class name for a workflow entity based on its status
|
|
7
|
+
*/
|
|
8
|
+
function getStatusClassName(status, isStripped = false) {
|
|
9
|
+
if (isStripped && status === 'pending') {
|
|
10
|
+
return styles.spanPendingStriped;
|
|
11
|
+
}
|
|
12
|
+
switch (status) {
|
|
13
|
+
case 'running':
|
|
14
|
+
return styles.spanRunning;
|
|
15
|
+
case 'pending':
|
|
16
|
+
return styles.spanPending;
|
|
17
|
+
case 'completed':
|
|
18
|
+
return styles.spanCompleted;
|
|
19
|
+
case 'cancelled':
|
|
20
|
+
return styles.spanCancelled;
|
|
21
|
+
case 'paused':
|
|
22
|
+
return styles.spanPaused;
|
|
23
|
+
case 'failed':
|
|
24
|
+
return styles.spanFailed;
|
|
25
|
+
default:
|
|
26
|
+
return '';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if a step name indicates it's a sleep step
|
|
31
|
+
*/
|
|
32
|
+
function isSleepStep(stepName) {
|
|
33
|
+
return String(stepName).toLowerCase().endsWith('sleep');
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get custom CSS class name for a span based on its attributes
|
|
37
|
+
* This is called dynamically by the trace viewer to style spans
|
|
38
|
+
*/
|
|
39
|
+
export const getCustomSpanClassName = (span) => {
|
|
40
|
+
const attributes = span.span.attributes;
|
|
41
|
+
const resource = attributes?.resource;
|
|
42
|
+
if (resource === 'step') {
|
|
43
|
+
const stepData = attributes.data;
|
|
44
|
+
const stepName = stepData?.stepName;
|
|
45
|
+
// DEPRECATED: Check if it's a sleep step
|
|
46
|
+
if (stepName && isSleepStep(stepName)) {
|
|
47
|
+
return styles.spanSleep;
|
|
48
|
+
}
|
|
49
|
+
// Regular step - use status colors
|
|
50
|
+
const isStripped = stepData?.status === 'pending';
|
|
51
|
+
return getStatusClassName(stepData?.status, isStripped);
|
|
52
|
+
}
|
|
53
|
+
if (resource === 'run') {
|
|
54
|
+
const runData = attributes.data;
|
|
55
|
+
return getStatusClassName(runData?.status, false);
|
|
56
|
+
}
|
|
57
|
+
if (resource === 'hook') {
|
|
58
|
+
return styles.spanHook;
|
|
59
|
+
}
|
|
60
|
+
if (resource === 'sleep') {
|
|
61
|
+
return styles.spanSleep;
|
|
62
|
+
}
|
|
63
|
+
// Default: no custom class
|
|
64
|
+
return '';
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Get custom CSS class name for a span event based on its type
|
|
68
|
+
* This is called dynamically by the trace viewer to style event markers
|
|
69
|
+
*/
|
|
70
|
+
export const getCustomSpanEventClassName = (spanEvent) => {
|
|
71
|
+
const eventName = spanEvent.event.name;
|
|
72
|
+
// Failure events - Red
|
|
73
|
+
if (eventName === 'step_failed' || eventName === 'workflow_failed') {
|
|
74
|
+
return styles.eventFailed;
|
|
75
|
+
}
|
|
76
|
+
// Retry events - Orange/Yellow
|
|
77
|
+
if (eventName === 'step_retrying') {
|
|
78
|
+
return styles.eventRetrying;
|
|
79
|
+
}
|
|
80
|
+
// Webhook-related events - Purple
|
|
81
|
+
if (eventName === 'hook_created' ||
|
|
82
|
+
eventName === 'hook_received' ||
|
|
83
|
+
eventName === 'hook_disposed') {
|
|
84
|
+
return styles.eventHook;
|
|
85
|
+
}
|
|
86
|
+
// Default - Blue
|
|
87
|
+
return styles.eventDefault;
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=trace-colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-colors.js","sourceRoot":"","sources":["../../src/workflow-traces/trace-colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,MAAM,MAAM,yCAAyC,CAAC;AAG7D;;GAEG;AACH,SAAS,kBAAkB,CACzB,MAA8C,EAC9C,UAAU,GAAG,KAAK;IAElB,IAAI,UAAU,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,WAAW,CAAC;QAC5B,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,WAAW,CAAC;QAC5B,KAAK,WAAW;YACd,OAAO,MAAM,CAAC,aAAa,CAAC;QAC9B,KAAK,WAAW;YACd,OAAO,MAAM,CAAC,aAAa,CAAC;QAC9B,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,UAAU,CAAC;QAC3B,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,UAAU,CAAC;QAC3B;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,QAAgB;IACnC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,IAAc,EAAU,EAAE;IAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;IACxC,MAAM,QAAQ,GAAG,UAAU,EAAE,QAAQ,CAAC;IAEtC,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAY,CAAC;QACzC,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAAQ,CAAC;QAEpC,yCAAyC;QACzC,IAAI,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC,SAAS,CAAC;QAC1B,CAAC;QAED,mCAAmC;QACnC,MAAM,UAAU,GAAG,QAAQ,EAAE,MAAM,KAAK,SAAS,CAAC;QAClD,OAAO,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,UAAU,CAAC,IAAmB,CAAC;QAC/C,OAAO,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,2BAA2B;IAC3B,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,SAAwB,EAChB,EAAE;IACV,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;IAEvC,uBAAuB;IACvB,IAAI,SAAS,KAAK,aAAa,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;QACnE,OAAO,MAAM,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,+BAA+B;IAC/B,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,kCAAkC;IAClC,IACE,SAAS,KAAK,cAAc;QAC5B,SAAS,KAAK,eAAe;QAC7B,SAAS,KAAK,eAAe,EAC7B,CAAC;QACD,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,iBAAiB;IACjB,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Functions for constructing OpenTelemetry spans from workflow entities
|
|
3
|
+
*/
|
|
4
|
+
import type { Event, Hook, Step, WorkflowRun } from '@workflow/world';
|
|
5
|
+
import type { Span, SpanEvent } from '../trace-viewer/types';
|
|
6
|
+
export declare const WORKFLOW_LIBRARY: {
|
|
7
|
+
name: string;
|
|
8
|
+
version: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Convert workflow events to span events
|
|
12
|
+
* Only includes events that should be displayed as markers
|
|
13
|
+
*/
|
|
14
|
+
export declare function convertEventsToSpanEvents(events: Event[], filterTypes?: boolean): SpanEvent[];
|
|
15
|
+
/**
|
|
16
|
+
* Converts a workflow Wait to an OpenTelemetry Span
|
|
17
|
+
*/
|
|
18
|
+
export declare function waitToSpan(correlationId: string, events: Event[], nowTime?: Date): Span;
|
|
19
|
+
/**
|
|
20
|
+
* Converts a workflow Step to an OpenTelemetry Span
|
|
21
|
+
*/
|
|
22
|
+
export declare function stepToSpan(step: Step, stepEvents: Event[], nowTime?: Date): Span;
|
|
23
|
+
/**
|
|
24
|
+
* Converts a workflow Hook to an OpenTelemetry Span
|
|
25
|
+
*/
|
|
26
|
+
export declare function hookToSpan(hook: Hook, hookEvents: Event[]): Span;
|
|
27
|
+
/**
|
|
28
|
+
* Creates a root span for the workflow run
|
|
29
|
+
*/
|
|
30
|
+
export declare function runToSpan(run: WorkflowRun, runEvents: Event[], nowTime?: Date): Span;
|
|
31
|
+
//# sourceMappingURL=trace-span-construction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-span-construction.d.ts","sourceRoot":"","sources":["../../src/workflow-traces/trace-span-construction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAI7D,eAAO,MAAM,gBAAgB;;;CAG5B,CAAC;AAgBF;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,KAAK,EAAE,EACf,WAAW,UAAO,GACjB,SAAS,EAAE,CAgBb;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,KAAK,EAAE,EACf,OAAO,CAAC,EAAE,IAAI,GACb,IAAI,CA6BN;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,KAAK,EAAE,EACnB,OAAO,CAAC,EAAE,IAAI,GACb,IAAI,CAiCN;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,CAsChE;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,KAAK,EAAE,EAClB,OAAO,CAAC,EAAE,IAAI,GACb,IAAI,CA8BN"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Functions for constructing OpenTelemetry spans from workflow entities
|
|
3
|
+
*/
|
|
4
|
+
import { parseStepName, parseWorkflowName } from '@workflow/core/parse-name';
|
|
5
|
+
import { shouldShowVerticalLine } from './event-colors';
|
|
6
|
+
import { calculateDuration, dateToOtelTime } from './trace-time-utils';
|
|
7
|
+
export const WORKFLOW_LIBRARY = {
|
|
8
|
+
name: 'workflow-development-kit',
|
|
9
|
+
version: '4.0.0',
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Event types that should be displayed as visual markers in the trace viewer
|
|
13
|
+
*/
|
|
14
|
+
const MARKER_EVENT_TYPES = new Set([
|
|
15
|
+
'hook_created',
|
|
16
|
+
'hook_received',
|
|
17
|
+
'hook_disposed',
|
|
18
|
+
'step_retrying',
|
|
19
|
+
'step_failed',
|
|
20
|
+
'workflow_failed',
|
|
21
|
+
'wait_created',
|
|
22
|
+
'wait_completed',
|
|
23
|
+
]);
|
|
24
|
+
/**
|
|
25
|
+
* Convert workflow events to span events
|
|
26
|
+
* Only includes events that should be displayed as markers
|
|
27
|
+
*/
|
|
28
|
+
export function convertEventsToSpanEvents(events, filterTypes = true) {
|
|
29
|
+
return events
|
|
30
|
+
.filter((event) => filterTypes ? MARKER_EVENT_TYPES.has(event.eventType) : true)
|
|
31
|
+
.map((event) => ({
|
|
32
|
+
name: event.eventType,
|
|
33
|
+
timestamp: dateToOtelTime(event.createdAt),
|
|
34
|
+
attributes: {
|
|
35
|
+
eventId: event.eventId,
|
|
36
|
+
correlationId: event.correlationId,
|
|
37
|
+
eventData: 'eventData' in event ? event.eventData : undefined,
|
|
38
|
+
},
|
|
39
|
+
// Control whether to show vertical line in timeline
|
|
40
|
+
showVerticalLine: shouldShowVerticalLine(event.eventType),
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Converts a workflow Wait to an OpenTelemetry Span
|
|
45
|
+
*/
|
|
46
|
+
export function waitToSpan(correlationId, events, nowTime) {
|
|
47
|
+
const startEvent = events.find((event) => event.eventType === 'wait_created');
|
|
48
|
+
const endEvent = events.find((event) => event.eventType === 'wait_completed');
|
|
49
|
+
const startTime = startEvent?.createdAt ?? nowTime;
|
|
50
|
+
const endTime = endEvent?.createdAt ?? nowTime;
|
|
51
|
+
const start = dateToOtelTime(startTime);
|
|
52
|
+
const end = dateToOtelTime(endTime);
|
|
53
|
+
const duration = calculateDuration(startTime, endTime);
|
|
54
|
+
const spanEvents = convertEventsToSpanEvents(events);
|
|
55
|
+
return {
|
|
56
|
+
spanId: correlationId,
|
|
57
|
+
name: 'sleep',
|
|
58
|
+
kind: 1, // INTERNAL span kind
|
|
59
|
+
resource: 'sleep',
|
|
60
|
+
library: WORKFLOW_LIBRARY,
|
|
61
|
+
status: { code: 0 },
|
|
62
|
+
traceFlags: 1,
|
|
63
|
+
attributes: {
|
|
64
|
+
resource: 'sleep',
|
|
65
|
+
data: {
|
|
66
|
+
correlationId,
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
links: [],
|
|
70
|
+
events: spanEvents,
|
|
71
|
+
duration,
|
|
72
|
+
startTime: start,
|
|
73
|
+
endTime: end,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Converts a workflow Step to an OpenTelemetry Span
|
|
78
|
+
*/
|
|
79
|
+
export function stepToSpan(step, stepEvents, nowTime) {
|
|
80
|
+
const now = nowTime ?? new Date();
|
|
81
|
+
const parsedName = parseStepName(String(step.stepName));
|
|
82
|
+
// Simplified attributes: only store resource type and full data
|
|
83
|
+
const attributes = {
|
|
84
|
+
resource: 'step',
|
|
85
|
+
data: step,
|
|
86
|
+
};
|
|
87
|
+
const resource = 'step';
|
|
88
|
+
const endTime = step.completedAt ?? now;
|
|
89
|
+
// Convert step-related events to span events (for markers like hook_created, step_retrying, etc.)
|
|
90
|
+
// This determines which events are displayed as markers. In the detail view,
|
|
91
|
+
// we'll show all events that correlate with the selected resource.
|
|
92
|
+
const events = convertEventsToSpanEvents(stepEvents);
|
|
93
|
+
return {
|
|
94
|
+
spanId: String(step.stepId),
|
|
95
|
+
name: parsedName?.shortName ?? '',
|
|
96
|
+
kind: 1, // INTERNAL span kind
|
|
97
|
+
resource,
|
|
98
|
+
library: WORKFLOW_LIBRARY,
|
|
99
|
+
status: { code: 0 },
|
|
100
|
+
traceFlags: 1,
|
|
101
|
+
attributes,
|
|
102
|
+
links: [],
|
|
103
|
+
events,
|
|
104
|
+
startTime: dateToOtelTime(step.startedAt),
|
|
105
|
+
endTime: dateToOtelTime(endTime),
|
|
106
|
+
duration: calculateDuration(step.startedAt, endTime),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Converts a workflow Hook to an OpenTelemetry Span
|
|
111
|
+
*/
|
|
112
|
+
export function hookToSpan(hook, hookEvents) {
|
|
113
|
+
// Simplified attributes: only store resource type and full data
|
|
114
|
+
const attributes = {
|
|
115
|
+
resource: 'hook',
|
|
116
|
+
data: hook,
|
|
117
|
+
};
|
|
118
|
+
// TODO: Determine proper end time for hooks
|
|
119
|
+
// If there are hook_received events, use the createdAt of the last hook_received event.
|
|
120
|
+
// Otherwise, set the end time to 1 second after the hook was created.
|
|
121
|
+
const lastHookReceivedEvent = hookEvents.find((event) => event.eventType === 'hook_received');
|
|
122
|
+
const endTime = lastHookReceivedEvent
|
|
123
|
+
? dateToOtelTime(lastHookReceivedEvent.createdAt)
|
|
124
|
+
: dateToOtelTime(new Date(Math.max(hook.createdAt.getTime() + 10_000, Date.now())));
|
|
125
|
+
// Convert hook-related events to span events
|
|
126
|
+
const events = convertEventsToSpanEvents(hookEvents);
|
|
127
|
+
return {
|
|
128
|
+
spanId: String(hook.hookId),
|
|
129
|
+
name: String(hook.hookId),
|
|
130
|
+
kind: 1, // INTERNAL span kind
|
|
131
|
+
resource: 'hook',
|
|
132
|
+
library: WORKFLOW_LIBRARY,
|
|
133
|
+
status: { code: 1 },
|
|
134
|
+
traceFlags: 1,
|
|
135
|
+
attributes,
|
|
136
|
+
links: [],
|
|
137
|
+
events,
|
|
138
|
+
startTime: dateToOtelTime(hook.createdAt),
|
|
139
|
+
endTime: dateToOtelTime(endTime),
|
|
140
|
+
duration: calculateDuration(hook.createdAt, endTime),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Creates a root span for the workflow run
|
|
145
|
+
*/
|
|
146
|
+
export function runToSpan(run, runEvents, nowTime) {
|
|
147
|
+
const now = nowTime ?? new Date();
|
|
148
|
+
// Simplified attributes: only store resource type and full data
|
|
149
|
+
const attributes = {
|
|
150
|
+
resource: 'run',
|
|
151
|
+
data: run,
|
|
152
|
+
};
|
|
153
|
+
const startDate = run.startedAt ?? run.createdAt;
|
|
154
|
+
const endTime = run.completedAt ?? now;
|
|
155
|
+
// Convert run-level events to span events
|
|
156
|
+
const events = convertEventsToSpanEvents(runEvents);
|
|
157
|
+
return {
|
|
158
|
+
spanId: String(run.runId),
|
|
159
|
+
name: String(parseWorkflowName(run.workflowName)?.shortName ?? '?'),
|
|
160
|
+
kind: 1, // INTERNAL span kind
|
|
161
|
+
resource: 'run',
|
|
162
|
+
library: WORKFLOW_LIBRARY,
|
|
163
|
+
status: { code: 0 },
|
|
164
|
+
traceFlags: 1,
|
|
165
|
+
attributes,
|
|
166
|
+
links: [],
|
|
167
|
+
events,
|
|
168
|
+
startTime: dateToOtelTime(startDate),
|
|
169
|
+
endTime: dateToOtelTime(endTime),
|
|
170
|
+
duration: calculateDuration(startDate, endTime),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=trace-span-construction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-span-construction.js","sourceRoot":"","sources":["../../src/workflow-traces/trace-span-construction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Time conversion utilities for workflow trace construction
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Converts a Date to OpenTelemetry time format [seconds, nanoseconds]
|
|
6
|
+
*/
|
|
7
|
+
export declare function dateToOtelTime(date: Date | unknown): [number, number];
|
|
8
|
+
export declare function otelTimeToMs(time: [number, number]): number;
|
|
9
|
+
/**
|
|
10
|
+
* Calculates duration in [seconds, nanoseconds] format
|
|
11
|
+
*/
|
|
12
|
+
export declare function calculateDuration(start: Date | unknown, end: Date | unknown): [number, number];
|
|
13
|
+
//# sourceMappingURL=trace-time-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-time-utils.d.ts","sourceRoot":"","sources":["../../src/workflow-traces/trace-time-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAQrE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAI3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,IAAI,GAAG,OAAO,EACrB,GAAG,EAAE,IAAI,GAAG,OAAO,GAClB,CAAC,MAAM,EAAE,MAAM,CAAC,CASlB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Time conversion utilities for workflow trace construction
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Converts a Date to OpenTelemetry time format [seconds, nanoseconds]
|
|
6
|
+
*/
|
|
7
|
+
export function dateToOtelTime(date) {
|
|
8
|
+
if (!date || !(date instanceof Date)) {
|
|
9
|
+
return [0, 0];
|
|
10
|
+
}
|
|
11
|
+
const ms = date.getTime();
|
|
12
|
+
const seconds = Math.floor(ms / 1000);
|
|
13
|
+
const nanoseconds = (ms % 1000) * 1_000_000;
|
|
14
|
+
return [seconds, nanoseconds];
|
|
15
|
+
}
|
|
16
|
+
export function otelTimeToMs(time) {
|
|
17
|
+
const secondsToMs = time[0] * 1_000;
|
|
18
|
+
const nanosecondsToMs = time[1] / 1_000_000;
|
|
19
|
+
return secondsToMs + nanosecondsToMs;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Calculates duration in [seconds, nanoseconds] format
|
|
23
|
+
*/
|
|
24
|
+
export function calculateDuration(start, end) {
|
|
25
|
+
if (!start || !(start instanceof Date)) {
|
|
26
|
+
return [0, 0];
|
|
27
|
+
}
|
|
28
|
+
const endTime = end && end instanceof Date ? end : new Date();
|
|
29
|
+
const durationMs = endTime.getTime() - start.getTime();
|
|
30
|
+
const seconds = Math.floor(durationMs / 1000);
|
|
31
|
+
const nanoseconds = (durationMs % 1000) * 1_000_000;
|
|
32
|
+
return [seconds, nanoseconds];
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=trace-time-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-time-utils.js","sourceRoot":"","sources":["../../src/workflow-traces/trace-time-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAoB;IACjD,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5C,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAsB;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IACpC,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC5C,OAAO,WAAW,GAAG,eAAe,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAqB,EACrB,GAAmB;IAEnB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,IAAI,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IACpD,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAChC,CAAC"}
|