lazy load runtime metrics only when needed#5254
Conversation
Overall package sizeSelf size: 8.77 MB Dependency sizes| name | version | self size | total size | |------|---------|-----------|------------| | @datadog/libdatadog | 0.4.0 | 29.44 MB | 29.44 MB | | @datadog/native-appsec | 8.4.0 | 19.25 MB | 19.26 MB | | @datadog/native-iast-taint-tracking | 3.3.0 | 13.77 MB | 13.78 MB | | @datadog/pprof | 5.5.1 | 9.79 MB | 10.17 MB | | protobufjs | 7.2.5 | 2.77 MB | 5.16 MB | | @datadog/native-iast-rewriter | 2.8.0 | 2.6 MB | 2.74 MB | | @opentelemetry/core | 1.14.0 | 872.87 kB | 1.47 MB | | @datadog/native-metrics | 3.1.0 | 1.06 MB | 1.46 MB | | @opentelemetry/api | 1.8.0 | 1.21 MB | 1.21 MB | | import-in-the-middle | 1.11.2 | 112.74 kB | 835.4 kB | | source-map | 0.7.4 | 226 kB | 226 kB | | opentracing | 0.14.7 | 194.81 kB | 194.81 kB | | lru-cache | 7.18.3 | 133.92 kB | 133.92 kB | | pprof-format | 2.1.0 | 111.69 kB | 111.69 kB | | @datadog/sketches-js | 2.1.0 | 109.9 kB | 109.9 kB | | lodash.sortby | 4.7.0 | 75.76 kB | 75.76 kB | | ignore | 5.3.2 | 53.63 kB | 53.63 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 | | @isaacs/ttlcache | 1.4.1 | 25.2 kB | 25.2 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 | | 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 | | path-to-regexp | 0.1.12 | 6.6 kB | 6.6 kB | | koalas | 1.0.2 | 6.47 kB | 6.47 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 |
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## master #5254 +/- ##
==========================================
- Coverage 81.24% 80.98% -0.27%
==========================================
Files 487 489 +2
Lines 21703 21856 +153
==========================================
+ Hits 17633 17700 +67
- Misses 4070 4156 +86 ☔ View full report in Codecov by Sentry. |
Datadog ReportBranch report: ✅ 0 Failed, 666 Passed, 0 Skipped, 13m 3.71s Total Time |
BenchmarksBenchmark execution time: 2025-02-24 18:08:04 Comparing candidate commit dc4e13f in PR branch Found 0 performance improvements and 8 performance regressions! Performance is the same for 894 metrics, 31 unstable metrics. scenario:log-skip-log-18
scenario:log-with-debug-18
scenario:log-with-error-18
scenario:log-without-log-18
scenario:plugin-graphql-with-depth-and-collapse-on-18
scenario:plugin-graphql-with-depth-on-max-18
|
6013e93 to
5e7bcdb
Compare
|
Does this affect user applications with runtime metrics disabled but who make use of custom metrics? |
No because custom metrics expose the underlying DogStatsD client directly and doesn't rely on runtime metrics and have their own scheduler in |
BridgeAR
left a comment
There was a problem hiding this comment.
LGTM. I just wondered if we really ever want to "go back" with stop.
| }, | ||
|
|
||
| stop () { | ||
| runtimeMetrics.stop() | ||
|
|
||
| Object.setPrototypeOf(module.exports, runtimeMetrics = noop) | ||
| } |
There was a problem hiding this comment.
I liked how the other PR replaced the whole object and it didn't allow going back. I guess when it's loaded once, we would not really need that anymore?
| }, | |
| stop () { | |
| runtimeMetrics.stop() | |
| Object.setPrototypeOf(module.exports, runtimeMetrics = noop) | |
| } | |
| }, |
There was a problem hiding this comment.
Yeah this was really just an optimization to free up memory if the feature is disabled. Some features cannot be disabled at runtime so that made less sense for those other PRs. Happy to remove it if you think keeping the code simpler is a better trade-off.
There was a problem hiding this comment.
I'll merge it like this for now, but happy to open a new PR if you think the optimization is not useful.
What does this PR do?
Lazy load runtime metrics only when needed.
Motivation
Right now when runtime metrics are disabled, the code is still loaded which impacts startup time.