feat(handler): register dd-trace ESM loader hook programmatically - #801
Merged
Conversation
ESM instrumentation (orchestrion/rewriter-based, e.g. the
@aws/durable-execution-sdk-js integration) depends on dd-trace's
loader-hook.mjs being registered via --import dd-trace/initialize.mjs.
Runtimes that ignore NODE_OPTIONS (e.g. the AWS durable functions
runtime) never register it, so ESM handlers get no rewritten
instrumentation while CJS handlers work.
Mirror what dd-trace/initialize.mjs does: resolve the dd-trace package
root and Module.register('./loader-hook.mjs') from handler.mjs before
the user's ESM handler is imported.
Guards:
- Skip when the loader hook is already active via NODE_OPTIONS/execArgv
(module.register() does not dedupe; a second registration would run
the rewriter twice on every module).
- Skip when the tracer failed to initialize, matching initialize.mjs.
- Use a namespace import for 'module' so runtimes without
module.register (< 18.19 / < 20.6) don't fail at link time.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 08f0e5af99
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
--require dd-trace/register.js (and --import of it, which works on modern Node via CJS interop) also registers loader-hook.mjs, but the .mjs-only pattern missed it, causing a second registration and double rewriting. Match register.js alongside .mjs preload entry points.
zarirhamza
approved these changes
Jul 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
https://datadoghq.atlassian.net/browse/APMSVLS-587
ESM instrumentation (orchestrion/rewriter-based, e.g. the @aws/durable-execution-sdk-js integration) depends on dd-trace's loader-hook.mjs being registered via --import dd-trace/initialize.mjs. Runtimes that ignore NODE_OPTIONS (e.g. the AWS durable functions runtime (not the regualr lambda runtime)) never register it, so ESM handlers get no rewritten instrumentation while CJS handlers work.
Mirror what dd-trace/initialize.mjs does: resolve the dd-trace package root and Module.register('./loader-hook.mjs') from handler.mjs before the user's ESM handler is imported.
Guards:
Testing Guidelines
Additional Notes
Types of Changes
Check all that apply