Skip to content

feat(debugger): add snapshot time budget#6897

Merged
watson merged 1 commit intomasterfrom
watson/DEBUG-4727/debugger-snapshot-time-budget
Nov 21, 2025
Merged

feat(debugger): add snapshot time budget#6897
watson merged 1 commit intomasterfrom
watson/DEBUG-4727/debugger-snapshot-time-budget

Conversation

@watson
Copy link
Copy Markdown
Collaborator

@watson watson commented Nov 12, 2025

What does this PR do?

  • Enforces a per-snapshot time budget for Dynamic Instrumentation debugger snapshots.
  • Default budget is 15ms; configurable via:
    • Env var: DD_DYNAMIC_INSTRUMENTATION_CAPTURE_TIMEOUT_MS
    • Programmatic: tracer.init({ dynamicInstrumentation: { captureTimeoutMs }})
  • When the budget is exceeded, remaining values that are not already resolved or in the process of being resolved (awaiting a session.post promise), are marked with notCapturedReason: 'timeout'.
  • Enforce max concurrency when resolving object properties (previously objects would have their properties resolved in parallel, now we enforce a max concurrency of two)
  • Adds unit and integration tests to validate partial snapshots under tight budgets.

Motivation

Prevent snapshot collection from exceeding acceptable latency and resource usage in complex/large object graphs.

Additional Notes

Depends on DataDog/system-tests#5705

Not covered by this PR:

Copy link
Copy Markdown
Collaborator Author

watson commented Nov 12, 2025

This stack of pull requests is managed by Graphite. Learn more about stacking.

@watson watson self-assigned this Nov 12, 2025
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Nov 12, 2025

Overall package size

Self size: 13.26 MB
Deduped: 116.17 MB
No deduping: 131.18 MB

Dependency sizes | name | version | self size | total size | |------|---------|-----------|------------| | @datadog/libdatadog | 0.7.0 | 35.02 MB | 35.02 MB | | @datadog/native-appsec | 10.3.0 | 20.73 MB | 20.74 MB | | @datadog/native-iast-taint-tracking | 4.0.0 | 11.72 MB | 11.73 MB | | @datadog/pprof | 5.12.0 | 11.19 MB | 11.57 MB | | @opentelemetry/resources | 1.30.1 | 557.67 kB | 7.71 MB | | @opentelemetry/core | 1.30.1 | 908.66 kB | 7.16 MB | | protobufjs | 7.5.4 | 2.95 MB | 5.83 MB | | @datadog/wasm-js-rewriter | 5.0.1 | 2.82 MB | 3.53 MB | | @datadog/native-metrics | 3.1.1 | 1.02 MB | 1.43 MB | | @opentelemetry/api-logs | 0.208.0 | 199.48 kB | 1.42 MB | | @opentelemetry/api | 1.9.0 | 1.22 MB | 1.22 MB | | jsonpath-plus | 10.3.0 | 617.18 kB | 1.08 MB | | import-in-the-middle | 1.15.0 | 127.66 kB | 856.24 kB | | lru-cache | 10.4.3 | 804.3 kB | 804.3 kB | | @datadog/openfeature-node-server | 0.2.0 | 118.51 kB | 437.19 kB | | opentracing | 0.14.7 | 194.81 kB | 194.81 kB | | source-map | 0.7.6 | 185.63 kB | 185.63 kB | | pprof-format | 2.2.1 | 163.06 kB | 163.06 kB | | @datadog/sketches-js | 2.1.1 | 109.9 kB | 109.9 kB | | @isaacs/ttlcache | 2.1.1 | 90.58 kB | 90.58 kB | | lodash.sortby | 4.7.0 | 75.76 kB | 75.76 kB | | ignore | 7.0.5 | 63.38 kB | 63.38 kB | | istanbul-lib-coverage | 3.2.2 | 34.37 kB | 34.37 kB | | rfdc | 1.4.1 | 27.15 kB | 27.15 kB | | dc-polyfill | 0.1.10 | 26.73 kB | 26.73 kB | | tlhunter-sorted-set | 0.1.0 | 24.94 kB | 24.94 kB | | shell-quote | 1.8.3 | 23.74 kB | 23.74 kB | | limiter | 1.1.5 | 23.17 kB | 23.17 kB | | retry | 0.13.1 | 18.85 kB | 18.85 kB | | semifies | 1.0.0 | 15.84 kB | 15.84 kB | | jest-docblock | 29.7.0 | 8.99 kB | 12.76 kB | | crypto-randomuuid | 1.0.0 | 11.18 kB | 11.18 kB | | ttl-set | 1.0.0 | 4.61 kB | 9.69 kB | | mutexify | 1.4.0 | 5.71 kB | 8.74 kB | | path-to-regexp | 0.1.12 | 6.6 kB | 6.6 kB | | module-details-from-path | 1.0.4 | 3.96 kB | 3.96 kB | | escape-string-regexp | 5.0.0 | 3.66 kB | 3.66 kB |

🤖 This report was automatically generated by heaviest-objects-in-the-universe

@codecov
Copy link
Copy Markdown

codecov Bot commented Nov 12, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 84.61%. Comparing base (f04d912) to head (5976953).
⚠️ Report is 4 commits behind head on master.

Additional details and impacted files
@@           Coverage Diff           @@
##           master    #6897   +/-   ##
=======================================
  Coverage   84.61%   84.61%           
=======================================
  Files         505      505           
  Lines       21166    21170    +4     
=======================================
+ Hits        17909    17913    +4     
  Misses       3257     3257           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@watson watson added the debugger Dynamic Instrumentation & Live Debugger label Nov 12, 2025
@pr-commenter
Copy link
Copy Markdown

pr-commenter Bot commented Nov 12, 2025

Benchmarks

Benchmark execution time: 2025-11-21 07:17:39

Comparing candidate commit 5976953 in PR branch watson/DEBUG-4727/debugger-snapshot-time-budget with baseline commit f04d912 in branch master.

Found 0 performance improvements and 0 performance regressions! Performance is the same for 291 metrics, 29 unstable metrics.

@watson watson force-pushed the watson/DEBUG-4727/debugger-snapshot-time-budget branch from 3f58922 to 1992630 Compare November 12, 2025 14:52
@watson watson marked this pull request as ready for review November 12, 2025 15:20
@watson watson requested review from a team as code owners November 12, 2025 15:20
@watson watson requested review from BridgeAR and removed request for a team November 12, 2025 15:20
@watson watson force-pushed the watson/DEBUG-4727/debugger-snapshot-time-budget branch from 1992630 to 03362e2 Compare November 12, 2025 15:23
@datadog-datadog-prod-us1

This comment has been minimized.

Comment thread packages/dd-trace/src/supported-configurations.json
tylfin
tylfin previously approved these changes Nov 12, 2025
@watson watson marked this pull request as draft November 13, 2025 08:49
@watson watson force-pushed the watson/DEBUG-4727/debugger-snapshot-time-budget branch 2 times, most recently from 4f232ba to c5280f9 Compare November 13, 2025 10:01
@watson watson force-pushed the watson/DEBUG-4727/debugger-snapshot-time-budget branch from c5280f9 to b9b7fa5 Compare November 13, 2025 13:31
@watson watson force-pushed the watson/DEBUG-4727/debugger-snapshot-time-budget branch 2 times, most recently from ddd5ec0 to bfd99a1 Compare November 14, 2025 10:27
@watson watson marked this pull request as ready for review November 14, 2025 10:29
@watson watson force-pushed the watson/DEBUG-4727/debugger-snapshot-time-budget branch 2 times, most recently from 65c4e4b to 4a970c8 Compare November 14, 2025 11:31
@watson watson force-pushed the watson/DEBUG-4727/debugger-snapshot-time-budget branch 2 times, most recently from c5336bf to af0b05b Compare November 17, 2025 14:45
@watson watson requested a review from BridgeAR November 18, 2025 12:34
@watson watson force-pushed the watson/DEBUG-4727/debugger-snapshot-time-budget branch 2 times, most recently from 1f3788c to bed66ba Compare November 20, 2025 09:58
@watson watson changed the base branch from master to v5.x November 20, 2025 11:19
@watson watson requested review from a team as code owners November 20, 2025 11:19
@watson watson changed the base branch from v5.x to master November 20, 2025 11:19
@watson watson removed request for a team November 20, 2025 11:20
Enforce a per-snapshot time budget. By default this budget is 15ms, but
can be modified by the experimental config, either as an environment
variable:

    DD_DYNAMIC_INSTRUMENTATION_CAPTURE_TIMEOUT_MS=20

Or programatically:

    tracer.init({
      dynamicInstrumentation: {
        captureTimeoutMs: 20
      }
    })

When the budget is exceeded, remaining values that are not already
resolved, are marked with `notCapturedReason: 'timeout'`.
@watson watson force-pushed the watson/DEBUG-4727/debugger-snapshot-time-budget branch from bed66ba to 5976953 Compare November 20, 2025 12:50
Copy link
Copy Markdown
Member

@BridgeAR BridgeAR left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I focused on the code and I did not review the tests.

The code is LGTM.

@watson watson merged commit 2dd3573 into master Nov 21, 2025
786 checks passed
@watson watson deleted the watson/DEBUG-4727/debugger-snapshot-time-budget branch November 21, 2025 11:00
dd-octo-sts Bot pushed a commit that referenced this pull request Nov 22, 2025
Enforce a per-snapshot time budget. By default this budget is 15ms, but
can be modified by the experimental config, either as an environment
variable:

    DD_DYNAMIC_INSTRUMENTATION_CAPTURE_TIMEOUT_MS=20

Or programatically:

    tracer.init({
      dynamicInstrumentation: {
        captureTimeoutMs: 20
      }
    })

When the budget is exceeded, remaining values that are not already
resolved, are marked with `notCapturedReason: 'timeout'`.
@dd-octo-sts dd-octo-sts Bot mentioned this pull request Nov 22, 2025
BridgeAR pushed a commit that referenced this pull request Dec 17, 2025
Enforce a per-snapshot time budget. By default this budget is 15ms, but
can be modified by the experimental config, either as an environment
variable:

    DD_DYNAMIC_INSTRUMENTATION_CAPTURE_TIMEOUT_MS=20

Or programatically:

    tracer.init({
      dynamicInstrumentation: {
        captureTimeoutMs: 20
      }
    })

When the budget is exceeded, remaining values that are not already
resolved, are marked with `notCapturedReason: 'timeout'`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

debugger Dynamic Instrumentation & Live Debugger semver-minor

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants