From fa9d923c1683e432e66e93ecee899ed594e9a1c7 Mon Sep 17 00:00:00 2001 From: pabloerhard Date: Mon, 23 Feb 2026 12:47:51 +0100 Subject: [PATCH 1/5] fix hooks double patching --- packages/datadog-instrumentations/src/helpers/hook.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/datadog-instrumentations/src/helpers/hook.js b/packages/datadog-instrumentations/src/helpers/hook.js index 1d8f0a44b1c..42c8208b507 100644 --- a/packages/datadog-instrumentations/src/helpers/hook.js +++ b/packages/datadog-instrumentations/src/helpers/hook.js @@ -26,8 +26,14 @@ function Hook (modules, hookOptions, onrequire) { const parts = [moduleBaseDir, moduleName].filter(Boolean) const filename = path.join(...parts) - if (this._patched[filename] && patched.has(moduleExports)) { - return patched.get(moduleExports) + if (this._patched[filename]) { + if (patched.has(moduleExports)) { + return patched.get(moduleExports) + } + // Already patched via a different loader don't re-patch, + // but still cache this exports reference. + patched.set(moduleExports, moduleExports) + return moduleExports } let defaultWrapResult From 75c9d635ad043a2b38cda337a0fb0a369fac78f6 Mon Sep 17 00:00:00 2001 From: pabloerhard Date: Mon, 23 Feb 2026 13:42:12 +0100 Subject: [PATCH 2/5] Prevent fix on builtin modules --- packages/datadog-instrumentations/src/helpers/hook.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/datadog-instrumentations/src/helpers/hook.js b/packages/datadog-instrumentations/src/helpers/hook.js index 42c8208b507..30c50fbd0d9 100644 --- a/packages/datadog-instrumentations/src/helpers/hook.js +++ b/packages/datadog-instrumentations/src/helpers/hook.js @@ -1,5 +1,6 @@ 'use strict' const path = require('path') +const Module = require('module') const iitm = require('../../../dd-trace/src/iitm') const ritm = require('../../../dd-trace/src/ritm') @@ -33,7 +34,7 @@ function Hook (modules, hookOptions, onrequire) { // Already patched via a different loader don't re-patch, // but still cache this exports reference. patched.set(moduleExports, moduleExports) - return moduleExports + if (!Module.builtinModules.includes(filename)) return moduleExports } let defaultWrapResult From 1910a004ab6c3490fdb9068f73a202fabc109ed0 Mon Sep 17 00:00:00 2001 From: pabloerhard Date: Mon, 23 Feb 2026 14:13:34 +0100 Subject: [PATCH 3/5] testing with out weakmap --- .../datadog-instrumentations/src/helpers/hook.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/datadog-instrumentations/src/helpers/hook.js b/packages/datadog-instrumentations/src/helpers/hook.js index 30c50fbd0d9..e1acc54d264 100644 --- a/packages/datadog-instrumentations/src/helpers/hook.js +++ b/packages/datadog-instrumentations/src/helpers/hook.js @@ -28,13 +28,13 @@ function Hook (modules, hookOptions, onrequire) { const filename = path.join(...parts) if (this._patched[filename]) { - if (patched.has(moduleExports)) { - return patched.get(moduleExports) - } + // if (patched.has(moduleExports)) { + // return patched.get(moduleExports) + // } // Already patched via a different loader don't re-patch, // but still cache this exports reference. - patched.set(moduleExports, moduleExports) - if (!Module.builtinModules.includes(filename)) return moduleExports + // patched.set(moduleExports, moduleExports) + return moduleExports } let defaultWrapResult @@ -56,7 +56,7 @@ function Hook (modules, hookOptions, onrequire) { if (newExports && (typeof newExports === 'object' || typeof newExports === 'function')) { - patched.set(moduleExports, newExports) + // patched.set(moduleExports, newExports) } return newExports } From 38f2b4bdcc005de058eb03437d703d885b662438 Mon Sep 17 00:00:00 2001 From: pabloerhard Date: Tue, 24 Feb 2026 10:10:52 +0100 Subject: [PATCH 4/5] fix hook cache logic --- .../src/helpers/hook.js | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/packages/datadog-instrumentations/src/helpers/hook.js b/packages/datadog-instrumentations/src/helpers/hook.js index e1acc54d264..cc5cdb67743 100644 --- a/packages/datadog-instrumentations/src/helpers/hook.js +++ b/packages/datadog-instrumentations/src/helpers/hook.js @@ -27,18 +27,23 @@ function Hook (modules, hookOptions, onrequire) { const parts = [moduleBaseDir, moduleName].filter(Boolean) const filename = path.join(...parts) - if (this._patched[filename]) { - // if (patched.has(moduleExports)) { - // return patched.get(moduleExports) - // } - // Already patched via a different loader don't re-patch, - // but still cache this exports reference. - // patched.set(moduleExports, moduleExports) - return moduleExports - } - let defaultWrapResult + const original = onrequire + onrequire = (moduleExports, ...args) => { + if (this._patched[filename] && patched.has(moduleExports)) { + return patched.get(moduleExports) + } + + const result = original(moduleExports, ...args) + if (result && (typeof result === 'object' || typeof result === 'function')) { + patched.set(moduleExports, result) + patched.set(result, result) + } + + return result + } + if ( isIitm && moduleExports.default && @@ -53,11 +58,7 @@ function Hook (modules, hookOptions, onrequire) { if (defaultWrapResult) newExports.default = defaultWrapResult this._patched[filename] = true - if (newExports && - (typeof newExports === 'object' || - typeof newExports === 'function')) { - // patched.set(moduleExports, newExports) - } + return newExports } From b74b590045df30097eae1dec62f67835f38c4230 Mon Sep 17 00:00:00 2001 From: pabloerhard Date: Tue, 24 Feb 2026 12:34:57 +0100 Subject: [PATCH 5/5] fix onrequire wrapping --- packages/datadog-instrumentations/src/helpers/hook.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/datadog-instrumentations/src/helpers/hook.js b/packages/datadog-instrumentations/src/helpers/hook.js index cc5cdb67743..c1b03fea446 100644 --- a/packages/datadog-instrumentations/src/helpers/hook.js +++ b/packages/datadog-instrumentations/src/helpers/hook.js @@ -1,6 +1,5 @@ 'use strict' const path = require('path') -const Module = require('module') const iitm = require('../../../dd-trace/src/iitm') const ritm = require('../../../dd-trace/src/ritm') @@ -29,13 +28,12 @@ function Hook (modules, hookOptions, onrequire) { let defaultWrapResult - const original = onrequire - onrequire = (moduleExports, ...args) => { + const wrappedOnrequire = (moduleExports, ...args) => { if (this._patched[filename] && patched.has(moduleExports)) { return patched.get(moduleExports) } - const result = original(moduleExports, ...args) + const result = onrequire(moduleExports, ...args) if (result && (typeof result === 'object' || typeof result === 'function')) { patched.set(moduleExports, result) patched.set(result, result) @@ -50,10 +48,10 @@ function Hook (modules, hookOptions, onrequire) { (typeof moduleExports.default === 'object' || typeof moduleExports.default === 'function') ) { - defaultWrapResult = onrequire(moduleExports.default, moduleName, moduleBaseDir, moduleVersion, isIitm) + defaultWrapResult = wrappedOnrequire(moduleExports.default, moduleName, moduleBaseDir, moduleVersion, isIitm) } - const newExports = onrequire(moduleExports, moduleName, moduleBaseDir, moduleVersion, isIitm) + const newExports = wrappedOnrequire(moduleExports, moduleName, moduleBaseDir, moduleVersion, isIitm) if (defaultWrapResult) newExports.default = defaultWrapResult