Skip to content

Commit 91b5a7d

Browse files
feat(telemetry): track total node count, subgraphs, and API-node details in RUN_BUTTON_CLICKED (#6468)
Summary - Add richer run-button telemetry: total node count, subgraph count, whether API nodes are present, and unique API node names. - Add provider method/event for “Add API credit” button clicks. - Include a one-off script to normalize Mixpanel survey properties (industry/useCase) for better analytics. Changes - Types: extend telemetry payloads - RunButtonProperties adds total_node_count, subgraph_count, has_api_nodes, api_node_names (src/platform/telemetry/types.ts:42) - ExecutionContext adds same fields (src/platform/telemetry/types.ts:61) - New event + provider API: ADD_API_CREDIT_BUTTON_CLICKED, trackAddApiCreditButtonClicked() (src/platform/telemetry/types.ts:173, src/platform/telemetry/types.ts:180) - Mixpanel provider - Compute node metrics in a single graph traversal and include them in RUN_BUTTON_CLICKED (src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts:169) - Fields populated: total_node_count, subgraph_count, has_api_nodes, api_node_names (src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts:177) - Add trackAddApiCreditButtonClicked() implementation (src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts:152) - Script - Add scripts/survey-data-migration.ts to normalize industry/useCase user properties using existing survey normalization utils; includes a simulation and a production outline (scripts/survey-data-migration.ts:1) Motivation - Improves insight into workflow complexity and API-node adoption directly at run time. - Normalizes free-text survey fields to reduce category proliferation and improve reporting quality. Validation - Run a workflow with/without API nodes and subgraphs; confirm telemetry includes: - total_node_count, subgraph_count, has_api_nodes, api_node_names - Click “Add API credit” and confirm app:add_api_credit_button_clicked is sent. - No user-visible changes; telemetry only runs in cloud builds. Impact - Telemetry payload shape expands; backend ingestion should accept the new properties. - Metrics computed in a single pass over the graph for efficiency. --------- Co-authored-by: bymyself <[email protected]>
1 parent da078a6 commit 91b5a7d

File tree

2 files changed

+56
-11
lines changed

2 files changed

+56
-11
lines changed

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

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ export class MixpanelTelemetryProvider implements TelemetryProvider {
149149
this.trackEvent(eventName)
150150
}
151151

152+
trackAddApiCreditButtonClicked(): void {
153+
this.trackEvent(TelemetryEvents.ADD_API_CREDIT_BUTTON_CLICKED)
154+
}
155+
152156
trackMonthlySubscriptionSucceeded(): void {
153157
this.trackEvent(TelemetryEvents.MONTHLY_SUBSCRIPTION_SUCCEEDED)
154158
}
@@ -169,7 +173,11 @@ export class MixpanelTelemetryProvider implements TelemetryProvider {
169173
const runButtonProperties: RunButtonProperties = {
170174
subscribe_to_run: options?.subscribe_to_run || false,
171175
workflow_type: executionContext.is_template ? 'template' : 'custom',
172-
workflow_name: executionContext.workflow_name ?? 'untitled'
176+
workflow_name: executionContext.workflow_name ?? 'untitled',
177+
total_node_count: executionContext.total_node_count,
178+
subgraph_count: executionContext.subgraph_count,
179+
has_api_nodes: executionContext.has_api_nodes,
180+
api_node_names: executionContext.api_node_names
173181
}
174182

175183
this.trackEvent(TelemetryEvents.RUN_BUTTON_CLICKED, runButtonProperties)
@@ -271,22 +279,50 @@ export class MixpanelTelemetryProvider implements TelemetryProvider {
271279
const activeWorkflow = workflowStore.activeWorkflow
272280

273281
// Calculate node metrics in a single traversal
274-
const nodeMetrics = reduceAllNodes(
282+
type NodeMetrics = {
283+
custom_node_count: number
284+
api_node_count: number
285+
subgraph_count: number
286+
total_node_count: number
287+
has_api_nodes: boolean
288+
api_node_names: string[]
289+
}
290+
291+
const nodeCounts = reduceAllNodes<NodeMetrics>(
275292
app.graph,
276-
(acc, node) => {
293+
(metrics, node) => {
277294
const nodeDef = nodeDefStore.nodeDefsByName[node.type]
278295
const isCustomNode =
279296
nodeDef?.nodeSource?.type === NodeSourceType.CustomNodes
280297
const isApiNode = nodeDef?.api_node === true
281298
const isSubgraph = node.isSubgraphNode?.() === true
282299

283-
return {
284-
custom_node_count: acc.custom_node_count + (isCustomNode ? 1 : 0),
285-
api_node_count: acc.api_node_count + (isApiNode ? 1 : 0),
286-
subgraph_count: acc.subgraph_count + (isSubgraph ? 1 : 0)
300+
if (isApiNode) {
301+
metrics.has_api_nodes = true
302+
const canonicalName = nodeDef?.name
303+
if (
304+
canonicalName &&
305+
!metrics.api_node_names.includes(canonicalName)
306+
) {
307+
metrics.api_node_names.push(canonicalName)
308+
}
287309
}
310+
311+
metrics.custom_node_count += isCustomNode ? 1 : 0
312+
metrics.api_node_count += isApiNode ? 1 : 0
313+
metrics.subgraph_count += isSubgraph ? 1 : 0
314+
metrics.total_node_count += 1
315+
316+
return metrics
288317
},
289-
{ custom_node_count: 0, api_node_count: 0, subgraph_count: 0 }
318+
{
319+
custom_node_count: 0,
320+
api_node_count: 0,
321+
subgraph_count: 0,
322+
total_node_count: 0,
323+
has_api_nodes: false,
324+
api_node_names: []
325+
}
290326
)
291327

292328
if (activeWorkflow?.filename) {
@@ -312,21 +348,21 @@ export class MixpanelTelemetryProvider implements TelemetryProvider {
312348
template_models: englishMetadata?.models ?? template?.models,
313349
template_use_case: englishMetadata?.useCase ?? template?.useCase,
314350
template_license: englishMetadata?.license ?? template?.license,
315-
...nodeMetrics
351+
...nodeCounts
316352
}
317353
}
318354

319355
return {
320356
is_template: false,
321357
workflow_name: activeWorkflow.filename,
322-
...nodeMetrics
358+
...nodeCounts
323359
}
324360
}
325361

326362
return {
327363
is_template: false,
328364
workflow_name: undefined,
329-
...nodeMetrics
365+
...nodeCounts
330366
}
331367
}
332368
}

src/platform/telemetry/types.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ export interface RunButtonProperties {
4242
subscribe_to_run: boolean
4343
workflow_type: 'template' | 'custom'
4444
workflow_name: string
45+
total_node_count: number
46+
subgraph_count: number
47+
has_api_nodes: boolean
48+
api_node_names: string[]
4549
}
4650

4751
/**
@@ -61,6 +65,9 @@ export interface ExecutionContext {
6165
custom_node_count: number
6266
api_node_count: number
6367
subgraph_count: number
68+
total_node_count: number
69+
has_api_nodes: boolean
70+
api_node_names: string[]
6471
}
6572

6673
/**
@@ -173,6 +180,7 @@ export interface TelemetryProvider {
173180
// Subscription flow events
174181
trackSubscription(event: 'modal_opened' | 'subscribe_clicked'): void
175182
trackMonthlySubscriptionSucceeded(): void
183+
trackAddApiCreditButtonClicked(): void
176184
trackApiCreditTopupButtonPurchaseClicked(amount: number): void
177185
trackRunButton(options?: { subscribe_to_run?: boolean }): void
178186

@@ -225,6 +233,7 @@ export const TelemetryEvents = {
225233
SUBSCRIPTION_REQUIRED_MODAL_OPENED: 'app:subscription_required_modal_opened',
226234
SUBSCRIBE_NOW_BUTTON_CLICKED: 'app:subscribe_now_button_clicked',
227235
MONTHLY_SUBSCRIPTION_SUCCEEDED: 'app:monthly_subscription_succeeded',
236+
ADD_API_CREDIT_BUTTON_CLICKED: 'app:add_api_credit_button_clicked',
228237
API_CREDIT_TOPUP_BUTTON_PURCHASE_CLICKED:
229238
'app:api_credit_topup_button_purchase_clicked',
230239

0 commit comments

Comments
 (0)