dd-trace-js icon indicating copy to clipboard operation
dd-trace-js copied to clipboard

Use async local storage in profiler

Open szegedi opened this issue 1 year ago • 3 comments

What does this PR do?

Updates the wall/cpu profiler so that instead of capturing the current span, local root span, and endpoint on each async context enter, it now computes them once for a context the first time it is encountered, and stores them in an async local storage. This reduces the computational burden on context enters. It is now reduced to setting a single property on the sample context object, which now serves as an additional level of indirection for the profiler to reach the current async store value.

Motivation

We're getting closer to the ideal of profiler sampling mechanism being able to use an async local store directly. It's a cleaner separation, greatly reduced work on context switches, and opens the way for adding custom context features to Node.js profiler.

szegedi avatar Sep 26 '24 15:09 szegedi

Overall package size

Self size: 7.18 MB Deduped: 62.54 MB No deduping: 62.82 MB

Dependency sizes | name | version | self size | total size | |------|---------|-----------|------------| | @datadog/native-appsec | 8.1.1 | 18.67 MB | 18.68 MB | | @datadog/native-iast-taint-tracking | 3.1.0 | 12.27 MB | 12.28 MB | | @datadog/pprof | 5.3.0 | 9.85 MB | 10.22 MB | | protobufjs | 7.2.5 | 2.77 MB | 5.16 MB | | @datadog/native-iast-rewriter | 2.4.1 | 2.14 MB | 2.23 MB | | @opentelemetry/core | 1.14.0 | 872.87 kB | 1.47 MB | | @datadog/native-metrics | 2.0.0 | 898.77 kB | 1.3 MB | | @opentelemetry/api | 1.8.0 | 1.21 MB | 1.21 MB | | jsonpath-plus | 9.0.0 | 580.4 kB | 1.03 MB | | import-in-the-middle | 1.8.1 | 71.67 kB | 785.15 kB | | msgpack-lite | 0.1.26 | 201.16 kB | 281.59 kB | | opentracing | 0.14.7 | 194.81 kB | 194.81 kB | | pprof-format | 2.1.0 | 111.69 kB | 111.69 kB | | @datadog/sketches-js | 2.1.0 | 109.9 kB | 109.9 kB | | semver | 7.6.3 | 95.82 kB | 95.82 kB | | lodash.sortby | 4.7.0 | 75.76 kB | 75.76 kB | | lru-cache | 7.14.0 | 74.95 kB | 74.95 kB | | ignore | 5.3.1 | 51.46 kB | 51.46 kB | | int64-buffer | 0.1.10 | 49.18 kB | 49.18 kB | | shell-quote | 1.8.1 | 44.96 kB | 44.96 kB | | istanbul-lib-coverage | 3.2.0 | 29.34 kB | 29.34 kB | | rfdc | 1.3.1 | 25.21 kB | 25.21 kB | | tlhunter-sorted-set | 0.1.0 | 24.94 kB | 24.94 kB | | limiter | 1.1.5 | 23.17 kB | 23.17 kB | | dc-polyfill | 0.1.4 | 23.1 kB | 23.1 kB | | retry | 0.13.1 | 18.85 kB | 18.85 kB | | jest-docblock | 29.7.0 | 8.99 kB | 12.76 kB | | crypto-randomuuid | 1.0.0 | 11.18 kB | 11.18 kB | | koalas | 1.0.2 | 6.47 kB | 6.47 kB | | path-to-regexp | 0.1.10 | 6.38 kB | 6.38 kB | | module-details-from-path | 1.0.3 | 4.47 kB | 4.47 kB |

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

github-actions[bot] avatar Sep 26 '24 15:09 github-actions[bot]

Benchmarks

Benchmark execution time: 2024-09-26 15:54:32

Comparing candidate commit 1eea9938eaf1af2cb3b8d4914c9e4a0d2ac37242 in PR branch szegedi/asynclocalstorage-profiler with baseline commit 7e3abec80fa8f8e3b0cb5c64906702ef5285cca2 in branch master.

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

pr-commenter[bot] avatar Sep 26 '24 15:09 pr-commenter[bot]

@szegedi is this something you could have another look at? :)

BridgeAR avatar May 28 '25 23:05 BridgeAR

Ping @szegedi

BridgeAR avatar Jul 07 '25 23:07 BridgeAR

@szegedi Is this something you plan to get to the finish line? Did the new approach end up working or is it not feasible?

rochdev avatar Aug 11 '25 15:08 rochdev

@szegedi PTAL, I believe this got superseded by https://github.com/DataDog/dd-trace-js/pull/5743

BridgeAR avatar Sep 27 '25 09:09 BridgeAR

@szegedi Is this something you plan to get to the finish line? Did the new approach end up working or is it not feasible?

It's somewhat orthogonal to the ACF work (which ended up working, FWIW :-) ) – the end goal here would've been to create an API for the customer to add business-logic specific tags to samples, similar to how profilers for Java and Go already do: https://docs.datadoghq.com/profiler/guide/isolate-outliers-in-monolithic-services/?tab=java#isolate-your-own-business-logic. But I probably need to rethink the logic anyhow.

szegedi avatar Oct 22 '25 13:10 szegedi