DataDog / dd-trace-js

JavaScript APM Tracer
https://docs.datadoghq.com/tracing/
Other
654 stars 309 forks source link

ESM custom loader loading code twice #3845

Open mgagliardo91 opened 11 months ago

mgagliardo91 commented 11 months ago

With the recent release of Node v18.19.0, the dd-trace-js custom ESM loader is loading our application twice, causing it to fail with a port already bound error (this is an express application).

It appears the the v18.19.0 release added some breaking changes that would alter the way the dd-trace-js loader hook works. They indicate that v20 moves loaders to their own thread, which sounds like the culprit, but I'm unsure why that would affect v18. See

I have tried to switch to use the --import syntax, as outlined here, however, this still results in duplicate loading.

I am unsure whether this is a bug with Node v18.19.0, or if the breaking change is in fact correct and dd-trace-js loader hook needs to be updated to reflect the changes.

Expected behaviour Loading dd-trace-js using the custom ESM loader node --loader=dd-trace/loader-hook.mjs properly starts our application, once.

Actual behaviour Custom loader loads our application twice, which triggers a port conflict given that its trying to start two threads of the same application.

Steps to reproduce

  1. Create a simple express app using ESM
  2. Instrument with dd-trace-js custom loader
  3. Run with Node v18.19.0

Environment

mgagliardo91 commented 11 months ago

For now, we will pin our docker node version to v18.18.0; however, we hope to resolve this without leaving the pin in place.

Rowanto commented 11 months ago

Same issue. Pinning to 18.18 (node:18.18-alpine) solves the issue temporarily as outlined by @mgagliardo91

khanayan123 commented 10 months ago

Hi is this still an issue?

the fix was applied in this PR: https://github.com/DataDog/import-in-the-middle/pull/44

& was released with this release: https://github.com/DataDog/import-in-the-middle/releases/tag/v1.6.0