Skip to content

Commit 8b2c1fc

Browse files
allow telemetry events to be disabled by name in feature flags (#6946)
## Summary Adds ability to toggle events on/off by name from dynamic feature flags. Also makes some events disabled by default (not being used for any analysis and taking too much of event quota currently). Note: telemetry is only enabled on cloud - this doesn't affect local users in any way. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6946-allow-telemetry-events-to-be-disabled-by-name-in-feature-flags-2b76d73d365081ea8676cfbb8217e640) by [Unito](https://www.unito.io)
1 parent df66a96 commit 8b2c1fc

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

src/platform/remoteConfig/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import type { TelemetryEventName } from '@/platform/telemetry/types'
2+
13
/**
24
* Server health alert configuration from the backend
35
*/
@@ -31,4 +33,5 @@ export type RemoteConfig = {
3133
comfy_api_base_url?: string
3234
comfy_platform_base_url?: string
3335
firebase_config?: FirebaseRuntimeConfig
36+
telemetry_disabled_events?: TelemetryEventName[]
3437
}

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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { OverridedMixpanel } from 'mixpanel-browser'
2+
import { watch } from 'vue'
23

34
import { useCurrentUser } from '@/composables/auth/useCurrentUser'
45
import {
@@ -41,9 +42,30 @@ import type {
4142
WorkflowCreatedMetadata,
4243
WorkflowImportMetadata
4344
} from '../../types'
45+
import { remoteConfig } from '@/platform/remoteConfig/remoteConfig'
46+
import type { RemoteConfig } from '@/platform/remoteConfig/types'
4447
import { TelemetryEvents } from '../../types'
4548
import { normalizeSurveyResponses } from '../../utils/surveyNormalization'
4649

50+
const DEFAULT_DISABLED_EVENTS = [
51+
TelemetryEvents.WORKFLOW_OPENED,
52+
TelemetryEvents.PAGE_VISIBILITY_CHANGED,
53+
TelemetryEvents.TAB_COUNT_TRACKING,
54+
TelemetryEvents.NODE_SEARCH,
55+
TelemetryEvents.NODE_SEARCH_RESULT_SELECTED,
56+
TelemetryEvents.TEMPLATE_FILTER_CHANGED,
57+
TelemetryEvents.SETTING_CHANGED,
58+
TelemetryEvents.HELP_CENTER_OPENED,
59+
TelemetryEvents.HELP_RESOURCE_CLICKED,
60+
TelemetryEvents.HELP_CENTER_CLOSED,
61+
TelemetryEvents.WORKFLOW_CREATED,
62+
TelemetryEvents.UI_BUTTON_CLICKED
63+
] as const satisfies TelemetryEventName[]
64+
65+
const TELEMETRY_EVENT_SET = new Set<TelemetryEventName>(
66+
Object.values(TelemetryEvents) as TelemetryEventName[]
67+
)
68+
4769
interface QueuedEvent {
4870
eventName: TelemetryEventName
4971
properties?: TelemetryEventProperties
@@ -67,8 +89,19 @@ export class MixpanelTelemetryProvider implements TelemetryProvider {
6789
private eventQueue: QueuedEvent[] = []
6890
private isInitialized = false
6991
private lastTriggerSource: ExecutionTriggerSource | undefined
92+
private disabledEvents = new Set<TelemetryEventName>(DEFAULT_DISABLED_EVENTS)
7093

7194
constructor() {
95+
this.configureDisabledEvents(
96+
(window.__CONFIG__ as Partial<RemoteConfig> | undefined) ?? null
97+
)
98+
watch(
99+
remoteConfig,
100+
(config) => {
101+
this.configureDisabledEvents(config)
102+
},
103+
{ immediate: true }
104+
)
72105
const token = window.__CONFIG__?.mixpanel_token
73106

74107
if (token) {
@@ -131,6 +164,10 @@ export class MixpanelTelemetryProvider implements TelemetryProvider {
131164
return
132165
}
133166

167+
if (this.disabledEvents.has(eventName)) {
168+
return
169+
}
170+
134171
const event: QueuedEvent = { eventName, properties }
135172

136173
if (this.isInitialized && this.mixpanel) {
@@ -146,6 +183,27 @@ export class MixpanelTelemetryProvider implements TelemetryProvider {
146183
}
147184
}
148185

186+
private configureDisabledEvents(config: Partial<RemoteConfig> | null): void {
187+
const disabledSource =
188+
config?.telemetry_disabled_events ?? DEFAULT_DISABLED_EVENTS
189+
190+
this.disabledEvents = this.buildEventSet(disabledSource)
191+
}
192+
193+
private buildEventSet(values: TelemetryEventName[]): Set<TelemetryEventName> {
194+
return new Set(
195+
values.filter((value) => {
196+
const isValid = TELEMETRY_EVENT_SET.has(value)
197+
if (!isValid && import.meta.env.DEV) {
198+
console.warn(
199+
`Unknown telemetry event name in disabled list: ${value}`
200+
)
201+
}
202+
return isValid
203+
})
204+
)
205+
}
206+
149207
trackSignupOpened(): void {
150208
this.trackEvent(TelemetryEvents.USER_SIGN_UP_OPENED)
151209
}

0 commit comments

Comments
 (0)