diff --git a/test/apps/instrumentation-overhead/index.html b/test/apps/instrumentation-overhead/index.html
new file mode 100644
index 0000000000..4c909f744f
--- /dev/null
+++ b/test/apps/instrumentation-overhead/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+ Instrumentation Overhead Benchmark
+
+
+ Instrumentation Overhead Benchmark
+ This page is used for benchmarking debugger instrumentation overhead.
+
+
+
diff --git a/test/apps/instrumentation-overhead/package.json b/test/apps/instrumentation-overhead/package.json
new file mode 100644
index 0000000000..3d5d8732e9
--- /dev/null
+++ b/test/apps/instrumentation-overhead/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "instrumentation-overhead-app",
+ "private": true,
+ "scripts": {
+ "build": "webpack --config ./webpack.config.js"
+ },
+ "peerDependencies": {
+ "@datadog/browser-debugger": "*"
+ },
+ "peerDependenciesMeta": {
+ "@datadog/browser-debugger": {
+ "optional": true
+ }
+ },
+ "resolutions": {
+ "@datadog/browser-core": "file:../../../packages/core/package.tgz",
+ "@datadog/browser-debugger": "file:../../../packages/debugger/package.tgz"
+ },
+ "devDependencies": {
+ "ts-loader": "9.5.1",
+ "typescript": "5.9.3",
+ "webpack": "5.105.2"
+ },
+ "volta": {
+ "extends": "../../../package.json"
+ },
+ "packageManager": "yarn@4.12.0"
+}
diff --git a/test/apps/instrumentation-overhead/src/app.ts b/test/apps/instrumentation-overhead/src/app.ts
new file mode 100644
index 0000000000..a728229cfe
--- /dev/null
+++ b/test/apps/instrumentation-overhead/src/app.ts
@@ -0,0 +1,23 @@
+/**
+ * Main entry point for instrumentation overhead benchmark
+ * Exposes both instrumented and non-instrumented functions to window
+ */
+
+import * as nonInstrumented from './functions'
+import * as instrumented from './instrumented'
+
+declare global {
+ interface Window {
+ testFunctions: {
+ add1: (a: number, b: number) => number
+ add2: (a: number, b: number) => number
+ }
+ USE_INSTRUMENTED?: boolean
+ }
+}
+
+// Expose functions to window based on configuration
+// The benchmark will set USE_INSTRUMENTED flag before loading this script
+if (typeof window !== 'undefined') {
+ window.testFunctions = window.USE_INSTRUMENTED ? instrumented : nonInstrumented
+}
diff --git a/test/apps/instrumentation-overhead/src/functions.ts b/test/apps/instrumentation-overhead/src/functions.ts
new file mode 100644
index 0000000000..630a0a4c47
--- /dev/null
+++ b/test/apps/instrumentation-overhead/src/functions.ts
@@ -0,0 +1,12 @@
+/**
+ * Non-instrumented baseline functions
+ * These are the original functions without any instrumentation overhead
+ */
+
+export function add1(a: number, b: number): number {
+ return a + b
+}
+
+export function add2(a: number, b: number): number {
+ return a + b
+}
diff --git a/test/apps/instrumentation-overhead/src/instrumented.ts b/test/apps/instrumentation-overhead/src/instrumented.ts
new file mode 100644
index 0000000000..e993c7cdbf
--- /dev/null
+++ b/test/apps/instrumentation-overhead/src/instrumented.ts
@@ -0,0 +1,43 @@
+/* eslint-disable camelcase, curly, @typescript-eslint/no-unsafe-return */
+
+/**
+ * Instrumented versions of the functions.
+ * These follow the debugger instrumentation pattern where $dd_* identifiers
+ * are injected by the debugger SDK at runtime.
+ */
+
+// Global hooks injected by debugger SDK
+declare const $dd_probes: (functionId: string) => any[] | undefined
+declare const $dd_entry: (probes: any[], self: any, args: Record) => void
+declare const $dd_return: (
+ probes: any[],
+ value: any,
+ self: any,
+ args: Record,
+ locals: Record
+) => any
+declare const $dd_throw: (probes: any[], error: Error, self: any, args: Record) => void
+
+export function add1(a: number, b: number): number {
+ const $dd_p = $dd_probes('instrumented.ts;add1')
+ try {
+ if ($dd_p) $dd_entry($dd_p, null, { a, b })
+ const result = a + b
+ return $dd_p ? $dd_return($dd_p, result, null, { a, b }, { result }) : result
+ } catch (e) {
+ if ($dd_p) $dd_throw($dd_p, e as Error, null, { a, b })
+ throw e
+ }
+}
+
+export function add2(a: number, b: number): number {
+ const $dd_p = $dd_probes('instrumented.ts;add2')
+ try {
+ if ($dd_p) $dd_entry($dd_p, null, { a, b })
+ const result = a + b
+ return $dd_p ? $dd_return($dd_p, result, null, { a, b }, { result }) : result
+ } catch (e) {
+ if ($dd_p) $dd_throw($dd_p, e as Error, null, { a, b })
+ throw e
+ }
+}
diff --git a/test/apps/instrumentation-overhead/tsconfig.json b/test/apps/instrumentation-overhead/tsconfig.json
new file mode 100644
index 0000000000..82a5ffffac
--- /dev/null
+++ b/test/apps/instrumentation-overhead/tsconfig.json
@@ -0,0 +1,11 @@
+{
+ "compilerOptions": {
+ "outDir": "./dist/",
+ "strict": true,
+ "module": "commonjs",
+ "moduleResolution": "node",
+ "target": "es5",
+ "lib": ["ES2015", "DOM"],
+ "types": []
+ }
+}
diff --git a/test/apps/instrumentation-overhead/webpack.config.js b/test/apps/instrumentation-overhead/webpack.config.js
new file mode 100644
index 0000000000..5038bebedc
--- /dev/null
+++ b/test/apps/instrumentation-overhead/webpack.config.js
@@ -0,0 +1,25 @@
+const path = require('node:path')
+
+module.exports = {
+ mode: 'production',
+ entry: './src/app.ts',
+ target: ['web', 'es2018'],
+ module: {
+ rules: [
+ {
+ test: /\.ts$/,
+ use: 'ts-loader',
+ },
+ ],
+ },
+ resolve: {
+ extensions: ['.ts', '.js'],
+ },
+ optimization: {
+ chunkIds: 'named',
+ },
+ output: {
+ path: path.resolve(__dirname, 'dist'),
+ filename: 'app.js',
+ },
+}
diff --git a/test/apps/instrumentation-overhead/yarn.lock b/test/apps/instrumentation-overhead/yarn.lock
new file mode 100644
index 0000000000..5589541935
--- /dev/null
+++ b/test/apps/instrumentation-overhead/yarn.lock
@@ -0,0 +1,884 @@
+# This file is generated by running "yarn install" inside your project.
+# Manual changes might be lost - proceed with caution!
+
+__metadata:
+ version: 8
+ cacheKey: 10c0
+
+"@datadog/browser-core@file:../../../packages/core/package.tgz::locator=instrumentation-overhead-app%40workspace%3A.":
+ version: 6.32.0
+ resolution: "@datadog/browser-core@file:../../../packages/core/package.tgz#../../../packages/core/package.tgz::hash=96405e&locator=instrumentation-overhead-app%40workspace%3A."
+ checksum: 10c0/e4e5ca667f2076e20971ce1dc674d018b60bf58630da46ad25a37034e9ac11ec25297a002d71f19e0524784caa3f777d730ee4ac77fe91032a6349c0bf14e7aa
+ languageName: node
+ linkType: hard
+
+"@datadog/browser-debugger@file:../../../packages/debugger/package.tgz::locator=instrumentation-overhead-app%40workspace%3A.":
+ version: 6.32.0
+ resolution: "@datadog/browser-debugger@file:../../../packages/debugger/package.tgz#../../../packages/debugger/package.tgz::hash=dfd49f&locator=instrumentation-overhead-app%40workspace%3A."
+ dependencies:
+ "@datadog/browser-core": "npm:6.32.0"
+ checksum: 10c0/5a0ee48f198141482a3db6f4a865f56ca63b8a951cf2fb383045fda327ba8a3d858140cd05c5603efa018b763be66b6b68af3bb05fe3c82c43c80e4fa0c9482f
+ languageName: node
+ linkType: hard
+
+"@jridgewell/gen-mapping@npm:^0.3.5":
+ version: 0.3.13
+ resolution: "@jridgewell/gen-mapping@npm:0.3.13"
+ dependencies:
+ "@jridgewell/sourcemap-codec": "npm:^1.5.0"
+ "@jridgewell/trace-mapping": "npm:^0.3.24"
+ checksum: 10c0/9a7d65fb13bd9aec1fbab74cda08496839b7e2ceb31f5ab922b323e94d7c481ce0fc4fd7e12e2610915ed8af51178bdc61e168e92a8c8b8303b030b03489b13b
+ languageName: node
+ linkType: hard
+
+"@jridgewell/resolve-uri@npm:^3.1.0":
+ version: 3.1.2
+ resolution: "@jridgewell/resolve-uri@npm:3.1.2"
+ checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e
+ languageName: node
+ linkType: hard
+
+"@jridgewell/source-map@npm:^0.3.3":
+ version: 0.3.11
+ resolution: "@jridgewell/source-map@npm:0.3.11"
+ dependencies:
+ "@jridgewell/gen-mapping": "npm:^0.3.5"
+ "@jridgewell/trace-mapping": "npm:^0.3.25"
+ checksum: 10c0/50a4fdafe0b8f655cb2877e59fe81320272eaa4ccdbe6b9b87f10614b2220399ae3e05c16137a59db1f189523b42c7f88bd097ee991dbd7bc0e01113c583e844
+ languageName: node
+ linkType: hard
+
+"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0":
+ version: 1.5.5
+ resolution: "@jridgewell/sourcemap-codec@npm:1.5.5"
+ checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0
+ languageName: node
+ linkType: hard
+
+"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25":
+ version: 0.3.31
+ resolution: "@jridgewell/trace-mapping@npm:0.3.31"
+ dependencies:
+ "@jridgewell/resolve-uri": "npm:^3.1.0"
+ "@jridgewell/sourcemap-codec": "npm:^1.4.14"
+ checksum: 10c0/4b30ec8cd56c5fd9a661f088230af01e0c1a3888d11ffb6b47639700f71225be21d1f7e168048d6d4f9449207b978a235c07c8f15c07705685d16dc06280e9d9
+ languageName: node
+ linkType: hard
+
+"@types/eslint-scope@npm:^3.7.7":
+ version: 3.7.7
+ resolution: "@types/eslint-scope@npm:3.7.7"
+ dependencies:
+ "@types/eslint": "npm:*"
+ "@types/estree": "npm:*"
+ checksum: 10c0/a0ecbdf2f03912679440550817ff77ef39a30fa8bfdacaf6372b88b1f931828aec392f52283240f0d648cf3055c5ddc564544a626bcf245f3d09fcb099ebe3cc
+ languageName: node
+ linkType: hard
+
+"@types/eslint@npm:*":
+ version: 9.6.1
+ resolution: "@types/eslint@npm:9.6.1"
+ dependencies:
+ "@types/estree": "npm:*"
+ "@types/json-schema": "npm:*"
+ checksum: 10c0/69ba24fee600d1e4c5abe0df086c1a4d798abf13792d8cfab912d76817fe1a894359a1518557d21237fbaf6eda93c5ab9309143dee4c59ef54336d1b3570420e
+ languageName: node
+ linkType: hard
+
+"@types/estree@npm:*, @types/estree@npm:^1.0.8":
+ version: 1.0.8
+ resolution: "@types/estree@npm:1.0.8"
+ checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5
+ languageName: node
+ linkType: hard
+
+"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.9":
+ version: 7.0.15
+ resolution: "@types/json-schema@npm:7.0.15"
+ checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db
+ languageName: node
+ linkType: hard
+
+"@types/node@npm:*":
+ version: 24.10.2
+ resolution: "@types/node@npm:24.10.2"
+ dependencies:
+ undici-types: "npm:~7.16.0"
+ checksum: 10c0/560c894e1a9bf7468718ceca8cd520361fd0d3fcc0b020c2f028fc722b28b5b56aecd16736a9b753d52a14837c066cf23480a8582ead59adc63a7e4333bc976c
+ languageName: node
+ linkType: hard
+
+"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.14.1":
+ version: 1.14.1
+ resolution: "@webassemblyjs/ast@npm:1.14.1"
+ dependencies:
+ "@webassemblyjs/helper-numbers": "npm:1.13.2"
+ "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2"
+ checksum: 10c0/67a59be8ed50ddd33fbb2e09daa5193ac215bf7f40a9371be9a0d9797a114d0d1196316d2f3943efdb923a3d809175e1563a3cb80c814fb8edccd1e77494972b
+ languageName: node
+ linkType: hard
+
+"@webassemblyjs/floating-point-hex-parser@npm:1.13.2":
+ version: 1.13.2
+ resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.13.2"
+ checksum: 10c0/0e88bdb8b50507d9938be64df0867f00396b55eba9df7d3546eb5dc0ca64d62e06f8d881ec4a6153f2127d0f4c11d102b6e7d17aec2f26bb5ff95a5e60652412
+ languageName: node
+ linkType: hard
+
+"@webassemblyjs/helper-api-error@npm:1.13.2":
+ version: 1.13.2
+ resolution: "@webassemblyjs/helper-api-error@npm:1.13.2"
+ checksum: 10c0/31be497f996ed30aae4c08cac3cce50c8dcd5b29660383c0155fce1753804fc55d47fcba74e10141c7dd2899033164e117b3bcfcda23a6b043e4ded4f1003dfb
+ languageName: node
+ linkType: hard
+
+"@webassemblyjs/helper-buffer@npm:1.14.1":
+ version: 1.14.1
+ resolution: "@webassemblyjs/helper-buffer@npm:1.14.1"
+ checksum: 10c0/0d54105dc373c0fe6287f1091e41e3a02e36cdc05e8cf8533cdc16c59ff05a646355415893449d3768cda588af451c274f13263300a251dc11a575bc4c9bd210
+ languageName: node
+ linkType: hard
+
+"@webassemblyjs/helper-numbers@npm:1.13.2":
+ version: 1.13.2
+ resolution: "@webassemblyjs/helper-numbers@npm:1.13.2"
+ dependencies:
+ "@webassemblyjs/floating-point-hex-parser": "npm:1.13.2"
+ "@webassemblyjs/helper-api-error": "npm:1.13.2"
+ "@xtuc/long": "npm:4.2.2"
+ checksum: 10c0/9c46852f31b234a8fb5a5a9d3f027bc542392a0d4de32f1a9c0075d5e8684aa073cb5929b56df565500b3f9cc0a2ab983b650314295b9bf208d1a1651bfc825a
+ languageName: node
+ linkType: hard
+
+"@webassemblyjs/helper-wasm-bytecode@npm:1.13.2":
+ version: 1.13.2
+ resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2"
+ checksum: 10c0/c4355d14f369b30cf3cbdd3acfafc7d0488e086be6d578e3c9780bd1b512932352246be96e034e2a7fcfba4f540ec813352f312bfcbbfe5bcfbf694f82ccc682
+ languageName: node
+ linkType: hard
+
+"@webassemblyjs/helper-wasm-section@npm:1.14.1":
+ version: 1.14.1
+ resolution: "@webassemblyjs/helper-wasm-section@npm:1.14.1"
+ dependencies:
+ "@webassemblyjs/ast": "npm:1.14.1"
+ "@webassemblyjs/helper-buffer": "npm:1.14.1"
+ "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2"
+ "@webassemblyjs/wasm-gen": "npm:1.14.1"
+ checksum: 10c0/1f9b33731c3c6dbac3a9c483269562fa00d1b6a4e7133217f40e83e975e636fd0f8736e53abd9a47b06b66082ecc976c7384391ab0a68e12d509ea4e4b948d64
+ languageName: node
+ linkType: hard
+
+"@webassemblyjs/ieee754@npm:1.13.2":
+ version: 1.13.2
+ resolution: "@webassemblyjs/ieee754@npm:1.13.2"
+ dependencies:
+ "@xtuc/ieee754": "npm:^1.2.0"
+ checksum: 10c0/2e732ca78c6fbae3c9b112f4915d85caecdab285c0b337954b180460290ccd0fb00d2b1dc4bb69df3504abead5191e0d28d0d17dfd6c9d2f30acac8c4961c8a7
+ languageName: node
+ linkType: hard
+
+"@webassemblyjs/leb128@npm:1.13.2":
+ version: 1.13.2
+ resolution: "@webassemblyjs/leb128@npm:1.13.2"
+ dependencies:
+ "@xtuc/long": "npm:4.2.2"
+ checksum: 10c0/dad5ef9e383c8ab523ce432dfd80098384bf01c45f70eb179d594f85ce5db2f80fa8c9cba03adafd85684e6d6310f0d3969a882538975989919329ac4c984659
+ languageName: node
+ linkType: hard
+
+"@webassemblyjs/utf8@npm:1.13.2":
+ version: 1.13.2
+ resolution: "@webassemblyjs/utf8@npm:1.13.2"
+ checksum: 10c0/d3fac9130b0e3e5a1a7f2886124a278e9323827c87a2b971e6d0da22a2ba1278ac9f66a4f2e363ecd9fac8da42e6941b22df061a119e5c0335f81006de9ee799
+ languageName: node
+ linkType: hard
+
+"@webassemblyjs/wasm-edit@npm:^1.14.1":
+ version: 1.14.1
+ resolution: "@webassemblyjs/wasm-edit@npm:1.14.1"
+ dependencies:
+ "@webassemblyjs/ast": "npm:1.14.1"
+ "@webassemblyjs/helper-buffer": "npm:1.14.1"
+ "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2"
+ "@webassemblyjs/helper-wasm-section": "npm:1.14.1"
+ "@webassemblyjs/wasm-gen": "npm:1.14.1"
+ "@webassemblyjs/wasm-opt": "npm:1.14.1"
+ "@webassemblyjs/wasm-parser": "npm:1.14.1"
+ "@webassemblyjs/wast-printer": "npm:1.14.1"
+ checksum: 10c0/5ac4781086a2ca4b320bdbfd965a209655fe8a208ca38d89197148f8597e587c9a2c94fb6bd6f1a7dbd4527c49c6844fcdc2af981f8d793a97bf63a016aa86d2
+ languageName: node
+ linkType: hard
+
+"@webassemblyjs/wasm-gen@npm:1.14.1":
+ version: 1.14.1
+ resolution: "@webassemblyjs/wasm-gen@npm:1.14.1"
+ dependencies:
+ "@webassemblyjs/ast": "npm:1.14.1"
+ "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2"
+ "@webassemblyjs/ieee754": "npm:1.13.2"
+ "@webassemblyjs/leb128": "npm:1.13.2"
+ "@webassemblyjs/utf8": "npm:1.13.2"
+ checksum: 10c0/d678810d7f3f8fecb2e2bdadfb9afad2ec1d2bc79f59e4711ab49c81cec578371e22732d4966f59067abe5fba8e9c54923b57060a729d28d408e608beef67b10
+ languageName: node
+ linkType: hard
+
+"@webassemblyjs/wasm-opt@npm:1.14.1":
+ version: 1.14.1
+ resolution: "@webassemblyjs/wasm-opt@npm:1.14.1"
+ dependencies:
+ "@webassemblyjs/ast": "npm:1.14.1"
+ "@webassemblyjs/helper-buffer": "npm:1.14.1"
+ "@webassemblyjs/wasm-gen": "npm:1.14.1"
+ "@webassemblyjs/wasm-parser": "npm:1.14.1"
+ checksum: 10c0/515bfb15277ee99ba6b11d2232ddbf22aed32aad6d0956fe8a0a0a004a1b5a3a277a71d9a3a38365d0538ac40d1b7b7243b1a244ad6cd6dece1c1bb2eb5de7ee
+ languageName: node
+ linkType: hard
+
+"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.14.1":
+ version: 1.14.1
+ resolution: "@webassemblyjs/wasm-parser@npm:1.14.1"
+ dependencies:
+ "@webassemblyjs/ast": "npm:1.14.1"
+ "@webassemblyjs/helper-api-error": "npm:1.13.2"
+ "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2"
+ "@webassemblyjs/ieee754": "npm:1.13.2"
+ "@webassemblyjs/leb128": "npm:1.13.2"
+ "@webassemblyjs/utf8": "npm:1.13.2"
+ checksum: 10c0/95427b9e5addbd0f647939bd28e3e06b8deefdbdadcf892385b5edc70091bf9b92fa5faac3fce8333554437c5d85835afef8c8a7d9d27ab6ba01ffab954db8c6
+ languageName: node
+ linkType: hard
+
+"@webassemblyjs/wast-printer@npm:1.14.1":
+ version: 1.14.1
+ resolution: "@webassemblyjs/wast-printer@npm:1.14.1"
+ dependencies:
+ "@webassemblyjs/ast": "npm:1.14.1"
+ "@xtuc/long": "npm:4.2.2"
+ checksum: 10c0/8d7768608996a052545251e896eac079c98e0401842af8dd4de78fba8d90bd505efb6c537e909cd6dae96e09db3fa2e765a6f26492553a675da56e2db51f9d24
+ languageName: node
+ linkType: hard
+
+"@xtuc/ieee754@npm:^1.2.0":
+ version: 1.2.0
+ resolution: "@xtuc/ieee754@npm:1.2.0"
+ checksum: 10c0/a8565d29d135039bd99ae4b2220d3e167d22cf53f867e491ed479b3f84f895742d0097f935b19aab90265a23d5d46711e4204f14c479ae3637fbf06c4666882f
+ languageName: node
+ linkType: hard
+
+"@xtuc/long@npm:4.2.2":
+ version: 4.2.2
+ resolution: "@xtuc/long@npm:4.2.2"
+ checksum: 10c0/8582cbc69c79ad2d31568c412129bf23d2b1210a1dfb60c82d5a1df93334da4ee51f3057051658569e2c196d8dc33bc05ae6b974a711d0d16e801e1d0647ccd1
+ languageName: node
+ linkType: hard
+
+"acorn-import-phases@npm:^1.0.3":
+ version: 1.0.4
+ resolution: "acorn-import-phases@npm:1.0.4"
+ peerDependencies:
+ acorn: ^8.14.0
+ checksum: 10c0/338eb46fc1aed5544f628344cb9af189450b401d152ceadbf1f5746901a5d923016cd0e7740d5606062d374fdf6941c29bb515d2bd133c4f4242d5d4cd73a3c7
+ languageName: node
+ linkType: hard
+
+"acorn@npm:^8.15.0":
+ version: 8.15.0
+ resolution: "acorn@npm:8.15.0"
+ bin:
+ acorn: bin/acorn
+ checksum: 10c0/dec73ff59b7d6628a01eebaece7f2bdb8bb62b9b5926dcad0f8931f2b8b79c2be21f6c68ac095592adb5adb15831a3635d9343e6a91d028bbe85d564875ec3ec
+ languageName: node
+ linkType: hard
+
+"ajv-formats@npm:^2.1.1":
+ version: 2.1.1
+ resolution: "ajv-formats@npm:2.1.1"
+ dependencies:
+ ajv: "npm:^8.0.0"
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+ checksum: 10c0/e43ba22e91b6a48d96224b83d260d3a3a561b42d391f8d3c6d2c1559f9aa5b253bfb306bc94bbeca1d967c014e15a6efe9a207309e95b3eaae07fcbcdc2af662
+ languageName: node
+ linkType: hard
+
+"ajv-keywords@npm:^5.1.0":
+ version: 5.1.0
+ resolution: "ajv-keywords@npm:5.1.0"
+ dependencies:
+ fast-deep-equal: "npm:^3.1.3"
+ peerDependencies:
+ ajv: ^8.8.2
+ checksum: 10c0/18bec51f0171b83123ba1d8883c126e60c6f420cef885250898bf77a8d3e65e3bfb9e8564f497e30bdbe762a83e0d144a36931328616a973ee669dc74d4a9590
+ languageName: node
+ linkType: hard
+
+"ajv@npm:^8.0.0, ajv@npm:^8.9.0":
+ version: 8.17.1
+ resolution: "ajv@npm:8.17.1"
+ dependencies:
+ fast-deep-equal: "npm:^3.1.3"
+ fast-uri: "npm:^3.0.1"
+ json-schema-traverse: "npm:^1.0.0"
+ require-from-string: "npm:^2.0.2"
+ checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35
+ languageName: node
+ linkType: hard
+
+"ansi-styles@npm:^4.1.0":
+ version: 4.3.0
+ resolution: "ansi-styles@npm:4.3.0"
+ dependencies:
+ color-convert: "npm:^2.0.1"
+ checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041
+ languageName: node
+ linkType: hard
+
+"baseline-browser-mapping@npm:^2.10.12":
+ version: 2.10.16
+ resolution: "baseline-browser-mapping@npm:2.10.16"
+ bin:
+ baseline-browser-mapping: dist/cli.cjs
+ checksum: 10c0/9947243bb8f16db3f8e05397c5c3e7a91243dcf2d1ec6a681ad5ffabeadee36c1061cd18e5f0432088df6798fa0689890ba26db173b9ad23c5650709b7b2e7cf
+ languageName: node
+ linkType: hard
+
+"braces@npm:^3.0.3":
+ version: 3.0.3
+ resolution: "braces@npm:3.0.3"
+ dependencies:
+ fill-range: "npm:^7.1.1"
+ checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04
+ languageName: node
+ linkType: hard
+
+"browserslist@npm:^4.28.1":
+ version: 4.28.2
+ resolution: "browserslist@npm:4.28.2"
+ dependencies:
+ baseline-browser-mapping: "npm:^2.10.12"
+ caniuse-lite: "npm:^1.0.30001782"
+ electron-to-chromium: "npm:^1.5.328"
+ node-releases: "npm:^2.0.36"
+ update-browserslist-db: "npm:^1.2.3"
+ bin:
+ browserslist: cli.js
+ checksum: 10c0/c0228b6330f785b7fa59d2d360124ec6d9322f96ed9f3ee1f873e33ecc9503a6f0ffc3b71191a28c4ff6e930b753b30043da1c33844a9548f3018d491f09ce60
+ languageName: node
+ linkType: hard
+
+"buffer-from@npm:^1.0.0":
+ version: 1.1.2
+ resolution: "buffer-from@npm:1.1.2"
+ checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34
+ languageName: node
+ linkType: hard
+
+"caniuse-lite@npm:^1.0.30001782":
+ version: 1.0.30001786
+ resolution: "caniuse-lite@npm:1.0.30001786"
+ checksum: 10c0/9895f0add1991eefb91cfae98e7baa9daffc6b862b0996c983d30e6be90ef679b6aef32dcb6eca312977fb67c2636ee575820f101213e69c1e0dbffd6ee8e09e
+ languageName: node
+ linkType: hard
+
+"chalk@npm:^4.1.0":
+ version: 4.1.2
+ resolution: "chalk@npm:4.1.2"
+ dependencies:
+ ansi-styles: "npm:^4.1.0"
+ supports-color: "npm:^7.1.0"
+ checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880
+ languageName: node
+ linkType: hard
+
+"chrome-trace-event@npm:^1.0.2":
+ version: 1.0.4
+ resolution: "chrome-trace-event@npm:1.0.4"
+ checksum: 10c0/3058da7a5f4934b87cf6a90ef5fb68ebc5f7d06f143ed5a4650208e5d7acae47bc03ec844b29fbf5ba7e46e8daa6acecc878f7983a4f4bb7271593da91e61ff5
+ languageName: node
+ linkType: hard
+
+"color-convert@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "color-convert@npm:2.0.1"
+ dependencies:
+ color-name: "npm:~1.1.4"
+ checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7
+ languageName: node
+ linkType: hard
+
+"color-name@npm:~1.1.4":
+ version: 1.1.4
+ resolution: "color-name@npm:1.1.4"
+ checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95
+ languageName: node
+ linkType: hard
+
+"commander@npm:^2.20.0":
+ version: 2.20.3
+ resolution: "commander@npm:2.20.3"
+ checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288
+ languageName: node
+ linkType: hard
+
+"electron-to-chromium@npm:^1.5.328":
+ version: 1.5.332
+ resolution: "electron-to-chromium@npm:1.5.332"
+ checksum: 10c0/0e9aedd5634e81f323919a5fba7e1cf34c18860262a50915fb2371a6c65324cbfa50eaea231d05d235cc40b1b60cfaf0c1546d3f2daa6ad6c03e89dfe21cb55f
+ languageName: node
+ linkType: hard
+
+"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.19.0":
+ version: 5.20.1
+ resolution: "enhanced-resolve@npm:5.20.1"
+ dependencies:
+ graceful-fs: "npm:^4.2.4"
+ tapable: "npm:^2.3.0"
+ checksum: 10c0/c6503ee1b2d725843e047e774445ecb12b779aa52db25d11ebe18d4b3adc148d3d993d2038b3d0c38ad836c9c4b3930fbc55df42f72b44785e2f94e5530eda69
+ languageName: node
+ linkType: hard
+
+"es-module-lexer@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "es-module-lexer@npm:2.0.0"
+ checksum: 10c0/ae78dbbd43035a4b972c46cfb6877e374ea290adfc62bc2f5a083fea242c0b2baaab25c5886af86be55f092f4a326741cb94334cd3c478c383fdc8a9ec5ff817
+ languageName: node
+ linkType: hard
+
+"escalade@npm:^3.2.0":
+ version: 3.2.0
+ resolution: "escalade@npm:3.2.0"
+ checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65
+ languageName: node
+ linkType: hard
+
+"eslint-scope@npm:5.1.1":
+ version: 5.1.1
+ resolution: "eslint-scope@npm:5.1.1"
+ dependencies:
+ esrecurse: "npm:^4.3.0"
+ estraverse: "npm:^4.1.1"
+ checksum: 10c0/d30ef9dc1c1cbdece34db1539a4933fe3f9b14e1ffb27ecc85987902ee663ad7c9473bbd49a9a03195a373741e62e2f807c4938992e019b511993d163450e70a
+ languageName: node
+ linkType: hard
+
+"esrecurse@npm:^4.3.0":
+ version: 4.3.0
+ resolution: "esrecurse@npm:4.3.0"
+ dependencies:
+ estraverse: "npm:^5.2.0"
+ checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5
+ languageName: node
+ linkType: hard
+
+"estraverse@npm:^4.1.1":
+ version: 4.3.0
+ resolution: "estraverse@npm:4.3.0"
+ checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d
+ languageName: node
+ linkType: hard
+
+"estraverse@npm:^5.2.0":
+ version: 5.3.0
+ resolution: "estraverse@npm:5.3.0"
+ checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107
+ languageName: node
+ linkType: hard
+
+"events@npm:^3.2.0":
+ version: 3.3.0
+ resolution: "events@npm:3.3.0"
+ checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6
+ languageName: node
+ linkType: hard
+
+"fast-deep-equal@npm:^3.1.3":
+ version: 3.1.3
+ resolution: "fast-deep-equal@npm:3.1.3"
+ checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0
+ languageName: node
+ linkType: hard
+
+"fast-uri@npm:^3.0.1":
+ version: 3.1.0
+ resolution: "fast-uri@npm:3.1.0"
+ checksum: 10c0/44364adca566f70f40d1e9b772c923138d47efeac2ae9732a872baafd77061f26b097ba2f68f0892885ad177becd065520412b8ffeec34b16c99433c5b9e2de7
+ languageName: node
+ linkType: hard
+
+"fill-range@npm:^7.1.1":
+ version: 7.1.1
+ resolution: "fill-range@npm:7.1.1"
+ dependencies:
+ to-regex-range: "npm:^5.0.1"
+ checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018
+ languageName: node
+ linkType: hard
+
+"glob-to-regexp@npm:^0.4.1":
+ version: 0.4.1
+ resolution: "glob-to-regexp@npm:0.4.1"
+ checksum: 10c0/0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429
+ languageName: node
+ linkType: hard
+
+"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4":
+ version: 4.2.11
+ resolution: "graceful-fs@npm:4.2.11"
+ checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2
+ languageName: node
+ linkType: hard
+
+"has-flag@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "has-flag@npm:4.0.0"
+ checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1
+ languageName: node
+ linkType: hard
+
+"instrumentation-overhead-app@workspace:.":
+ version: 0.0.0-use.local
+ resolution: "instrumentation-overhead-app@workspace:."
+ dependencies:
+ "@datadog/browser-debugger": "file:../../../packages/debugger/package.tgz"
+ ts-loader: "npm:9.5.1"
+ typescript: "npm:5.9.3"
+ webpack: "npm:5.105.2"
+ languageName: unknown
+ linkType: soft
+
+"is-number@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "is-number@npm:7.0.0"
+ checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811
+ languageName: node
+ linkType: hard
+
+"jest-worker@npm:^27.4.5":
+ version: 27.5.1
+ resolution: "jest-worker@npm:27.5.1"
+ dependencies:
+ "@types/node": "npm:*"
+ merge-stream: "npm:^2.0.0"
+ supports-color: "npm:^8.0.0"
+ checksum: 10c0/8c4737ffd03887b3c6768e4cc3ca0269c0336c1e4b1b120943958ddb035ed2a0fc6acab6dc99631720a3720af4e708ff84fb45382ad1e83c27946adf3623969b
+ languageName: node
+ linkType: hard
+
+"json-parse-even-better-errors@npm:^2.3.1":
+ version: 2.3.1
+ resolution: "json-parse-even-better-errors@npm:2.3.1"
+ checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3
+ languageName: node
+ linkType: hard
+
+"json-schema-traverse@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "json-schema-traverse@npm:1.0.0"
+ checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6
+ languageName: node
+ linkType: hard
+
+"loader-runner@npm:^4.3.1":
+ version: 4.3.1
+ resolution: "loader-runner@npm:4.3.1"
+ checksum: 10c0/a523b6329f114e0a98317158e30a7dfce044b731521be5399464010472a93a15ece44757d1eaed1d8845019869c5390218bc1c7c3110f4eeaef5157394486eac
+ languageName: node
+ linkType: hard
+
+"merge-stream@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "merge-stream@npm:2.0.0"
+ checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5
+ languageName: node
+ linkType: hard
+
+"micromatch@npm:^4.0.0":
+ version: 4.0.8
+ resolution: "micromatch@npm:4.0.8"
+ dependencies:
+ braces: "npm:^3.0.3"
+ picomatch: "npm:^2.3.1"
+ checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8
+ languageName: node
+ linkType: hard
+
+"mime-db@npm:1.52.0":
+ version: 1.52.0
+ resolution: "mime-db@npm:1.52.0"
+ checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa
+ languageName: node
+ linkType: hard
+
+"mime-types@npm:^2.1.27":
+ version: 2.1.35
+ resolution: "mime-types@npm:2.1.35"
+ dependencies:
+ mime-db: "npm:1.52.0"
+ checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2
+ languageName: node
+ linkType: hard
+
+"neo-async@npm:^2.6.2":
+ version: 2.6.2
+ resolution: "neo-async@npm:2.6.2"
+ checksum: 10c0/c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d
+ languageName: node
+ linkType: hard
+
+"node-releases@npm:^2.0.36":
+ version: 2.0.37
+ resolution: "node-releases@npm:2.0.37"
+ checksum: 10c0/306df89190b3225d0cb001260de52f0befd225a782ec85311ce97b0aa3b2e22f5e4e4c00395c6dc9bc9ef440c64723f6205fe1e27d32b8dd1d140891fbadf901
+ languageName: node
+ linkType: hard
+
+"picocolors@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "picocolors@npm:1.1.1"
+ checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58
+ languageName: node
+ linkType: hard
+
+"picomatch@npm:^2.3.1":
+ version: 2.3.1
+ resolution: "picomatch@npm:2.3.1"
+ checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be
+ languageName: node
+ linkType: hard
+
+"require-from-string@npm:^2.0.2":
+ version: 2.0.2
+ resolution: "require-from-string@npm:2.0.2"
+ checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2
+ languageName: node
+ linkType: hard
+
+"schema-utils@npm:^4.3.0, schema-utils@npm:^4.3.3":
+ version: 4.3.3
+ resolution: "schema-utils@npm:4.3.3"
+ dependencies:
+ "@types/json-schema": "npm:^7.0.9"
+ ajv: "npm:^8.9.0"
+ ajv-formats: "npm:^2.1.1"
+ ajv-keywords: "npm:^5.1.0"
+ checksum: 10c0/1c8d2c480a026d7c02ab2ecbe5919133a096d6a721a3f201fa50663e4f30f6d6ba020dfddd93cb828b66b922e76b342e103edd19a62c95c8f60e9079cc403202
+ languageName: node
+ linkType: hard
+
+"semver@npm:^7.3.4":
+ version: 7.7.4
+ resolution: "semver@npm:7.7.4"
+ bin:
+ semver: bin/semver.js
+ checksum: 10c0/5215ad0234e2845d4ea5bb9d836d42b03499546ddafb12075566899fc617f68794bb6f146076b6881d755de17d6c6cc73372555879ec7dce2c2feee947866ad2
+ languageName: node
+ linkType: hard
+
+"source-map-support@npm:~0.5.20":
+ version: 0.5.21
+ resolution: "source-map-support@npm:0.5.21"
+ dependencies:
+ buffer-from: "npm:^1.0.0"
+ source-map: "npm:^0.6.0"
+ checksum: 10c0/9ee09942f415e0f721d6daad3917ec1516af746a8120bba7bb56278707a37f1eb8642bde456e98454b8a885023af81a16e646869975f06afc1a711fb90484e7d
+ languageName: node
+ linkType: hard
+
+"source-map@npm:^0.6.0":
+ version: 0.6.1
+ resolution: "source-map@npm:0.6.1"
+ checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011
+ languageName: node
+ linkType: hard
+
+"source-map@npm:^0.7.4":
+ version: 0.7.6
+ resolution: "source-map@npm:0.7.6"
+ checksum: 10c0/59f6f05538539b274ba771d2e9e32f6c65451982510564438e048bc1352f019c6efcdc6dd07909b1968144941c14015c2c7d4369fb7c4d7d53ae769716dcc16c
+ languageName: node
+ linkType: hard
+
+"supports-color@npm:^7.1.0":
+ version: 7.2.0
+ resolution: "supports-color@npm:7.2.0"
+ dependencies:
+ has-flag: "npm:^4.0.0"
+ checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124
+ languageName: node
+ linkType: hard
+
+"supports-color@npm:^8.0.0":
+ version: 8.1.1
+ resolution: "supports-color@npm:8.1.1"
+ dependencies:
+ has-flag: "npm:^4.0.0"
+ checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89
+ languageName: node
+ linkType: hard
+
+"tapable@npm:^2.3.0":
+ version: 2.3.2
+ resolution: "tapable@npm:2.3.2"
+ checksum: 10c0/45ec8bd8963907f35bba875f9b3e9a5afa5ba11a9a4e4a2d7b2313d983cb2741386fd7dd3e54b13055b2be942971aac369d197e02263ec9216c59c0a8069ed7f
+ languageName: node
+ linkType: hard
+
+"terser-webpack-plugin@npm:^5.3.16":
+ version: 5.4.0
+ resolution: "terser-webpack-plugin@npm:5.4.0"
+ dependencies:
+ "@jridgewell/trace-mapping": "npm:^0.3.25"
+ jest-worker: "npm:^27.4.5"
+ schema-utils: "npm:^4.3.0"
+ terser: "npm:^5.31.1"
+ peerDependencies:
+ webpack: ^5.1.0
+ peerDependenciesMeta:
+ "@swc/core":
+ optional: true
+ esbuild:
+ optional: true
+ uglify-js:
+ optional: true
+ checksum: 10c0/1feed4b9575af795dae6af0c8f0d76d6e1fb7b357b8628d90e834c23a651b918a58cdc48d0ae6c1f0581f74bc8169b33c3b8d049f2d2190bac4e310964e59fde
+ languageName: node
+ linkType: hard
+
+"terser@npm:^5.31.1":
+ version: 5.44.1
+ resolution: "terser@npm:5.44.1"
+ dependencies:
+ "@jridgewell/source-map": "npm:^0.3.3"
+ acorn: "npm:^8.15.0"
+ commander: "npm:^2.20.0"
+ source-map-support: "npm:~0.5.20"
+ bin:
+ terser: bin/terser
+ checksum: 10c0/ee7a76692cb39b1ed22c30ff366c33ff3c977d9bb769575338ff5664676168fcba59192fb5168ef80c7cd901ef5411a1b0351261f5eaa50decf0fc71f63bde75
+ languageName: node
+ linkType: hard
+
+"to-regex-range@npm:^5.0.1":
+ version: 5.0.1
+ resolution: "to-regex-range@npm:5.0.1"
+ dependencies:
+ is-number: "npm:^7.0.0"
+ checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892
+ languageName: node
+ linkType: hard
+
+"ts-loader@npm:9.5.1":
+ version: 9.5.1
+ resolution: "ts-loader@npm:9.5.1"
+ dependencies:
+ chalk: "npm:^4.1.0"
+ enhanced-resolve: "npm:^5.0.0"
+ micromatch: "npm:^4.0.0"
+ semver: "npm:^7.3.4"
+ source-map: "npm:^0.7.4"
+ peerDependencies:
+ typescript: "*"
+ webpack: ^5.0.0
+ checksum: 10c0/7dc1e3e5d3d032b6ef27836032f02c57077dfbcdf5817cbbc16b7b8609e7ed1d0ec157a03eaac07960161d8ad4a9e030c4d6722fe33540cf6ee75156c7f9c33d
+ languageName: node
+ linkType: hard
+
+"typescript@npm:5.9.3":
+ version: 5.9.3
+ resolution: "typescript@npm:5.9.3"
+ bin:
+ tsc: bin/tsc
+ tsserver: bin/tsserver
+ checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5
+ languageName: node
+ linkType: hard
+
+"typescript@patch:typescript@npm%3A5.9.3#optional!builtin":
+ version: 5.9.3
+ resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5"
+ bin:
+ tsc: bin/tsc
+ tsserver: bin/tsserver
+ checksum: 10c0/ad09fdf7a756814dce65bc60c1657b40d44451346858eea230e10f2e95a289d9183b6e32e5c11e95acc0ccc214b4f36289dcad4bf1886b0adb84d711d336a430
+ languageName: node
+ linkType: hard
+
+"undici-types@npm:~7.16.0":
+ version: 7.16.0
+ resolution: "undici-types@npm:7.16.0"
+ checksum: 10c0/3033e2f2b5c9f1504bdc5934646cb54e37ecaca0f9249c983f7b1fc2e87c6d18399ebb05dc7fd5419e02b2e915f734d872a65da2e3eeed1813951c427d33cc9a
+ languageName: node
+ linkType: hard
+
+"update-browserslist-db@npm:^1.2.3":
+ version: 1.2.3
+ resolution: "update-browserslist-db@npm:1.2.3"
+ dependencies:
+ escalade: "npm:^3.2.0"
+ picocolors: "npm:^1.1.1"
+ peerDependencies:
+ browserslist: ">= 4.21.0"
+ bin:
+ update-browserslist-db: cli.js
+ checksum: 10c0/13a00355ea822388f68af57410ce3255941d5fb9b7c49342c4709a07c9f230bbef7f7499ae0ca7e0de532e79a82cc0c4edbd125f1a323a1845bf914efddf8bec
+ languageName: node
+ linkType: hard
+
+"watchpack@npm:^2.5.1":
+ version: 2.5.1
+ resolution: "watchpack@npm:2.5.1"
+ dependencies:
+ glob-to-regexp: "npm:^0.4.1"
+ graceful-fs: "npm:^4.1.2"
+ checksum: 10c0/dffbb483d1f61be90dc570630a1eb308581e2227d507d783b1d94a57ac7b705ecd9a1a4b73d73c15eab596d39874e5276a3d9cb88bbb698bafc3f8d08c34cf17
+ languageName: node
+ linkType: hard
+
+"webpack-sources@npm:^3.3.3":
+ version: 3.3.4
+ resolution: "webpack-sources@npm:3.3.4"
+ checksum: 10c0/94a42508531338eb41939cf1d48a4a8a6db97f3a47e5453cff2133a68d3169ca779d4bcbe9dfed072ce16611959eba1e16f085bc2dc56714e1a1c1783fd661a3
+ languageName: node
+ linkType: hard
+
+"webpack@npm:5.105.2":
+ version: 5.105.2
+ resolution: "webpack@npm:5.105.2"
+ dependencies:
+ "@types/eslint-scope": "npm:^3.7.7"
+ "@types/estree": "npm:^1.0.8"
+ "@types/json-schema": "npm:^7.0.15"
+ "@webassemblyjs/ast": "npm:^1.14.1"
+ "@webassemblyjs/wasm-edit": "npm:^1.14.1"
+ "@webassemblyjs/wasm-parser": "npm:^1.14.1"
+ acorn: "npm:^8.15.0"
+ acorn-import-phases: "npm:^1.0.3"
+ browserslist: "npm:^4.28.1"
+ chrome-trace-event: "npm:^1.0.2"
+ enhanced-resolve: "npm:^5.19.0"
+ es-module-lexer: "npm:^2.0.0"
+ eslint-scope: "npm:5.1.1"
+ events: "npm:^3.2.0"
+ glob-to-regexp: "npm:^0.4.1"
+ graceful-fs: "npm:^4.2.11"
+ json-parse-even-better-errors: "npm:^2.3.1"
+ loader-runner: "npm:^4.3.1"
+ mime-types: "npm:^2.1.27"
+ neo-async: "npm:^2.6.2"
+ schema-utils: "npm:^4.3.3"
+ tapable: "npm:^2.3.0"
+ terser-webpack-plugin: "npm:^5.3.16"
+ watchpack: "npm:^2.5.1"
+ webpack-sources: "npm:^3.3.3"
+ peerDependenciesMeta:
+ webpack-cli:
+ optional: true
+ bin:
+ webpack: bin/webpack.js
+ checksum: 10c0/565df8072c00d72e0a22e136971862b7eac7beb8b8d39a2ae4ab00838941ea58acc5b49dd7ea268e3d839810756cb86ba5c272b3a25904f6db7807cfa8ed0b29
+ languageName: node
+ linkType: hard
diff --git a/test/performance/createBenchmarkTest.ts b/test/performance/createBenchmarkTest.ts
index 2a124fd891..d424567701 100644
--- a/test/performance/createBenchmarkTest.ts
+++ b/test/performance/createBenchmarkTest.ts
@@ -10,7 +10,15 @@ import type { Server } from './server'
import { startPerformanceServer } from './server'
import { CLIENT_TOKEN, APPLICATION_ID, DATADOG_SITE, SDK_BUNDLE_URL } from './configuration'
-const SCENARIO_CONFIGURATIONS = ['none', 'rum', 'rum_replay', 'rum_profiling', 'none_with_headers'] as const
+const SCENARIO_CONFIGURATIONS = [
+ 'none',
+ 'rum',
+ 'rum_replay',
+ 'rum_profiling',
+ 'none_with_headers',
+ 'instrumented_no_probes',
+ 'instrumented_with_probes',
+] as const
type ScenarioConfiguration = (typeof SCENARIO_CONFIGURATIONS)[number]
type TestRunner = (page: Page, takeMeasurements: () => Promise, appUrl: string) => Promise | void
@@ -38,8 +46,12 @@ export function createBenchmarkTest(scenarioName: string) {
const { stopProfiling, takeMeasurements } = await startProfiling(page, cdpSession)
- if (shouldInjectSDK(scenarioConfiguration)) {
- await injectSDK(page, scenarioConfiguration, scenarioName)
+ if (shouldInjectRumSDK(scenarioConfiguration)) {
+ await injectRumSDK(page, scenarioConfiguration, scenarioName)
+ }
+
+ if (shouldInjectDebugger(scenarioConfiguration)) {
+ await injectDebugger(page, scenarioConfiguration, scenarioName)
}
await runner(page, takeMeasurements, buildAppUrl(server.origin, scenarioConfiguration))
@@ -70,7 +82,7 @@ interface PageInitScriptParameters {
scenarioName: string
}
-async function injectSDK(page: Page, scenarioConfiguration: ScenarioConfiguration, scenarioName: string) {
+async function injectRumSDK(page: Page, scenarioConfiguration: ScenarioConfiguration, scenarioName: string) {
const configuration: Partial = {
clientToken: CLIENT_TOKEN,
applicationId: APPLICATION_ID,
@@ -116,6 +128,88 @@ async function injectSDK(page: Page, scenarioConfiguration: ScenarioConfiguratio
)
}
+async function injectDebugger(page: Page, scenarioConfiguration: ScenarioConfiguration, _scenarioName: string) {
+ // Set flag for app to use instrumented functions
+ await page.addInitScript(() => {
+ ;(window as any).USE_INSTRUMENTED = true
+ })
+
+ // Load debugger SDK (using local build for now)
+ await page.addInitScript(() => {
+ // Define global hooks that instrumented code expects
+ // These do minimal work that the VM can't optimize away
+ // Signatures match the real implementations from packages/debugger/src/domain/api.ts
+
+ // Pre-populate with a placeholder key to help V8 optimize property lookups.
+ // Removing this shows a much larger performance overhead.
+ // Benchmarks show that using an object is much faster than a Map.
+ const probesObj: Record = { __placeholder__: undefined }
+
+ // Container used to hold some data manipulated by the $dd_* functions to ensure the VM doesn't optimize them away.
+ const callCounts = { entry: 0, return: 0, throw: 0 }
+
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
+ ;(window as any).$dd_probes = (functionId: string) => probesObj[functionId]
+ ;(window as any).$dd_entry = (_probes: any[], _self: any, _args: Record) => {
+ callCounts.entry++
+ }
+ ;(window as any).$dd_return = (
+ _probes: any[],
+ value: any,
+ _self: any,
+ _args: Record,
+ _locals: Record
+ ) => {
+ callCounts.return++
+ return value // eslint-disable-line @typescript-eslint/no-unsafe-return
+ }
+ ;(window as any).$dd_throw = (_probes: any[], _error: Error, _self: any, _args: Record) => {
+ callCounts.throw++
+ }
+
+ // Variables starting with $_dd are not going to exist in the real code, but are on the global scope in this benchmark to allow the benchmark to modify them.
+ ;(window as any).$_dd_probesObj = probesObj
+ ;(window as any).$_dd_callCounts = callCounts
+ })
+
+ // Initialize debugger after page loads
+ await page.addInitScript(
+ ({ scenarioConfiguration }: { scenarioConfiguration: ScenarioConfiguration }) => {
+ document.addEventListener('DOMContentLoaded', () => {
+ // In a real scenario, DD_DEBUGGER would be loaded from a bundle
+ // For now, we're just testing the instrumentation overhead with the hooks
+ const browserWindow = window as any
+
+ // Mock init that sets up the hooks properly
+ if (!browserWindow.DD_DEBUGGER) {
+ browserWindow.DD_DEBUGGER = {
+ init: () => {
+ // Hooks are already defined in the init script
+ },
+ version: 'test',
+ }
+
+ // Auto-init for testing
+ browserWindow.DD_DEBUGGER.init() // eslint-disable-line @typescript-eslint/no-unsafe-call
+
+ // Add probe for add1 in instrumented_with_probes scenario.
+ // In the real SDK, probes are added internally by the delivery API polling,
+ // not via a public method. Here we write directly to the probes object.
+ if (scenarioConfiguration === 'instrumented_with_probes') {
+ browserWindow.$_dd_probesObj['instrumented.ts;add1'] = [
+ {
+ id: 'test-probe',
+ functionId: 'instrumented.ts;add1',
+ },
+ ]
+ }
+ }
+ })
+ },
+ { scenarioConfiguration }
+ )
+}
+
/**
* Warm-up by loading a page to eliminate inflated TTFB seen on the very first load.
* Inflated TTFB can come from cold-path costs (DNS resolution, TCP/TLS handshake, etc.).
@@ -126,11 +220,17 @@ async function warmup(browser: Browser, url: string) {
}
async function getSDKVersion(page: Page) {
- return await page.evaluate(() => (window as BrowserWindow).DD_RUM?.version || '')
+ return await page.evaluate(
+ () => (window as BrowserWindow).DD_RUM?.version || (window as BrowserWindow).DD_DEBUGGER?.version || ''
+ )
}
-function shouldInjectSDK(scenarioConfiguration: ScenarioConfiguration): boolean {
- return !['none', 'none_with_headers'].includes(scenarioConfiguration)
+function shouldInjectRumSDK(scenarioConfiguration: ScenarioConfiguration): boolean {
+ return ['rum', 'rum_replay', 'rum_profiling'].includes(scenarioConfiguration)
+}
+
+function shouldInjectDebugger(scenarioConfiguration: ScenarioConfiguration): boolean {
+ return ['instrumented_no_probes', 'instrumented_with_probes'].includes(scenarioConfiguration)
}
function buildAppUrl(origin: string, scenarioConfiguration: ScenarioConfiguration): string {
@@ -138,6 +238,9 @@ function buildAppUrl(origin: string, scenarioConfiguration: ScenarioConfiguratio
if (scenarioConfiguration === 'rum_profiling' || scenarioConfiguration === 'none_with_headers') {
url.searchParams.set('profiling', 'true')
}
+ if (scenarioConfiguration === 'instrumented_no_probes' || scenarioConfiguration === 'instrumented_with_probes') {
+ url.searchParams.set('instrumented', 'true')
+ }
return url.toString()
}
diff --git a/test/performance/profiling.type.ts b/test/performance/profiling.type.ts
index 79c31d47a3..80805d822c 100644
--- a/test/performance/profiling.type.ts
+++ b/test/performance/profiling.type.ts
@@ -3,6 +3,10 @@ import type { RumPublicApi } from '@datadog/browser-rum-core'
export interface BrowserWindow extends Window {
DD_RUM?: RumPublicApi
+ DD_DEBUGGER?: {
+ init: () => void
+ version?: string
+ }
__webVitalsMetrics__?: WebVitalsMetrics
}
diff --git a/test/performance/scenarios/instrumentationOverhead.scenario.ts b/test/performance/scenarios/instrumentationOverhead.scenario.ts
new file mode 100644
index 0000000000..9e5252330b
--- /dev/null
+++ b/test/performance/scenarios/instrumentationOverhead.scenario.ts
@@ -0,0 +1,66 @@
+/* eslint-disable @typescript-eslint/no-unsafe-return */
+import { test } from '@playwright/test'
+import { createBenchmarkTest } from '../createBenchmarkTest'
+
+declare global {
+ interface Window {
+ testFunctions: {
+ add1: (a: number, b: number) => number
+ add2: (a: number, b: number) => number
+ }
+ }
+}
+
+test.describe('benchmark', () => {
+ void createBenchmarkTest('instrumentationOverhead').run(async (page, takeMeasurements, appUrl) => {
+ // Navigate to app and wait for initial load
+ await page.goto(appUrl, { waitUntil: 'domcontentloaded' })
+
+ // WARMUP PHASE: Allow JIT to optimize (100,000+ calls before measurement)
+ await page.evaluate(() => {
+ let warmupSum = 0
+ for (let i = 0; i < 100_000; i++) {
+ warmupSum += window.testFunctions.add1(i, i + 1)
+ warmupSum += window.testFunctions.add2(i, i + 1)
+ }
+ console.log('Warmup sum:', warmupSum) // Ensure VM doesn't eliminate warmup
+ })
+
+ // Start measuring after warmup
+ await takeMeasurements()
+
+ // MEASUREMENT PHASE: Heavy stress test
+ // Benchmark add1, but call add2 occasionally, which under the instrumented_with_probes scenario is instrumented.
+ // This is to measure if the instrumentation of add2 has an impact on the VM optimization of add1.
+ await page.evaluate(() => {
+ let sum1 = 0
+ let sum2 = 0
+
+ const start = performance.now()
+ for (let i = 0; i < 10_000_000; i++) {
+ sum1 += window.testFunctions.add1(i, i + 1)
+
+ if (i % 100_000 === 0) {
+ sum2 += window.testFunctions.add2(i, i + 1)
+ }
+ }
+ const totalTime = performance.now() - start
+
+ // Log accumulated results to ensure VM cannot optimize away function bodies
+ const callCounts = (window as any).$_dd_callCounts
+ const message = `Benchmark complete - ${totalTime.toFixed(1)}ms total, sum1: ${sum1}, sum2: ${sum2}${
+ callCounts
+ ? `, instrumentation: entry=${callCounts.entry} return=${callCounts.return} throw=${callCounts.throw}`
+ : ''
+ }`
+ console.log(message)
+
+ // Also set on window so we can retrieve it
+ ;(window as any).benchmarkResult = { sum1, sum2, totalTime, callCounts }
+ })
+
+ // Retrieve and log the result to verify it ran
+ const result = await page.evaluate(() => (window as any).benchmarkResult)
+ console.log('Playwright: Benchmark result:', result)
+ })
+})
diff --git a/test/performance/server.ts b/test/performance/server.ts
index fe53ed70f6..da02b15744 100644
--- a/test/performance/server.ts
+++ b/test/performance/server.ts
@@ -20,6 +20,7 @@ export function startPerformanceServer(scenarioName: string): Promise {
const appMap: Record = {
heavy: '../apps/react-heavy-spa/dist',
shopistLike: '../apps/react-shopist-like/dist',
+ instrumentationOverhead: '../apps/instrumentation-overhead',
}
const distPath = path.resolve(import.meta.dirname, appMap[scenarioName])