Add Live Debugger package#4449
Merged
Merged
Conversation
|
All contributors have signed the CLA ✍️ ✅ |
Collaborator
Author
This stack of pull requests is managed by Graphite. Learn more about stacking. |
🎉 All green!❄️ No new flaky tests detected 🎯 Code Coverage (details) 🔗 Commit SHA: a310727 | Docs | Datadog PR Page | Give us feedback! |
4df303f to
b539c14
Compare
Bundles Sizes Evolution
🚀 CPU Performance
🧠 Memory Performance
|
Collaborator
Author
|
I have read the CLA Document and I hereby sign the CLA |
3042bfe to
98490f7
Compare
4 tasks
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 98490f775f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
This was referenced Apr 7, 2026
9bbedbf to
bf9a162
Compare
This was referenced Apr 14, 2026
Ensure we don't publish it while WIP
In the browser there's no trace or span id
Replace the hand-rolled `$dd_*` stub hooks with the actual published SDK
so the benchmark measures real per-call instrumentation overhead, not
the cost of counter-incrementing stubs. With the stubs the
`instrumented_with_probes` configuration came in at roughly the same
cost as `none`; with the real SDK it's ~1.65 µs per call, which is the
number we actually want to track.
For the measurement to be statistically sound the SDK has to be fully
ready before the warmup loop runs, otherwise V8 JIT-optimizes against
an intermediate `$dd_probes`-undefined shape and then deopts mid-flight
once probes appear. To get there:
- Inline the built debugger bundle via `addInitScript({ path })` so
`DD_DEBUGGER` is defined before the test app's script tag executes.
- Mock the SDK's same-origin probe-delivery endpoint on the perf
server, routing off the request body's `service` field so parallel
benchmark workers stay isolated.
- Gate the scenario's warmup on a `__benchmarkReady` flag that the
injector flips only after `init()` returns and (for
`instrumented_with_probes`) the first poll has populated the registry.
The probe used for `instrumented_with_probes` is a typical low-impact
`LOG_PROBE` (`captureSnapshot: false`, `snapshotsPerSecond: 1`), so
measurement stays focused on probe-lookup + sampling-check cost rather
than intake traffic. The SDK's `pollInterval` is set to one day so
re-polls can't perturb the measurement window.
Previously, the Debugger SDK set `source: 'dd_debugger'` on its init configuration so it would flow into the `ddsource` URL parameter, which forced `validateAndBuildConfiguration` to convert it back to 'browser' via a `toSdkSource` helper before storing on `Configuration.source` (used as the SDK source on RUM events). The round-trip was confusing because the same field was playing two roles: URL routing source and RUM event SDK source. Split them apart: - `InitConfiguration.source` no longer accepts 'dd_debugger'. - `computeTransportConfiguration` takes an optional `sourceOverride` parameter (typed `TransportSource`, includes 'dd_debugger') used only for URL building. The Debugger SDK passes 'dd_debugger' there. - Function overloads narrow the return type when no override is given, so `Configuration.source` is `SdkSource` without a runtime conversion. - `toSdkSource` is removed. Wire behavior is unchanged: URLs still go out with `?ddsource=dd_debugger&...&dd-evp-origin=browser`, RUM events still carry a valid `SdkSource`, and downstream `source:dd_debugger` queries keep working.
ce9f93d to
09376b1
Compare
273842f to
b297a1b
Compare
BenoitZugmeyer
approved these changes
May 11, 2026
The previous commit (09376b1) widened `TransportConfiguration.source` to `TransportSource` so the `dd_debugger` override could ride through it. That forced `Configuration` to redeclare `source: SdkSource` to narrow the inherited type back down for consumers like `defaultContext.ts` (where `RumEvent.source` does not accept `dd_debugger`), and it required overload signatures on `computeTransportConfiguration` to preserve that narrowing at the return-type boundary. None of that is actually necessary: nothing reads `source` off a `TransportConfiguration` outside of `validateAndBuildConfiguration` spreading it into `Configuration`. The override only needs to reach the endpoint builders so the `ddsource` URL parameter gets the right value. Keep the override strictly internal to URL building: - `TransportConfiguration.source` is back to `SdkSource`, matching its pre-09376b12b shape. - `computeTransportConfiguration` drops the overload pair and exposes a single signature with optional `sourceOverride`. - The override is plumbed into `ResolvedSourceInitConfiguration` and flows to the endpoint builders, but the returned struct's `source` is always the validated `SdkSource`. - The redundant `source: SdkSource` redeclaration on `Configuration` is removed. Wire behavior is unchanged: URLs still go out with `?ddsource=dd_debugger&...&dd-evp-origin=browser`.
b297a1b to
0f3dfe2
Compare
As we are adding more tests, Karma is sending more messages from the browser to the node process. Those tests are piling up sometimes in browserstack, and it takes some time for them to reach the node process. Increasing the timeout should help.
Json schemas where parsed every time an event was emitted, which was very ineficient in Firefox 67 and triggered a LOT of GC pauses, which might be the root cause of timeouts.
thomas-lebeau
approved these changes
May 12, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Motivation
Introduce the
@datadog/browser-debuggerpackage to enable Live Debugger in browser applications. This gives frontend developers the ability to add log probes to running applications, evaluate conditions, and inspect runtime state — all without redeploying or modifying source code.Changes
New package:
packages/debuggerA new
@datadog/browser-debuggerpackage that provides the full probe execution pipeline:domain/api.ts— Core instrumentation hooks (onEntry,onReturn,onThrow) that execute probes when instrumented functions are called, including condition evaluation, snapshot capture, template message rendering, and rate limiting.domain/activeEntries.ts— Tracks per-probe execution stacks for correlating entry/return/throw events, extracted to break the dependency cycle betweenapi.tsandprobes.ts.domain/probes.ts— Probe lifecycle management (add, remove, clear) with per-probe and global snapshot rate limiting. Compiles probe conditions and template segments on registration.domain/capture.ts— Deep value capture for arguments, locals, return values, and thrown errors with configurable reference depth, collection size limits, and string length limits.domain/expression.ts— Expression compiler that parses JSON expression trees (comparisons, logical operators, member access, string operations, etc.) into executable functions.domain/condition.ts— Probe condition evaluator that compiles and caches condition expressions.domain/template.ts— Template segment compiler and evaluator for rendering dynamic probe messages with runtime context.domain/stacktrace.ts— Stack trace capture and parsing fromErrorobjects.domain/deliveryApi.ts— Polling-based probe delivery client that fetches probe updates/deletions from the Delivery API using a cursor for incremental sync.transport/startDebuggerBatch.ts— Transport layer that reuses@datadog/browser-core's batch/flush infrastructure to send debugger snapshots to the logs intake.entries/main.ts— Public API surface (datadogDebugger.init()). Exposes$dd_entry/$dd_return/$dd_throw/$dd_probeshooks onglobalThisfor instrumented code. Defines the globalDD_DEBUGGERobject.Changes to
@datadog/browser-core'dd_debugger'as a valid source in configuration and transport types, mapped to'browser'for the SDK source.computeTransportConfigurationand theBatchtype so the debugger package can create its own transport.E2E test framework and scenarios
test/e2e/scenario/debugger.scenario.ts— 7 E2E test scenarios covering: basic snapshot sending, argument/return value capture, exception capture on throw, template message evaluation with expression segments, condition evaluation (both met and not met), and RUM correlation..withDebugger()builder method tocreateTest(),DebuggerIntakeRequesttype andintakeRegistry.debuggerEventsfor asserting on debugger events, debugger page setups for CDN/bundle/npm modes, and default debugger configuration.test/apps/vanilla/app.ts— Added@datadog/browser-debuggerimport andDEBUGGER_INITsupport so debugger E2E tests work in the npm setup.Performance benchmarks
test/apps/instrumentation-overhead/— Webpack test app for measuring instrumentation overhead with instrumented vs. uninstrumented function variants.test/performance/scenarios/instrumentationOverhead.scenario.ts— Benchmark scenario that stress-tests 10M function calls to measure the overhead of debugger instrumentation hooks.test/performance/createBenchmarkTest.ts— Extended withinstrumented_no_probesandinstrumented_with_probesscenario configurations and a dedicatedinjectDebuggerfunction.Tooling
scripts/build/build-test-apps.tsto include the new test app and to use resolution paths when installing peer dependencies (needed for unpublished packages like@datadog/browser-debuggerthat only exist locally as.tgzfiles).scripts/dev-server/lib/server.tsto serve the debugger bundle.Test instructions
yarn test:unit --spec "packages/debugger/src/**/*.spec.ts"yarn test:e2e:init && yarn test:e2e -g "debugger"yarn build:apps && yarn test:performanceChecklist
Tested on staging— N/A, this is a new pre-production package not yet deployed to any environment