Skip to content

Conversation

@watson
Copy link
Collaborator

@watson watson commented Dec 6, 2025

What does this PR do?

Initialize a probes lastCaptureNs to BigInt(Number.MIN_SAFE_INTEGER), ensuring the first probe hit always passes the sampling check regardless of when it occurs.

Motivation

When a probe is added with any sampling rate, the first probe hit could be incorrectly skipped if it occurred within the sampling interval after process start.

This happened because lastCaptureNs was initialized to 0n, causing the sampling check start - probe.lastCaptureNs < probe.nsBetweenSampling to evaluate to true when the process had been running for less time than the sampling interval.

For example:

  • At 10 samples/sec: first hit skipped if within first 100ms
  • At 5 samples/sec: first hit skipped if within first 200ms
  • At 1 sample/sec: first hit skipped if within first 1 second
  • At 0.5 samples/sec: first hit skipped if within first 2 seconds

…captured

When a probe is added with any sampling rate, the first probe hit could
be incorrectly skipped if it occurred within the sampling interval after
process start.

This happened because `lastCaptureNs` was initialized to `0n`, causing
the sampling check
`start - probe.lastCaptureNs < probe.nsBetweenSampling` to evaluate to
true when the process had been running for less time than the sampling
interval.

For example:
- At 10 samples/sec: first hit skipped if within first 100ms
- At 5 samples/sec: first hit skipped if within first 200ms
- At 1 sample/sec: first hit skipped if within first 1 second
- At 0.5 samples/sec: first hit skipped if within first 2 seconds

Fix by initializing `lastCaptureNs` to
`BigInt(Number.MIN_SAFE_INTEGER)`, ensuring the first probe hit always
passes the sampling check regardless of when it occurs.
@watson watson requested review from a team as code owners December 6, 2025 10:11
@github-actions
Copy link

github-actions bot commented Dec 6, 2025

Overall package size

Self size: 13.6 MB
Deduped: 113.8 MB
No deduping: 128.82 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.3 | 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

@watson watson self-assigned this Dec 6, 2025
@watson watson added semver-patch debugger Dynamic Instrumentation & Live Debugger labels Dec 6, 2025
Copy link
Collaborator Author

watson commented Dec 6, 2025

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

@codecov
Copy link

codecov bot commented Dec 6, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 84.83%. Comparing base (581b163) to head (286e68c).

Additional details and impacted files
@@           Coverage Diff           @@
##           master    #7042   +/-   ##
=======================================
  Coverage   84.83%   84.83%           
=======================================
  Files         517      517           
  Lines       22050    22050           
=======================================
  Hits        18707    18707           
  Misses       3343     3343           

☔ 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 Dec 6, 2025

Benchmarks

Benchmark execution time: 2025-12-06 10:19:44

Comparing candidate commit 286e68c in PR branch watson/ensure-first-capture-happens with baseline commit 581b163 in branch master.

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

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-patch

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants