From d76f05ba3d3b6fe4e8b301809b51f728334855d0 Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Mon, 30 Jun 2025 09:08:47 -0400 Subject: [PATCH] fix: Stop telemetry events to `Posthog` (#16788) --- packages/cli/src/telemetry/index.ts | 10 +- .../src/components/ParameterInputFull.vue | 24 +-- .../ResourceLocator/ResourceLocator.vue | 24 +-- .../editor-ui/src/components/RunData.vue | 18 +- .../editor-ui/src/components/RunDataJson.vue | 4 +- .../editor-ui/src/components/RunDataTable.vue | 4 +- .../SetupWorkflowCredentialsModal.vue | 2 +- .../src/components/VirtualSchema.test.ts | 2 - .../src/components/VirtualSchema.vue | 2 +- .../WorkflowSelectorParameterInput.vue | 4 +- .../composables/useCanvasOperations.test.ts | 14 +- .../src/composables/useCanvasOperations.ts | 14 +- .../handlers/executionFinished.ts | 14 +- .../editor-ui/src/plugins/telemetry.test.ts | 3 +- .../editor-ui/src/plugins/telemetry/index.ts | 27 +-- .../src/stores/assistant.store.test.ts | 18 +- .../editor-ui/src/stores/assistant.store.ts | 16 +- .../editor-ui/src/stores/builder.store.ts | 24 +-- .../src/stores/nodeCreator.store.test.ts | 178 ++++++------------ .../editor-ui/src/stores/nodeCreator.store.ts | 18 +- .../editor-ui/src/stores/posthog.store.ts | 7 - .../src/stores/workflows.store.test.ts | 22 +-- .../editor-ui/src/stores/workflows.store.ts | 34 ++-- .../src/utils/templates/templateActions.ts | 2 +- .../Evaluations.ee/EvaluationsRootView.vue | 38 ++-- .../tests/EvaluationsRootView.test.ts | 126 +++++-------- .../frontend/editor-ui/src/views/NodeView.vue | 19 +- .../SetupTemplateFormStep.vue | 16 +- .../setupTemplate.store.ts | 14 +- .../editor-ui/src/views/WorkflowsView.vue | 10 +- 30 files changed, 247 insertions(+), 461 deletions(-) diff --git a/packages/cli/src/telemetry/index.ts b/packages/cli/src/telemetry/index.ts index 2979c40cf7..62e1b6c8ef 100644 --- a/packages/cli/src/telemetry/index.ts +++ b/packages/cli/src/telemetry/index.ts @@ -195,11 +195,7 @@ export class Telemetry { }); } - track( - eventName: string, - properties: ITelemetryTrackProperties = {}, - { withPostHog } = { withPostHog: false }, // whether to additionally track with PostHog - ) { + track(eventName: string, properties: ITelemetryTrackProperties = {}) { if (!this.rudderStack) { return; } @@ -219,10 +215,6 @@ export class Telemetry { context: {}, }; - if (withPostHog) { - this.postHog?.track(payload); - } - return this.rudderStack.track({ ...payload, // provide a fake IP address to instruct RudderStack to not use the user's IP address diff --git a/packages/frontend/editor-ui/src/components/ParameterInputFull.vue b/packages/frontend/editor-ui/src/components/ParameterInputFull.vue index e71ac6986e..35317874d6 100644 --- a/packages/frontend/editor-ui/src/components/ParameterInputFull.vue +++ b/packages/frontend/editor-ui/src/components/ParameterInputFull.vue @@ -257,14 +257,10 @@ const isSingleLineInput: ComputedRef = computed( function applyOverride() { if (!fromAIOverride.value) return; - telemetry.track( - 'User turned on fromAI override', - { - nodeType: activeNode.value?.type, - parameter: props.path, - }, - { withPostHog: true }, - ); + telemetry.track('User turned on fromAI override', { + nodeType: activeNode.value?.type, + parameter: props.path, + }); updateFromAIOverrideValues(fromAIOverride.value, String(props.value)); const value = buildValueFromOverride(fromAIOverride.value, props, true); valueChanged({ @@ -277,14 +273,10 @@ function applyOverride() { function removeOverride(clearField = false) { if (!fromAIOverride.value) return; - telemetry.track( - 'User turned off fromAI override', - { - nodeType: activeNode.value?.type, - parameter: props.path, - }, - { withPostHog: true }, - ); + telemetry.track('User turned off fromAI override', { + nodeType: activeNode.value?.type, + parameter: props.path, + }); valueChanged({ node: activeNode.value?.name, name: props.path, diff --git a/packages/frontend/editor-ui/src/components/ResourceLocator/ResourceLocator.vue b/packages/frontend/editor-ui/src/components/ResourceLocator/ResourceLocator.vue index edac5a0dea..68c0f547dc 100644 --- a/packages/frontend/editor-ui/src/components/ResourceLocator/ResourceLocator.vue +++ b/packages/frontend/editor-ui/src/components/ResourceLocator/ResourceLocator.vue @@ -847,14 +847,10 @@ function onInputBlur(event: FocusEvent) { function applyOverride() { if (!props.node || !fromAIOverride.value) return; - telemetry.track( - 'User turned on fromAI override', - { - nodeType: props.node.type, - parameter: props.path, - }, - { withPostHog: true }, - ); + telemetry.track('User turned on fromAI override', { + nodeType: props.node.type, + parameter: props.path, + }); updateFromAIOverrideValues(fromAIOverride.value, props.modelValue.value?.toString() ?? ''); emit('update:modelValue', { @@ -866,14 +862,10 @@ function applyOverride() { function removeOverride() { if (!props.node || !fromAIOverride.value) return; - telemetry.track( - 'User turned off fromAI override', - { - nodeType: props.node.type, - parameter: props.path, - }, - { withPostHog: true }, - ); + telemetry.track('User turned off fromAI override', { + nodeType: props.node.type, + parameter: props.path, + }); emit('update:modelValue', { ...props.modelValue, value: buildValueFromOverride(fromAIOverride.value, props, false), diff --git a/packages/frontend/editor-ui/src/components/RunData.vue b/packages/frontend/editor-ui/src/components/RunData.vue index f4bf6e6462..30c2bf3ae2 100644 --- a/packages/frontend/editor-ui/src/components/RunData.vue +++ b/packages/frontend/editor-ui/src/components/RunData.vue @@ -715,18 +715,12 @@ onMounted(() => { const errorsToTrack = ['unknown error']; if (error && errorsToTrack.some((e) => error.message?.toLowerCase().includes(e))) { - telemetry.track( - 'User encountered an error', - { - node: node.value.type, - errorMessage: error.message, - nodeVersion: node.value.typeVersion, - n8nVersion: rootStore.versionCli, - }, - { - withPostHog: true, - }, - ); + telemetry.track('User encountered an error', { + node: node.value.type, + errorMessage: error.message, + nodeVersion: node.value.typeVersion, + n8nVersion: rootStore.versionCli, + }); } } }); diff --git a/packages/frontend/editor-ui/src/components/RunDataJson.vue b/packages/frontend/editor-ui/src/components/RunDataJson.vue index 026bf06f86..735f566dbb 100644 --- a/packages/frontend/editor-ui/src/components/RunDataJson.vue +++ b/packages/frontend/editor-ui/src/components/RunDataJson.vue @@ -108,9 +108,7 @@ const onDragEnd = (el: HTMLElement) => { setTimeout(() => { void externalHooks.run('runDataJson.onDragEnd', telemetryPayload); - telemetry.track('User dragged data for mapping', telemetryPayload, { - withPostHog: true, - }); + telemetry.track('User dragged data for mapping', telemetryPayload); }, 1000); // ensure dest data gets set if drop }; diff --git a/packages/frontend/editor-ui/src/components/RunDataTable.vue b/packages/frontend/editor-ui/src/components/RunDataTable.vue index fc50e22c4c..3613193ffe 100644 --- a/packages/frontend/editor-ui/src/components/RunDataTable.vue +++ b/packages/frontend/editor-ui/src/components/RunDataTable.vue @@ -308,9 +308,7 @@ function onDragEnd(column: string, src: string, depth = '0') { void externalHooks.run('runDataTable.onDragEnd', telemetryPayload); - telemetry.track('User dragged data for mapping', telemetryPayload, { - withPostHog: true, - }); + telemetry.track('User dragged data for mapping', telemetryPayload); }, 1000); // ensure dest data gets set if drop } diff --git a/packages/frontend/editor-ui/src/components/SetupWorkflowCredentialsModal/SetupWorkflowCredentialsModal.vue b/packages/frontend/editor-ui/src/components/SetupWorkflowCredentialsModal/SetupWorkflowCredentialsModal.vue index ef1e49b300..8540aece87 100644 --- a/packages/frontend/editor-ui/src/components/SetupWorkflowCredentialsModal/SetupWorkflowCredentialsModal.vue +++ b/packages/frontend/editor-ui/src/components/SetupWorkflowCredentialsModal/SetupWorkflowCredentialsModal.vue @@ -33,7 +33,7 @@ const { onMounted(() => { setInitialCredentialSelection(); - telemetry.track('User opened cred setup', { source: 'canvas' }, { withPostHog: true }); + telemetry.track('User opened cred setup', { source: 'canvas' }); }); onUnmounted(() => { diff --git a/packages/frontend/editor-ui/src/components/VirtualSchema.test.ts b/packages/frontend/editor-ui/src/components/VirtualSchema.test.ts index 7ddcf6ecb6..f8f793c1bf 100644 --- a/packages/frontend/editor-ui/src/components/VirtualSchema.test.ts +++ b/packages/frontend/editor-ui/src/components/VirtualSchema.test.ts @@ -569,7 +569,6 @@ describe('VirtualSchema.vue', () => { src_nodes_back: '1', src_has_credential: false, }), - { withPostHog: true }, ), ); }); @@ -616,7 +615,6 @@ describe('VirtualSchema.vue', () => { src_view: 'schema_preview', src_has_credential: true, }), - { withPostHog: true }, ), ); }); diff --git a/packages/frontend/editor-ui/src/components/VirtualSchema.vue b/packages/frontend/editor-ui/src/components/VirtualSchema.vue index 1e6fd656ab..7d5bea7c45 100644 --- a/packages/frontend/editor-ui/src/components/VirtualSchema.vue +++ b/packages/frontend/editor-ui/src/components/VirtualSchema.vue @@ -407,7 +407,7 @@ const onDragEnd = (el: HTMLElement) => { void useExternalHooks().run('runDataJson.onDragEnd', telemetryPayload); - telemetry.track('User dragged data for mapping', telemetryPayload, { withPostHog: true }); + telemetry.track('User dragged data for mapping', telemetryPayload); }, 250); // ensure dest data gets set if drop }; diff --git a/packages/frontend/editor-ui/src/components/WorkflowSelectorParameterInput/WorkflowSelectorParameterInput.vue b/packages/frontend/editor-ui/src/components/WorkflowSelectorParameterInput/WorkflowSelectorParameterInput.vue index b73dd2a2b1..223c901179 100644 --- a/packages/frontend/editor-ui/src/components/WorkflowSelectorParameterInput/WorkflowSelectorParameterInput.vue +++ b/packages/frontend/editor-ui/src/components/WorkflowSelectorParameterInput/WorkflowSelectorParameterInput.vue @@ -171,7 +171,7 @@ function onInputChange(workflowId: NodeParameterValue): void { } function onListItemSelected(value: NodeParameterValue) { - telemetry.track('User chose sub-workflow', {}, { withPostHog: true }); + telemetry.track('User chose sub-workflow', {}); onInputChange(value); hideDropdown(); } @@ -258,7 +258,7 @@ const onAddResourceClicked = async () => { if (projectId) { workflow.projectId = projectId; } - telemetry.track('User clicked create new sub-workflow button', {}, { withPostHog: true }); + telemetry.track('User clicked create new sub-workflow button', {}); const newWorkflow = await workflowsStore.createNewWorkflow(workflow); const { href } = router.resolve({ diff --git a/packages/frontend/editor-ui/src/composables/useCanvasOperations.test.ts b/packages/frontend/editor-ui/src/composables/useCanvasOperations.test.ts index ec3a4143fb..4bf697c71c 100644 --- a/packages/frontend/editor-ui/src/composables/useCanvasOperations.test.ts +++ b/packages/frontend/editor-ui/src/composables/useCanvasOperations.test.ts @@ -526,15 +526,11 @@ describe('useCanvasOperations', () => { const { tidyUp } = useCanvasOperations(); tidyUp(event); - expect(useTelemetry().track).toHaveBeenCalledWith( - 'User tidied up canvas', - { - nodes_count: 2, - source: 'canvas-button', - target: 'all', - }, - { withPostHog: true }, - ); + expect(useTelemetry().track).toHaveBeenCalledWith('User tidied up canvas', { + nodes_count: 2, + source: 'canvas-button', + target: 'all', + }); }); }); diff --git a/packages/frontend/editor-ui/src/composables/useCanvasOperations.ts b/packages/frontend/editor-ui/src/composables/useCanvasOperations.ts index 8df11379d7..b62d706d18 100644 --- a/packages/frontend/editor-ui/src/composables/useCanvasOperations.ts +++ b/packages/frontend/editor-ui/src/composables/useCanvasOperations.ts @@ -188,15 +188,11 @@ export function useCanvasOperations() { } function trackTidyUp({ result, source, target }: CanvasLayoutEvent) { - telemetry.track( - 'User tidied up canvas', - { - source, - target, - nodes_count: result.nodes.length, - }, - { withPostHog: true }, - ); + telemetry.track('User tidied up canvas', { + source, + target, + nodes_count: result.nodes.length, + }); } function updateNodesPosition( diff --git a/packages/frontend/editor-ui/src/composables/usePushConnection/handlers/executionFinished.ts b/packages/frontend/editor-ui/src/composables/usePushConnection/handlers/executionFinished.ts index 303706157b..754540c7ce 100644 --- a/packages/frontend/editor-ui/src/composables/usePushConnection/handlers/executionFinished.ts +++ b/packages/frontend/editor-ui/src/composables/usePushConnection/handlers/executionFinished.ts @@ -59,13 +59,9 @@ export async function executionFinished( const easyAiWorkflowJson = getEasyAiWorkflowJson(); const isEasyAIWorkflow = workflow.meta.templateId === easyAiWorkflowJson.meta.templateId; if (isEasyAIWorkflow) { - telemetry.track( - 'User executed test AI workflow', - { - status: data.status, - }, - { withPostHog: true }, - ); + telemetry.track('User executed test AI workflow', { + status: data.status, + }); } } @@ -313,9 +309,7 @@ export function handleExecutionFinishedWithErrorOrCanceled( } } - telemetry.track('Instance FE emitted paired item error', eventData, { - withPostHog: true, - }); + telemetry.track('Instance FE emitted paired item error', eventData); }); } diff --git a/packages/frontend/editor-ui/src/plugins/telemetry.test.ts b/packages/frontend/editor-ui/src/plugins/telemetry.test.ts index c1a4cda3cf..5b2d0c4f7c 100644 --- a/packages/frontend/editor-ui/src/plugins/telemetry.test.ts +++ b/packages/frontend/editor-ui/src/plugins/telemetry.test.ts @@ -190,9 +190,8 @@ describe('telemetry', () => { const event = 'testEvent'; const properties = { test: '1' }; - const options = { withPostHog: false }; - telemetry.track(event, properties, options); + telemetry.track(event, properties); expect(trackFunction).toHaveBeenCalledTimes(1); expect(trackFunction).toHaveBeenCalledWith( diff --git a/packages/frontend/editor-ui/src/plugins/telemetry/index.ts b/packages/frontend/editor-ui/src/plugins/telemetry/index.ts index 822c4019b1..bc3144b658 100644 --- a/packages/frontend/editor-ui/src/plugins/telemetry/index.ts +++ b/packages/frontend/editor-ui/src/plugins/telemetry/index.ts @@ -13,7 +13,6 @@ import { } from '@/constants'; import { useRootStore } from '@n8n/stores/useRootStore'; import { useNDVStore } from '@/stores/ndv.store'; -import { usePostHog } from '@/stores/posthog.store'; import { useSettingsStore } from '@/stores/settings.store'; import { useUIStore } from '@/stores/ui.store'; @@ -97,11 +96,7 @@ export class Telemetry { } } - track( - event: string, - properties?: ITelemetryTrackProperties, - options: { withPostHog?: boolean } = {}, - ) { + track(event: string, properties?: ITelemetryTrackProperties) { if (!this.rudderStack) return; const updatedProperties = { @@ -115,10 +110,6 @@ export class Telemetry { ip: '0.0.0.0', }, }); - - if (options.withPostHog) { - usePostHog().capture(event, updatedProperties); - } } page(route: RouteLocation) { @@ -170,7 +161,7 @@ export class Telemetry { switch (event) { case 'askAi.generationFinished': - this.track('Ai code generation finished', properties, { withPostHog: true }); + this.track('Ai code generation finished', properties); default: break; } @@ -184,7 +175,7 @@ export class Telemetry { switch (event) { case 'generationFinished': - this.track('Ai Transform code generation finished', properties, { withPostHog: true }); + this.track('Ai Transform code generation finished', properties); default: break; } @@ -202,14 +193,10 @@ export class Telemetry { }; const changeName = changeNameMap[nodeType] || APPEND_ATTRIBUTION_DEFAULT_PATH; if (change.name === changeName) { - this.track( - 'User toggled n8n reference option', - { - node: nodeType, - toValue: change.value, - }, - { withPostHog: true }, - ); + this.track('User toggled n8n reference option', { + node: nodeType, + toValue: change.value, + }); } } } diff --git a/packages/frontend/editor-ui/src/stores/assistant.store.test.ts b/packages/frontend/editor-ui/src/stores/assistant.store.test.ts index 3b52a7fb6a..a6e9a0b7a5 100644 --- a/packages/frontend/editor-ui/src/stores/assistant.store.test.ts +++ b/packages/frontend/editor-ui/src/stores/assistant.store.test.ts @@ -371,18 +371,12 @@ describe('AI Assistant store', () => { source: 'error', has_existing_session: true, }); - expect(track).toHaveBeenCalledWith( - 'Assistant session started', - { - chat_session_id: 'test', - node_type: 'n8n-nodes-base.stopAndError', - task: 'error', - credential_type: undefined, - }, - { - withPostHog: true, - }, - ); + expect(track).toHaveBeenCalledWith('Assistant session started', { + chat_session_id: 'test', + node_type: 'n8n-nodes-base.stopAndError', + task: 'error', + credential_type: undefined, + }); expect(track).toHaveBeenCalledWith('User opened assistant', { chat_session_id: 'test', diff --git a/packages/frontend/editor-ui/src/stores/assistant.store.ts b/packages/frontend/editor-ui/src/stores/assistant.store.ts index b0972105e0..179df10768 100644 --- a/packages/frontend/editor-ui/src/stores/assistant.store.ts +++ b/packages/frontend/editor-ui/src/stores/assistant.store.ts @@ -291,16 +291,12 @@ export const useAssistantStore = defineStore(STORES.ASSISTANT, () => { function onEachStreamingMessage(response: ChatRequest.ResponsePayload, id: string) { if (response.sessionId && !currentSessionId.value) { currentSessionId.value = response.sessionId; - telemetry.track( - 'Assistant session started', - { - chat_session_id: currentSessionId.value, - task: chatSessionTask.value, - node_type: chatSessionError.value?.node.type, - credential_type: chatSessionCredType.value?.name, - }, - { withPostHog: true }, - ); + telemetry.track('Assistant session started', { + chat_session_id: currentSessionId.value, + task: chatSessionTask.value, + node_type: chatSessionError.value?.node.type, + credential_type: chatSessionCredType.value?.name, + }); // Track first user message in support chat now that we have a session id if (usersMessages.value.length === 1 && chatSessionTask.value === 'support') { const firstUserMessage = usersMessages.value[0] as ChatUI.TextMessage; diff --git a/packages/frontend/editor-ui/src/stores/builder.store.ts b/packages/frontend/editor-ui/src/stores/builder.store.ts index ec25cf07e3..939a152ce1 100644 --- a/packages/frontend/editor-ui/src/stores/builder.store.ts +++ b/packages/frontend/editor-ui/src/stores/builder.store.ts @@ -242,14 +242,10 @@ export const useBuilderStore = defineStore(STORES.BUILDER, () => { function onEachStreamingMessage(response: ChatRequest.ResponsePayload, id: string) { if (response.sessionId && !currentSessionId.value) { currentSessionId.value = response.sessionId; - telemetry.track( - 'Assistant session started', - { - chat_session_id: currentSessionId.value, - task: 'workflow-generation', - }, - { withPostHog: true }, - ); + telemetry.track('Assistant session started', { + chat_session_id: currentSessionId.value, + task: 'workflow-generation', + }); } else if (currentSessionId.value !== response.sessionId) { // Ignore messages from other sessions return; @@ -263,14 +259,10 @@ export const useBuilderStore = defineStore(STORES.BUILDER, () => { // Core API functions async function initBuilderChat(userMessage: string, source: 'chat' | 'canvas') { - telemetry.track( - 'User submitted workflow prompt', - { - source, - prompt: userMessage, - }, - { withPostHog: true }, - ); + telemetry.track('User submitted workflow prompt', { + source, + prompt: userMessage, + }); resetBuilderChat(); const id = getRandomId(); diff --git a/packages/frontend/editor-ui/src/stores/nodeCreator.store.test.ts b/packages/frontend/editor-ui/src/stores/nodeCreator.store.test.ts index 581d805f35..5a7eae832a 100644 --- a/packages/frontend/editor-ui/src/stores/nodeCreator.store.test.ts +++ b/packages/frontend/editor-ui/src/stores/nodeCreator.store.test.ts @@ -80,18 +80,12 @@ describe('useNodeCreatorStore', () => { workflow_id, }); - expect(useTelemetry().track).toHaveBeenCalledWith( - 'User opened nodes panel', - { - mode, - source, - nodes_panel_session_id: getSessionId(now), - workflow_id, - }, - { - withPostHog: false, - }, - ); + expect(useTelemetry().track).toHaveBeenCalledWith('User opened nodes panel', { + mode, + source, + nodes_panel_session_id: getSessionId(now), + workflow_id, + }); }); it('resets session id every time node creator is opened', () => { @@ -101,18 +95,12 @@ describe('useNodeCreatorStore', () => { workflow_id, }); - expect(useTelemetry().track).toHaveBeenCalledWith( - 'User opened nodes panel', - { - mode, - source, - nodes_panel_session_id: getSessionId(now), - workflow_id, - }, - { - withPostHog: false, - }, - ); + expect(useTelemetry().track).toHaveBeenCalledWith('User opened nodes panel', { + mode, + source, + nodes_panel_session_id: getSessionId(now), + workflow_id, + }); vi.setSystemTime(now1); @@ -122,18 +110,12 @@ describe('useNodeCreatorStore', () => { workflow_id, }); - expect(useTelemetry().track).toHaveBeenCalledWith( - 'User opened nodes panel', - { - mode, - source, - nodes_panel_session_id: getSessionId(now1), - workflow_id, - }, - { - withPostHog: false, - }, - ); + expect(useTelemetry().track).toHaveBeenCalledWith('User opened nodes panel', { + mode, + source, + nodes_panel_session_id: getSessionId(now1), + workflow_id, + }); }); it('tracks event on category expanded', () => { @@ -144,18 +126,12 @@ describe('useNodeCreatorStore', () => { }); nodeCreatorStore.onCategoryExpanded({ workflow_id, category_name }); - expect(useTelemetry().track).toHaveBeenCalledWith( - 'User viewed node category', - { - category_name, - is_subcategory: false, - nodes_panel_session_id: getSessionId(now), - workflow_id, - }, - { - withPostHog: false, - }, - ); + expect(useTelemetry().track).toHaveBeenCalledWith('User viewed node category', { + category_name, + is_subcategory: false, + nodes_panel_session_id: getSessionId(now), + workflow_id, + }); }); it('tracks event when node is added to canvas', () => { @@ -174,22 +150,16 @@ describe('useNodeCreatorStore', () => { input_node_type, }); - expect(useTelemetry().track).toHaveBeenCalledWith( - 'User added node to workflow canvas', - { - node_id, - node_type, - node_version, - is_auto_add: true, - drag_and_drop: true, - input_node_type, - nodes_panel_session_id: getSessionId(now), - workflow_id, - }, - { - withPostHog: true, - }, - ); + expect(useTelemetry().track).toHaveBeenCalledWith('User added node to workflow canvas', { + node_id, + node_type, + node_version, + is_auto_add: true, + drag_and_drop: true, + input_node_type, + nodes_panel_session_id: getSessionId(now), + workflow_id, + }); }); it('tracks event when action is added', () => { @@ -205,19 +175,13 @@ describe('useNodeCreatorStore', () => { resource, }); - expect(useTelemetry().track).toHaveBeenCalledWith( - 'User added action', - { - node_type, - action, - source_mode, - resource, - nodes_panel_session_id: getSessionId(now), - }, - { - withPostHog: false, - }, - ); + expect(useTelemetry().track).toHaveBeenCalledWith('User added action', { + node_type, + action, + source_mode, + resource, + nodes_panel_session_id: getSessionId(now), + }); }); it('tracks when custom api action is clicked', () => { @@ -230,16 +194,10 @@ describe('useNodeCreatorStore', () => { app_identifier: node_type, }); - expect(useTelemetry().track).toHaveBeenCalledWith( - 'User clicked custom API from node actions', - { - app_identifier: node_type, - nodes_panel_session_id: getSessionId(now), - }, - { - withPostHog: false, - }, - ); + expect(useTelemetry().track).toHaveBeenCalledWith('User clicked custom API from node actions', { + app_identifier: node_type, + nodes_panel_session_id: getSessionId(now), + }); }); it('tracks when action is viewed', () => { @@ -255,19 +213,13 @@ describe('useNodeCreatorStore', () => { trigger_action_count: 2, }); - expect(useTelemetry().track).toHaveBeenCalledWith( - 'User viewed node actions', - { - app_identifier: node_type, - actions, - regular_action_count: 1, - trigger_action_count: 2, - nodes_panel_session_id: getSessionId(now), - }, - { - withPostHog: false, - }, - ); + expect(useTelemetry().track).toHaveBeenCalledWith('User viewed node actions', { + app_identifier: node_type, + actions, + regular_action_count: 1, + trigger_action_count: 2, + nodes_panel_session_id: getSessionId(now), + }); }); it('tracks when search filter is updated, ignoring custom actions in count', () => { @@ -308,22 +260,16 @@ describe('useNodeCreatorStore', () => { title, }); - expect(useTelemetry().track).toHaveBeenCalledWith( - 'User entered nodes panel search term', - { - search_string: newValue, - filter_mode: 'regular', - category_name: subcategory, - results_count: 2, - trigger_count: 1, - regular_count: 1, - nodes_panel_session_id: getSessionId(now), - title, - }, - { - withPostHog: false, - }, - ); + expect(useTelemetry().track).toHaveBeenCalledWith('User entered nodes panel search term', { + search_string: newValue, + filter_mode: 'regular', + category_name: subcategory, + results_count: 2, + trigger_count: 1, + regular_count: 1, + nodes_panel_session_id: getSessionId(now), + title, + }); }); describe('selective connection view', () => { const mockedParseCanvasConnectionHandleString = vi.mocked( diff --git a/packages/frontend/editor-ui/src/stores/nodeCreator.store.ts b/packages/frontend/editor-ui/src/stores/nodeCreator.store.ts index da96abb978..209a30f2e9 100644 --- a/packages/frontend/editor-ui/src/stores/nodeCreator.store.ts +++ b/packages/frontend/editor-ui/src/stores/nodeCreator.store.ts @@ -292,17 +292,11 @@ export const useNodeCreatorStore = defineStore(STORES.NODE_CREATOR, () => { nodePanelSessionId.value = `nodes_panel_session_${new Date().valueOf()}`; } - function trackNodeCreatorEvent(event: string, properties: IDataObject = {}, withPostHog = false) { - telemetry.track( - event, - { - ...properties, - nodes_panel_session_id: nodePanelSessionId.value, - }, - { - withPostHog, - }, - ); + function trackNodeCreatorEvent(event: string, properties: IDataObject = {}) { + telemetry.track(event, { + ...properties, + nodes_panel_session_id: nodePanelSessionId.value, + }); } function onCreatorOpened({ @@ -419,7 +413,7 @@ export const useNodeCreatorStore = defineStore(STORES.NODE_CREATOR, () => { drag_and_drop?: boolean; input_node_type?: string; }) { - trackNodeCreatorEvent('User added node to workflow canvas', properties, true); + trackNodeCreatorEvent('User added node to workflow canvas', properties); } function getMode(mode: NodeFilterType): string { diff --git a/packages/frontend/editor-ui/src/stores/posthog.store.ts b/packages/frontend/editor-ui/src/stores/posthog.store.ts index 655fbd9de0..965160c1ef 100644 --- a/packages/frontend/editor-ui/src/stores/posthog.store.ts +++ b/packages/frontend/editor-ui/src/stores/posthog.store.ts @@ -164,12 +164,6 @@ export const usePostHog = defineStore('posthog', () => { } }; - const capture = (event: string, properties: IDataObject) => { - if (typeof window.posthog?.capture === 'function') { - window.posthog.capture(event, properties); - } - }; - const setMetadata = (metadata: IDataObject, target: 'user' | 'events') => { if (typeof window.posthog?.people?.set !== 'function') return; if (typeof window.posthog?.register !== 'function') return; @@ -188,7 +182,6 @@ export const usePostHog = defineStore('posthog', () => { getVariant, reset, identify, - capture, setMetadata, overrides, }; diff --git a/packages/frontend/editor-ui/src/stores/workflows.store.test.ts b/packages/frontend/editor-ui/src/stores/workflows.store.test.ts index fa78bec97d..da4608d3c3 100644 --- a/packages/frontend/editor-ui/src/stores/workflows.store.test.ts +++ b/packages/frontend/editor-ui/src/stores/workflows.store.test.ts @@ -647,20 +647,14 @@ describe('useWorkflowsStore', () => { }, }, }); - expect(track).toHaveBeenCalledWith( - 'Manual exec errored', - { - error_title: 'invalid syntax', - node_type: 'n8n-nodes-base.set', - node_type_version: 3.4, - node_id: '554c7ff4-7ee2-407c-8931-e34234c5056a', - node_graph_string: - '{"node_types":["n8n-nodes-base.set"],"node_connections":[],"nodes":{"0":{"id":"554c7ff4-7ee2-407c-8931-e34234c5056a","type":"n8n-nodes-base.set","version":3.4,"position":[680,180]}},"notes":{},"is_pinned":false}', - }, - { - withPostHog: true, - }, - ); + expect(track).toHaveBeenCalledWith('Manual exec errored', { + error_title: 'invalid syntax', + node_type: 'n8n-nodes-base.set', + node_type_version: 3.4, + node_id: '554c7ff4-7ee2-407c-8931-e34234c5056a', + node_graph_string: + '{"node_types":["n8n-nodes-base.set"],"node_connections":[],"nodes":{"0":{"id":"554c7ff4-7ee2-407c-8931-e34234c5056a","type":"n8n-nodes-base.set","version":3.4,"position":[680,180]}},"notes":{},"is_pinned":false}', + }); }); it('sets workflow pin data', () => { diff --git a/packages/frontend/editor-ui/src/stores/workflows.store.ts b/packages/frontend/editor-ui/src/stores/workflows.store.ts index 29da326f79..42e5581669 100644 --- a/packages/frontend/editor-ui/src/stores/workflows.store.ts +++ b/packages/frontend/editor-ui/src/stores/workflows.store.ts @@ -1511,25 +1511,21 @@ export const useWorkflowsStore = defineStore(STORES.WORKFLOWS, () => { if (pushData.data.error) { const node = getNodeByName(nodeName); - telemetry.track( - 'Manual exec errored', - { - error_title: pushData.data.error.message, - node_type: node?.type, - node_type_version: node?.typeVersion, - node_id: node?.id, - node_graph_string: JSON.stringify( - TelemetryHelpers.generateNodesGraph( - await workflowHelpers.getWorkflowDataToSave(), - workflowHelpers.getNodeTypes(), - { - isCloudDeployment: settingsStore.isCloudDeployment, - }, - ).nodeGraph, - ), - }, - { withPostHog: true }, - ); + telemetry.track('Manual exec errored', { + error_title: pushData.data.error.message, + node_type: node?.type, + node_type_version: node?.typeVersion, + node_id: node?.id, + node_graph_string: JSON.stringify( + TelemetryHelpers.generateNodesGraph( + await workflowHelpers.getWorkflowDataToSave(), + workflowHelpers.getNodeTypes(), + { + isCloudDeployment: settingsStore.isCloudDeployment, + }, + ).nodeGraph, + ), + }); } } diff --git a/packages/frontend/editor-ui/src/utils/templates/templateActions.ts b/packages/frontend/editor-ui/src/utils/templates/templateActions.ts index 8a836bc9c7..3cf69286db 100644 --- a/packages/frontend/editor-ui/src/utils/templates/templateActions.ts +++ b/packages/frontend/editor-ui/src/utils/templates/templateActions.ts @@ -70,7 +70,7 @@ async function openTemplateCredentialSetup(opts: { }) { const { router, templateId, inNewBrowserTab = false, telemetry, source } = opts; - telemetry.track('User opened cred setup', { source }, { withPostHog: true }); + telemetry.track('User opened cred setup', { source }); const routeLocation: RouteLocationRaw = { name: VIEWS.TEMPLATE_SETUP, diff --git a/packages/frontend/editor-ui/src/views/Evaluations.ee/EvaluationsRootView.vue b/packages/frontend/editor-ui/src/views/Evaluations.ee/EvaluationsRootView.vue index b04757a025..19d999a9f3 100644 --- a/packages/frontend/editor-ui/src/views/Evaluations.ee/EvaluationsRootView.vue +++ b/packages/frontend/editor-ui/src/views/Evaluations.ee/EvaluationsRootView.vue @@ -103,30 +103,22 @@ watch( (ready) => { if (ready) { if (showWizard.value) { - telemetry.track( - 'User viewed tests tab', - { - workflow_id: props.name, - test_type: 'evaluation', - view: 'setup', - trigger_set_up: evaluationStore.evaluationTriggerExists, - output_set_up: evaluationStore.evaluationSetOutputsNodeExist, - metrics_set_up: evaluationStore.evaluationSetMetricsNodeExist, - quota_reached: evaluationsQuotaExceeded.value, - }, - { withPostHog: true }, - ); + telemetry.track('User viewed tests tab', { + workflow_id: props.name, + test_type: 'evaluation', + view: 'setup', + trigger_set_up: evaluationStore.evaluationTriggerExists, + output_set_up: evaluationStore.evaluationSetOutputsNodeExist, + metrics_set_up: evaluationStore.evaluationSetMetricsNodeExist, + quota_reached: evaluationsQuotaExceeded.value, + }); } else { - telemetry.track( - 'User viewed tests tab', - { - workflow_id: props.name, - test_type: 'evaluation', - view: 'overview', - run_count: runs.value.length, - }, - { withPostHog: true }, - ); + telemetry.track('User viewed tests tab', { + workflow_id: props.name, + test_type: 'evaluation', + view: 'overview', + run_count: runs.value.length, + }); } } }, diff --git a/packages/frontend/editor-ui/src/views/Evaluations.ee/tests/EvaluationsRootView.test.ts b/packages/frontend/editor-ui/src/views/Evaluations.ee/tests/EvaluationsRootView.test.ts index df159a359d..6c02965bf9 100644 --- a/packages/frontend/editor-ui/src/views/Evaluations.ee/tests/EvaluationsRootView.test.ts +++ b/packages/frontend/editor-ui/src/views/Evaluations.ee/tests/EvaluationsRootView.test.ts @@ -144,19 +144,15 @@ describe('EvaluationsRootView', () => { renderComponent({ props: { name: mockWorkflow.id } }); await waitFor(() => { - expect(useTelemetry().track).toHaveBeenCalledWith( - 'User viewed tests tab', - { - workflow_id: mockWorkflow.id, - test_type: 'evaluation', - view: 'setup', - trigger_set_up: false, - output_set_up: false, - metrics_set_up: false, - quota_reached: false, - }, - { withPostHog: true }, - ); + expect(useTelemetry().track).toHaveBeenCalledWith('User viewed tests tab', { + workflow_id: mockWorkflow.id, + test_type: 'evaluation', + view: 'setup', + trigger_set_up: false, + output_set_up: false, + metrics_set_up: false, + quota_reached: false, + }); }); }); @@ -176,16 +172,12 @@ describe('EvaluationsRootView', () => { renderComponent({ props: { name: mockWorkflow.id } }); await waitFor(() => { - expect(useTelemetry().track).toHaveBeenCalledWith( - 'User viewed tests tab', - { - workflow_id: mockWorkflow.id, - test_type: 'evaluation', - view: 'overview', - run_count: 2, - }, - { withPostHog: true }, - ); + expect(useTelemetry().track).toHaveBeenCalledWith('User viewed tests tab', { + workflow_id: mockWorkflow.id, + test_type: 'evaluation', + view: 'overview', + run_count: 2, + }); }); }); @@ -223,19 +215,15 @@ describe('EvaluationsRootView', () => { renderComponent({ props: { name: mockWorkflow.id } }); await waitFor(() => { - expect(useTelemetry().track).toHaveBeenCalledWith( - 'User viewed tests tab', - { - workflow_id: mockWorkflow.id, - test_type: 'evaluation', - view: 'setup', - trigger_set_up: true, - output_set_up: false, - metrics_set_up: false, - quota_reached: false, - }, - { withPostHog: true }, - ); + expect(useTelemetry().track).toHaveBeenCalledWith('User viewed tests tab', { + workflow_id: mockWorkflow.id, + test_type: 'evaluation', + view: 'setup', + trigger_set_up: true, + output_set_up: false, + metrics_set_up: false, + quota_reached: false, + }); }); }); @@ -279,19 +267,15 @@ describe('EvaluationsRootView', () => { renderComponent({ props: { name: mockWorkflow.id } }); await waitFor(() => { - expect(useTelemetry().track).toHaveBeenCalledWith( - 'User viewed tests tab', - { - workflow_id: mockWorkflow.id, - test_type: 'evaluation', - view: 'setup', - trigger_set_up: false, - output_set_up: true, - metrics_set_up: false, - quota_reached: false, - }, - { withPostHog: true }, - ); + expect(useTelemetry().track).toHaveBeenCalledWith('User viewed tests tab', { + workflow_id: mockWorkflow.id, + test_type: 'evaluation', + view: 'setup', + trigger_set_up: false, + output_set_up: true, + metrics_set_up: false, + quota_reached: false, + }); }); }); @@ -335,19 +319,15 @@ describe('EvaluationsRootView', () => { renderComponent({ props: { name: mockWorkflow.id } }); await waitFor(() => { - expect(useTelemetry().track).toHaveBeenCalledWith( - 'User viewed tests tab', - { - workflow_id: mockWorkflow.id, - test_type: 'evaluation', - view: 'setup', - trigger_set_up: false, - output_set_up: false, - metrics_set_up: true, - quota_reached: false, - }, - { withPostHog: true }, - ); + expect(useTelemetry().track).toHaveBeenCalledWith('User viewed tests tab', { + workflow_id: mockWorkflow.id, + test_type: 'evaluation', + view: 'setup', + trigger_set_up: false, + output_set_up: false, + metrics_set_up: true, + quota_reached: false, + }); }); }); @@ -367,19 +347,15 @@ describe('EvaluationsRootView', () => { renderComponent({ props: { name: mockWorkflow.id } }); await waitFor(() => { - expect(useTelemetry().track).toHaveBeenCalledWith( - 'User viewed tests tab', - { - workflow_id: mockWorkflow.id, - test_type: 'evaluation', - view: 'setup', - trigger_set_up: false, - output_set_up: false, - metrics_set_up: false, - quota_reached: true, - }, - { withPostHog: true }, - ); + expect(useTelemetry().track).toHaveBeenCalledWith('User viewed tests tab', { + workflow_id: mockWorkflow.id, + test_type: 'evaluation', + view: 'setup', + trigger_set_up: false, + output_set_up: false, + metrics_set_up: false, + quota_reached: true, + }); }); }); }); diff --git a/packages/frontend/editor-ui/src/views/NodeView.vue b/packages/frontend/editor-ui/src/views/NodeView.vue index 5c165fa6e9..3151c17457 100644 --- a/packages/frontend/editor-ui/src/views/NodeView.vue +++ b/packages/frontend/editor-ui/src/views/NodeView.vue @@ -554,9 +554,6 @@ function trackOpenWorkflowFromOnboardingTemplate() { { workflow_id: workflowId.value, }, - { - withPostHog: true, - }, ); } @@ -646,17 +643,11 @@ async function openWorkflowTemplate(templateId: string) { } function trackOpenWorkflowTemplate(templateId: string) { - telemetry.track( - 'User inserted workflow template', - { - source: 'workflow', - template_id: tryToParseNumber(templateId), - wf_template_repo_session_id: templatesStore.previousSessionId, - }, - { - withPostHog: true, - }, - ); + telemetry.track('User inserted workflow template', { + source: 'workflow', + template_id: tryToParseNumber(templateId), + wf_template_repo_session_id: templatesStore.previousSessionId, + }); } /** diff --git a/packages/frontend/editor-ui/src/views/SetupWorkflowFromTemplateView/SetupTemplateFormStep.vue b/packages/frontend/editor-ui/src/views/SetupWorkflowFromTemplateView/SetupTemplateFormStep.vue index 425b84c3f4..a369e27bdc 100644 --- a/packages/frontend/editor-ui/src/views/SetupWorkflowFromTemplateView/SetupTemplateFormStep.vue +++ b/packages/frontend/editor-ui/src/views/SetupWorkflowFromTemplateView/SetupTemplateFormStep.vue @@ -62,17 +62,11 @@ const nodeNames = computed(() => { //#region Methods const onCredentialModalOpened = () => { - telemetry.track( - 'User opened Credential modal', - { - source: 'cred_setup', - credentialType: props.credentials.credentialType, - new_credential: !props.selectedCredentialId, - }, - { - withPostHog: true, - }, - ); + telemetry.track('User opened Credential modal', { + source: 'cred_setup', + credentialType: props.credentials.credentialType, + new_credential: !props.selectedCredentialId, + }); }; //#endregion Methods diff --git a/packages/frontend/editor-ui/src/views/SetupWorkflowFromTemplateView/setupTemplate.store.ts b/packages/frontend/editor-ui/src/views/SetupWorkflowFromTemplateView/setupTemplate.store.ts index fbc45a500a..696f1fdc4a 100644 --- a/packages/frontend/editor-ui/src/views/SetupWorkflowFromTemplateView/setupTemplate.store.ts +++ b/packages/frontend/editor-ui/src/views/SetupWorkflowFromTemplateView/setupTemplate.store.ts @@ -197,15 +197,11 @@ export const useSetupTemplateStore = defineStore('setupTemplate', () => { workflow_id: createdWorkflow.id, }); - telemetry.track( - 'User inserted workflow template', - { - source: 'workflow', - template_id: tryToParseNumber(templateId.value), - wf_template_repo_session_id: templatesStore.currentSessionId, - }, - { withPostHog: true }, - ); + telemetry.track('User inserted workflow template', { + source: 'workflow', + template_id: tryToParseNumber(templateId.value), + wf_template_repo_session_id: templatesStore.currentSessionId, + }); telemetry.track('User saved new workflow from template', { template_id: tryToParseNumber(templateId.value), diff --git a/packages/frontend/editor-ui/src/views/WorkflowsView.vue b/packages/frontend/editor-ui/src/views/WorkflowsView.vue index dd29edfcd7..83311c312d 100644 --- a/packages/frontend/editor-ui/src/views/WorkflowsView.vue +++ b/packages/frontend/editor-ui/src/views/WorkflowsView.vue @@ -765,13 +765,9 @@ function isValidProjectId(projectId: string) { const openAIWorkflow = async (source: string) => { dismissEasyAICallout(); - telemetry.track( - 'User clicked test AI workflow', - { - source, - }, - { withPostHog: true }, - ); + telemetry.track('User clicked test AI workflow', { + source, + }); const easyAiWorkflowJson = getEasyAiWorkflowJson();