Skip to content

lazy load runtime metrics only when needed#5254

Merged
rochdev merged 4 commits into
masterfrom
lazy-runtime-metrics
Feb 25, 2025
Merged

lazy load runtime metrics only when needed#5254
rochdev merged 4 commits into
masterfrom
lazy-runtime-metrics

Conversation

@rochdev

@rochdev rochdev commented Feb 12, 2025

Copy link
Copy Markdown
Member

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.

@github-actions

github-actions Bot commented Feb 12, 2025

Copy link
Copy Markdown
Contributor

Overall package size

Self size: 8.77 MB
Deduped: 94.97 MB
No deduping: 95.49 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

codecov Bot commented Feb 12, 2025

Copy link
Copy Markdown

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 80.98%. Comparing base (6b97186) to head (dc4e13f).
Report is 46 commits behind head on master.

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.
📢 Have feedback on the report? Share it here.

@datadog-datadog-prod-us1

datadog-datadog-prod-us1 Bot commented Feb 12, 2025

Copy link
Copy Markdown

Datadog Report

Branch report: lazy-runtime-metrics
Commit report: bbf8588
Test service: dd-trace-js-integration-tests

✅ 0 Failed, 666 Passed, 0 Skipped, 13m 3.71s Total Time

@pr-commenter

pr-commenter Bot commented Feb 12, 2025

Copy link
Copy Markdown

Benchmarks

Benchmark execution time: 2025-02-24 18:08:04

Comparing candidate commit dc4e13f in PR branch lazy-runtime-metrics with baseline commit 6b97186 in branch master.

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

scenario:log-skip-log-18

  • 🟥 execution_time [+21.805ms; +23.892ms] or [+5.444%; +5.965%]

scenario:log-with-debug-18

  • 🟥 execution_time [+22.142ms; +24.729ms] or [+5.540%; +6.187%]

scenario:log-with-error-18

  • 🟥 cpu_user_time [+20.094ms; +24.595ms] or [+5.630%; +6.892%]
  • 🟥 execution_time [+23.007ms; +24.989ms] or [+5.776%; +6.274%]

scenario:log-without-log-18

  • 🟥 cpu_user_time [+18.506ms; +23.050ms] or [+5.560%; +6.925%]
  • 🟥 execution_time [+22.206ms; +24.352ms] or [+5.958%; +6.533%]

scenario:plugin-graphql-with-depth-and-collapse-on-18

  • 🟥 max_rss_usage [+46.333MB; +91.175MB] or [+5.362%; +10.551%]

scenario:plugin-graphql-with-depth-on-max-18

  • 🟥 max_rss_usage [+51.043MB; +66.237MB] or [+5.918%; +7.680%]

@rochdev
rochdev marked this pull request as ready for review February 12, 2025 18:04
@rochdev
rochdev requested a review from a team as a code owner February 12, 2025 18:04
@rochdev
rochdev force-pushed the lazy-runtime-metrics branch from 6013e93 to 5e7bcdb Compare February 13, 2025 21:16
Comment thread packages/dd-trace/src/runtime_metrics/index.js Outdated
@tlhunter

Copy link
Copy Markdown
Member

Does this affect user applications with runtime metrics disabled but who make use of custom metrics?

@rochdev

rochdev commented Feb 19, 2025

Copy link
Copy Markdown
Member Author

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 proxy.js.

BridgeAR
BridgeAR previously approved these changes Feb 24, 2025

@BridgeAR BridgeAR left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Just left two nits

Comment thread packages/dd-trace/src/runtime_metrics/index.js Outdated
Comment thread packages/dd-trace/src/runtime_metrics/index.js Outdated

@BridgeAR BridgeAR left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. I just wondered if we really ever want to "go back" with stop.

Comment on lines +25 to +31
},

stop () {
runtimeMetrics.stop()

Object.setPrototypeOf(module.exports, runtimeMetrics = noop)
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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?

Suggested change
},
stop () {
runtimeMetrics.stop()
Object.setPrototypeOf(module.exports, runtimeMetrics = noop)
}
},

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll merge it like this for now, but happy to open a new PR if you think the optimization is not useful.

@rochdev
rochdev merged commit 487ea6f into master Feb 25, 2025
@rochdev
rochdev deleted the lazy-runtime-metrics branch February 25, 2025 20:33
@watson watson mentioned this pull request Feb 27, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants