1- import type { DeflateEncoder , DeflateWorker , DeflateWorkerAction , Telemetry } from '@datadog/browser-core'
1+ import type {
2+ DeflateEncoder ,
3+ DeflateWorker ,
4+ DeflateWorkerAction ,
5+ RawTelemetryEvent ,
6+ Telemetry ,
7+ } from '@datadog/browser-core'
28import { BridgeCapability , display } from '@datadog/browser-core'
39import type { RecorderApi , RumSessionManager } from '@datadog/browser-rum-core'
410import { LifeCycle , LifeCycleEventType } from '@datadog/browser-rum-core'
5- import { collectAsyncCalls , mockEventBridge , registerCleanupTask } from '@datadog/browser-core/test'
11+ import type { MockTelemetry } from '@datadog/browser-core/test'
12+ import { collectAsyncCalls , mockEventBridge , registerCleanupTask , startMockTelemetry } from '@datadog/browser-core/test'
613import type { RumSessionManagerMock } from '../../../rum-core/test'
714import {
815 createRumSessionManagerMock ,
@@ -14,6 +21,7 @@ import type { CreateDeflateWorker } from '../domain/deflate'
1421import { MockWorker } from '../../test'
1522import { resetDeflateWorkerState } from '../domain/deflate'
1623import * as replayStats from '../domain/replayStats'
24+ import type { RecorderInitMetrics } from '../domain/startRecorderInitTelemetry'
1725import { makeRecorderApi } from './recorderApi'
1826import type { StartRecording } from './postStartStrategy'
1927
@@ -26,12 +34,13 @@ describe('makeRecorderApi', () => {
2634 let mockWorker : MockWorker
2735 let createDeflateWorkerSpy : jasmine . Spy < CreateDeflateWorker >
2836 let rumInit : ( options ?: { worker ?: DeflateWorker } ) => void
37+ let telemetry : MockTelemetry
2938
3039 function setupRecorderApi ( {
3140 sessionManager,
3241 startSessionReplayRecordingManually,
3342 } : { sessionManager ?: RumSessionManager ; startSessionReplayRecordingManually ?: boolean } = { } ) {
34- const mockTelemetry = { enabled : true } as Telemetry
43+ telemetry = startMockTelemetry ( )
3544 mockWorker = new MockWorker ( )
3645 createDeflateWorkerSpy = jasmine . createSpy ( 'createDeflateWorkerSpy' ) . and . callFake ( ( ) => mockWorker )
3746 spyOn ( display , 'error' )
@@ -48,15 +57,21 @@ describe('makeRecorderApi', () => {
4857 }
4958 } )
5059
60+ const configuration = mockRumConfiguration ( {
61+ startSessionReplayRecordingManually : startSessionReplayRecordingManually ?? false ,
62+ recorderInitTelemetrySampleRate : 100 ,
63+ telemetrySampleRate : 100 ,
64+ } )
65+
5166 recorderApi = makeRecorderApi ( loadRecorderSpy , createDeflateWorkerSpy )
5267 rumInit = ( { worker } = { } ) => {
5368 recorderApi . onRumStart (
5469 lifeCycle ,
55- mockRumConfiguration ( { startSessionReplayRecordingManually : startSessionReplayRecordingManually ?? false } ) ,
70+ configuration ,
5671 sessionManager ?? createRumSessionManagerMock ( ) . setId ( '1234' ) ,
5772 mockViewHistory ( ) ,
5873 worker ,
59- mockTelemetry
74+ { enabled : true } as Telemetry
6075 )
6176 }
6277
@@ -72,9 +87,11 @@ describe('makeRecorderApi', () => {
7287 setupRecorderApi ( )
7388 expect ( loadRecorderSpy ) . not . toHaveBeenCalled ( )
7489 expect ( startRecordingSpy ) . not . toHaveBeenCalled ( )
90+ expect ( await telemetry . hasEvents ( ) ) . toEqual ( false )
7591 rumInit ( )
7692 await collectAsyncCalls ( startRecordingSpy , 1 )
7793 expect ( startRecordingSpy ) . toHaveBeenCalled ( )
94+ expect ( await telemetry . getEvents ( ) ) . toEqual ( [ expectedRecorderInitTelemetry ( ) ] )
7895 } )
7996
8097 it ( 'starts recording after the DOM is loaded' , async ( ) => {
@@ -84,32 +101,39 @@ describe('makeRecorderApi', () => {
84101
85102 expect ( loadRecorderSpy ) . toHaveBeenCalled ( )
86103 expect ( startRecordingSpy ) . not . toHaveBeenCalled ( )
104+ expect ( await telemetry . hasEvents ( ) ) . toEqual ( false )
105+
87106 triggerOnDomLoaded ( )
88107 await collectAsyncCalls ( startRecordingSpy , 1 )
89108
90109 expect ( startRecordingSpy ) . toHaveBeenCalled ( )
110+ expect ( await telemetry . getEvents ( ) ) . toEqual ( [ expectedRecorderInitTelemetry ( ) ] )
91111 } )
92112 } )
93113
94114 describe ( 'with manual start' , ( ) => {
95- it ( 'does not start recording when init() is called' , ( ) => {
115+ it ( 'does not start recording when init() is called' , async ( ) => {
96116 setupRecorderApi ( { startSessionReplayRecordingManually : true } )
97117 expect ( loadRecorderSpy ) . not . toHaveBeenCalled ( )
98118 expect ( startRecordingSpy ) . not . toHaveBeenCalled ( )
119+ expect ( await telemetry . hasEvents ( ) ) . toEqual ( false )
99120 rumInit ( )
100121 expect ( loadRecorderSpy ) . not . toHaveBeenCalled ( )
101122 expect ( startRecordingSpy ) . not . toHaveBeenCalled ( )
123+ expect ( await telemetry . hasEvents ( ) ) . toEqual ( false )
102124 } )
103125
104- it ( 'does not start recording after the DOM is loaded' , ( ) => {
126+ it ( 'does not start recording after the DOM is loaded' , async ( ) => {
105127 setupRecorderApi ( { startSessionReplayRecordingManually : true } )
106128 const { triggerOnDomLoaded } = mockDocumentReadyState ( )
107129 rumInit ( )
108130 expect ( loadRecorderSpy ) . not . toHaveBeenCalled ( )
109131 expect ( startRecordingSpy ) . not . toHaveBeenCalled ( )
132+ expect ( await telemetry . hasEvents ( ) ) . toEqual ( false )
110133 triggerOnDomLoaded ( )
111134 expect ( loadRecorderSpy ) . not . toHaveBeenCalled ( )
112135 expect ( startRecordingSpy ) . not . toHaveBeenCalled ( )
136+ expect ( await telemetry . hasEvents ( ) ) . toEqual ( false )
113137 } )
114138 } )
115139 } )
@@ -178,6 +202,7 @@ describe('makeRecorderApi', () => {
178202
179203 expect ( startRecordingSpy ) . toHaveBeenCalledTimes ( 1 )
180204 expect ( setForcedReplaySpy ) . toHaveBeenCalledTimes ( 1 )
205+ expect ( await telemetry . getEvents ( ) ) . toEqual ( [ expectedRecorderInitTelemetry ( { forced : true } ) ] )
181206 } )
182207
183208 it ( 'uses the previously created worker if available' , async ( ) => {
@@ -201,6 +226,13 @@ describe('makeRecorderApi', () => {
201226 await collectAsyncCalls ( createDeflateWorkerSpy , 1 )
202227
203228 expect ( startRecordingSpy ) . not . toHaveBeenCalled ( )
229+ const events = await telemetry . getEvents ( )
230+ expect ( events ) . toEqual ( [
231+ jasmine . objectContaining ( {
232+ error : jasmine . anything ( ) ,
233+ } ) ,
234+ expectedRecorderInitTelemetry ( { result : 'deflate-encoder-load-failed' } ) ,
235+ ] )
204236 } )
205237
206238 it ( 'stops recording if worker initialization fails' , async ( ) => {
@@ -630,3 +662,19 @@ describe('makeRecorderApi', () => {
630662 } )
631663 } )
632664} )
665+
666+ function expectedRecorderInitTelemetry ( overrides : Partial < RecorderInitMetrics > = { } ) : RawTelemetryEvent {
667+ return {
668+ type : 'log' ,
669+ status : 'debug' ,
670+ message : 'Recorder init metrics' ,
671+ metrics : {
672+ forced : false ,
673+ loadRecorderModuleDuration : jasmine . any ( Number ) ,
674+ recorderInitDuration : jasmine . any ( Number ) ,
675+ result : 'succeeded' ,
676+ waitForDocReadyDuration : jasmine . any ( Number ) ,
677+ ...overrides ,
678+ } ,
679+ }
680+ }
0 commit comments