Skip to content

Commit fa37496

Browse files
Track room load duration (tldraw#6530)
Track room load duration and send some basic metrics. Also segment the metrics based on the room size. [Posthog chart](https://eu.posthog.com/project/45921/insights/URk77Mgl?dashboard=127276&variables_override=%7B%7D) - tried it on preview link for this PR. ### Change type - [x] `improvement`
1 parent 0e0fb8b commit fa37496

5 files changed

Lines changed: 50 additions & 3 deletions

File tree

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { ROOM_SIZE_LIMIT_MB } from '@tldraw/dotcom-shared'
2+
import { useRef } from 'react'
3+
import { Editor } from 'tldraw'
4+
import { trackEvent } from '../utils/analytics'
5+
6+
function getFileSizeBucket(sizeMB: number): string {
7+
if (sizeMB <= 1) return '0-1 MB'
8+
if (sizeMB <= 5) return '1-5 MB'
9+
if (sizeMB <= 10) return '5-10 MB'
10+
return '10+ MB'
11+
}
12+
13+
export function useRoomLoadTracking() {
14+
const loadStartTime = useRef(Date.now())
15+
16+
return (editor: Editor) => {
17+
const loadTime = Date.now() - loadStartTime.current
18+
let estimatedFileSizeMB = 0
19+
try {
20+
const meta = editor.getDocumentSettings().meta
21+
const storagePercentage =
22+
typeof meta.storageUsedPercentage === 'number' ? meta.storageUsedPercentage : 0
23+
// Calculate estimated file size based on storage percentage
24+
estimatedFileSizeMB = (storagePercentage / 100) * ROOM_SIZE_LIMIT_MB
25+
} catch (error) {
26+
console.warn('Failed to get storage percentage for analytics:', error)
27+
}
28+
29+
const fileSizeBucket = getFileSizeBucket(estimatedFileSizeMB)
30+
31+
// Send analytics data to PostHog
32+
trackEvent('room_load_duration', {
33+
load_time_ms: loadTime,
34+
file_size_bucket: fileSizeBucket,
35+
})
36+
}
37+
}

apps/dotcom/client/src/tla/components/TlaEditor/TlaEditor.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
} from 'tldraw'
2424
import { ThemeUpdater } from '../../../components/ThemeUpdater/ThemeUpdater'
2525
import { useOpenUrlAndTrack } from '../../../hooks/useOpenUrlAndTrack'
26+
import { useRoomLoadTracking } from '../../../hooks/useRoomLoadTracking'
2627
import { useHandleUiEvents } from '../../../utils/analytics'
2728
import { assetUrls } from '../../../utils/assetUrls'
2829
import { MULTIPLAYER_SERVER } from '../../../utils/config'
@@ -128,8 +129,11 @@ function TlaEditorInner({ fileSlug, deepLinks }: TlaEditorProps) {
128129
})
129130
}, [hideAllShapes])
130131

132+
const trackRoomLoaded = useRoomLoadTracking()
133+
131134
const handleMount = useCallback(
132135
(editor: Editor) => {
136+
trackRoomLoaded(editor)
133137
;(window as any).app = app
134138
;(window as any).editor = editor
135139
// Register the editor globally
@@ -185,7 +189,7 @@ function TlaEditorInner({ fileSlug, deepLinks }: TlaEditorProps) {
185189
cleanup()
186190
}
187191
},
188-
[addDialog, app, fileId, remountImageShapes, setIsReady]
192+
[addDialog, trackRoomLoaded, app, fileId, remountImageShapes, setIsReady]
189193
)
190194

191195
const user = useTldrawUser()

apps/dotcom/client/src/tla/components/TlaEditor/TlaLegacyFileEditor.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { Editor, TLComponents, Tldraw } from 'tldraw'
1010
import { StoreErrorScreen } from '../../../components/StoreErrorScreen'
1111
import { ThemeUpdater } from '../../../components/ThemeUpdater/ThemeUpdater'
1212
import { useLegacyUrlParams } from '../../../hooks/useLegacyUrlParams'
13+
import { useRoomLoadTracking } from '../../../hooks/useRoomLoadTracking'
1314
import { trackEvent, useHandleUiEvents } from '../../../utils/analytics'
1415
import { assetUrls } from '../../../utils/assetUrls'
1516
import { MULTIPLAYER_SERVER } from '../../../utils/config'
@@ -85,8 +86,11 @@ function TlaEditorInner({
8586
const isReadonly =
8687
roomOpenMode === ROOM_OPEN_MODE.READ_ONLY || roomOpenMode === ROOM_OPEN_MODE.READ_ONLY_LEGACY
8788

89+
const trackRoomLoaded = useRoomLoadTracking()
90+
8891
const handleMount = useCallback(
8992
(editor: Editor) => {
93+
trackRoomLoaded(editor)
9094
if (!isReadonly) {
9195
;(window as any).app = editor
9296
;(window as any).editor = editor
@@ -96,7 +100,7 @@ function TlaEditorInner({
96100
editor.registerExternalAssetHandler('url', createAssetFromUrl)
97101
setIsReady()
98102
},
99-
[isReadonly, setIsReady]
103+
[isReadonly, trackRoomLoaded, setIsReady]
100104
)
101105

102106
if (storeWithStatus.error) {

apps/dotcom/sync-worker/src/TLDrawDurableObject.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
READ_ONLY_PREFIX,
1313
ROOM_OPEN_MODE,
1414
ROOM_PREFIX,
15+
ROOM_SIZE_LIMIT_MB,
1516
SNAPSHOT_PREFIX,
1617
TlaFile,
1718
type RoomOpenMode,
@@ -84,7 +85,6 @@ async function canAccessTestProductionFile(
8485
}
8586

8687
const MB = 1024 * 1024
87-
const ROOM_SIZE_LIMIT_MB = 25
8888

8989
export class TLDrawDurableObject extends DurableObject {
9090
// A unique identifier for this instance of the Durable Object
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
export const MAX_NUMBER_OF_FILES = 200
2+
3+
export const ROOM_SIZE_LIMIT_MB = 25

0 commit comments

Comments
 (0)