Skip to content

Commit 08d1a78

Browse files
feat(telemetry): add workflow_opened with open_source and missing node metrics (#6476)
- Adds app:workflow_opened and plumbs open_source across drag/drop, file-open button, workspace, and templates - Tracks missing_node_count and missing_node_types for both workflow_opened and workflow_imported - Reuses WorkflowOpenSource type for consistency; no breaking changes to loadGraphData callers (5th param remains options object; openSource optional) Validation - pnpm lint:fix - pnpm typecheck Notes - Telemetry only runs in cloud builds; OSS remains clean. - loadGraphData telemetry is centralized where missing_node_types is computed. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6476-feat-telemetry-add-workflow_opened-with-open_source-and-missing-node-metrics-29d6d73d365081f385c0da29958309da) by [Unito](https://www.unito.io) --------- Co-authored-by: bymyself <[email protected]>
1 parent 6dbe00d commit 08d1a78

File tree

5 files changed

+246
-23
lines changed

5 files changed

+246
-23
lines changed

src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,20 @@ import type {
55
ExecutionContext,
66
ExecutionErrorMetadata,
77
ExecutionSuccessMetadata,
8+
NodeSearchMetadata,
9+
NodeSearchResultMetadata,
10+
PageVisibilityMetadata,
811
RunButtonProperties,
912
SurveyResponses,
13+
TabCountMetadata,
1014
TelemetryEventName,
1115
TelemetryEventProperties,
1216
TelemetryProvider,
13-
TemplateMetadata
17+
TemplateFilterMetadata,
18+
TemplateLibraryClosedMetadata,
19+
TemplateLibraryMetadata,
20+
TemplateMetadata,
21+
WorkflowImportMetadata
1422
} from '../../types'
1523
import { TelemetryEvents } from '../../types'
1624

@@ -351,6 +359,41 @@ export class MixpanelTelemetryProvider implements TelemetryProvider {
351359
this.trackEvent(TelemetryEvents.TEMPLATE_WORKFLOW_OPENED, metadata)
352360
}
353361

362+
trackTemplateLibraryOpened(metadata: TemplateLibraryMetadata): void {
363+
this.trackEvent(TelemetryEvents.TEMPLATE_LIBRARY_OPENED, metadata)
364+
}
365+
366+
trackTemplateLibraryClosed(metadata: TemplateLibraryClosedMetadata): void {
367+
this.trackEvent(TelemetryEvents.TEMPLATE_LIBRARY_CLOSED, metadata)
368+
}
369+
370+
trackWorkflowImported(metadata: WorkflowImportMetadata): void {
371+
this.trackEvent(TelemetryEvents.WORKFLOW_IMPORTED, metadata)
372+
}
373+
374+
trackWorkflowOpened(metadata: WorkflowImportMetadata): void {
375+
this.trackEvent(TelemetryEvents.WORKFLOW_OPENED, metadata)
376+
}
377+
378+
trackPageVisibilityChanged(metadata: PageVisibilityMetadata): void {
379+
this.trackEvent(TelemetryEvents.PAGE_VISIBILITY_CHANGED, metadata)
380+
}
381+
382+
trackTabCount(metadata: TabCountMetadata): void {
383+
this.trackEvent(TelemetryEvents.TAB_COUNT_TRACKING, metadata)
384+
}
385+
386+
trackNodeSearch(metadata: NodeSearchMetadata): void {
387+
this.trackEvent(TelemetryEvents.NODE_SEARCH, metadata)
388+
}
389+
390+
trackNodeSearchResultSelected(metadata: NodeSearchResultMetadata): void {
391+
this.trackEvent(TelemetryEvents.NODE_SEARCH_RESULT_SELECTED, metadata)
392+
}
393+
394+
trackTemplateFilterChanged(metadata: TemplateFilterMetadata): void {
395+
this.trackEvent(TelemetryEvents.TEMPLATE_FILTER_CHANGED, metadata)
396+
}
354397
trackWorkflowExecution(): void {
355398
if (this.isOnboardingMode) {
356399
// During onboarding, track basic execution without workflow context

src/platform/telemetry/types.ts

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,97 @@ export interface TemplateMetadata {
8989
template_license?: string
9090
}
9191

92+
/**
93+
* Credit topup metadata
94+
*/
95+
export interface CreditTopupMetadata {
96+
credit_amount: number
97+
}
98+
99+
/**
100+
* Workflow import metadata
101+
*/
102+
export interface WorkflowImportMetadata {
103+
missing_node_count: number
104+
missing_node_types: string[]
105+
/**
106+
* The source of the workflow open/import action
107+
*/
108+
open_source?: 'file_button' | 'file_drop' | 'template' | 'unknown'
109+
}
110+
111+
/**
112+
* Workflow open metadata
113+
*/
114+
/**
115+
* Enumerated sources for workflow open/import actions.
116+
*/
117+
export type WorkflowOpenSource = NonNullable<
118+
WorkflowImportMetadata['open_source']
119+
>
120+
121+
/**
122+
* Template library metadata
123+
*/
124+
export interface TemplateLibraryMetadata {
125+
source: 'sidebar' | 'menu' | 'command'
126+
}
127+
128+
/**
129+
* Template library closed metadata
130+
*/
131+
export interface TemplateLibraryClosedMetadata {
132+
template_selected: boolean
133+
time_spent_seconds: number
134+
}
135+
136+
/**
137+
* Page visibility metadata
138+
*/
139+
export interface PageVisibilityMetadata {
140+
visibility_state: 'visible' | 'hidden'
141+
}
142+
143+
/**
144+
* Tab count metadata
145+
*/
146+
export interface TabCountMetadata {
147+
tab_count: number
148+
}
149+
150+
/**
151+
* Node search metadata
152+
*/
153+
export interface NodeSearchMetadata {
154+
query: string
155+
}
156+
157+
/**
158+
* Node search result selection metadata
159+
*/
160+
export interface NodeSearchResultMetadata {
161+
node_type: string
162+
last_query: string
163+
}
164+
165+
/**
166+
* Template filter tracking metadata
167+
*/
168+
export interface TemplateFilterMetadata {
169+
search_query?: string
170+
selected_models: string[]
171+
selected_use_cases: string[]
172+
selected_licenses: string[]
173+
sort_by:
174+
| 'default'
175+
| 'alphabetical'
176+
| 'newest'
177+
| 'vram-low-to-high'
178+
| 'model-size-low-to-high'
179+
filtered_count: number
180+
total_count: number
181+
}
182+
92183
/**
93184
* Core telemetry provider interface
94185
*/
@@ -106,6 +197,25 @@ export interface TelemetryProvider {
106197

107198
// Template workflow events
108199
trackTemplate(metadata: TemplateMetadata): void
200+
trackTemplateLibraryOpened(metadata: TemplateLibraryMetadata): void
201+
trackTemplateLibraryClosed(metadata: TemplateLibraryClosedMetadata): void
202+
203+
// Workflow management events
204+
trackWorkflowImported(metadata: WorkflowImportMetadata): void
205+
trackWorkflowOpened(metadata: WorkflowImportMetadata): void
206+
207+
// Page visibility events
208+
trackPageVisibilityChanged(metadata: PageVisibilityMetadata): void
209+
210+
// Tab tracking events
211+
trackTabCount(metadata: TabCountMetadata): void
212+
213+
// Node search analytics events
214+
trackNodeSearch(metadata: NodeSearchMetadata): void
215+
trackNodeSearchResultSelected(metadata: NodeSearchResultMetadata): void
216+
217+
// Template filter tracking events
218+
trackTemplateFilterChanged(metadata: TemplateFilterMetadata): void
109219

110220
// Workflow execution events
111221
trackWorkflowExecution(): void
@@ -140,6 +250,25 @@ export const TelemetryEvents = {
140250

141251
// Template Tracking
142252
TEMPLATE_WORKFLOW_OPENED: 'app:template_workflow_opened',
253+
TEMPLATE_LIBRARY_OPENED: 'app:template_library_opened',
254+
TEMPLATE_LIBRARY_CLOSED: 'app:template_library_closed',
255+
256+
// Workflow Management
257+
WORKFLOW_IMPORTED: 'app:workflow_imported',
258+
WORKFLOW_OPENED: 'app:workflow_opened',
259+
260+
// Page Visibility
261+
PAGE_VISIBILITY_CHANGED: 'app:page_visibility_changed',
262+
263+
// Tab Tracking
264+
TAB_COUNT_TRACKING: 'app:tab_count_tracking',
265+
266+
// Node Search Analytics
267+
NODE_SEARCH: 'app:node_search',
268+
NODE_SEARCH_RESULT_SELECTED: 'app:node_search_result_selected',
269+
270+
// Template Filter Analytics
271+
TEMPLATE_FILTER_CHANGED: 'app:template_filter_changed',
143272

144273
// Execution Lifecycle
145274
EXECUTION_START: 'execution_start',
@@ -157,6 +286,15 @@ export type TelemetryEventProperties =
157286
| AuthMetadata
158287
| SurveyResponses
159288
| TemplateMetadata
289+
| TemplateLibraryMetadata
290+
| TemplateLibraryClosedMetadata
291+
| WorkflowImportMetadata
292+
| PageVisibilityMetadata
293+
| TabCountMetadata
294+
| NodeSearchMetadata
295+
| NodeSearchResultMetadata
296+
| TemplateFilterMetadata
297+
| CreditTopupMetadata
160298
| ExecutionContext
161299
| RunButtonProperties
162300
| ExecutionErrorMetadata

src/platform/workflow/templates/composables/useTemplateWorkflows.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,9 @@ export function useTemplateWorkflows() {
138138
}
139139

140140
dialogStore.closeDialog()
141-
await app.loadGraphData(json, true, true, workflowName)
141+
await app.loadGraphData(json, true, true, workflowName, {
142+
openSource: 'template'
143+
})
142144

143145
return true
144146
}
@@ -159,7 +161,9 @@ export function useTemplateWorkflows() {
159161
}
160162

161163
dialogStore.closeDialog()
162-
await app.loadGraphData(json, true, true, workflowName)
164+
await app.loadGraphData(json, true, true, workflowName, {
165+
openSource: 'template'
166+
})
163167

164168
return true
165169
} catch (error) {

0 commit comments

Comments
 (0)