dd-trace-js
dd-trace-js copied to clipboard
Use async local storage in profiler
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.
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
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.
@szegedi is this something you could have another look at? :)
Ping @szegedi
@szegedi Is this something you plan to get to the finish line? Did the new approach end up working or is it not feasible?
@szegedi PTAL, I believe this got superseded by https://github.com/DataDog/dd-trace-js/pull/5743
@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.