Skip to content

Commit 5dcaf80

Browse files
committed
Merge branch 'bcaudan/fix-performance-script' into bcaudan/test-perf
2 parents d3a4b23 + ad6ee2b commit 5dcaf80

File tree

20 files changed

+518
-125
lines changed

20 files changed

+518
-125
lines changed

developer-extension/src/panel/components/tabs/eventsTab/eventRow.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { default as clsx } from 'clsx'
66
import type { TelemetryEvent } from '../../../../../../packages/core/src/domain/telemetry'
77
import type { LogsEvent } from '../../../../../../packages/logs/src/logsEvent.types'
88
import type {
9+
DurationProperties,
910
RumActionEvent,
1011
RumErrorEvent,
1112
RumLongTaskEvent,
@@ -371,7 +372,7 @@ function LongTaskDescription({ event }: { event: RumLongTaskEvent }) {
371372

372373
function VitalDescription({ event }: { event: RumVitalEvent }) {
373374
const vitalName = event.vital.name
374-
const vitalValue = event.vital.duration
375+
const vitalValue = (event.vital as DurationProperties).duration
375376
const vitalDescription = event.vital.description
376377
return (
377378
<>

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
"eslint-module-utils": "2.12.1",
6060
"eslint-plugin-import": "2.32.0",
6161
"eslint-plugin-jasmine": "4.2.2",
62-
"eslint-plugin-jsdoc": "54.7.0",
62+
"eslint-plugin-jsdoc": "57.0.8",
6363
"eslint-plugin-unicorn": "61.0.2",
6464
"express": "5.1.0",
6565
"glob": "11.0.3",

packages/core/src/domain/configuration/configuration.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ export interface InitConfiguration {
223223
*
224224
* @internal
225225
*/
226-
source?: 'browser' | 'flutter' | undefined
226+
source?: 'browser' | 'flutter' | 'unity' | undefined
227227

228228
/**
229229
* [Internal option] Additional configuration for the SDK.
@@ -286,7 +286,7 @@ export interface Configuration extends TransportConfiguration {
286286

287287
// internal
288288
sdkVersion: string | undefined
289-
source: 'browser' | 'flutter'
289+
source: 'browser' | 'flutter' | 'unity'
290290
variant: string | undefined
291291
}
292292

packages/core/src/domain/configuration/endpointBuilder.spec.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,10 +158,16 @@ describe('endpointBuilder', () => {
158158
expect(endpoint).toContain('ddsource=browser')
159159
})
160160

161-
it('should source when provided', () => {
161+
it('should use flutter source when provided', () => {
162162
const config = { ...initConfiguration, source: 'flutter' as const }
163163
const endpoint = createEndpointBuilder(config, 'rum').build('fetch', DEFAULT_PAYLOAD)
164164
expect(endpoint).toContain('ddsource=flutter')
165165
})
166+
167+
it('should use unity source when provided', () => {
168+
const config = { ...initConfiguration, source: 'unity' as const }
169+
const endpoint = createEndpointBuilder(config, 'rum').build('fetch', DEFAULT_PAYLOAD)
170+
expect(endpoint).toContain('ddsource=unity')
171+
})
166172
})
167173
})

packages/core/src/domain/configuration/transportConfiguration.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export interface TransportConfiguration {
1313
datacenter?: string | undefined
1414
replica?: ReplicaConfiguration
1515
site: Site
16-
source: 'browser' | 'flutter'
16+
source: 'browser' | 'flutter' | 'unity'
1717
}
1818

1919
export interface ReplicaConfiguration {
@@ -23,7 +23,7 @@ export interface ReplicaConfiguration {
2323

2424
export function computeTransportConfiguration(initConfiguration: InitConfiguration): TransportConfiguration {
2525
const site = initConfiguration.site || INTAKE_SITE_US1
26-
const source = initConfiguration.source === 'flutter' ? 'flutter' : 'browser'
26+
const source = validateSource(initConfiguration.source)
2727

2828
const endpointBuilders = computeEndpointBuilders({ ...initConfiguration, site, source })
2929
const replicaConfiguration = computeReplicaConfiguration({ ...initConfiguration, site, source })
@@ -36,6 +36,13 @@ export function computeTransportConfiguration(initConfiguration: InitConfigurati
3636
}
3737
}
3838

39+
function validateSource(source: string | undefined) {
40+
if (source === 'flutter' || source === 'unity') {
41+
return source
42+
}
43+
return 'browser'
44+
}
45+
3946
function computeEndpointBuilders(initConfiguration: InitConfiguration) {
4047
return {
4148
logsEndpointBuilder: createEndpointBuilder(initConfiguration, 'logs'),

packages/core/src/tools/experimentalFeatures.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ export enum ExperimentalFeature {
1717
TRACK_INTAKE_REQUESTS = 'track_intake_requests',
1818
WRITABLE_RESOURCE_GRAPHQL = 'writable_resource_graphql',
1919
EARLY_REQUEST_COLLECTION = 'early_request_collection',
20-
WATCH_COOKIE_WITHOUT_LOCK = 'watch_cookie_without_lock',
2120
USE_TREE_WALKER_FOR_ACTION_NAME = 'use_tree_walker_for_action_name',
21+
FEATURE_OPERATION_VITAL = 'feature_operation_vital',
2222
SHORT_SESSION_INVESTIGATION = 'short_session_investigation',
2323
}
2424

packages/rum-core/src/boot/preStartRum.spec.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,17 @@ describe('preStartRum', () => {
742742
strategy.init(DEFAULT_INIT_CONFIGURATION, PUBLIC_API)
743743
expect(addDurationVitalSpy).toHaveBeenCalledOnceWith(vitalAdd)
744744
})
745+
746+
it('addOperationStepVital', () => {
747+
const addOperationStepVitalSpy = jasmine.createSpy()
748+
doStartRumSpy.and.returnValue({
749+
addOperationStepVital: addOperationStepVitalSpy,
750+
} as unknown as StartRumResult)
751+
752+
strategy.addOperationStepVital('foo', 'start')
753+
strategy.init(DEFAULT_INIT_CONFIGURATION, PUBLIC_API)
754+
expect(addOperationStepVitalSpy).toHaveBeenCalledOnceWith('foo', 'start', undefined, undefined)
755+
})
745756
})
746757

747758
describe('tracking consent', () => {

packages/rum-core/src/boot/preStartRum.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
buildGlobalContextManager,
1818
buildUserContextManager,
1919
monitorError,
20+
sanitize,
2021
} from '@datadog/browser-core'
2122
import type { RumConfiguration, RumInitConfiguration } from '../domain/configuration'
2223
import {
@@ -25,7 +26,12 @@ import {
2526
serializeRumConfiguration,
2627
} from '../domain/configuration'
2728
import type { ViewOptions } from '../domain/view/trackViews'
28-
import type { DurationVital, CustomVitalsState } from '../domain/vital/vitalCollection'
29+
import type {
30+
DurationVital,
31+
CustomVitalsState,
32+
FeatureOperationOptions,
33+
FailureReason,
34+
} from '../domain/vital/vitalCollection'
2935
import { startDurationVital, stopDurationVital } from '../domain/vital/vitalCollection'
3036
import { callPluginsMethod } from '../domain/plugins'
3137
import type { StartRumResult } from './startRum'
@@ -148,6 +154,22 @@ export function createPreStartStrategy(
148154
bufferApiCalls.add((startRumResult) => startRumResult.addDurationVital(vital))
149155
}
150156

157+
const addOperationStepVital = (
158+
name: string,
159+
stepType: 'start' | 'end',
160+
options?: FeatureOperationOptions,
161+
failureReason?: FailureReason
162+
) => {
163+
bufferApiCalls.add((startRumResult) =>
164+
startRumResult.addOperationStepVital(
165+
sanitize(name)!,
166+
stepType,
167+
sanitize(options) as FeatureOperationOptions,
168+
sanitize(failureReason) as FailureReason | undefined
169+
)
170+
)
171+
}
172+
151173
const strategy: Strategy = {
152174
init(initConfiguration, publicApi) {
153175
if (!initConfiguration) {
@@ -248,6 +270,7 @@ export function createPreStartStrategy(
248270
},
249271

250272
addDurationVital,
273+
addOperationStepVital,
251274
}
252275

253276
return strategy

packages/rum-core/src/boot/rumPublicApi.spec.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ const noopStartRum = (): ReturnType<StartRum> => ({
3434
accountContext: {} as any,
3535
hooks: {} as any,
3636
telemetry: {} as any,
37+
addOperationStepVital: () => undefined,
3738
})
3839
const DEFAULT_INIT_CONFIGURATION = { applicationId: 'xxx', clientToken: 'xxx' }
3940
const FAKE_WORKER = {} as DeflateWorker
@@ -784,6 +785,57 @@ describe('rum public api', () => {
784785
})
785786
})
786787

788+
describe('startFeatureOperation', () => {
789+
it('should call addOperationStepVital on the startRum result with start status', () => {
790+
const addOperationStepVitalSpy = jasmine.createSpy()
791+
const rumPublicApi = makeRumPublicApi(
792+
() => ({ ...noopStartRum(), addOperationStepVital: addOperationStepVitalSpy }),
793+
noopRecorderApi,
794+
noopProfilerApi
795+
)
796+
rumPublicApi.init(DEFAULT_INIT_CONFIGURATION)
797+
rumPublicApi.startFeatureOperation('foo', { operationKey: '00000000-0000-0000-0000-000000000000' })
798+
expect(addOperationStepVitalSpy).toHaveBeenCalledWith('foo', 'start', {
799+
operationKey: '00000000-0000-0000-0000-000000000000',
800+
})
801+
})
802+
})
803+
804+
describe('succeedFeatureOperation', () => {
805+
it('should call addOperationStepVital on the startRum result with end status', () => {
806+
const addOperationStepVitalSpy = jasmine.createSpy()
807+
const rumPublicApi = makeRumPublicApi(
808+
() => ({ ...noopStartRum(), addOperationStepVital: addOperationStepVitalSpy }),
809+
noopRecorderApi,
810+
noopProfilerApi
811+
)
812+
rumPublicApi.init(DEFAULT_INIT_CONFIGURATION)
813+
rumPublicApi.succeedFeatureOperation('foo', { operationKey: '00000000-0000-0000-0000-000000000000' })
814+
expect(addOperationStepVitalSpy).toHaveBeenCalledWith('foo', 'end', {
815+
operationKey: '00000000-0000-0000-0000-000000000000',
816+
})
817+
})
818+
})
819+
820+
describe('failFeatureOperation', () => {
821+
it('should call addOperationStepVital on the startRum result with end status and failure reason', () => {
822+
const addOperationStepVitalSpy = jasmine.createSpy()
823+
const rumPublicApi = makeRumPublicApi(
824+
() => ({ ...noopStartRum(), addOperationStepVital: addOperationStepVitalSpy }),
825+
noopRecorderApi,
826+
noopProfilerApi
827+
)
828+
rumPublicApi.init(DEFAULT_INIT_CONFIGURATION)
829+
rumPublicApi.failFeatureOperation('foo', 'error', { operationKey: '00000000-0000-0000-0000-000000000000' })
830+
expect(addOperationStepVitalSpy).toHaveBeenCalledWith(
831+
'foo',
832+
'end',
833+
{ operationKey: '00000000-0000-0000-0000-000000000000' },
834+
'error'
835+
)
836+
})
837+
})
838+
787839
it('should provide sdk version', () => {
788840
const rumPublicApi = makeRumPublicApi(noopStartRum, noopRecorderApi, noopProfilerApi)
789841
expect(rumPublicApi.version).toBe('test')

packages/rum-core/src/boot/rumPublicApi.ts

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,10 @@ import type { RumConfiguration, RumInitConfiguration } from '../domain/configura
4343
import type { ViewOptions } from '../domain/view/trackViews'
4444
import type {
4545
AddDurationVitalOptions,
46-
DurationVitalOptions,
4746
DurationVitalReference,
47+
DurationVitalOptions,
48+
FeatureOperationOptions,
49+
FailureReason,
4850
} from '../domain/vital/vitalCollection'
4951
import { createCustomVitalsState } from '../domain/vital/vitalCollection'
5052
import { callPluginsMethod } from '../domain/plugins'
@@ -425,9 +427,37 @@ export interface RumPublicApi extends PublicApi {
425427
*
426428
* @category Vital
427429
* @param nameOrRef - Name or reference of the custom vital
428-
* @param options - Options for the custom vital (context, description)
430+
* @param options - Options for the custom vital (operationKey, context, description)
429431
*/
430432
stopDurationVital: (nameOrRef: string | DurationVitalReference, options?: DurationVitalOptions) => void
433+
434+
/**
435+
* [Experimental] start a feature operation
436+
*
437+
* @category Vital
438+
* @param name - Name of the operation step
439+
* @param options - Options for the operation step (operationKey, context, description)
440+
*/
441+
startFeatureOperation: (name: string, options?: FeatureOperationOptions) => void
442+
443+
/**
444+
* [Experimental] succeed a feature operation
445+
*
446+
* @category Vital
447+
* @param name - Name of the operation step
448+
* @param options - Options for the operation step (operationKey, context, description)
449+
*/
450+
succeedFeatureOperation: (name: string, options?: FeatureOperationOptions) => void
451+
452+
/**
453+
* [Experimental] fail a feature operation
454+
*
455+
* @category Vital
456+
* @param name - Name of the operation step
457+
* @param failureReason
458+
* @param options - Options for the operation step (operationKey, context, description)
459+
*/
460+
failFeatureOperation: (name: string, failureReaon: FailureReason, options?: FeatureOperationOptions) => void
431461
}
432462

433463
export interface RecorderApi {
@@ -496,6 +526,7 @@ export interface Strategy {
496526
startDurationVital: StartRumResult['startDurationVital']
497527
stopDurationVital: StartRumResult['stopDurationVital']
498528
addDurationVital: StartRumResult['addDurationVital']
529+
addOperationStepVital: StartRumResult['addOperationStepVital']
499530
}
500531

501532
export function makeRumPublicApi(
@@ -773,6 +804,21 @@ export function makeRumPublicApi(
773804
description: sanitize(options && options.description) as string | undefined,
774805
})
775806
}),
807+
808+
startFeatureOperation: monitor((name, options) => {
809+
addTelemetryUsage({ feature: 'add-operation-step-vital', action_type: 'start' })
810+
strategy.addOperationStepVital(name, 'start', options)
811+
}),
812+
813+
succeedFeatureOperation: monitor((name, options) => {
814+
addTelemetryUsage({ feature: 'add-operation-step-vital', action_type: 'succeed' })
815+
strategy.addOperationStepVital(name, 'end', options)
816+
}),
817+
818+
failFeatureOperation: monitor((name, failureReason, options) => {
819+
addTelemetryUsage({ feature: 'add-operation-step-vital', action_type: 'fail' })
820+
strategy.addOperationStepVital(name, 'end', options, failureReason)
821+
}),
776822
})
777823

778824
return rumPublicApi

0 commit comments

Comments
 (0)