Skip to content

Conversation

@watson
Copy link
Collaborator

@watson watson commented Nov 27, 2025

What does this PR do?

Implements an intelligent snapshot pruning algorithm for Dynamic Instrumentation/Live Debugger that selectively removes the largest and deepest leaf nodes from oversized payloads while preserving the overall schema structure. This replaces the previous approach which simply deleted all captured variables when a snapshot exceeded the 1MB size limit.

Motivation

Align with how the other tracers prunes large snapshots.

Previously, when a snapshot payload exceeded 1MB, we would delete all captures entirely and show an error message to users. This was a poor user experience because users would lose all captured variable data, even though most of the snapshot was likely still valuable.

With this new pruning algorithm, we can intelligently reduce the size of oversized snapshots by removing only the least valuable data (deepest, largest nodes, and nodes that were already truncated due to depth limits), allowing users to still see most of their captured variables even when dealing with large data structures.

Additional Notes

The pruning algorithm:

  • Parses snapshots into a tree structure tracking JSON object positions
  • Uses a priority queue to select nodes for pruning based on:
    1. Presence of notCapturedReason: 'depth' (highest priority - already truncated data)
    2. Depth level (deeper nodes pruned first)
    3. Presence of any notCapturedReason (any truncated data)
    4. Size (larger nodes pruned first)
  • Only prunes nodes at level 6 or deeper (locals and below)
  • Promotes parent nodes when all children are pruned to reduce overhead
  • Iteratively prunes if needed to reach target size
  • Falls back to prune all everything if pruning fails or errors out

@github-actions
Copy link

github-actions bot commented Nov 27, 2025

Overall package size

Self size: 13.45 MB
Deduped: 113.64 MB
No deduping: 128.66 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/pprof | 5.12.0 | 11.19 MB | 11.57 MB | | @datadog/native-iast-taint-tracking | 4.1.0 | 9.01 MB | 9.02 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.2 | 90.79 kB | 90.79 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

Copy link
Collaborator Author

watson commented Nov 27, 2025

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

@codecov
Copy link

codecov bot commented Nov 27, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 84.94%. Comparing base (7a4b1c3) to head (693c32a).
⚠️ Report is 1 commits behind head on master.

Additional details and impacted files
@@           Coverage Diff           @@
##           master    #7006   +/-   ##
=======================================
  Coverage   84.94%   84.94%           
=======================================
  Files         514      514           
  Lines       21754    21754           
=======================================
  Hits        18478    18478           
  Misses       3276     3276           

☔ 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.

@pr-commenter
Copy link

pr-commenter bot commented Nov 27, 2025

Benchmarks

Benchmark execution time: 2025-12-01 10:51:29

Comparing candidate commit 693c32a in PR branch watson/DEBUG-2624/implement-pruning-algo with baseline commit 7a4b1c3 in branch master.

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

@watson watson self-assigned this Nov 28, 2025
@watson watson added semver-minor debugger Dynamic Instrumentation & Live Debugger labels Nov 28, 2025
@watson watson force-pushed the watson/DEBUG-2624/implement-pruning-algo branch 2 times, most recently from ecf4d0c to 2c58667 Compare November 28, 2025 10:05
@datadog-datadog-prod-us1
Copy link

datadog-datadog-prod-us1 bot commented Nov 28, 2025

⚠️ Tests

⚠️ Warnings

🧪 1 Test failed

Plugin couchbase with couchbase ^3.0.7 (3.0.7) without configuration "before each" hook for "should catch errors in callback and report error in trace" from errors are handled correctly in callbacks (Datadog)
Timeout of 5000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/home/runner/work/dd-trace-js/dd-trace-js/packages/datadog-plugin-couchbase/test/index.spec.js)

Error: Timeout of 5000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/home/runner/work/dd-trace-js/dd-trace-js/packages/datadog-plugin-couchbase/test/index.spec.js)
    at listOnTimeout (node:internal/timers:559:17)
    at processTimers (node:internal/timers:502:7)

ℹ️ Info

❄️ No new flaky tests detected

This comment will be updated automatically if new data arrives.
🔗 Commit SHA: 693c32a | Docs | Datadog PR Page | Was this helpful? Give us feedback!

@watson watson force-pushed the watson/DEBUG-2624/implement-pruning-algo branch 2 times, most recently from 90f07f4 to a217410 Compare November 30, 2025 07:13
@watson watson marked this pull request as ready for review November 30, 2025 07:16
@watson watson requested review from a team as code owners November 30, 2025 07:16
@watson watson force-pushed the watson/DEBUG-2624/implement-pruning-algo branch from a217410 to 7d33a6c Compare November 30, 2025 07:21
…payloads

Replace the crude "delete all captures" approach with an intelligent pruning
algorithm that selectively removes the largest and deepest leaf nodes while
preserving the schema structure.

The algorithm prunes like so:

- Parses snapshots into a tree structure tracking JSON object positions
- Uses a priority queue to select nodes for pruning based on:
  1. Presence of `notCapturedReason: 'depth'`
  2. Depth level (deeper nodes pruned first)
  3. Presence of any `notCapturedReason`
  4. Size (larger nodes pruned first)
- Only prunes nodes at level 6 or deeper (`locals`)
- Promotes parent nodes when all children are pruned to reduce overhead
- Iteratively prunes if needed to reach target size
@watson watson force-pushed the watson/DEBUG-2624/implement-pruning-algo branch from 7d33a6c to 693c32a Compare December 1, 2025 10:41
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.

2 participants