Skip to content

Commit 9182b1a

Browse files
arjansinghchristian-byrnetrevorreznik05claude
authored
[rh-test] Telemetry Backports (#6522)
## Summary Resolves issues with #6503 ## Changes - Backport #6400 - Fix circular dependency issue - Backport #6505 ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6522-rh-test-Telemetry-Backports-29e6d73d365081258d10c08299bde69b) by [Unito](https://www.unito.io) --------- Co-authored-by: Christian Byrne <[email protected]> Co-authored-by: Christian Byrne <[email protected]> Co-authored-by: Claude <[email protected]>
1 parent dcda95d commit 9182b1a

File tree

20 files changed

+1784
-79
lines changed

20 files changed

+1784
-79
lines changed

src/components/actionbar/ComfyRunButton/ComfyQueueButton.vue

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,7 @@ const queuePrompt = async (e: Event) => {
158158
? 'Comfy.QueuePromptFront'
159159
: 'Comfy.QueuePrompt'
160160
161-
if (isCloud) {
162-
useTelemetry()?.trackRunButton({ subscribe_to_run: false })
163-
}
161+
useTelemetry()?.trackRunButton({ subscribe_to_run: false })
164162
165163
await commandStore.execute(commandId)
166164
}

src/components/dialog/content/ErrorDialogContent.vue

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ import { useI18n } from 'vue-i18n'
6161
import NoResultsPlaceholder from '@/components/common/NoResultsPlaceholder.vue'
6262
import FindIssueButton from '@/components/dialog/content/error/FindIssueButton.vue'
6363
import { useCopyToClipboard } from '@/composables/useCopyToClipboard'
64+
import { useTelemetry } from '@/platform/telemetry'
6465
import { api } from '@/scripts/api'
6566
import { app } from '@/scripts/app'
6667
import { useCommandStore } from '@/stores/commandStore'
@@ -92,12 +93,18 @@ const showReport = () => {
9293
const toast = useToast()
9394
const { t } = useI18n()
9495
const systemStatsStore = useSystemStatsStore()
96+
const telemetry = useTelemetry()
9597
9698
const title = computed<string>(
9799
() => error.nodeType ?? error.exceptionType ?? t('errorDialog.defaultTitle')
98100
)
99101
100102
const showContactSupport = async () => {
103+
telemetry?.trackHelpResourceClicked({
104+
resource_type: 'help_feedback',
105+
is_external: true,
106+
source: 'error_dialog'
107+
})
101108
await useCommandStore().execute('Comfy.ContactSupport')
102109
}
103110

src/components/dialog/content/credit/CreditTopUpOption.vue

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,10 @@ import Tag from 'primevue/tag'
4343
import { onBeforeUnmount, ref } from 'vue'
4444
4545
import { useFirebaseAuthActions } from '@/composables/auth/useFirebaseAuthActions'
46+
import { useTelemetry } from '@/platform/telemetry'
4647
4748
const authActions = useFirebaseAuthActions()
49+
const telemetry = useTelemetry()
4850
4951
const {
5052
amount,
@@ -61,8 +63,11 @@ const didClickBuyNow = ref(false)
6163
const loading = ref(false)
6264
6365
const handleBuyNow = async () => {
66+
const creditAmount = editable ? customAmount.value : amount
67+
telemetry?.trackApiCreditTopupButtonPurchaseClicked(creditAmount)
68+
6469
loading.value = true
65-
await authActions.purchaseCredits(editable ? customAmount.value : amount)
70+
await authActions.purchaseCredits(creditAmount)
6671
loading.value = false
6772
didClickBuyNow.value = true
6873
}

src/components/dialog/content/setting/CreditsPanel.vue

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ import { computed, ref, watch } from 'vue'
123123
import UserCredit from '@/components/common/UserCredit.vue'
124124
import UsageLogsTable from '@/components/dialog/content/setting/UsageLogsTable.vue'
125125
import { useFirebaseAuthActions } from '@/composables/auth/useFirebaseAuthActions'
126+
import { useTelemetry } from '@/platform/telemetry'
126127
import { useDialogService } from '@/services/dialogService'
127128
import { useCommandStore } from '@/stores/commandStore'
128129
import { useFirebaseAuthStore } from '@/stores/firebaseAuthStore'
@@ -139,6 +140,7 @@ const dialogService = useDialogService()
139140
const authStore = useFirebaseAuthStore()
140141
const authActions = useFirebaseAuthActions()
141142
const commandStore = useCommandStore()
143+
const telemetry = useTelemetry()
142144
const loading = computed(() => authStore.loading)
143145
const balanceLoading = computed(() => authStore.isFetchingBalance)
144146
@@ -168,6 +170,11 @@ const handleCreditsHistoryClick = async () => {
168170
}
169171
170172
const handleMessageSupport = async () => {
173+
telemetry?.trackHelpResourceClicked({
174+
resource_type: 'help_feedback',
175+
is_external: true,
176+
source: 'credits_panel'
177+
})
171178
await commandStore.execute('Comfy.ContactSupport')
172179
}
173180

src/components/helpcenter/HelpCenterMenuContent.vue

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,14 @@
130130

131131
<script setup lang="ts">
132132
import Button from 'primevue/button'
133-
import { computed, nextTick, onMounted, ref } from 'vue'
133+
import { computed, nextTick, onBeforeUnmount, onMounted, ref } from 'vue'
134134
import type { CSSProperties, Component } from 'vue'
135135
import { useI18n } from 'vue-i18n'
136136
137137
import PuzzleIcon from '@/components/icons/PuzzleIcon.vue'
138138
import { isCloud } from '@/platform/distribution/types'
139139
import { useSettingStore } from '@/platform/settings/settingStore'
140+
import { useTelemetry } from '@/platform/telemetry'
140141
import type { ReleaseNote } from '@/platform/updates/common/releaseService'
141142
import { useReleaseStore } from '@/platform/updates/common/releaseStore'
142143
import { useCommandStore } from '@/stores/commandStore'
@@ -188,6 +189,7 @@ const { t, locale } = useI18n()
188189
const releaseStore = useReleaseStore()
189190
const commandStore = useCommandStore()
190191
const settingStore = useSettingStore()
192+
const telemetry = useTelemetry()
191193
192194
// Emits
193195
const emit = defineEmits<{
@@ -199,6 +201,7 @@ const isSubmenuVisible = ref(false)
199201
const submenuRef = ref<HTMLElement | null>(null)
200202
const submenuStyle = ref<CSSProperties>({})
201203
let hoverTimeout: number | null = null
204+
const openedAt = ref<number>(Date.now())
202205
203206
// Computed
204207
const hasReleases = computed(() => releaseStore.releases.length > 0)
@@ -218,6 +221,7 @@ const moreItems = computed<MenuItem[]>(() => {
218221
label: t('helpCenter.desktopUserGuide'),
219222
visible: isElectron(),
220223
action: () => {
224+
trackResourceClick('docs', true)
221225
const docsUrl =
222226
electronAPI().getPlatform() === 'darwin'
223227
? EXTERNAL_LINKS.DESKTOP_GUIDE_MACOS
@@ -273,6 +277,7 @@ const menuItems = computed<MenuItem[]>(() => {
273277
icon: 'pi pi-book',
274278
label: t('helpCenter.docs'),
275279
action: () => {
280+
trackResourceClick('docs', true)
276281
openExternalLink(EXTERNAL_LINKS.DOCS)
277282
emit('close')
278283
}
@@ -283,6 +288,7 @@ const menuItems = computed<MenuItem[]>(() => {
283288
icon: 'pi pi-discord',
284289
label: 'Discord',
285290
action: () => {
291+
trackResourceClick('discord', true)
286292
openExternalLink(EXTERNAL_LINKS.DISCORD)
287293
emit('close')
288294
}
@@ -293,6 +299,7 @@ const menuItems = computed<MenuItem[]>(() => {
293299
icon: 'pi pi-github',
294300
label: t('helpCenter.github'),
295301
action: () => {
302+
trackResourceClick('github', true)
296303
openExternalLink(EXTERNAL_LINKS.GITHUB)
297304
emit('close')
298305
}
@@ -303,6 +310,7 @@ const menuItems = computed<MenuItem[]>(() => {
303310
icon: 'pi pi-question-circle',
304311
label: t('helpCenter.helpFeedback'),
305312
action: () => {
313+
trackResourceClick('help_feedback', false)
306314
void commandStore.execute('Comfy.ContactSupport')
307315
emit('close')
308316
}
@@ -318,6 +326,7 @@ const menuItems = computed<MenuItem[]>(() => {
318326
label: t('helpCenter.managerExtension'),
319327
showRedDot: shouldShowManagerRedDot.value,
320328
action: async () => {
329+
trackResourceClick('manager', false)
321330
await useManagerState().openManager({
322331
initialTab: ManagerTab.All,
323332
showToastOnLegacyError: false
@@ -341,6 +350,23 @@ const menuItems = computed<MenuItem[]>(() => {
341350
})
342351
343352
// Utility Functions
353+
const trackResourceClick = (
354+
resourceType:
355+
| 'docs'
356+
| 'discord'
357+
| 'github'
358+
| 'help_feedback'
359+
| 'manager'
360+
| 'release_notes',
361+
isExternal: boolean
362+
): void => {
363+
telemetry?.trackHelpResourceClicked({
364+
resource_type: resourceType,
365+
is_external: isExternal,
366+
source: 'help_center'
367+
})
368+
}
369+
344370
const openExternalLink = (url: string): void => {
345371
window.open(url, '_blank', 'noopener,noreferrer')
346372
}
@@ -496,6 +522,7 @@ const onReinstall = (): void => {
496522
}
497523
498524
const onReleaseClick = (release: ReleaseNote): void => {
525+
trackResourceClick('release_notes', true)
499526
void releaseStore.handleShowChangelog(release.version)
500527
const versionAnchor = formatVersionAnchor(release.version)
501528
const changelogUrl = `${getChangelogUrl()}#${versionAnchor}`
@@ -504,6 +531,7 @@ const onReleaseClick = (release: ReleaseNote): void => {
504531
}
505532
506533
const onUpdate = (_: ReleaseNote): void => {
534+
trackResourceClick('docs', true)
507535
openExternalLink(EXTERNAL_LINKS.UPDATE_GUIDE)
508536
emit('close')
509537
}
@@ -518,10 +546,16 @@ const getChangelogUrl = (): string => {
518546
519547
// Lifecycle
520548
onMounted(async () => {
549+
telemetry?.trackHelpCenterOpened({ source: 'sidebar' })
521550
if (!hasReleases.value) {
522551
await releaseStore.fetchReleases()
523552
}
524553
})
554+
555+
onBeforeUnmount(() => {
556+
const timeSpentSeconds = Math.round((Date.now() - openedAt.value) / 1000)
557+
telemetry?.trackHelpCenterClosed({ time_spent_seconds: timeSpentSeconds })
558+
})
525559
</script>
526560

527561
<style scoped>

src/components/searchbox/NodeSearchBox.vue

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
multiple
5252
:option-label="'display_name'"
5353
@complete="search($event.query)"
54-
@option-select="emit('addNode', $event.value)"
54+
@option-select="onAddNode($event.value)"
5555
@focused-option-changed="setHoverSuggestion($event)"
5656
>
5757
<template #option="{ option }">
@@ -78,6 +78,7 @@
7878
</template>
7979

8080
<script setup lang="ts">
81+
import { debounce } from 'es-toolkit/compat'
8182
import Button from 'primevue/button'
8283
import Dialog from 'primevue/dialog'
8384
import { computed, nextTick, onMounted, ref } from 'vue'
@@ -88,6 +89,7 @@ import AutoCompletePlus from '@/components/primevueOverride/AutoCompletePlus.vue
8889
import NodeSearchFilter from '@/components/searchbox/NodeSearchFilter.vue'
8990
import NodeSearchItem from '@/components/searchbox/NodeSearchItem.vue'
9091
import { useSettingStore } from '@/platform/settings/settingStore'
92+
import { useTelemetry } from '@/platform/telemetry'
9193
import type { ComfyNodeDefImpl } from '@/stores/nodeDefStore'
9294
import { useNodeDefStore, useNodeFrequencyStore } from '@/stores/nodeDefStore'
9395
import type { FuseFilterWithValue } from '@/utils/fuseUtil'
@@ -96,6 +98,7 @@ import SearchFilterChip from '../common/SearchFilterChip.vue'
9698
9799
const settingStore = useSettingStore()
98100
const { t } = useI18n()
101+
const telemetry = useTelemetry()
99102
100103
const enableNodePreview = computed(() =>
101104
settingStore.get('Comfy.NodeSearchBoxImpl.NodePreview')
@@ -117,6 +120,14 @@ const placeholder = computed(() => {
117120
118121
const nodeDefStore = useNodeDefStore()
119122
const nodeFrequencyStore = useNodeFrequencyStore()
123+
124+
// Debounced search tracking (500ms as per implementation plan)
125+
const debouncedTrackSearch = debounce((query: string) => {
126+
if (query.trim()) {
127+
telemetry?.trackNodeSearch({ query })
128+
}
129+
}, 500)
130+
120131
const search = (query: string) => {
121132
const queryIsEmpty = query === '' && filters.length === 0
122133
currentQuery.value = query
@@ -127,10 +138,22 @@ const search = (query: string) => {
127138
limit: searchLimit
128139
})
129140
]
141+
142+
// Track search queries with debounce
143+
debouncedTrackSearch(query)
130144
}
131145
132146
const emit = defineEmits(['addFilter', 'removeFilter', 'addNode'])
133147
148+
// Track node selection and emit addNode event
149+
const onAddNode = (nodeDef: ComfyNodeDefImpl) => {
150+
telemetry?.trackNodeSearchResultSelected({
151+
node_type: nodeDef.name,
152+
last_query: currentQuery.value
153+
})
154+
emit('addNode', nodeDef)
155+
}
156+
134157
let inputElement: HTMLInputElement | null = null
135158
const reFocusInput = async () => {
136159
inputElement ??= document.getElementById(inputId) as HTMLInputElement

0 commit comments

Comments
 (0)