feat(debugger): add snapshot time budget#6897
Conversation
This stack of pull requests is managed by Graphite. Learn more about stacking. |
Overall package sizeSelf size: 13.26 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 Report✅ All modified and coverable lines are covered by tests. 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. 🚀 New features to boost your workflow:
|
BenchmarksBenchmark execution time: 2025-11-21 07:17:39 Comparing candidate commit 5976953 in PR branch Found 0 performance improvements and 0 performance regressions! Performance is the same for 291 metrics, 29 unstable metrics. |
3f58922 to
1992630
Compare
1992630 to
03362e2
Compare
This comment has been minimized.
This comment has been minimized.
4f232ba to
c5280f9
Compare
c5280f9 to
b9b7fa5
Compare
ddd5ec0 to
bfd99a1
Compare
65c4e4b to
4a970c8
Compare
c5336bf to
af0b05b
Compare
1f3788c to
bed66ba
Compare
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'`.
bed66ba to
5976953
Compare
BridgeAR
left a comment
There was a problem hiding this comment.
I focused on the code and I did not review the tests.
The code is LGTM.
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'`.
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'`.

What does this PR do?
DD_DYNAMIC_INSTRUMENTATION_CAPTURE_TIMEOUT_MStracer.init({ dynamicInstrumentation: { captureTimeoutMs }})session.postpromise), are marked withnotCapturedReason: 'timeout'.Motivation
Prevent snapshot collection from exceeding acceptable latency and resource usage in complex/large object graphs.
Additional Notes
Depends on DataDog/system-tests#5705Not covered by this PR:
Runtime.getPropertieson an array with a million elements will take much much longer than 15ms. I'll address this in follow up PRs (feat(debugger): add special handling for very large collections/objects #6912).