From 94d9a591b05bc54a1ee22da3e5c0697bfd3011ab Mon Sep 17 00:00:00 2001 From: Adrian de la Rosa Date: Fri, 9 Jan 2026 17:13:32 +0100 Subject: [PATCH 1/9] feat: add localStorage strategy to remote config --- .../configuration/remoteConfiguration.spec.ts | 40 +++++++++++++++++++ .../configuration/remoteConfiguration.ts | 16 ++++++++ .../remoteConfiguration.types.ts | 14 +++++++ 3 files changed, 70 insertions(+) diff --git a/packages/rum-core/src/domain/configuration/remoteConfiguration.spec.ts b/packages/rum-core/src/domain/configuration/remoteConfiguration.spec.ts index b2aab1b0ae..77d8f0b322 100644 --- a/packages/rum-core/src/domain/configuration/remoteConfiguration.spec.ts +++ b/packages/rum-core/src/domain/configuration/remoteConfiguration.spec.ts @@ -509,6 +509,46 @@ describe('remoteConfiguration', () => { }) }) + describe('localStorage strategy', () => { + const LOCAL_STORAGE_KEY = 'dd_test_version' + + beforeEach(() => { + localStorage.setItem(LOCAL_STORAGE_KEY, 'my-version') + registerCleanupTask(() => localStorage.removeItem(LOCAL_STORAGE_KEY)) + }) + + it('should resolve a configuration value from localStorage', () => { + expectAppliedRemoteConfigurationToBe( + { version: { rcSerializedType: 'dynamic', strategy: 'localStorage', key: LOCAL_STORAGE_KEY } }, + { version: 'my-version' } + ) + expect(metrics.get().localStorage).toEqual({ success: 1 }) + }) + + it('should resolve a configuration value from localStorage with an extractor', () => { + localStorage.setItem(LOCAL_STORAGE_KEY, 'version-123') + expectAppliedRemoteConfigurationToBe( + { + version: { + rcSerializedType: 'dynamic', + strategy: 'localStorage', + key: LOCAL_STORAGE_KEY, + extractor: { rcSerializedType: 'regex', value: '\\d+' }, + }, + }, + { version: '123' } + ) + }) + + it('should resolve to undefined if the key is missing', () => { + expectAppliedRemoteConfigurationToBe( + { version: { rcSerializedType: 'dynamic', strategy: 'localStorage', key: 'non_existent_key' } }, + { version: undefined } + ) + expect(metrics.get().localStorage).toEqual({ missing: 1 }) + }) + }) + describe('with extractor', () => { beforeEach(() => { setCookie(COOKIE_NAME, 'my-version-123', ONE_MINUTE) diff --git a/packages/rum-core/src/domain/configuration/remoteConfiguration.ts b/packages/rum-core/src/domain/configuration/remoteConfiguration.ts index e279b5a7a5..614909ca07 100644 --- a/packages/rum-core/src/domain/configuration/remoteConfiguration.ts +++ b/packages/rum-core/src/domain/configuration/remoteConfiguration.ts @@ -46,6 +46,7 @@ export interface RemoteConfigurationMetrics extends Context { cookie?: RemoteConfigurationMetricCounters dom?: RemoteConfigurationMetricCounters js?: RemoteConfigurationMetricCounters + localStorage?: RemoteConfigurationMetricCounters } interface RemoteConfigurationMetricCounters { @@ -149,6 +150,9 @@ export function applyRemoteConfiguration( case 'js': resolvedValue = resolveJsValue(property) break + case 'localStorage': + resolvedValue = resolveLocalStorageValue(property) + break default: display.error(`Unsupported remote configuration: "strategy": "${strategy as string}"`) return @@ -166,6 +170,18 @@ export function applyRemoteConfiguration( return value } + function resolveLocalStorageValue({ key }: { key: string }) { + let value: string | null + try { + value = localStorage.getItem(key) + } catch { + metrics.increment('localStorage', 'failure') + return + } + metrics.increment('localStorage', value !== null ? 'success' : 'missing') + return value ?? undefined + } + function resolveDomValue({ selector, attribute }: { selector: string; attribute?: string }) { let element: Element | null try { diff --git a/packages/rum-core/src/domain/configuration/remoteConfiguration.types.ts b/packages/rum-core/src/domain/configuration/remoteConfiguration.types.ts index 176d25d6fd..64851de309 100644 --- a/packages/rum-core/src/domain/configuration/remoteConfiguration.types.ts +++ b/packages/rum-core/src/domain/configuration/remoteConfiguration.types.ts @@ -26,6 +26,13 @@ export type DynamicOption = extractor?: SerializedRegex [k: string]: unknown } + | { + rcSerializedType: 'dynamic' + strategy: 'localStorage' + key: string + extractor?: SerializedRegex + [k: string]: unknown + } /** * RUM Browser & Mobile SDKs Remote Configuration properties @@ -73,6 +80,13 @@ export interface RumSdkConfig { extractor?: SerializedRegex [k: string]: unknown } + | { + rcSerializedType: 'dynamic' + strategy: 'localStorage' + key: string + extractor?: SerializedRegex + [k: string]: unknown + } /** * The percentage of sessions tracked */ From b2a2fd9d65c778219c714c9d74c7d1304a07505c Mon Sep 17 00:00:00 2001 From: Adrian de la Rosa Date: Fri, 30 Jan 2026 10:59:44 +0100 Subject: [PATCH 2/9] chore: update schema --- .../configuration/remoteConfiguration.types.ts | 14 -------------- packages/rum-core/src/rumEvent.types.ts | 16 ++++------------ packages/rum/src/types/sessionReplay.ts | 4 ++-- rum-events-format | 2 +- 4 files changed, 7 insertions(+), 29 deletions(-) diff --git a/packages/rum-core/src/domain/configuration/remoteConfiguration.types.ts b/packages/rum-core/src/domain/configuration/remoteConfiguration.types.ts index 64851de309..176d25d6fd 100644 --- a/packages/rum-core/src/domain/configuration/remoteConfiguration.types.ts +++ b/packages/rum-core/src/domain/configuration/remoteConfiguration.types.ts @@ -26,13 +26,6 @@ export type DynamicOption = extractor?: SerializedRegex [k: string]: unknown } - | { - rcSerializedType: 'dynamic' - strategy: 'localStorage' - key: string - extractor?: SerializedRegex - [k: string]: unknown - } /** * RUM Browser & Mobile SDKs Remote Configuration properties @@ -80,13 +73,6 @@ export interface RumSdkConfig { extractor?: SerializedRegex [k: string]: unknown } - | { - rcSerializedType: 'dynamic' - strategy: 'localStorage' - key: string - extractor?: SerializedRegex - [k: string]: unknown - } /** * The percentage of sessions tracked */ diff --git a/packages/rum-core/src/rumEvent.types.ts b/packages/rum-core/src/rumEvent.types.ts index 686d519d7b..8a1a5ebe46 100644 --- a/packages/rum-core/src/rumEvent.types.ts +++ b/packages/rum-core/src/rumEvent.types.ts @@ -141,6 +141,10 @@ export type RumActionEvent = CommonProperties & * CSS selector path of the target element */ readonly selector?: string + /** + * Mobile-only: a globally unique and stable identifier for this UI element, computed as the hash of the element's path (32 lowercase hex characters). Used to correlate actions with mobile session replay wireframes. + */ + readonly permanent_id?: string /** * Width of the target element (in pixels) */ @@ -956,62 +960,50 @@ export type RumViewEvent = CommonProperties & */ readonly time_spent: number /** - * @deprecated * Duration in ns to the first rendering (deprecated in favor of `view.performance.fcp.timestamp`) */ readonly first_contentful_paint?: number /** - * @deprecated * Duration in ns to the largest contentful paint (deprecated in favor of `view.performance.lcp.timestamp`) */ readonly largest_contentful_paint?: number /** - * @deprecated * CSS selector path of the largest contentful paint element (deprecated in favor of `view.performance.lcp.target_selector`) */ readonly largest_contentful_paint_target_selector?: string /** - * @deprecated * Duration in ns of the first input event delay (deprecated in favor of `view.performance.fid.duration`) */ readonly first_input_delay?: number /** - * @deprecated * Duration in ns to the first input (deprecated in favor of `view.performance.fid.timestamp`) */ readonly first_input_time?: number /** - * @deprecated * CSS selector path of the first input target element (deprecated in favor of `view.performance.fid.target_selector`) */ readonly first_input_target_selector?: string /** - * @deprecated * Longest duration in ns between an interaction and the next paint (deprecated in favor of `view.performance.inp.duration`) */ readonly interaction_to_next_paint?: number /** - * @deprecated * Duration in ns between start of the view and start of the INP (deprecated in favor of `view.performance.inp.timestamp`) */ readonly interaction_to_next_paint_time?: number /** - * @deprecated * CSS selector path of the interacted element corresponding to INP (deprecated in favor of `view.performance.inp.target_selector`) */ readonly interaction_to_next_paint_target_selector?: string /** - * @deprecated * Total layout shift score that occurred on the view (deprecated in favor of `view.performance.cls.score`) */ readonly cumulative_layout_shift?: number /** - * @deprecated * Duration in ns between start of the view and start of the largest layout shift contributing to CLS (deprecated in favor of `view.performance.cls.timestamp`) */ readonly cumulative_layout_shift_time?: number /** - * @deprecated * CSS selector path of the first element (in document order) of the largest layout shift contributing to CLS (deprecated in favor of `view.performance.cls.target_selector`) */ readonly cumulative_layout_shift_target_selector?: string diff --git a/packages/rum/src/types/sessionReplay.ts b/packages/rum/src/types/sessionReplay.ts index 8cb22ec203..bceb0a14bf 100644 --- a/packages/rum/src/types/sessionReplay.ts +++ b/packages/rum/src/types/sessionReplay.ts @@ -419,7 +419,7 @@ export type AddDocTypeNodeChange = [ '#doctype' | StringReference, StringOrStringReference, StringOrStringReference, - StringOrStringReference, + StringOrStringReference ] /** * Browser-specific. Schema representing a string, either expressed as a literal or as an index into the string table. @@ -560,7 +560,7 @@ export type VisualViewportChange = [ VisualViewportPageTop, VisualViewportWidth, VisualViewportHeight, - VisualViewportScale, + VisualViewportScale ] /** * The offset of the left edge of the visual viewport from the left edge of the layout viewport in CSS pixels. diff --git a/rum-events-format b/rum-events-format index 32918d9997..846ac60c69 160000 --- a/rum-events-format +++ b/rum-events-format @@ -1 +1 @@ -Subproject commit 32918d999701fb7bfd876369e27ced77d6de1809 +Subproject commit 846ac60c69c6bed5445b04c957eaa4e07aa06192 From 0029aeeb97e86cd1a289c36130c0b6063bb5d411 Mon Sep 17 00:00:00 2001 From: Adrian de la Rosa Date: Fri, 30 Jan 2026 11:58:44 +0100 Subject: [PATCH 3/9] feat: add schema for localStorage --- .../remoteConfiguration.types.ts | 14 +++++++++++++ remote-configuration/rum-sdk-config.json | 20 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/packages/rum-core/src/domain/configuration/remoteConfiguration.types.ts b/packages/rum-core/src/domain/configuration/remoteConfiguration.types.ts index 176d25d6fd..2d3924579e 100644 --- a/packages/rum-core/src/domain/configuration/remoteConfiguration.types.ts +++ b/packages/rum-core/src/domain/configuration/remoteConfiguration.types.ts @@ -26,6 +26,13 @@ export type DynamicOption = extractor?: SerializedRegex [k: string]: unknown } + | { + rcSerializedType: 'dynamic' + strategy: 'localStorage' + name: string + extractor?: SerializedRegex + [k: string]: unknown + } /** * RUM Browser & Mobile SDKs Remote Configuration properties @@ -73,6 +80,13 @@ export interface RumSdkConfig { extractor?: SerializedRegex [k: string]: unknown } + | { + rcSerializedType: 'dynamic' + strategy: 'localStorage' + name: string + extractor?: SerializedRegex + [k: string]: unknown + } /** * The percentage of sessions tracked */ diff --git a/remote-configuration/rum-sdk-config.json b/remote-configuration/rum-sdk-config.json index 6240661906..62ed607830 100644 --- a/remote-configuration/rum-sdk-config.json +++ b/remote-configuration/rum-sdk-config.json @@ -100,6 +100,26 @@ "$ref": "#/$defs/SerializedRegex" } } + }, + { + "type": "object", + "required": ["rcSerializedType", "strategy", "name"], + "properties": { + "rcSerializedType": { + "type": "string", + "const": "dynamic" + }, + "strategy": { + "type": "string", + "const": "localStorage" + }, + "name": { + "type": "string" + }, + "extractor": { + "$ref": "#/$defs/SerializedRegex" + } + } } ] }, From f158c5d8d17b2666b48f38f5480239be57e622fb Mon Sep 17 00:00:00 2001 From: Adrian de la Rosa Date: Fri, 30 Jan 2026 14:18:00 +0100 Subject: [PATCH 4/9] fix: key in schema --- .../src/domain/configuration/remoteConfiguration.types.ts | 4 ++-- remote-configuration/rum-sdk-config.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/rum-core/src/domain/configuration/remoteConfiguration.types.ts b/packages/rum-core/src/domain/configuration/remoteConfiguration.types.ts index 2d3924579e..64851de309 100644 --- a/packages/rum-core/src/domain/configuration/remoteConfiguration.types.ts +++ b/packages/rum-core/src/domain/configuration/remoteConfiguration.types.ts @@ -29,7 +29,7 @@ export type DynamicOption = | { rcSerializedType: 'dynamic' strategy: 'localStorage' - name: string + key: string extractor?: SerializedRegex [k: string]: unknown } @@ -83,7 +83,7 @@ export interface RumSdkConfig { | { rcSerializedType: 'dynamic' strategy: 'localStorage' - name: string + key: string extractor?: SerializedRegex [k: string]: unknown } diff --git a/remote-configuration/rum-sdk-config.json b/remote-configuration/rum-sdk-config.json index 62ed607830..feb97911fd 100644 --- a/remote-configuration/rum-sdk-config.json +++ b/remote-configuration/rum-sdk-config.json @@ -103,7 +103,7 @@ }, { "type": "object", - "required": ["rcSerializedType", "strategy", "name"], + "required": ["rcSerializedType", "strategy", "key"], "properties": { "rcSerializedType": { "type": "string", @@ -113,7 +113,7 @@ "type": "string", "const": "localStorage" }, - "name": { + "key": { "type": "string" }, "extractor": { From d82050d57c1aaea679612ada5c1a05fb96dd79dd Mon Sep 17 00:00:00 2001 From: Adrian de la Rosa Date: Mon, 2 Feb 2026 10:40:47 +0100 Subject: [PATCH 5/9] empty commit From ada6b539a48460491317ad5aaa89817c4ec3439d Mon Sep 17 00:00:00 2001 From: Adrian de la Rosa Date: Mon, 2 Feb 2026 11:29:05 +0100 Subject: [PATCH 6/9] chore: update schema --- packages/rum-core/src/rumEvent.types.ts | 18 ++++++++++++++++++ packages/rum/src/types/sessionReplay.ts | 4 ++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/rum-core/src/rumEvent.types.ts b/packages/rum-core/src/rumEvent.types.ts index 8a1a5ebe46..055360adc0 100644 --- a/packages/rum-core/src/rumEvent.types.ts +++ b/packages/rum-core/src/rumEvent.types.ts @@ -2020,6 +2020,24 @@ export interface ViewPerformanceData { * URL of the largest contentful paint element */ resource_url?: string + /** + * Sub-parts of the LCP + */ + sub_parts?: { + /** + * Time between first_byte and the loading start of the resource associated with the LCP + */ + readonly load_delay: number + /** + * Time to takes to load the resource attached to the LCP + */ + readonly load_time: number + /** + * Time between the LCP resource finishes loading and the LCP element is fully rendered + */ + readonly render_delay: number + [k: string]: unknown + } [k: string]: unknown } /** diff --git a/packages/rum/src/types/sessionReplay.ts b/packages/rum/src/types/sessionReplay.ts index bceb0a14bf..8cb22ec203 100644 --- a/packages/rum/src/types/sessionReplay.ts +++ b/packages/rum/src/types/sessionReplay.ts @@ -419,7 +419,7 @@ export type AddDocTypeNodeChange = [ '#doctype' | StringReference, StringOrStringReference, StringOrStringReference, - StringOrStringReference + StringOrStringReference, ] /** * Browser-specific. Schema representing a string, either expressed as a literal or as an index into the string table. @@ -560,7 +560,7 @@ export type VisualViewportChange = [ VisualViewportPageTop, VisualViewportWidth, VisualViewportHeight, - VisualViewportScale + VisualViewportScale, ] /** * The offset of the left edge of the visual viewport from the left edge of the layout viewport in CSS pixels. From a00424695079d1d136581e96fc1114bd7e9d809b Mon Sep 17 00:00:00 2001 From: Adrian de la Rosa Date: Mon, 2 Feb 2026 11:35:11 +0100 Subject: [PATCH 7/9] chore: update schema --- packages/rum-core/src/rumEvent.types.ts | 12 ++++++++++++ rum-events-format | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/rum-core/src/rumEvent.types.ts b/packages/rum-core/src/rumEvent.types.ts index 055360adc0..6e7d0c177e 100644 --- a/packages/rum-core/src/rumEvent.types.ts +++ b/packages/rum-core/src/rumEvent.types.ts @@ -960,50 +960,62 @@ export type RumViewEvent = CommonProperties & */ readonly time_spent: number /** + * @deprecated * Duration in ns to the first rendering (deprecated in favor of `view.performance.fcp.timestamp`) */ readonly first_contentful_paint?: number /** + * @deprecated * Duration in ns to the largest contentful paint (deprecated in favor of `view.performance.lcp.timestamp`) */ readonly largest_contentful_paint?: number /** + * @deprecated * CSS selector path of the largest contentful paint element (deprecated in favor of `view.performance.lcp.target_selector`) */ readonly largest_contentful_paint_target_selector?: string /** + * @deprecated * Duration in ns of the first input event delay (deprecated in favor of `view.performance.fid.duration`) */ readonly first_input_delay?: number /** + * @deprecated * Duration in ns to the first input (deprecated in favor of `view.performance.fid.timestamp`) */ readonly first_input_time?: number /** + * @deprecated * CSS selector path of the first input target element (deprecated in favor of `view.performance.fid.target_selector`) */ readonly first_input_target_selector?: string /** + * @deprecated * Longest duration in ns between an interaction and the next paint (deprecated in favor of `view.performance.inp.duration`) */ readonly interaction_to_next_paint?: number /** + * @deprecated * Duration in ns between start of the view and start of the INP (deprecated in favor of `view.performance.inp.timestamp`) */ readonly interaction_to_next_paint_time?: number /** + * @deprecated * CSS selector path of the interacted element corresponding to INP (deprecated in favor of `view.performance.inp.target_selector`) */ readonly interaction_to_next_paint_target_selector?: string /** + * @deprecated * Total layout shift score that occurred on the view (deprecated in favor of `view.performance.cls.score`) */ readonly cumulative_layout_shift?: number /** + * @deprecated * Duration in ns between start of the view and start of the largest layout shift contributing to CLS (deprecated in favor of `view.performance.cls.timestamp`) */ readonly cumulative_layout_shift_time?: number /** + * @deprecated * CSS selector path of the first element (in document order) of the largest layout shift contributing to CLS (deprecated in favor of `view.performance.cls.target_selector`) */ readonly cumulative_layout_shift_target_selector?: string diff --git a/rum-events-format b/rum-events-format index 846ac60c69..e1a3ffb802 160000 --- a/rum-events-format +++ b/rum-events-format @@ -1 +1 @@ -Subproject commit 846ac60c69c6bed5445b04c957eaa4e07aa06192 +Subproject commit e1a3ffb802d8d5ab4dfc3c7680b9d0abf405420c From 1b8e8525565fef32c8cd2bb6e40e414c6eb10d53 Mon Sep 17 00:00:00 2001 From: Adrian de la Rosa Date: Mon, 2 Feb 2026 17:35:21 +0100 Subject: [PATCH 8/9] =?UTF-8?q?=E2=9C=85=20test:=20add=20E2E=20tests=20for?= =?UTF-8?q?=20localStorage=20remote=20configuration=20strategy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add 4 new E2E tests for the localStorage strategy: 1. Basic localStorage retrieval - reads simple string values 2. localStorage with regex extractor - parses extracted values 3. Missing key handling - gracefully falls back when key doesn't exist 4. localStorage unavailable - handles access errors and falls back Tests follow the same pattern as the js strategy tests (PR #3766) and validate: - Synchronous value resolution during SDK initialization - Regex extraction functionality - Fallback behavior for missing or inaccessible keys - Integration with both CDN and npm setups Co-Authored-By: Claude Haiku 4.5 --- .../rum/remoteConfiguration.scenario.ts | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/test/e2e/scenario/rum/remoteConfiguration.scenario.ts b/test/e2e/scenario/rum/remoteConfiguration.scenario.ts index 96708a1e97..fe9ba78f51 100644 --- a/test/e2e/scenario/rum/remoteConfiguration.scenario.ts +++ b/test/e2e/scenario/rum/remoteConfiguration.scenario.ts @@ -93,6 +93,93 @@ test.describe('remote configuration', () => { expect(initConfiguration.version).toBe('js-version') }) + createTest('should resolve an option value from localStorage') + .withRum({ + remoteConfigurationId: 'e2e', + }) + .withRemoteConfiguration({ + rum: { + applicationId: 'e2e', + version: { rcSerializedType: 'dynamic', strategy: 'localStorage', key: 'dd_app_version' }, + }, + }) + .withBody(html` + + `) + .run(async ({ page }) => { + const initConfiguration = await page.evaluate(() => window.DD_RUM!.getInitConfiguration()!) + expect(initConfiguration.version).toBe('localStorage-version') + }) + + createTest('should resolve an option value from localStorage with an extractor') + .withRum({ + remoteConfigurationId: 'e2e', + }) + .withRemoteConfiguration({ + rum: { + applicationId: 'e2e', + version: { + rcSerializedType: 'dynamic', + strategy: 'localStorage', + key: 'dd_app_version', + extractor: { rcSerializedType: 'regex', value: '\\d+\\.\\d+\\.\\d+' }, + }, + }, + }) + .withBody(html` + + `) + .run(async ({ page }) => { + const initConfiguration = await page.evaluate(() => window.DD_RUM!.getInitConfiguration()!) + expect(initConfiguration.version).toBe('1.2.3') + }) + + createTest('should resolve to undefined when localStorage key is missing') + .withRum({ + remoteConfigurationId: 'e2e', + version: 'fallback-version', + }) + .withRemoteConfiguration({ + rum: { + applicationId: 'e2e', + version: { rcSerializedType: 'dynamic', strategy: 'localStorage', key: 'non_existent_key' }, + }, + }) + .run(async ({ page }) => { + const initConfiguration = await page.evaluate(() => window.DD_RUM!.getInitConfiguration()!) + expect(initConfiguration.version).toBe('fallback-version') + }) + + createTest('should handle localStorage access failure gracefully') + .withRum({ + remoteConfigurationId: 'e2e', + version: 'fallback-version', + }) + .withRemoteConfiguration({ + rum: { + applicationId: 'e2e', + version: { rcSerializedType: 'dynamic', strategy: 'localStorage', key: 'dd_app_version' }, + }, + }) + .withBody(html` + + `) + .run(async ({ page }) => { + const initConfiguration = await page.evaluate(() => window.DD_RUM!.getInitConfiguration()!) + expect(initConfiguration.version).toBe('fallback-version') + }) + createTest('should resolve user context') .withRum({ remoteConfigurationId: 'e2e', From c812560fdddc2e61b9c758c0e3531b515a6f89f7 Mon Sep 17 00:00:00 2001 From: Adrian de la Rosa Date: Tue, 3 Feb 2026 15:37:25 +0100 Subject: [PATCH 9/9] fix: format --- test/e2e/scenario/rum/remoteConfiguration.scenario.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/scenario/rum/remoteConfiguration.scenario.ts b/test/e2e/scenario/rum/remoteConfiguration.scenario.ts index fe9ba78f51..3e80d70fa0 100644 --- a/test/e2e/scenario/rum/remoteConfiguration.scenario.ts +++ b/test/e2e/scenario/rum/remoteConfiguration.scenario.ts @@ -168,7 +168,7 @@ test.describe('remote configuration', () => { .withBody(html`