From 794d4982f6a5439b30c3971a109b26336e58fa42 Mon Sep 17 00:00:00 2001 From: bymyself Date: Tue, 25 Nov 2025 16:50:15 -0800 Subject: [PATCH 1/2] add disabled event system --- src/platform/remoteConfig/types.ts | 3 ++ .../cloud/MixpanelTelemetryProvider.ts | 50 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/src/platform/remoteConfig/types.ts b/src/platform/remoteConfig/types.ts index 43bfbd70fe4..10f47e82633 100644 --- a/src/platform/remoteConfig/types.ts +++ b/src/platform/remoteConfig/types.ts @@ -23,6 +23,8 @@ type FirebaseRuntimeConfig = { * Remote configuration type * Configuration fetched from the server at runtime */ +import type { TelemetryEventName } from '@/platform/telemetry/types' + export type RemoteConfig = { mixpanel_token?: string subscription_required?: boolean @@ -31,4 +33,5 @@ export type RemoteConfig = { comfy_api_base_url?: string comfy_platform_base_url?: string firebase_config?: FirebaseRuntimeConfig + telemetry_disabled_events?: TelemetryEventName[] } diff --git a/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts b/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts index 28ef060a698..cb1de70065a 100644 --- a/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts +++ b/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts @@ -1,4 +1,5 @@ import type { OverridedMixpanel } from 'mixpanel-browser' +import { watch } from 'vue' import { useCurrentUser } from '@/composables/auth/useCurrentUser' import { @@ -41,9 +42,30 @@ import type { WorkflowCreatedMetadata, WorkflowImportMetadata } from '../../types' +import { remoteConfig } from '@/platform/remoteConfig/remoteConfig' +import type { RemoteConfig } from '@/platform/remoteConfig/types' import { TelemetryEvents } from '../../types' import { normalizeSurveyResponses } from '../../utils/surveyNormalization' +const DEFAULT_DISABLED_EVENTS: TelemetryEventName[] = [ + TelemetryEvents.WORKFLOW_OPENED, + TelemetryEvents.PAGE_VISIBILITY_CHANGED, + TelemetryEvents.TAB_COUNT_TRACKING, + TelemetryEvents.NODE_SEARCH, + TelemetryEvents.NODE_SEARCH_RESULT_SELECTED, + TelemetryEvents.TEMPLATE_FILTER_CHANGED, + TelemetryEvents.SETTING_CHANGED, + TelemetryEvents.HELP_CENTER_OPENED, + TelemetryEvents.HELP_RESOURCE_CLICKED, + TelemetryEvents.HELP_CENTER_CLOSED, + TelemetryEvents.WORKFLOW_CREATED, + TelemetryEvents.UI_BUTTON_CLICKED +] + +const TELEMETRY_EVENT_SET = new Set( + Object.values(TelemetryEvents) as TelemetryEventName[] +) + interface QueuedEvent { eventName: TelemetryEventName properties?: TelemetryEventProperties @@ -67,8 +89,15 @@ export class MixpanelTelemetryProvider implements TelemetryProvider { private eventQueue: QueuedEvent[] = [] private isInitialized = false private lastTriggerSource: ExecutionTriggerSource | undefined + private disabledEvents = new Set(DEFAULT_DISABLED_EVENTS) constructor() { + this.configureDisabledEvents( + (window.__CONFIG__ as Partial | undefined) ?? null + ) + watch(remoteConfig, (config) => { + this.configureDisabledEvents(config) + }) const token = window.__CONFIG__?.mixpanel_token if (token) { @@ -131,6 +160,10 @@ export class MixpanelTelemetryProvider implements TelemetryProvider { return } + if (this.disabledEvents.has(eventName)) { + return + } + const event: QueuedEvent = { eventName, properties } if (this.isInitialized && this.mixpanel) { @@ -146,6 +179,23 @@ export class MixpanelTelemetryProvider implements TelemetryProvider { } } + private configureDisabledEvents(config: Partial | null): void { + const disabledSource = + config?.telemetry_disabled_events ?? DEFAULT_DISABLED_EVENTS + + this.disabledEvents = this.buildEventSet(disabledSource) + } + + private buildEventSet(values: TelemetryEventName[]): Set { + const normalized = new Set() + values.forEach((value) => { + if (TELEMETRY_EVENT_SET.has(value)) { + normalized.add(value) + } + }) + return normalized + } + trackSignupOpened(): void { this.trackEvent(TelemetryEvents.USER_SIGN_UP_OPENED) } From 40cba7b98de7b2ac85f0564eb786cf00c4876082 Mon Sep 17 00:00:00 2001 From: bymyself Date: Wed, 26 Nov 2025 12:51:17 -0800 Subject: [PATCH 2/2] nit --- src/platform/remoteConfig/types.ts | 4 +-- .../cloud/MixpanelTelemetryProvider.ts | 32 ++++++++++++------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/platform/remoteConfig/types.ts b/src/platform/remoteConfig/types.ts index 10f47e82633..e33cde30958 100644 --- a/src/platform/remoteConfig/types.ts +++ b/src/platform/remoteConfig/types.ts @@ -1,3 +1,5 @@ +import type { TelemetryEventName } from '@/platform/telemetry/types' + /** * Server health alert configuration from the backend */ @@ -23,8 +25,6 @@ type FirebaseRuntimeConfig = { * Remote configuration type * Configuration fetched from the server at runtime */ -import type { TelemetryEventName } from '@/platform/telemetry/types' - export type RemoteConfig = { mixpanel_token?: string subscription_required?: boolean diff --git a/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts b/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts index cb1de70065a..d683288c415 100644 --- a/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts +++ b/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts @@ -47,7 +47,7 @@ import type { RemoteConfig } from '@/platform/remoteConfig/types' import { TelemetryEvents } from '../../types' import { normalizeSurveyResponses } from '../../utils/surveyNormalization' -const DEFAULT_DISABLED_EVENTS: TelemetryEventName[] = [ +const DEFAULT_DISABLED_EVENTS = [ TelemetryEvents.WORKFLOW_OPENED, TelemetryEvents.PAGE_VISIBILITY_CHANGED, TelemetryEvents.TAB_COUNT_TRACKING, @@ -60,7 +60,7 @@ const DEFAULT_DISABLED_EVENTS: TelemetryEventName[] = [ TelemetryEvents.HELP_CENTER_CLOSED, TelemetryEvents.WORKFLOW_CREATED, TelemetryEvents.UI_BUTTON_CLICKED -] +] as const satisfies TelemetryEventName[] const TELEMETRY_EVENT_SET = new Set( Object.values(TelemetryEvents) as TelemetryEventName[] @@ -95,9 +95,13 @@ export class MixpanelTelemetryProvider implements TelemetryProvider { this.configureDisabledEvents( (window.__CONFIG__ as Partial | undefined) ?? null ) - watch(remoteConfig, (config) => { - this.configureDisabledEvents(config) - }) + watch( + remoteConfig, + (config) => { + this.configureDisabledEvents(config) + }, + { immediate: true } + ) const token = window.__CONFIG__?.mixpanel_token if (token) { @@ -187,13 +191,17 @@ export class MixpanelTelemetryProvider implements TelemetryProvider { } private buildEventSet(values: TelemetryEventName[]): Set { - const normalized = new Set() - values.forEach((value) => { - if (TELEMETRY_EVENT_SET.has(value)) { - normalized.add(value) - } - }) - return normalized + return new Set( + values.filter((value) => { + const isValid = TELEMETRY_EVENT_SET.has(value) + if (!isValid && import.meta.env.DEV) { + console.warn( + `Unknown telemetry event name in disabled list: ${value}` + ) + } + return isValid + }) + ) } trackSignupOpened(): void {