From aa0a34aa20a614ae237408c1df6e8a7230414aa7 Mon Sep 17 00:00:00 2001 From: Bryan English Date: Wed, 20 Aug 2025 17:04:04 -0400 Subject: [PATCH 01/23] remove special-casing of default in hook.js, update http2 integration Also add appropriate testing for each import style --- integration-tests/helpers/index.js | 2 +- .../src/helpers/hook.js | 8 ----- .../src/http2/client.js | 1 + .../src/http2/server.js | 3 +- .../test/integration-test/client.spec.js | 30 ++++++++++--------- .../{server.mjs => server-default.mjs} | 0 .../integration-test/server-destructure.mjs | 11 +++++++ .../test/integration-test/server-star.mjs | 11 +++++++ 8 files changed, 42 insertions(+), 24 deletions(-) rename packages/datadog-plugin-http2/test/integration-test/{server.mjs => server-default.mjs} (100%) create mode 100644 packages/datadog-plugin-http2/test/integration-test/server-destructure.mjs create mode 100644 packages/datadog-plugin-http2/test/integration-test/server-star.mjs diff --git a/integration-tests/helpers/index.js b/integration-tests/helpers/index.js index 824c4398dcf..610b999d9f1 100644 --- a/integration-tests/helpers/index.js +++ b/integration-tests/helpers/index.js @@ -381,7 +381,7 @@ function checkSpansForServiceName (spans, name) { async function spawnPluginIntegrationTestProc (cwd, serverFile, agentPort, stdioHandler, additionalEnvArgs = {}) { let env = { - NODE_OPTIONS: `--loader=${hookFile}`, + NODE_OPTIONS: `--no-warnings --loader=${hookFile}`, DD_TRACE_AGENT_PORT: agentPort } env = { ...process.env, ...env, ...additionalEnvArgs } diff --git a/packages/datadog-instrumentations/src/helpers/hook.js b/packages/datadog-instrumentations/src/helpers/hook.js index 5ca81bb5408..875734ece37 100644 --- a/packages/datadog-instrumentations/src/helpers/hook.js +++ b/packages/datadog-instrumentations/src/helpers/hook.js @@ -34,14 +34,6 @@ function Hook (modules, hookOptions, onrequire) { this._ritmHook = ritm(modules, {}, safeHook) this._iitmHook = iitm(modules, hookOptions, (moduleExports, moduleName, moduleBaseDir) => { - // TODO: Move this logic to import-in-the-middle and only do it for CommonJS - // modules and not ESM. In the meantime, all the modules we instrument are - // CommonJS modules for which the default export is always moved to - // `default` anyway. - if (moduleExports && moduleExports.default) { - moduleExports.default = safeHook(moduleExports.default, moduleName, moduleBaseDir) - return moduleExports - } return safeHook(moduleExports, moduleName, moduleBaseDir) }) } diff --git a/packages/datadog-instrumentations/src/http2/client.js b/packages/datadog-instrumentations/src/http2/client.js index 651c9ed6edd..349cd7b16c0 100644 --- a/packages/datadog-instrumentations/src/http2/client.js +++ b/packages/datadog-instrumentations/src/http2/client.js @@ -70,6 +70,7 @@ function wrapConnect (connect) { addHook({ name: names }, http2 => { shimmer.wrap(http2, 'connect', wrapConnect) + if (http2.default) http2.default.connet = http2.connect return http2 }) diff --git a/packages/datadog-instrumentations/src/http2/server.js b/packages/datadog-instrumentations/src/http2/server.js index df1a834ba03..b4356479bf9 100644 --- a/packages/datadog-instrumentations/src/http2/server.js +++ b/packages/datadog-instrumentations/src/http2/server.js @@ -17,8 +17,9 @@ const names = ['http2', 'node:http2'] addHook({ name: names }, http2 => { shimmer.wrap(http2, 'createSecureServer', wrapCreateServer) + if (http2.default) http2.default.createSecureServer = http2.createSecureServer shimmer.wrap(http2, 'createServer', wrapCreateServer) - return http2 + if (http2.default) http2.default.createServer = http2.createServer }) function wrapCreateServer (createServer) { diff --git a/packages/datadog-plugin-http2/test/integration-test/client.spec.js b/packages/datadog-plugin-http2/test/integration-test/client.spec.js index 800dc1d0c6d..ae62b9716d0 100644 --- a/packages/datadog-plugin-http2/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-http2/test/integration-test/client.spec.js @@ -34,20 +34,22 @@ describe('esm', () => { }) context('http2', () => { - it('is instrumented', async () => { - proc = await spawnPluginIntegrationTestProc(sandbox.folder, 'server.mjs', agent.port) - const resultPromise = agent.assertMessageReceived(({ headers, payload }) => { - assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) - assert.isArray(payload) - assert.strictEqual(payload.length, 1) - assert.isArray(payload[0]) - assert.strictEqual(payload[0].length, 1) - assert.propertyVal(payload[0][0], 'name', 'web.request') - assert.propertyVal(payload[0][0].meta, 'component', 'http2') - }) - await curl(proc) - return resultPromise - }).timeout(50000) + for (const variant of ['default', 'destructure', 'star']) { + it(`is instrumented (${variant})`, async () => { + proc = await spawnPluginIntegrationTestProc(sandbox.folder, `server-${variant}.mjs`, agent.port) + const resultPromise = agent.assertMessageReceived(({ headers, payload }) => { + assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) + assert.isArray(payload) + assert.strictEqual(payload.length, 1) + assert.isArray(payload[0]) + assert.strictEqual(payload[0].length, 1) + assert.propertyVal(payload[0][0], 'name', 'web.request') + assert.propertyVal(payload[0][0].meta, 'component', 'http2') + }) + await curl(proc) + return resultPromise + }).timeout(50000) + } }) }) diff --git a/packages/datadog-plugin-http2/test/integration-test/server.mjs b/packages/datadog-plugin-http2/test/integration-test/server-default.mjs similarity index 100% rename from packages/datadog-plugin-http2/test/integration-test/server.mjs rename to packages/datadog-plugin-http2/test/integration-test/server-default.mjs diff --git a/packages/datadog-plugin-http2/test/integration-test/server-destructure.mjs b/packages/datadog-plugin-http2/test/integration-test/server-destructure.mjs new file mode 100644 index 00000000000..8faa2a62208 --- /dev/null +++ b/packages/datadog-plugin-http2/test/integration-test/server-destructure.mjs @@ -0,0 +1,11 @@ +import 'dd-trace/init.js' +import { createServer } from 'http2' + +const server = createServer((req, res) => { + res.end('Hello, HTTP/2!') +}) + +server.listen(0, () => { + const port = server.address().port + process.send({ port }) +}) diff --git a/packages/datadog-plugin-http2/test/integration-test/server-star.mjs b/packages/datadog-plugin-http2/test/integration-test/server-star.mjs new file mode 100644 index 00000000000..33c53092b16 --- /dev/null +++ b/packages/datadog-plugin-http2/test/integration-test/server-star.mjs @@ -0,0 +1,11 @@ +import 'dd-trace/init.js' +import * as http2 from 'http2' + +const server = http2.createServer((req, res) => { + res.end('Hello, HTTP/2!') +}) + +server.listen(0, () => { + const port = server.address().port + process.send({ port }) +}) From f585a350d500666a394f42d3d7403c5b3c6cb09c Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Mon, 8 Sep 2025 16:16:55 -0400 Subject: [PATCH 02/23] Added net integration tests for different import --- .../src/http2/client.js | 2 +- .../test/integration-test/client.spec.js | 28 ++++++++++--------- .../{server.mjs => server-default.mjs} | 0 .../integration-test/server-destructure.mjs | 14 ++++++++++ .../test/integration-test/server-star.mjs | 14 ++++++++++ 5 files changed, 44 insertions(+), 14 deletions(-) rename packages/datadog-plugin-net/test/integration-test/{server.mjs => server-default.mjs} (100%) create mode 100644 packages/datadog-plugin-net/test/integration-test/server-destructure.mjs create mode 100644 packages/datadog-plugin-net/test/integration-test/server-star.mjs diff --git a/packages/datadog-instrumentations/src/http2/client.js b/packages/datadog-instrumentations/src/http2/client.js index 349cd7b16c0..b335df7c4cd 100644 --- a/packages/datadog-instrumentations/src/http2/client.js +++ b/packages/datadog-instrumentations/src/http2/client.js @@ -70,7 +70,7 @@ function wrapConnect (connect) { addHook({ name: names }, http2 => { shimmer.wrap(http2, 'connect', wrapConnect) - if (http2.default) http2.default.connet = http2.connect + if (http2.default) http2.default.connect = http2.connect return http2 }) diff --git a/packages/datadog-plugin-net/test/integration-test/client.spec.js b/packages/datadog-plugin-net/test/integration-test/client.spec.js index 53e5c988a73..c14fc74ddd5 100644 --- a/packages/datadog-plugin-net/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-net/test/integration-test/client.spec.js @@ -33,18 +33,20 @@ describe('esm', () => { }) context('net', () => { - it('is instrumented', async () => { - const res = agent.assertMessageReceived(({ headers, payload }) => { - assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) - assert.isArray(payload) - assert.strictEqual(checkSpansForServiceName(payload, 'tcp.connect'), true) - const metaContainsNet = payload.some((span) => span.some((nestedSpan) => nestedSpan.meta.component === 'net')) - assert.strictEqual(metaContainsNet, true) - }) - - proc = await spawnPluginIntegrationTestProc(sandbox.folder, 'server.mjs', agent.port) - - await res - }).timeout(20000) + for (const variant of ['default', 'destructure', 'star']) { + it('is instrumented', async () => { + const res = agent.assertMessageReceived(({ headers, payload }) => { + assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) + assert.isArray(payload) + assert.strictEqual(checkSpansForServiceName(payload, 'tcp.connect'), true) + const metaContainsNet = payload.some((span) => span.some((nestedSpan) => nestedSpan.meta.component === 'net')) + assert.strictEqual(metaContainsNet, true) + }) + + proc = await spawnPluginIntegrationTestProc(sandbox.folder, `server-${variant}.mjs`, agent.port) + + await res + }).timeout(20000) + } }) }) diff --git a/packages/datadog-plugin-net/test/integration-test/server.mjs b/packages/datadog-plugin-net/test/integration-test/server-default.mjs similarity index 100% rename from packages/datadog-plugin-net/test/integration-test/server.mjs rename to packages/datadog-plugin-net/test/integration-test/server-default.mjs diff --git a/packages/datadog-plugin-net/test/integration-test/server-destructure.mjs b/packages/datadog-plugin-net/test/integration-test/server-destructure.mjs new file mode 100644 index 00000000000..6055ab1a780 --- /dev/null +++ b/packages/datadog-plugin-net/test/integration-test/server-destructure.mjs @@ -0,0 +1,14 @@ +import 'dd-trace/init.js' +import { createConnection } from 'net' + +const client = createConnection(0, () => {}) + +client.on('data', (data) => {}) + +client.on('end', () => { + client.end() +}) + +client.on('error', (err) => { + client.end() +}) diff --git a/packages/datadog-plugin-net/test/integration-test/server-star.mjs b/packages/datadog-plugin-net/test/integration-test/server-star.mjs new file mode 100644 index 00000000000..3529b6743c2 --- /dev/null +++ b/packages/datadog-plugin-net/test/integration-test/server-star.mjs @@ -0,0 +1,14 @@ +import 'dd-trace/init.js' +import * as net from 'net' + +const client = net.createConnection(0, () => {}) + +client.on('data', (data) => {}) + +client.on('end', () => { + client.end() +}) + +client.on('error', (err) => { + client.end() +}) From 8315da0c012431b9188d698f4737b7006e889b7b Mon Sep 17 00:00:00 2001 From: Bryan English Date: Mon, 8 Sep 2025 22:05:41 -0400 Subject: [PATCH 03/23] fix bunyan for new esm import handling --- .../datadog-instrumentations/src/bunyan.js | 3 +++ .../test/integration-test/client.spec.js | 24 ++++++++++--------- .../{server.mjs => server-default.mjs} | 0 .../integration-test/server-destructure.mjs | 10 ++++++++ .../test/integration-test/server-star.mjs | 10 ++++++++ 5 files changed, 36 insertions(+), 11 deletions(-) rename packages/datadog-plugin-bunyan/test/integration-test/{server.mjs => server-default.mjs} (100%) create mode 100644 packages/datadog-plugin-bunyan/test/integration-test/server-destructure.mjs create mode 100644 packages/datadog-plugin-bunyan/test/integration-test/server-star.mjs diff --git a/packages/datadog-instrumentations/src/bunyan.js b/packages/datadog-instrumentations/src/bunyan.js index 039e7740c7a..e28e819d61e 100644 --- a/packages/datadog-instrumentations/src/bunyan.js +++ b/packages/datadog-instrumentations/src/bunyan.js @@ -8,6 +8,9 @@ const shimmer = require('../../datadog-shimmer') addHook({ name: 'bunyan', versions: ['>=1'] }, Logger => { const logCh = channel('apm:bunyan:log') + if (Logger.default) { + Logger = Logger.default + } shimmer.wrap(Logger.prototype, '_emit', emit => { return function wrappedEmit (rec) { if (logCh.hasSubscribers) { diff --git a/packages/datadog-plugin-bunyan/test/integration-test/client.spec.js b/packages/datadog-plugin-bunyan/test/integration-test/client.spec.js index 2777b5b84e2..e847e1af33b 100644 --- a/packages/datadog-plugin-bunyan/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-bunyan/test/integration-test/client.spec.js @@ -31,16 +31,18 @@ describe('esm', () => { proc && proc.kill() await agent.stop() }) - it('is instrumented', async () => { - proc = await spawnPluginIntegrationTestProc( - sandbox.folder, - 'server.mjs', - agent.port, - (data) => { - const jsonObject = JSON.parse(data.toString()) - expect(jsonObject).to.have.property('dd') - } - ) - }).timeout(20000) + for (const variant of ['default', 'destructure', 'star']) { + it(`is instrumented (${variant})`, async () => { + proc = await spawnPluginIntegrationTestProc( + sandbox.folder, + `server-${variant}.mjs`, + agent.port, + (data) => { + const jsonObject = JSON.parse(data.toString()) + expect(jsonObject).to.have.property('dd') + } + ) + }).timeout(20000) + } }) }) diff --git a/packages/datadog-plugin-bunyan/test/integration-test/server.mjs b/packages/datadog-plugin-bunyan/test/integration-test/server-default.mjs similarity index 100% rename from packages/datadog-plugin-bunyan/test/integration-test/server.mjs rename to packages/datadog-plugin-bunyan/test/integration-test/server-default.mjs diff --git a/packages/datadog-plugin-bunyan/test/integration-test/server-destructure.mjs b/packages/datadog-plugin-bunyan/test/integration-test/server-destructure.mjs new file mode 100644 index 00000000000..32461172caa --- /dev/null +++ b/packages/datadog-plugin-bunyan/test/integration-test/server-destructure.mjs @@ -0,0 +1,10 @@ +import ddtrace from 'dd-trace' +import { default as Logger } from 'bunyan' + +ddtrace.init({ + logInjection: true +}) + +const logger = Logger.createLogger({ name: 'test-logger' }) + +logger.info('test xyz') diff --git a/packages/datadog-plugin-bunyan/test/integration-test/server-star.mjs b/packages/datadog-plugin-bunyan/test/integration-test/server-star.mjs new file mode 100644 index 00000000000..3d78b8d3aa1 --- /dev/null +++ b/packages/datadog-plugin-bunyan/test/integration-test/server-star.mjs @@ -0,0 +1,10 @@ +import ddtrace from 'dd-trace' +import * as bunyan from 'bunyan' + +ddtrace.init({ + logInjection: true +}) + +const logger = bunyan.createLogger({ name: 'test-logger' }) + +logger.info('test xyz') From 2292d3bd88c2bfd53d02528433b5ada1fce4ab85 Mon Sep 17 00:00:00 2001 From: Bryan English Date: Tue, 9 Sep 2025 00:00:28 -0400 Subject: [PATCH 04/23] add a variants helper for esm tests --- integration-tests/helpers/index.js | 32 ++++++++++++++++++- .../test/integration-test/client.spec.js | 12 +++++-- .../integration-test/server-destructure.mjs | 10 ------ .../test/integration-test/server-star.mjs | 10 ------ .../{server-default.mjs => server.mjs} | 0 .../test/integration-test/client.spec.js | 11 +++++-- .../integration-test/server-destructure.mjs | 11 ------- .../test/integration-test/server-star.mjs | 11 ------- .../{server-default.mjs => server.mjs} | 0 .../test/integration-test/client.spec.js | 15 ++++++--- .../integration-test/server-destructure.mjs | 14 -------- .../test/integration-test/server-star.mjs | 14 -------- .../{server-default.mjs => server.mjs} | 0 13 files changed, 61 insertions(+), 79 deletions(-) delete mode 100644 packages/datadog-plugin-bunyan/test/integration-test/server-destructure.mjs delete mode 100644 packages/datadog-plugin-bunyan/test/integration-test/server-star.mjs rename packages/datadog-plugin-bunyan/test/integration-test/{server-default.mjs => server.mjs} (100%) delete mode 100644 packages/datadog-plugin-http2/test/integration-test/server-destructure.mjs delete mode 100644 packages/datadog-plugin-http2/test/integration-test/server-star.mjs rename packages/datadog-plugin-http2/test/integration-test/{server-default.mjs => server.mjs} (100%) delete mode 100644 packages/datadog-plugin-net/test/integration-test/server-destructure.mjs delete mode 100644 packages/datadog-plugin-net/test/integration-test/server-star.mjs rename packages/datadog-plugin-net/test/integration-test/{server-default.mjs => server.mjs} (100%) diff --git a/integration-tests/helpers/index.js b/integration-tests/helpers/index.js index 610b999d9f1..92b64faf1d7 100644 --- a/integration-tests/helpers/index.js +++ b/integration-tests/helpers/index.js @@ -273,6 +273,35 @@ async function createSandbox (dependencies = [], isGitRepo = false, } } +/** + * Creates a bunch of files based on an original file in sandbox. Useful for varying test files + * without having to create a bunch of them yourself. + * + * The variants object should have keys that are named variants, and values that are the text + * in the file that's different in each variant. There must always be a "default" variant, + * whose value is the original text within the file that will be replaced. + * + * @param {object} sandbox - A `sandbox` as returned from `createSandbox` + * @param {string} filename - The file that will be copied and modified for each variant. + * @param {object} variants - The variants. + * @returns {object} A map from variant names to resulting filenames + */ +function varySandbox(sandbox, filename, variants) { + const origFileData = fs.readFileSync(path.join(sandbox.folder, filename), 'utf8') + const [prefix, suffix] = filename.split('.') + const variantFilenames = {} + for (const variant in variants) { + const variantFilename = `${prefix}-${variant}.${suffix}` + variantFilenames[variant] = variantFilename + let newFileData = origFileData + if (variant !== 'default') { + newFileData = origFileData.replace(variants.default, `${variants[variant]}`) + } + fs.writeFileSync(path.join(sandbox.folder, variantFilename), newFileData) + } + return variantFilenames +} + function telemetryForwarder (shouldExpectTelemetryPoints = true) { process.env.DD_TELEMETRY_FORWARDER_PATH = path.join(__dirname, '..', 'telemetry-forwarder.sh') @@ -487,5 +516,6 @@ module.exports = { useEnv, useSandbox, sandboxCwd, - setShouldKill + setShouldKill, + varySandbox } diff --git a/packages/datadog-plugin-bunyan/test/integration-test/client.spec.js b/packages/datadog-plugin-bunyan/test/integration-test/client.spec.js index e847e1af33b..2335dbce039 100644 --- a/packages/datadog-plugin-bunyan/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-bunyan/test/integration-test/client.spec.js @@ -3,7 +3,8 @@ const { FakeAgent, createSandbox, - spawnPluginIntegrationTestProc + spawnPluginIntegrationTestProc, + varySandbox } = require('../../../../integration-tests/helpers') const { withVersions } = require('../../../dd-trace/test/setup/mocha') const { expect } = require('chai') @@ -12,11 +13,18 @@ describe('esm', () => { let agent let proc let sandbox + let variants + withVersions('bunyan', 'bunyan', version => { before(async function () { this.timeout(20000) sandbox = await createSandbox([`'bunyan@${version}'`], false, ['./packages/datadog-plugin-bunyan/test/integration-test/*']) + variants = varySandbox(sandbox, 'server.mjs', { + default: `import bunyan from 'bunyan'`, + star: `import * as bunyan from 'bunyan'`, + destructure: `import { default as bunyan } from 'bunyan'` + }) }) after(async () => { @@ -35,7 +43,7 @@ describe('esm', () => { it(`is instrumented (${variant})`, async () => { proc = await spawnPluginIntegrationTestProc( sandbox.folder, - `server-${variant}.mjs`, + variants[variant], agent.port, (data) => { const jsonObject = JSON.parse(data.toString()) diff --git a/packages/datadog-plugin-bunyan/test/integration-test/server-destructure.mjs b/packages/datadog-plugin-bunyan/test/integration-test/server-destructure.mjs deleted file mode 100644 index 32461172caa..00000000000 --- a/packages/datadog-plugin-bunyan/test/integration-test/server-destructure.mjs +++ /dev/null @@ -1,10 +0,0 @@ -import ddtrace from 'dd-trace' -import { default as Logger } from 'bunyan' - -ddtrace.init({ - logInjection: true -}) - -const logger = Logger.createLogger({ name: 'test-logger' }) - -logger.info('test xyz') diff --git a/packages/datadog-plugin-bunyan/test/integration-test/server-star.mjs b/packages/datadog-plugin-bunyan/test/integration-test/server-star.mjs deleted file mode 100644 index 3d78b8d3aa1..00000000000 --- a/packages/datadog-plugin-bunyan/test/integration-test/server-star.mjs +++ /dev/null @@ -1,10 +0,0 @@ -import ddtrace from 'dd-trace' -import * as bunyan from 'bunyan' - -ddtrace.init({ - logInjection: true -}) - -const logger = bunyan.createLogger({ name: 'test-logger' }) - -logger.info('test xyz') diff --git a/packages/datadog-plugin-bunyan/test/integration-test/server-default.mjs b/packages/datadog-plugin-bunyan/test/integration-test/server.mjs similarity index 100% rename from packages/datadog-plugin-bunyan/test/integration-test/server-default.mjs rename to packages/datadog-plugin-bunyan/test/integration-test/server.mjs diff --git a/packages/datadog-plugin-http2/test/integration-test/client.spec.js b/packages/datadog-plugin-http2/test/integration-test/client.spec.js index ae62b9716d0..6dece07e67d 100644 --- a/packages/datadog-plugin-http2/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-http2/test/integration-test/client.spec.js @@ -3,7 +3,8 @@ const { FakeAgent, createSandbox, - spawnPluginIntegrationTestProc + spawnPluginIntegrationTestProc, + varySandbox } = require('../../../../integration-tests/helpers') const { assert } = require('chai') const http2 = require('http2') @@ -12,11 +13,17 @@ describe('esm', () => { let agent let proc let sandbox + let variants before(async function () { this.timeout(50000) sandbox = await createSandbox(['http2'], false, [ './packages/datadog-plugin-http2/test/integration-test/*']) + variants = varySandbox(sandbox, 'server.mjs', { + default: `import http2 from 'http2'`, + star: `import * as http2 from 'http2'`, + destructure: `import { createServer } from 'http2'; const http2 = { createServer }` + }) }) after(async function () { @@ -36,7 +43,7 @@ describe('esm', () => { context('http2', () => { for (const variant of ['default', 'destructure', 'star']) { it(`is instrumented (${variant})`, async () => { - proc = await spawnPluginIntegrationTestProc(sandbox.folder, `server-${variant}.mjs`, agent.port) + proc = await spawnPluginIntegrationTestProc(sandbox.folder, variants[variant], agent.port) const resultPromise = agent.assertMessageReceived(({ headers, payload }) => { assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) assert.isArray(payload) diff --git a/packages/datadog-plugin-http2/test/integration-test/server-destructure.mjs b/packages/datadog-plugin-http2/test/integration-test/server-destructure.mjs deleted file mode 100644 index 8faa2a62208..00000000000 --- a/packages/datadog-plugin-http2/test/integration-test/server-destructure.mjs +++ /dev/null @@ -1,11 +0,0 @@ -import 'dd-trace/init.js' -import { createServer } from 'http2' - -const server = createServer((req, res) => { - res.end('Hello, HTTP/2!') -}) - -server.listen(0, () => { - const port = server.address().port - process.send({ port }) -}) diff --git a/packages/datadog-plugin-http2/test/integration-test/server-star.mjs b/packages/datadog-plugin-http2/test/integration-test/server-star.mjs deleted file mode 100644 index 33c53092b16..00000000000 --- a/packages/datadog-plugin-http2/test/integration-test/server-star.mjs +++ /dev/null @@ -1,11 +0,0 @@ -import 'dd-trace/init.js' -import * as http2 from 'http2' - -const server = http2.createServer((req, res) => { - res.end('Hello, HTTP/2!') -}) - -server.listen(0, () => { - const port = server.address().port - process.send({ port }) -}) diff --git a/packages/datadog-plugin-http2/test/integration-test/server-default.mjs b/packages/datadog-plugin-http2/test/integration-test/server.mjs similarity index 100% rename from packages/datadog-plugin-http2/test/integration-test/server-default.mjs rename to packages/datadog-plugin-http2/test/integration-test/server.mjs diff --git a/packages/datadog-plugin-net/test/integration-test/client.spec.js b/packages/datadog-plugin-net/test/integration-test/client.spec.js index c14fc74ddd5..97a27391a16 100644 --- a/packages/datadog-plugin-net/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-net/test/integration-test/client.spec.js @@ -4,7 +4,8 @@ const { FakeAgent, createSandbox, checkSpansForServiceName, - spawnPluginIntegrationTestProc + spawnPluginIntegrationTestProc, + varySandbox } = require('../../../../integration-tests/helpers') const { assert } = require('chai') @@ -12,11 +13,17 @@ describe('esm', () => { let agent let proc let sandbox + let variants before(async function () { this.timeout(20000) sandbox = await createSandbox(['net'], false, [ './packages/datadog-plugin-net/test/integration-test/*']) + variants = varySandbox(sandbox, 'server.mjs', { + default: `import net from 'net'`, + star: `import * as net from 'net'`, + destructure: `import { createConnection } from 'net'; const net = { createConnection }` + }) }) after(async () => { @@ -33,8 +40,8 @@ describe('esm', () => { }) context('net', () => { - for (const variant of ['default', 'destructure', 'star']) { - it('is instrumented', async () => { + for (const variant of ['default', 'star', 'destructure']) { + it(`is instrumented (${variant})`, async () => { const res = agent.assertMessageReceived(({ headers, payload }) => { assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) assert.isArray(payload) @@ -43,7 +50,7 @@ describe('esm', () => { assert.strictEqual(metaContainsNet, true) }) - proc = await spawnPluginIntegrationTestProc(sandbox.folder, `server-${variant}.mjs`, agent.port) + proc = await spawnPluginIntegrationTestProc(sandbox.folder, variants[variant], agent.port) await res }).timeout(20000) diff --git a/packages/datadog-plugin-net/test/integration-test/server-destructure.mjs b/packages/datadog-plugin-net/test/integration-test/server-destructure.mjs deleted file mode 100644 index 6055ab1a780..00000000000 --- a/packages/datadog-plugin-net/test/integration-test/server-destructure.mjs +++ /dev/null @@ -1,14 +0,0 @@ -import 'dd-trace/init.js' -import { createConnection } from 'net' - -const client = createConnection(0, () => {}) - -client.on('data', (data) => {}) - -client.on('end', () => { - client.end() -}) - -client.on('error', (err) => { - client.end() -}) diff --git a/packages/datadog-plugin-net/test/integration-test/server-star.mjs b/packages/datadog-plugin-net/test/integration-test/server-star.mjs deleted file mode 100644 index 3529b6743c2..00000000000 --- a/packages/datadog-plugin-net/test/integration-test/server-star.mjs +++ /dev/null @@ -1,14 +0,0 @@ -import 'dd-trace/init.js' -import * as net from 'net' - -const client = net.createConnection(0, () => {}) - -client.on('data', (data) => {}) - -client.on('end', () => { - client.end() -}) - -client.on('error', (err) => { - client.end() -}) diff --git a/packages/datadog-plugin-net/test/integration-test/server-default.mjs b/packages/datadog-plugin-net/test/integration-test/server.mjs similarity index 100% rename from packages/datadog-plugin-net/test/integration-test/server-default.mjs rename to packages/datadog-plugin-net/test/integration-test/server.mjs From 3d25ea1b623c1e034935e334c3a8877dc7eb165e Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Tue, 9 Sep 2025 09:28:03 -0400 Subject: [PATCH 05/23] Added import variation tests for elasticsearch --- .../test/integration-test/client.spec.js | 25 ++++++++++--------- .../test/integration-test/server-default.mjs | 6 +++++ .../{server.mjs => server-destructure.mjs} | 0 .../test/integration-test/server-star.mjs | 6 +++++ 4 files changed, 25 insertions(+), 12 deletions(-) create mode 100644 packages/datadog-plugin-elasticsearch/test/integration-test/server-default.mjs rename packages/datadog-plugin-elasticsearch/test/integration-test/{server.mjs => server-destructure.mjs} (100%) create mode 100644 packages/datadog-plugin-elasticsearch/test/integration-test/server-star.mjs diff --git a/packages/datadog-plugin-elasticsearch/test/integration-test/client.spec.js b/packages/datadog-plugin-elasticsearch/test/integration-test/client.spec.js index 2c2e6202635..7cb40cee737 100644 --- a/packages/datadog-plugin-elasticsearch/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-elasticsearch/test/integration-test/client.spec.js @@ -34,17 +34,18 @@ describe('esm', () => { proc && proc.kill() await agent.stop() }) - - it('is instrumented', async () => { - const res = agent.assertMessageReceived(({ headers, payload }) => { - assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) - assert.isArray(payload) - assert.strictEqual(checkSpansForServiceName(payload, 'elasticsearch.query'), true) - }) - - proc = await spawnPluginIntegrationTestProc(sandbox.folder, 'server.mjs', agent.port) - - await res - }).timeout(20000) + for (const variant of ['default', 'destructure', 'star']) { + it(`is instrumented ${variant}`, async () => { + const res = agent.assertMessageReceived(({ headers, payload }) => { + assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) + assert.isArray(payload) + assert.strictEqual(checkSpansForServiceName(payload, 'elasticsearch.query'), true) + }) + + proc = await spawnPluginIntegrationTestProc(sandbox.folder, `server-${variant}.mjs`, agent.port) + + await res + }).timeout(20000) + } }) }) diff --git a/packages/datadog-plugin-elasticsearch/test/integration-test/server-default.mjs b/packages/datadog-plugin-elasticsearch/test/integration-test/server-default.mjs new file mode 100644 index 00000000000..2bc6e1ce1e8 --- /dev/null +++ b/packages/datadog-plugin-elasticsearch/test/integration-test/server-default.mjs @@ -0,0 +1,6 @@ +import 'dd-trace/init.js' +import elasticsearch from '@elastic/elasticsearch' + +const client = new elasticsearch.Client({ node: 'http://127.0.0.1:9200' }) + +await client.ping() diff --git a/packages/datadog-plugin-elasticsearch/test/integration-test/server.mjs b/packages/datadog-plugin-elasticsearch/test/integration-test/server-destructure.mjs similarity index 100% rename from packages/datadog-plugin-elasticsearch/test/integration-test/server.mjs rename to packages/datadog-plugin-elasticsearch/test/integration-test/server-destructure.mjs diff --git a/packages/datadog-plugin-elasticsearch/test/integration-test/server-star.mjs b/packages/datadog-plugin-elasticsearch/test/integration-test/server-star.mjs new file mode 100644 index 00000000000..c2ea1de1b73 --- /dev/null +++ b/packages/datadog-plugin-elasticsearch/test/integration-test/server-star.mjs @@ -0,0 +1,6 @@ +import 'dd-trace/init.js' +import * as elastic from '@elastic/elasticsearch' + +const client = new elastic.Client({ node: 'http://127.0.0.1:9200' }) + +await client.ping() From 3de006d1fd24c269bdaaa1ccb6a834f3f9b016f7 Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Tue, 9 Sep 2025 10:01:04 -0400 Subject: [PATCH 06/23] Added import variations tests for amqplib --- .../test/integration-test/client.spec.js | 24 ++++++++++--------- .../{server.mjs => server-default.mjs} | 0 .../integration-test/server-destructure.mjs | 14 +++++++++++ .../test/integration-test/server-star.mjs | 14 +++++++++++ 4 files changed, 41 insertions(+), 11 deletions(-) rename packages/datadog-plugin-amqplib/test/integration-test/{server.mjs => server-default.mjs} (100%) create mode 100644 packages/datadog-plugin-amqplib/test/integration-test/server-destructure.mjs create mode 100644 packages/datadog-plugin-amqplib/test/integration-test/server-star.mjs diff --git a/packages/datadog-plugin-amqplib/test/integration-test/client.spec.js b/packages/datadog-plugin-amqplib/test/integration-test/client.spec.js index 849fc4a454a..a7b6dba1641 100644 --- a/packages/datadog-plugin-amqplib/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-amqplib/test/integration-test/client.spec.js @@ -34,16 +34,18 @@ describe('esm', () => { await agent.stop() }) - it('is instrumented', async () => { - const res = agent.assertMessageReceived(({ headers, payload }) => { - assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) - assert.isArray(payload) - assert.strictEqual(checkSpansForServiceName(payload, 'amqp.command'), true) - }) - - proc = await spawnPluginIntegrationTestProc(sandbox.folder, 'server.mjs', agent.port) - - await res - }).timeout(20000) + for (const variant of ['default', 'destructure', 'star']) { + it('is instrumented', async () => { + const res = agent.assertMessageReceived(({ headers, payload }) => { + assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) + assert.isArray(payload) + assert.strictEqual(checkSpansForServiceName(payload, 'amqp.command'), true) + }) + + proc = await spawnPluginIntegrationTestProc(sandbox.folder, `server-${variant}.mjs`, agent.port) + + await res + }).timeout(20000) + } }) }) diff --git a/packages/datadog-plugin-amqplib/test/integration-test/server.mjs b/packages/datadog-plugin-amqplib/test/integration-test/server-default.mjs similarity index 100% rename from packages/datadog-plugin-amqplib/test/integration-test/server.mjs rename to packages/datadog-plugin-amqplib/test/integration-test/server-default.mjs diff --git a/packages/datadog-plugin-amqplib/test/integration-test/server-destructure.mjs b/packages/datadog-plugin-amqplib/test/integration-test/server-destructure.mjs new file mode 100644 index 00000000000..69174165834 --- /dev/null +++ b/packages/datadog-plugin-amqplib/test/integration-test/server-destructure.mjs @@ -0,0 +1,14 @@ +import 'dd-trace/init.js' +import { connect } from 'amqplib' + +const connection = await connect('amqp://localhost:5672') +const channel = await connection.createChannel() + +await channel.assertQueue('test', {}) + +if (channel) { + await channel.close() +} +if (connection) { + await connection.close() +} diff --git a/packages/datadog-plugin-amqplib/test/integration-test/server-star.mjs b/packages/datadog-plugin-amqplib/test/integration-test/server-star.mjs new file mode 100644 index 00000000000..b461ffd8e75 --- /dev/null +++ b/packages/datadog-plugin-amqplib/test/integration-test/server-star.mjs @@ -0,0 +1,14 @@ +import 'dd-trace/init.js' +import * as amqplib from 'amqplib' + +const connection = await amqplib.connect('amqp://localhost:5672') +const channel = await connection.createChannel() + +await channel.assertQueue('test', {}) + +if (channel) { + await channel.close() +} +if (connection) { + await connection.close() +} From f7dc2384f8d864b9d0602dcbcc2caa6d04a0084b Mon Sep 17 00:00:00 2001 From: Bryan English Date: Tue, 9 Sep 2025 20:52:29 -0400 Subject: [PATCH 07/23] more correct approach for dealing with default exports As a bonus, it requires less changes to instrumentations! --- .../src/helpers/hook.js | 22 +++++++++++-------- .../src/helpers/register.js | 5 +++-- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/packages/datadog-instrumentations/src/helpers/hook.js b/packages/datadog-instrumentations/src/helpers/hook.js index 875734ece37..fe670fd7832 100644 --- a/packages/datadog-instrumentations/src/helpers/hook.js +++ b/packages/datadog-instrumentations/src/helpers/hook.js @@ -19,29 +19,33 @@ function Hook (modules, hookOptions, onrequire) { hookOptions = {} } - this._patched = Object.create(null) + const patched = new WeakSet() - const safeHook = (moduleExports, moduleName, moduleBaseDir, moduleVersion) => { - const parts = [moduleBaseDir, moduleName].filter(Boolean) - const filename = path.join(...parts) + const safeHook = (moduleExports, moduleName, moduleBaseDir, moduleVersion, isIitm) => { + if (patched.has(moduleExports)) return moduleExports - if (this._patched[filename]) return moduleExports + const newExports = onrequire(moduleExports, moduleName, moduleBaseDir, moduleVersion, isIitm) - this._patched[filename] = true + if (isIitm && newExports.default && !patched.has(newExports.default) && (typeof newExports.default === 'object' || typeof newExports.default === 'function')) { + onrequire(newExports.default, moduleName, moduleBaseDir, moduleVersion, isIitm) + patched.add(newExports.default) + } - return onrequire(moduleExports, moduleName, moduleBaseDir, moduleVersion) + patched.add(newExports) + patched.add(moduleExports) + + return newExports } this._ritmHook = ritm(modules, {}, safeHook) this._iitmHook = iitm(modules, hookOptions, (moduleExports, moduleName, moduleBaseDir) => { - return safeHook(moduleExports, moduleName, moduleBaseDir) + return safeHook(moduleExports, moduleName, moduleBaseDir, null, true) }) } Hook.prototype.unhook = function () { this._ritmHook.unhook() this._iitmHook.unhook() - this._patched = Object.create(null) } module.exports = Hook diff --git a/packages/datadog-instrumentations/src/helpers/register.js b/packages/datadog-instrumentations/src/helpers/register.js index eb3bc5a0e37..3c552d4efca 100644 --- a/packages/datadog-instrumentations/src/helpers/register.js +++ b/packages/datadog-instrumentations/src/helpers/register.js @@ -66,7 +66,7 @@ for (const packageName of names) { // get the instrumentation file name to save all hooked versions const instrumentationFileName = parseHookInstrumentationFileName(packageName) - Hook([packageName], hookOptions, (moduleExports, moduleName, moduleBaseDir, moduleVersion) => { + Hook([packageName], hookOptions, (moduleExports, moduleName, moduleBaseDir, moduleVersion, isIitm) => { moduleName = moduleName.replace(pathSepExpr, '/') // This executes the integration file thus adding its entries to `instrumentations` @@ -137,7 +137,8 @@ for (const packageName of names) { // picked up due to the unification. Check what modules actually use the name. // TODO(BridgeAR): Only replace moduleExports if the hook returns a new value. // This allows to reduce the instrumentation code (no return needed). - moduleExports = hook(moduleExports, version, name) ?? moduleExports + + moduleExports = hook(moduleExports, version, name, isIitm) ?? moduleExports // Set the moduleExports in the hooks WeakSet hook[HOOK_SYMBOL].add(moduleExports) } catch (e) { From eb3a11a6ee9f16eddf090b1b65af4997d42f43d4 Mon Sep 17 00:00:00 2001 From: Bryan English Date: Tue, 9 Sep 2025 20:52:29 -0400 Subject: [PATCH 08/23] update bunyan, fastify, http2, and pino for new default handling Also, proper testing on net, dns, pino, and amqplib, elasticsearch --- .../datadog-instrumentations/src/bunyan.js | 4 +-- .../datadog-instrumentations/src/fastify.js | 12 +++---- .../src/http2/server.js | 2 -- packages/datadog-instrumentations/src/pino.js | 28 +++++++++++---- .../test/integration-test/client.spec.js | 12 +++++-- .../integration-test/server-destructure.mjs | 14 -------- .../test/integration-test/server-star.mjs | 14 -------- .../{server-default.mjs => server.mjs} | 0 .../test/integration-test/client.spec.js | 35 ++++++++++++------- .../test/integration-test/client.spec.js | 13 +++++-- .../integration-test/server-destructure.mjs | 6 ---- .../test/integration-test/server-star.mjs | 6 ---- .../{server-default.mjs => server.mjs} | 0 .../test/integration-test/client.spec.js | 33 ++++++++++------- 14 files changed, 91 insertions(+), 88 deletions(-) delete mode 100644 packages/datadog-plugin-amqplib/test/integration-test/server-destructure.mjs delete mode 100644 packages/datadog-plugin-amqplib/test/integration-test/server-star.mjs rename packages/datadog-plugin-amqplib/test/integration-test/{server-default.mjs => server.mjs} (100%) delete mode 100644 packages/datadog-plugin-elasticsearch/test/integration-test/server-destructure.mjs delete mode 100644 packages/datadog-plugin-elasticsearch/test/integration-test/server-star.mjs rename packages/datadog-plugin-elasticsearch/test/integration-test/{server-default.mjs => server.mjs} (100%) diff --git a/packages/datadog-instrumentations/src/bunyan.js b/packages/datadog-instrumentations/src/bunyan.js index e28e819d61e..9b7e7e42da4 100644 --- a/packages/datadog-instrumentations/src/bunyan.js +++ b/packages/datadog-instrumentations/src/bunyan.js @@ -8,9 +8,7 @@ const shimmer = require('../../datadog-shimmer') addHook({ name: 'bunyan', versions: ['>=1'] }, Logger => { const logCh = channel('apm:bunyan:log') - if (Logger.default) { - Logger = Logger.default - } + shimmer.wrap(Logger.prototype, '_emit', emit => { return function wrappedEmit (rec) { if (logCh.hasSubscribers) { diff --git a/packages/datadog-instrumentations/src/fastify.js b/packages/datadog-instrumentations/src/fastify.js index 67c94dd0bf1..8da6f516e09 100644 --- a/packages/datadog-instrumentations/src/fastify.js +++ b/packages/datadog-instrumentations/src/fastify.js @@ -265,8 +265,8 @@ function canPublishResponsePayload (payload) { !ArrayBuffer.isView(payload) // TypedArray } -addHook({ name: 'fastify', versions: ['>=3'] }, fastify => { - const wrapped = shimmer.wrapFunction(fastify, fastify => wrapFastify(fastify, true)) +addHook({ name: 'fastify', versions: ['>=3'] }, (fastify, _1, _2, isIitm) => { + const wrapped = shimmer.wrapFunction(fastify, fastify => wrapFastify(isIitm ? fastify.default : fastify, true)) wrapped.fastify = wrapped wrapped.default = wrapped @@ -274,12 +274,12 @@ addHook({ name: 'fastify', versions: ['>=3'] }, fastify => { return wrapped }) -addHook({ name: 'fastify', versions: ['2'] }, fastify => { - return shimmer.wrapFunction(fastify, fastify => wrapFastify(fastify, true)) +addHook({ name: 'fastify', versions: ['2'] }, (fastify, _1, _2, isIitm) => { + return shimmer.wrapFunction(fastify, fastify => wrapFastify(isIitm ? fastify.default : fastify, true)) }) -addHook({ name: 'fastify', versions: ['1'] }, fastify => { - return shimmer.wrapFunction(fastify, fastify => wrapFastify(fastify, false)) +addHook({ name: 'fastify', versions: ['1'] }, (fastify, _1, _2, isIitm) => { + return shimmer.wrapFunction(fastify, fastify => wrapFastify(isIitm ? fastify.default : fastify, false)) }) function wrapReplyHeader (Reply) { diff --git a/packages/datadog-instrumentations/src/http2/server.js b/packages/datadog-instrumentations/src/http2/server.js index b4356479bf9..5977d738554 100644 --- a/packages/datadog-instrumentations/src/http2/server.js +++ b/packages/datadog-instrumentations/src/http2/server.js @@ -17,9 +17,7 @@ const names = ['http2', 'node:http2'] addHook({ name: names }, http2 => { shimmer.wrap(http2, 'createSecureServer', wrapCreateServer) - if (http2.default) http2.default.createSecureServer = http2.createSecureServer shimmer.wrap(http2, 'createServer', wrapCreateServer) - if (http2.default) http2.default.createServer = http2.createServer }) function wrapCreateServer (createServer) { diff --git a/packages/datadog-instrumentations/src/pino.js b/packages/datadog-instrumentations/src/pino.js index 503986519ae..fad64bff920 100644 --- a/packages/datadog-instrumentations/src/pino.js +++ b/packages/datadog-instrumentations/src/pino.js @@ -73,22 +73,36 @@ function wrapPrettyFactory (prettyFactory) { } } -addHook({ name: 'pino', versions: ['2 - 3', '4', '>=5 <5.14.0'] }, pino => { +addHook({ name: 'pino', versions: ['2 - 3', '4'] }, (pino,_1, _2, isIitm) => { + if (!pino.default && isIitm) return const asJsonSym = (pino.symbols && pino.symbols.asJsonSym) || 'asJson' - return shimmer.wrapFunction(pino, pino => wrapPino(asJsonSym, wrapAsJson, pino)) + const wrapped = shimmer.wrapFunction(pino, pino => wrapPino(asJsonSym, wrapAsJson, isIitm ? pino.default : pino)) + + return wrapped }) -addHook({ name: 'pino', versions: ['>=5.14.0 <6.8.0'] }, pino => { - const mixinSym = pino.symbols.mixinSym +addHook({ name: 'pino', versions: ['>=5 <5.14.0'] }, (pino,_1, _2, isIitm) => { + const asJsonSym = ((pino.default || pino)?.symbols.asJsonSym) || 'asJson' + + const wrapped = shimmer.wrapFunction(pino, pino => wrapPino(asJsonSym, wrapAsJson, isIitm ? pino.default : pino)) + + return wrapped +}) + +addHook({ name: 'pino', versions: ['>=5.14.0 <6.8.0'] }, (pino) => { + const mixinSym = (pino.default || pino).symbols.mixinSym - return shimmer.wrapFunction(pino, pino => wrapPino(mixinSym, wrapMixin, pino)) + const wrapped = shimmer.wrapFunction(pino, pino => wrapPino(mixinSym, wrapMixin, pino.default || pino)) + + return wrapped }) -addHook({ name: 'pino', versions: ['>=6.8.0'] }, pino => { +addHook({ name: 'pino', versions: ['>=6.8.0'] }, (pino,_1, _2,isIitm) => { + if (isIitm && !pino.default) return const mixinSym = pino.symbols.mixinSym - const wrapped = shimmer.wrapFunction(pino, pino => wrapPino(mixinSym, wrapMixin, pino)) + const wrapped = shimmer.wrapFunction(pino, pino => wrapPino(mixinSym, wrapMixin, isIitm ? pino.default : pino)) wrapped.pino = wrapped wrapped.default = wrapped diff --git a/packages/datadog-plugin-amqplib/test/integration-test/client.spec.js b/packages/datadog-plugin-amqplib/test/integration-test/client.spec.js index a7b6dba1641..106022a2ffa 100644 --- a/packages/datadog-plugin-amqplib/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-amqplib/test/integration-test/client.spec.js @@ -4,7 +4,8 @@ const { FakeAgent, createSandbox, checkSpansForServiceName, - spawnPluginIntegrationTestProc + spawnPluginIntegrationTestProc, + varySandbox } = require('../../../../integration-tests/helpers') const { withVersions } = require('../../../dd-trace/test/setup/mocha') const { assert } = require('chai') @@ -13,12 +14,19 @@ describe('esm', () => { let agent let proc let sandbox + let variants + // test against later versions because server.mjs uses newer package syntax withVersions('amqplib', 'amqplib', '>=0.10.0', version => { before(async function () { this.timeout(20000) sandbox = await createSandbox([`'amqplib@${version}'`], false, ['./packages/datadog-plugin-amqplib/test/integration-test/*']) + variants = varySandbox(sandbox, 'server.mjs', { + default: `import amqplib from 'amqplib'`, + star: `import * as amqplib from 'amqplib'`, + destructure: `import { connect } from 'amqplib'; const amqplib = { connect }` + }) }) after(async () => { @@ -42,7 +50,7 @@ describe('esm', () => { assert.strictEqual(checkSpansForServiceName(payload, 'amqp.command'), true) }) - proc = await spawnPluginIntegrationTestProc(sandbox.folder, `server-${variant}.mjs`, agent.port) + proc = await spawnPluginIntegrationTestProc(sandbox.folder, variants[variant], agent.port) await res }).timeout(20000) diff --git a/packages/datadog-plugin-amqplib/test/integration-test/server-destructure.mjs b/packages/datadog-plugin-amqplib/test/integration-test/server-destructure.mjs deleted file mode 100644 index 69174165834..00000000000 --- a/packages/datadog-plugin-amqplib/test/integration-test/server-destructure.mjs +++ /dev/null @@ -1,14 +0,0 @@ -import 'dd-trace/init.js' -import { connect } from 'amqplib' - -const connection = await connect('amqp://localhost:5672') -const channel = await connection.createChannel() - -await channel.assertQueue('test', {}) - -if (channel) { - await channel.close() -} -if (connection) { - await connection.close() -} diff --git a/packages/datadog-plugin-amqplib/test/integration-test/server-star.mjs b/packages/datadog-plugin-amqplib/test/integration-test/server-star.mjs deleted file mode 100644 index b461ffd8e75..00000000000 --- a/packages/datadog-plugin-amqplib/test/integration-test/server-star.mjs +++ /dev/null @@ -1,14 +0,0 @@ -import 'dd-trace/init.js' -import * as amqplib from 'amqplib' - -const connection = await amqplib.connect('amqp://localhost:5672') -const channel = await connection.createChannel() - -await channel.assertQueue('test', {}) - -if (channel) { - await channel.close() -} -if (connection) { - await connection.close() -} diff --git a/packages/datadog-plugin-amqplib/test/integration-test/server-default.mjs b/packages/datadog-plugin-amqplib/test/integration-test/server.mjs similarity index 100% rename from packages/datadog-plugin-amqplib/test/integration-test/server-default.mjs rename to packages/datadog-plugin-amqplib/test/integration-test/server.mjs diff --git a/packages/datadog-plugin-dns/test/integration-test/client.spec.js b/packages/datadog-plugin-dns/test/integration-test/client.spec.js index 4a2f5113458..bb9112dfff0 100644 --- a/packages/datadog-plugin-dns/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-dns/test/integration-test/client.spec.js @@ -4,7 +4,8 @@ const { FakeAgent, createSandbox, checkSpansForServiceName, - spawnPluginIntegrationTestProc + spawnPluginIntegrationTestProc, + varySandbox } = require('../../../../integration-tests/helpers') const { assert } = require('chai') @@ -12,11 +13,17 @@ describe('esm', () => { let agent let proc let sandbox + let variants before(async function () { this.timeout(20000) sandbox = await createSandbox([], false, [ './packages/datadog-plugin-dns/test/integration-test/*']) + variants = varySandbox(sandbox, 'server.mjs', { + default: `import dns from 'dns'`, + star: `import * as dns from 'dns'`, + destructure: `import { lookup } from 'dns'; const dns = { lookup }` + }) }) after(async () => { @@ -33,17 +40,19 @@ describe('esm', () => { }) context('dns', () => { - it('is instrumented', async () => { - const res = agent.assertMessageReceived(({ headers, payload }) => { - assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) - assert.isArray(payload) - assert.strictEqual(checkSpansForServiceName(payload, 'dns.lookup'), true) - assert.strictEqual(payload[0][0].resource, 'fakedomain.faketld') - }) - - proc = await spawnPluginIntegrationTestProc(sandbox.folder, 'server.mjs', agent.port) - - await res - }).timeout(20000) + for (const variant of ['default', 'star', 'destructure']) { + it(`is instrumented (${variant})`, async () => { + const res = agent.assertMessageReceived(({ headers, payload }) => { + assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) + assert.isArray(payload) + assert.strictEqual(checkSpansForServiceName(payload, 'dns.lookup'), true) + assert.strictEqual(payload[0][0].resource, 'fakedomain.faketld') + }) + + proc = await spawnPluginIntegrationTestProc(sandbox.folder, variants[variant], agent.port) + + await res + }).timeout(20000) + } }) }) diff --git a/packages/datadog-plugin-elasticsearch/test/integration-test/client.spec.js b/packages/datadog-plugin-elasticsearch/test/integration-test/client.spec.js index 7cb40cee737..b86d8c29d39 100644 --- a/packages/datadog-plugin-elasticsearch/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-elasticsearch/test/integration-test/client.spec.js @@ -4,7 +4,8 @@ const { FakeAgent, createSandbox, checkSpansForServiceName, - spawnPluginIntegrationTestProc + spawnPluginIntegrationTestProc, + varySandbox } = require('../../../../integration-tests/helpers') const { withVersions } = require('../../../dd-trace/test/setup/mocha') const { assert } = require('chai') @@ -13,6 +14,7 @@ describe('esm', () => { let agent let proc let sandbox + let variants // excluding 8.16.0 for esm tests, because it is not working: https://github.com/elastic/elasticsearch-js/issues/2466 withVersions('elasticsearch', ['@elastic/elasticsearch'], '<8.16.0 || >8.16.0', version => { @@ -20,6 +22,11 @@ describe('esm', () => { this.timeout(20000) sandbox = await createSandbox([`'@elastic/elasticsearch@${version}'`], false, [ './packages/datadog-plugin-elasticsearch/test/integration-test/*']) + variants = varySandbox(sandbox, 'server.mjs', { + default: `import elasticsearch from '@elastic/elasticsearch'`, + star: `import * as elasticsearch from '@elastic/elasticsearch'`, + destructure: `import { Client } from '@elastic/elasticsearch'; const elasticsearch = { Client }` + }) }) after(async () => { @@ -35,14 +42,14 @@ describe('esm', () => { await agent.stop() }) for (const variant of ['default', 'destructure', 'star']) { - it(`is instrumented ${variant}`, async () => { + it(`is instrumented (${variant})`, async () => { const res = agent.assertMessageReceived(({ headers, payload }) => { assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) assert.isArray(payload) assert.strictEqual(checkSpansForServiceName(payload, 'elasticsearch.query'), true) }) - proc = await spawnPluginIntegrationTestProc(sandbox.folder, `server-${variant}.mjs`, agent.port) + proc = await spawnPluginIntegrationTestProc(sandbox.folder, variants[variant], agent.port) await res }).timeout(20000) diff --git a/packages/datadog-plugin-elasticsearch/test/integration-test/server-destructure.mjs b/packages/datadog-plugin-elasticsearch/test/integration-test/server-destructure.mjs deleted file mode 100644 index ff47d43b773..00000000000 --- a/packages/datadog-plugin-elasticsearch/test/integration-test/server-destructure.mjs +++ /dev/null @@ -1,6 +0,0 @@ -import 'dd-trace/init.js' -import { Client } from '@elastic/elasticsearch' - -const client = new Client({ node: 'http://127.0.0.1:9200' }) - -await client.ping() diff --git a/packages/datadog-plugin-elasticsearch/test/integration-test/server-star.mjs b/packages/datadog-plugin-elasticsearch/test/integration-test/server-star.mjs deleted file mode 100644 index c2ea1de1b73..00000000000 --- a/packages/datadog-plugin-elasticsearch/test/integration-test/server-star.mjs +++ /dev/null @@ -1,6 +0,0 @@ -import 'dd-trace/init.js' -import * as elastic from '@elastic/elasticsearch' - -const client = new elastic.Client({ node: 'http://127.0.0.1:9200' }) - -await client.ping() diff --git a/packages/datadog-plugin-elasticsearch/test/integration-test/server-default.mjs b/packages/datadog-plugin-elasticsearch/test/integration-test/server.mjs similarity index 100% rename from packages/datadog-plugin-elasticsearch/test/integration-test/server-default.mjs rename to packages/datadog-plugin-elasticsearch/test/integration-test/server.mjs diff --git a/packages/datadog-plugin-pino/test/integration-test/client.spec.js b/packages/datadog-plugin-pino/test/integration-test/client.spec.js index b97f0885ac8..abec92ce47a 100644 --- a/packages/datadog-plugin-pino/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-pino/test/integration-test/client.spec.js @@ -3,7 +3,8 @@ const { FakeAgent, createSandbox, - spawnPluginIntegrationTestProc + spawnPluginIntegrationTestProc, + varySandbox } = require('../../../../integration-tests/helpers') const { withVersions } = require('../../../dd-trace/test/setup/mocha') const { expect } = require('chai') @@ -12,12 +13,18 @@ describe('esm', () => { let agent let proc let sandbox + let variants withVersions('pino', 'pino', version => { before(async function () { this.timeout(20000) sandbox = await createSandbox([`'pino@${version}'`], false, ['./packages/datadog-plugin-pino/test/integration-test/*']) + variants = varySandbox(sandbox, 'server.mjs', { + default: `import pino from 'pino'`, + star: `import * as modPino from 'pino'; const pino = (...a) => modPino.default(...a)`, + destructure: `import { default as pino } from 'pino'`, + }) }) after(async () => { @@ -33,16 +40,18 @@ describe('esm', () => { await agent.stop() }) - it('is instrumented', async () => { - proc = await spawnPluginIntegrationTestProc( - sandbox.folder, - 'server.mjs', - agent.port, - (data) => { - const jsonObject = JSON.parse(data.toString()) - expect(jsonObject).to.have.property('dd') - } - ) - }).timeout(20000) + for (const variant of ['default', 'star', 'destructure']) { + it(`is instrumented (${variant})`, async () => { + proc = await spawnPluginIntegrationTestProc( + sandbox.folder, + variants[variant], + agent.port, + (data) => { + const jsonObject = JSON.parse(data.toString()) + expect(jsonObject).to.have.property('dd') + } + ) + }).timeout(20000) + } }) }) From 4674f3dac5cdfc8d34269e265beb82ddbf344cdd Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Wed, 10 Sep 2025 17:10:39 -0400 Subject: [PATCH 09/23] Added import variation tests for cassandra-driver --- .../src/cassandra-driver.js | 12 ++++++-- .../test/integration-test/client.spec.js | 29 ++++++++++++------- .../test/integration-test/server.mjs | 4 +-- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/packages/datadog-instrumentations/src/cassandra-driver.js b/packages/datadog-instrumentations/src/cassandra-driver.js index 006f85809e0..40c98c3161e 100644 --- a/packages/datadog-instrumentations/src/cassandra-driver.js +++ b/packages/datadog-instrumentations/src/cassandra-driver.js @@ -45,7 +45,11 @@ addHook({ name: 'cassandra-driver', versions: ['>=3.0.0'] }, cassandra => { return cassandra }) -addHook({ name: 'cassandra-driver', versions: ['>=4.4'] }, cassandra => { +addHook({ name: 'cassandra-driver', versions: ['>=4.4'] }, (cassandra, _1, _2, isIitm) => { + if (!cassandra.default && isIitm) { + return cassandra + } + shimmer.wrap(cassandra.Client.prototype, '_execute', _execute => function (query, params, execOptions, callback) { if (!startCh.hasSubscribers) { return _execute.apply(this, arguments) @@ -68,7 +72,11 @@ const isValid = (args) => { return args.length === 4 || typeof args[3] === 'function' } -addHook({ name: 'cassandra-driver', versions: ['3 - 4.3'] }, cassandra => { +addHook({ name: 'cassandra-driver', versions: ['3 - 4.3'] }, (cassandra, _1, _2, isIitm) => { + if (!cassandra.default && isIitm) { + return cassandra + } + shimmer.wrap(cassandra.Client.prototype, '_innerExecute', _innerExecute => function (query, params, execOptions, callback) { if (!startCh.hasSubscribers) { diff --git a/packages/datadog-plugin-cassandra-driver/test/integration-test/client.spec.js b/packages/datadog-plugin-cassandra-driver/test/integration-test/client.spec.js index 7ebeb665d31..0f9ae62e683 100644 --- a/packages/datadog-plugin-cassandra-driver/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-cassandra-driver/test/integration-test/client.spec.js @@ -4,7 +4,8 @@ const { FakeAgent, createSandbox, checkSpansForServiceName, - spawnPluginIntegrationTestProc + spawnPluginIntegrationTestProc, + varySandbox } = require('../../../../integration-tests/helpers') const { withVersions } = require('../../../dd-trace/test/setup/mocha') const { assert } = require('chai') @@ -13,6 +14,7 @@ describe('esm', () => { let agent let proc let sandbox + let variants // test against later versions because server.mjs uses newer package syntax withVersions('cassandra-driver', 'cassandra-driver', '>=4.4.0', version => { @@ -20,6 +22,11 @@ describe('esm', () => { this.timeout(20000) sandbox = await createSandbox([`'cassandra-driver@${version}'`], false, [ './packages/datadog-plugin-cassandra-driver/test/integration-test/*']) + variants = varySandbox(sandbox, 'server.mjs', { + default: 'import cassandra from \'cassandra-driver\'', + star: 'import * as cassandra from \'cassandra-driver\'', + destructure: 'import { Client } from \'cassandra-driver\'; const cassandra = { Client }' + }) }) after(async () => { @@ -35,16 +42,18 @@ describe('esm', () => { await agent.stop() }) - it('is instrumented', async () => { - const res = agent.assertMessageReceived(({ headers, payload }) => { - assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) - assert.isArray(payload) - assert.strictEqual(checkSpansForServiceName(payload, 'cassandra.query'), true) - }) + for (const variant of ['default', 'destructure', 'star']) { + it('is instrumented', async () => { + const res = agent.assertMessageReceived(({ headers, payload }) => { + assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) + assert.isArray(payload) + assert.strictEqual(checkSpansForServiceName(payload, 'cassandra.query'), true) + }) - proc = await spawnPluginIntegrationTestProc(sandbox.folder, 'server.mjs', agent.port) + proc = await spawnPluginIntegrationTestProc(sandbox.folder, variants[variant], agent.port) - await res - }).timeout(20000) + await res + }).timeout(20000) + } }) }) diff --git a/packages/datadog-plugin-cassandra-driver/test/integration-test/server.mjs b/packages/datadog-plugin-cassandra-driver/test/integration-test/server.mjs index c65ebffe78d..c4b6ebd518c 100644 --- a/packages/datadog-plugin-cassandra-driver/test/integration-test/server.mjs +++ b/packages/datadog-plugin-cassandra-driver/test/integration-test/server.mjs @@ -1,7 +1,7 @@ import 'dd-trace/init.js' -import { Client } from 'cassandra-driver' +import cassandra from 'cassandra-driver' -const client = new Client({ +const client = new cassandra.Client({ contactPoints: ['127.0.0.1'], localDataCenter: 'datacenter1', keyspace: 'system' From 2d6124d8ca00cf077ee9d640f4cfeffd5659395c Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Thu, 11 Sep 2025 16:28:53 -0400 Subject: [PATCH 10/23] Added import variation tests for connect --- .../datadog-instrumentations/src/connect.js | 8 +++-- .../test/integration-test/client.spec.js | 32 ++++++++++++------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/packages/datadog-instrumentations/src/connect.js b/packages/datadog-instrumentations/src/connect.js index 507811f6dd3..867ee63a857 100644 --- a/packages/datadog-instrumentations/src/connect.js +++ b/packages/datadog-instrumentations/src/connect.js @@ -102,11 +102,15 @@ function wrapNext (req, next) { }) } -addHook({ name: 'connect', versions: ['>=3'] }, connect => { +addHook({ name: 'connect', versions: ['>=3.4.0'] }, (connect) => { return shimmer.wrapFunction(connect, connect => wrapConnect(connect)) }) -addHook({ name: 'connect', versions: ['2.2.2'] }, connect => { +addHook({ name: 'connect', versions: ['>=3 <3.4.0'], file: 'lib/connect.js' }, (connect) => { + return shimmer.wrapFunction(connect, connect => wrapConnect(connect)) +}) + +addHook({ name: 'connect', versions: ['2.2.2'], file: 'lib/connect.js' }, connect => { shimmer.wrap(connect.proto, 'use', wrapUse) shimmer.wrap(connect.proto, 'handle', wrapHandle) diff --git a/packages/datadog-plugin-connect/test/integration-test/client.spec.js b/packages/datadog-plugin-connect/test/integration-test/client.spec.js index 541db6e2cc5..ba354dc9091 100644 --- a/packages/datadog-plugin-connect/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-connect/test/integration-test/client.spec.js @@ -5,7 +5,8 @@ const { createSandbox, curlAndAssertMessage, checkSpansForServiceName, - spawnPluginIntegrationTestProc + spawnPluginIntegrationTestProc, + varySandbox } = require('../../../../integration-tests/helpers') const { withVersions } = require('../../../dd-trace/test/setup/mocha') const { assert } = require('chai') @@ -14,13 +15,18 @@ describe('esm', () => { let agent let proc let sandbox - + let variants // test against later versions because server.mjs uses newer package syntax - withVersions('connect', 'connect', '>=3', version => { + withVersions('connect', 'connect', version => { before(async function () { this.timeout(20000) sandbox = await createSandbox([`'connect@${version}'`], false, [ './packages/datadog-plugin-connect/test/integration-test/*']) + variants = varySandbox(sandbox, 'server.mjs', { + default: 'import connect from \'connect\'', + star: 'import * as starConnect from \'connect\'; const connect = starConnect.default;', + destructure: 'import { default as connect } from \'connect\';' + }) }) after(async () => { @@ -36,14 +42,16 @@ describe('esm', () => { await agent.stop() }) - it('is instrumented', async () => { - proc = await spawnPluginIntegrationTestProc(sandbox.folder, 'server.mjs', agent.port) - - return curlAndAssertMessage(agent, proc, ({ headers, payload }) => { - assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) - assert.isArray(payload) - assert.strictEqual(checkSpansForServiceName(payload, 'connect.request'), true) - }) - }).timeout(20000) + for (const variant of ['default', 'destructure', 'star']) { + it(`is instrumented (${variant})`, async () => { + proc = await spawnPluginIntegrationTestProc(sandbox.folder, variants[variant], agent.port) + + return curlAndAssertMessage(agent, proc, ({ headers, payload }) => { + assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) + assert.isArray(payload) + assert.strictEqual(checkSpansForServiceName(payload, 'connect.request'), true) + }) + }).timeout(20000) + } }) }) From e7d7205ac85626feb92f7791125aed64486e5946 Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Thu, 11 Sep 2025 16:35:08 -0400 Subject: [PATCH 11/23] Refactor hook.js to use WeakMap for patched exports, improving handling of default exports and reducing complexity in the safeHook function. --- .../src/helpers/hook.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/datadog-instrumentations/src/helpers/hook.js b/packages/datadog-instrumentations/src/helpers/hook.js index fe670fd7832..7ec08b40957 100644 --- a/packages/datadog-instrumentations/src/helpers/hook.js +++ b/packages/datadog-instrumentations/src/helpers/hook.js @@ -19,20 +19,25 @@ function Hook (modules, hookOptions, onrequire) { hookOptions = {} } - const patched = new WeakSet() + const patched = new WeakMap() const safeHook = (moduleExports, moduleName, moduleBaseDir, moduleVersion, isIitm) => { - if (patched.has(moduleExports)) return moduleExports + if (patched.has(moduleExports)) { + return patched.get(moduleExports) + } const newExports = onrequire(moduleExports, moduleName, moduleBaseDir, moduleVersion, isIitm) - if (isIitm && newExports.default && !patched.has(newExports.default) && (typeof newExports.default === 'object' || typeof newExports.default === 'function')) { - onrequire(newExports.default, moduleName, moduleBaseDir, moduleVersion, isIitm) - patched.add(newExports.default) + if ( + isIitm && + moduleExports.default && + (typeof moduleExports.default === 'object' || + typeof moduleExports.default === 'function') + ) { + newExports.default = onrequire(moduleExports.default, moduleName, moduleBaseDir, moduleVersion, isIitm) } - patched.add(newExports) - patched.add(moduleExports) + patched.set(moduleExports, newExports) return newExports } From 2ed771e0ea51b84e6ff38fc88063d9dc804ac742 Mon Sep 17 00:00:00 2001 From: Bryan English Date: Thu, 11 Sep 2025 22:08:01 -0400 Subject: [PATCH 12/23] update ioredis for new default handling, and vary import tests --- .../datadog-instrumentations/src/ioredis.js | 13 ++++++++- .../test/integration-test/client.spec.js | 29 ++++++++++++------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/packages/datadog-instrumentations/src/ioredis.js b/packages/datadog-instrumentations/src/ioredis.js index 43ed093893e..466130594c0 100644 --- a/packages/datadog-instrumentations/src/ioredis.js +++ b/packages/datadog-instrumentations/src/ioredis.js @@ -10,7 +10,7 @@ const startCh = channel('apm:ioredis:command:start') const finishCh = channel('apm:ioredis:command:finish') const errorCh = channel('apm:ioredis:command:error') -addHook({ name: 'ioredis', versions: ['>=2'] }, Redis => { +function wrapRedis(Redis) { shimmer.wrap(Redis.prototype, 'sendCommand', sendCommand => function (command, stream) { if (!startCh.hasSubscribers) return sendCommand.apply(this, arguments) @@ -35,8 +35,19 @@ addHook({ name: 'ioredis', versions: ['>=2'] }, Redis => { }) }) return Redis +} + +addHook({ name: 'ioredis', versions: ['>=2 <4'], file: 'lib/redis.js' }, wrapRedis) + +addHook({ name: 'ioredis', versions: [ '>=4 <4.11.0'], file: 'built/redis.js' }, wrapRedis) + +addHook({ name: 'ioredis', versions: [ '>=4.11.0 <5'], file: 'built/redis/index.js' }, (exports) => { + wrapRedis(exports.default) + return exports }) +addHook({ name: 'ioredis', versions: [ '>=5'] }, wrapRedis) + function finish (finishCh, errorCh, ctx, error) { if (error) { ctx.error = error diff --git a/packages/datadog-plugin-ioredis/test/integration-test/client.spec.js b/packages/datadog-plugin-ioredis/test/integration-test/client.spec.js index ed52f073e36..9a1a7d52bce 100644 --- a/packages/datadog-plugin-ioredis/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-ioredis/test/integration-test/client.spec.js @@ -4,7 +4,8 @@ const { FakeAgent, createSandbox, checkSpansForServiceName, - spawnPluginIntegrationTestProc + spawnPluginIntegrationTestProc, + varySandbox } = require('../../../../integration-tests/helpers') const { withVersions } = require('../../../dd-trace/test/setup/mocha') const { assert } = require('chai') @@ -13,11 +14,17 @@ describe('esm', () => { let agent let proc let sandbox + let variants withVersions('ioredis', 'ioredis', version => { before(async function () { this.timeout(20000) sandbox = await createSandbox([`'ioredis@${version}'`], false, [ './packages/datadog-plugin-ioredis/test/integration-test/*']) + variants = varySandbox(sandbox, 'server.mjs', { + default: `import Redis from 'ioredis'`, + star: `import * as modRedis from 'ioredis'; const { default: Redis } = modRedis`, + destructure: `import { default as Redis } from 'ioredis'` + }) }) after(async () => { @@ -33,16 +40,18 @@ describe('esm', () => { await agent.stop() }) - it('is instrumented', async () => { - const res = agent.assertMessageReceived(({ headers, payload }) => { - assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) - assert.isArray(payload) - assert.strictEqual(checkSpansForServiceName(payload, 'redis.command'), true) - }) + for (const variant of ['default', 'star', 'destructure']) { + it(`is instrumented (${variant})`, async () => { + const res = agent.assertMessageReceived(({ headers, payload }) => { + assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) + assert.isArray(payload) + assert.strictEqual(checkSpansForServiceName(payload, 'redis.command'), true) + }) - proc = await spawnPluginIntegrationTestProc(sandbox.folder, 'server.mjs', agent.port) + proc = await spawnPluginIntegrationTestProc(sandbox.folder, variants[variant], agent.port) - await res - }).timeout(20000) + await res + }).timeout(20000) + } }) }) From d9ab3c5ff7db3cc025e1e744859ddfd873f37723 Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Fri, 12 Sep 2025 14:33:46 -0400 Subject: [PATCH 13/23] Added import variations tests for express --- .../datadog-instrumentations/src/express.js | 10 +-- .../test/integration-test/client.spec.js | 80 ++++++++++--------- 2 files changed, 49 insertions(+), 41 deletions(-) diff --git a/packages/datadog-instrumentations/src/express.js b/packages/datadog-instrumentations/src/express.js index 3975d78985d..874b0bb59a8 100644 --- a/packages/datadog-instrumentations/src/express.js +++ b/packages/datadog-instrumentations/src/express.js @@ -57,7 +57,7 @@ function wrapResponseRender (render) { } } -addHook({ name: 'express', versions: ['>=4'] }, express => { +addHook({ name: 'express', versions: ['>=4'], file: ['lib/express.js'] }, express => { shimmer.wrap(express.application, 'handle', wrapHandle) shimmer.wrap(express.response, 'json', wrapResponseJson) @@ -67,14 +67,14 @@ addHook({ name: 'express', versions: ['>=4'] }, express => { return express }) -addHook({ name: 'express', versions: ['4'] }, express => { +addHook({ name: 'express', versions: ['4'], file: 'lib/express.js' }, express => { shimmer.wrap(express.Router, 'use', wrapRouterMethod) shimmer.wrap(express.Router, 'route', wrapRouterMethod) return express }) -addHook({ name: 'express', versions: ['>=5.0.0'] }, express => { +addHook({ name: 'express', versions: ['>=5.0.0'], file: ['lib/express.js'] }, express => { shimmer.wrap(express.Router.prototype, 'use', wrapRouterMethod) shimmer.wrap(express.Router.prototype, 'route', wrapRouterMethod) @@ -136,12 +136,12 @@ function wrapProcessParamsMethod (requestPositionInArguments) { } } -addHook({ name: 'express', versions: ['>=4.0.0 <4.3.0'] }, express => { +addHook({ name: 'express', versions: ['>=4.0.0 <4.3.0'], file: ['lib/express.js'] }, express => { shimmer.wrap(express.Router, 'process_params', wrapProcessParamsMethod(1)) return express }) -addHook({ name: 'express', versions: ['>=4.3.0 <5.0.0'] }, express => { +addHook({ name: 'express', versions: ['>=4.3.0 <5.0.0'], file: ['lib/express.js'] }, express => { shimmer.wrap(express.Router, 'process_params', wrapProcessParamsMethod(2)) return express }) diff --git a/packages/datadog-plugin-express/test/integration-test/client.spec.js b/packages/datadog-plugin-express/test/integration-test/client.spec.js index f9a3339b608..8bf931a8bf4 100644 --- a/packages/datadog-plugin-express/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-express/test/integration-test/client.spec.js @@ -4,7 +4,8 @@ const { FakeAgent, createSandbox, curlAndAssertMessage, - spawnPluginIntegrationTestProc + spawnPluginIntegrationTestProc, + varySandbox } = require('../../../../integration-tests/helpers') const { withVersions } = require('../../../dd-trace/test/setup/mocha') const { assert } = require('chai') @@ -14,12 +15,18 @@ describe('esm', () => { let agent let proc let sandbox + let variants withVersions('express', 'express', version => { before(async function () { this.timeout(50000) sandbox = await createSandbox([`'express@${version}'`], false, ['./packages/datadog-plugin-express/test/integration-test/*']) + variants = varySandbox(sandbox, 'server.mjs', { + default: 'import express from \'express\'', + star: 'import * as starExpress from \'express\'; const express = starExpress.default;', + destructure: 'import { default as express } from \'express\';' + }) }) after(async function () { @@ -35,46 +42,47 @@ describe('esm', () => { proc && proc.kill() await agent.stop() }) + for (const variant of ['default', 'star', 'destructure']) { + describe('with DD_TRACE_MIDDLEWARE_TRACING_ENABLED unset', () => { + it('is instrumented', async () => { + proc = await spawnPluginIntegrationTestProc(sandbox.folder, variants[variant], agent.port) + const numberOfSpans = semver.intersects(version, '<5.0.0') ? 4 : 3 - describe('with DD_TRACE_MIDDLEWARE_TRACING_ENABLED unset', () => { - it('is instrumented', async () => { - proc = await spawnPluginIntegrationTestProc(sandbox.folder, 'server.mjs', agent.port) - const numberOfSpans = semver.intersects(version, '<5.0.0') ? 4 : 3 + return curlAndAssertMessage(agent, proc, ({ headers, payload }) => { + assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) + assert.isArray(payload) + assert.strictEqual(payload.length, 1) + assert.isArray(payload[0]) + assert.strictEqual(payload[0].length, numberOfSpans) + assert.propertyVal(payload[0][0], 'name', 'express.request') + assert.propertyVal(payload[0][1], 'name', 'express.middleware') + }) + }).timeout(50000) + }) - return curlAndAssertMessage(agent, proc, ({ headers, payload }) => { - assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) - assert.isArray(payload) - assert.strictEqual(payload.length, 1) - assert.isArray(payload[0]) - assert.strictEqual(payload[0].length, numberOfSpans) - assert.propertyVal(payload[0][0], 'name', 'express.request') - assert.propertyVal(payload[0][1], 'name', 'express.middleware') + describe('with DD_TRACE_MIDDLEWARE_TRACING_ENABLED=true', () => { + before(() => { + process.env.DD_TRACE_MIDDLEWARE_TRACING_ENABLED = false }) - }).timeout(50000) - }) - - describe('with DD_TRACE_MIDDLEWARE_TRACING_ENABLED=true', () => { - before(() => { - process.env.DD_TRACE_MIDDLEWARE_TRACING_ENABLED = false - }) - after(() => { - delete process.env.DD_TRACE_MIDDLEWARE_TRACING_ENABLED - }) + after(() => { + delete process.env.DD_TRACE_MIDDLEWARE_TRACING_ENABLED + }) - it('disables middleware spans when config.middlewareTracingEnabled is false via env var', async () => { - proc = await spawnPluginIntegrationTestProc(sandbox.folder, 'server.mjs', agent.port) - const numberOfSpans = 1 + it('disables middleware spans when config.middlewareTracingEnabled is false via env var', async () => { + proc = await spawnPluginIntegrationTestProc(sandbox.folder, variants[variant], agent.port) + const numberOfSpans = 1 - return curlAndAssertMessage(agent, proc, ({ headers, payload }) => { - assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) - assert.isArray(payload) - assert.strictEqual(payload.length, 1) - assert.isArray(payload[0]) - assert.strictEqual(payload[0].length, numberOfSpans) - assert.propertyVal(payload[0][0], 'name', 'express.request') - }) - }).timeout(50000) - }) + return curlAndAssertMessage(agent, proc, ({ headers, payload }) => { + assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) + assert.isArray(payload) + assert.strictEqual(payload.length, 1) + assert.isArray(payload[0]) + assert.strictEqual(payload[0].length, numberOfSpans) + assert.propertyVal(payload[0][0], 'name', 'express.request') + }) + }).timeout(50000) + }) + } }) }) From ef127a9716f071ea663d725cdc9aedb4b525d16e Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Fri, 12 Sep 2025 14:42:47 -0400 Subject: [PATCH 14/23] removing express changes (express will fail) --- packages/datadog-instrumentations/src/express.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/datadog-instrumentations/src/express.js b/packages/datadog-instrumentations/src/express.js index 874b0bb59a8..d9ba0e2fc2d 100644 --- a/packages/datadog-instrumentations/src/express.js +++ b/packages/datadog-instrumentations/src/express.js @@ -57,7 +57,7 @@ function wrapResponseRender (render) { } } -addHook({ name: 'express', versions: ['>=4'], file: ['lib/express.js'] }, express => { +addHook({ name: 'express', versions: ['>=4'] }, express => { shimmer.wrap(express.application, 'handle', wrapHandle) shimmer.wrap(express.response, 'json', wrapResponseJson) @@ -67,14 +67,14 @@ addHook({ name: 'express', versions: ['>=4'], file: ['lib/express.js'] }, expres return express }) -addHook({ name: 'express', versions: ['4'], file: 'lib/express.js' }, express => { +addHook({ name: 'express', versions: ['4'] }, express => { shimmer.wrap(express.Router, 'use', wrapRouterMethod) shimmer.wrap(express.Router, 'route', wrapRouterMethod) return express }) -addHook({ name: 'express', versions: ['>=5.0.0'], file: ['lib/express.js'] }, express => { +addHook({ name: 'express', versions: ['>=5.0.0'] }, express => { shimmer.wrap(express.Router.prototype, 'use', wrapRouterMethod) shimmer.wrap(express.Router.prototype, 'route', wrapRouterMethod) @@ -141,7 +141,7 @@ addHook({ name: 'express', versions: ['>=4.0.0 <4.3.0'], file: ['lib/express.js' return express }) -addHook({ name: 'express', versions: ['>=4.3.0 <5.0.0'], file: ['lib/express.js'] }, express => { +addHook({ name: 'express', versions: ['>=4.3.0 <5.0.0'] }, express => { shimmer.wrap(express.Router, 'process_params', wrapProcessParamsMethod(2)) return express }) From 556ae2fb84c55afc5c141c6ce6f09d030d05b0e4 Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Fri, 12 Sep 2025 14:44:33 -0400 Subject: [PATCH 15/23] express tests back to original state --- .../test/integration-test/client.spec.js | 80 +++++++++---------- 1 file changed, 36 insertions(+), 44 deletions(-) diff --git a/packages/datadog-plugin-express/test/integration-test/client.spec.js b/packages/datadog-plugin-express/test/integration-test/client.spec.js index 8bf931a8bf4..f9a3339b608 100644 --- a/packages/datadog-plugin-express/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-express/test/integration-test/client.spec.js @@ -4,8 +4,7 @@ const { FakeAgent, createSandbox, curlAndAssertMessage, - spawnPluginIntegrationTestProc, - varySandbox + spawnPluginIntegrationTestProc } = require('../../../../integration-tests/helpers') const { withVersions } = require('../../../dd-trace/test/setup/mocha') const { assert } = require('chai') @@ -15,18 +14,12 @@ describe('esm', () => { let agent let proc let sandbox - let variants withVersions('express', 'express', version => { before(async function () { this.timeout(50000) sandbox = await createSandbox([`'express@${version}'`], false, ['./packages/datadog-plugin-express/test/integration-test/*']) - variants = varySandbox(sandbox, 'server.mjs', { - default: 'import express from \'express\'', - star: 'import * as starExpress from \'express\'; const express = starExpress.default;', - destructure: 'import { default as express } from \'express\';' - }) }) after(async function () { @@ -42,47 +35,46 @@ describe('esm', () => { proc && proc.kill() await agent.stop() }) - for (const variant of ['default', 'star', 'destructure']) { - describe('with DD_TRACE_MIDDLEWARE_TRACING_ENABLED unset', () => { - it('is instrumented', async () => { - proc = await spawnPluginIntegrationTestProc(sandbox.folder, variants[variant], agent.port) - const numberOfSpans = semver.intersects(version, '<5.0.0') ? 4 : 3 - return curlAndAssertMessage(agent, proc, ({ headers, payload }) => { - assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) - assert.isArray(payload) - assert.strictEqual(payload.length, 1) - assert.isArray(payload[0]) - assert.strictEqual(payload[0].length, numberOfSpans) - assert.propertyVal(payload[0][0], 'name', 'express.request') - assert.propertyVal(payload[0][1], 'name', 'express.middleware') - }) - }).timeout(50000) - }) + describe('with DD_TRACE_MIDDLEWARE_TRACING_ENABLED unset', () => { + it('is instrumented', async () => { + proc = await spawnPluginIntegrationTestProc(sandbox.folder, 'server.mjs', agent.port) + const numberOfSpans = semver.intersects(version, '<5.0.0') ? 4 : 3 - describe('with DD_TRACE_MIDDLEWARE_TRACING_ENABLED=true', () => { - before(() => { - process.env.DD_TRACE_MIDDLEWARE_TRACING_ENABLED = false - }) - - after(() => { - delete process.env.DD_TRACE_MIDDLEWARE_TRACING_ENABLED + return curlAndAssertMessage(agent, proc, ({ headers, payload }) => { + assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) + assert.isArray(payload) + assert.strictEqual(payload.length, 1) + assert.isArray(payload[0]) + assert.strictEqual(payload[0].length, numberOfSpans) + assert.propertyVal(payload[0][0], 'name', 'express.request') + assert.propertyVal(payload[0][1], 'name', 'express.middleware') }) + }).timeout(50000) + }) - it('disables middleware spans when config.middlewareTracingEnabled is false via env var', async () => { - proc = await spawnPluginIntegrationTestProc(sandbox.folder, variants[variant], agent.port) - const numberOfSpans = 1 + describe('with DD_TRACE_MIDDLEWARE_TRACING_ENABLED=true', () => { + before(() => { + process.env.DD_TRACE_MIDDLEWARE_TRACING_ENABLED = false + }) - return curlAndAssertMessage(agent, proc, ({ headers, payload }) => { - assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) - assert.isArray(payload) - assert.strictEqual(payload.length, 1) - assert.isArray(payload[0]) - assert.strictEqual(payload[0].length, numberOfSpans) - assert.propertyVal(payload[0][0], 'name', 'express.request') - }) - }).timeout(50000) + after(() => { + delete process.env.DD_TRACE_MIDDLEWARE_TRACING_ENABLED }) - } + + it('disables middleware spans when config.middlewareTracingEnabled is false via env var', async () => { + proc = await spawnPluginIntegrationTestProc(sandbox.folder, 'server.mjs', agent.port) + const numberOfSpans = 1 + + return curlAndAssertMessage(agent, proc, ({ headers, payload }) => { + assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) + assert.isArray(payload) + assert.strictEqual(payload.length, 1) + assert.isArray(payload[0]) + assert.strictEqual(payload[0].length, numberOfSpans) + assert.propertyVal(payload[0][0], 'name', 'express.request') + }) + }).timeout(50000) + }) }) }) From ac6a4a7d9c8c68f1abf1d00dec8c74d236b95eb6 Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Fri, 12 Sep 2025 14:47:50 -0400 Subject: [PATCH 16/23] readed express changes --- packages/datadog-instrumentations/src/express.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/datadog-instrumentations/src/express.js b/packages/datadog-instrumentations/src/express.js index d9ba0e2fc2d..874b0bb59a8 100644 --- a/packages/datadog-instrumentations/src/express.js +++ b/packages/datadog-instrumentations/src/express.js @@ -57,7 +57,7 @@ function wrapResponseRender (render) { } } -addHook({ name: 'express', versions: ['>=4'] }, express => { +addHook({ name: 'express', versions: ['>=4'], file: ['lib/express.js'] }, express => { shimmer.wrap(express.application, 'handle', wrapHandle) shimmer.wrap(express.response, 'json', wrapResponseJson) @@ -67,14 +67,14 @@ addHook({ name: 'express', versions: ['>=4'] }, express => { return express }) -addHook({ name: 'express', versions: ['4'] }, express => { +addHook({ name: 'express', versions: ['4'], file: 'lib/express.js' }, express => { shimmer.wrap(express.Router, 'use', wrapRouterMethod) shimmer.wrap(express.Router, 'route', wrapRouterMethod) return express }) -addHook({ name: 'express', versions: ['>=5.0.0'] }, express => { +addHook({ name: 'express', versions: ['>=5.0.0'], file: ['lib/express.js'] }, express => { shimmer.wrap(express.Router.prototype, 'use', wrapRouterMethod) shimmer.wrap(express.Router.prototype, 'route', wrapRouterMethod) @@ -141,7 +141,7 @@ addHook({ name: 'express', versions: ['>=4.0.0 <4.3.0'], file: ['lib/express.js' return express }) -addHook({ name: 'express', versions: ['>=4.3.0 <5.0.0'] }, express => { +addHook({ name: 'express', versions: ['>=4.3.0 <5.0.0'], file: ['lib/express.js'] }, express => { shimmer.wrap(express.Router, 'process_params', wrapProcessParamsMethod(2)) return express }) From 30bc2d44a147637cc42456275c85d6df32ed6019 Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Fri, 12 Sep 2025 14:51:45 -0400 Subject: [PATCH 17/23] express back to original state --- packages/datadog-instrumentations/src/express.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/datadog-instrumentations/src/express.js b/packages/datadog-instrumentations/src/express.js index 874b0bb59a8..3975d78985d 100644 --- a/packages/datadog-instrumentations/src/express.js +++ b/packages/datadog-instrumentations/src/express.js @@ -57,7 +57,7 @@ function wrapResponseRender (render) { } } -addHook({ name: 'express', versions: ['>=4'], file: ['lib/express.js'] }, express => { +addHook({ name: 'express', versions: ['>=4'] }, express => { shimmer.wrap(express.application, 'handle', wrapHandle) shimmer.wrap(express.response, 'json', wrapResponseJson) @@ -67,14 +67,14 @@ addHook({ name: 'express', versions: ['>=4'], file: ['lib/express.js'] }, expres return express }) -addHook({ name: 'express', versions: ['4'], file: 'lib/express.js' }, express => { +addHook({ name: 'express', versions: ['4'] }, express => { shimmer.wrap(express.Router, 'use', wrapRouterMethod) shimmer.wrap(express.Router, 'route', wrapRouterMethod) return express }) -addHook({ name: 'express', versions: ['>=5.0.0'], file: ['lib/express.js'] }, express => { +addHook({ name: 'express', versions: ['>=5.0.0'] }, express => { shimmer.wrap(express.Router.prototype, 'use', wrapRouterMethod) shimmer.wrap(express.Router.prototype, 'route', wrapRouterMethod) @@ -136,12 +136,12 @@ function wrapProcessParamsMethod (requestPositionInArguments) { } } -addHook({ name: 'express', versions: ['>=4.0.0 <4.3.0'], file: ['lib/express.js'] }, express => { +addHook({ name: 'express', versions: ['>=4.0.0 <4.3.0'] }, express => { shimmer.wrap(express.Router, 'process_params', wrapProcessParamsMethod(1)) return express }) -addHook({ name: 'express', versions: ['>=4.3.0 <5.0.0'], file: ['lib/express.js'] }, express => { +addHook({ name: 'express', versions: ['>=4.3.0 <5.0.0'] }, express => { shimmer.wrap(express.Router, 'process_params', wrapProcessParamsMethod(2)) return express }) From 95780dd5305a886e34da27bf80d1a6fdcb8be117 Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Fri, 12 Sep 2025 14:52:34 -0400 Subject: [PATCH 18/23] added random coment --- packages/datadog-instrumentations/src/express.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/datadog-instrumentations/src/express.js b/packages/datadog-instrumentations/src/express.js index 3975d78985d..d39e0d2f7ad 100644 --- a/packages/datadog-instrumentations/src/express.js +++ b/packages/datadog-instrumentations/src/express.js @@ -39,6 +39,7 @@ function wrapResponseJson (json) { const responseRenderChannel = tracingChannel('datadog:express:response:render') function wrapResponseRender (render) { + // random comment !!!!!!!!!!!! return function wrappedRender (view, options, callback) { if (!responseRenderChannel.start.hasSubscribers) { return render.apply(this, arguments) From 2348e991ee6906de13c856c54e81f028af1bde8e Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Fri, 12 Sep 2025 14:59:29 -0400 Subject: [PATCH 19/23] added small change --- packages/datadog-instrumentations/src/express.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/datadog-instrumentations/src/express.js b/packages/datadog-instrumentations/src/express.js index d39e0d2f7ad..f75125dbabb 100644 --- a/packages/datadog-instrumentations/src/express.js +++ b/packages/datadog-instrumentations/src/express.js @@ -58,7 +58,7 @@ function wrapResponseRender (render) { } } -addHook({ name: 'express', versions: ['>=4'] }, express => { +addHook({ name: 'express', versions: ['>=4'], file: ['lib/express.js'] }, express => { shimmer.wrap(express.application, 'handle', wrapHandle) shimmer.wrap(express.response, 'json', wrapResponseJson) From ab1710b07c54182c1c0e9684237b06127f3eca06 Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Fri, 12 Sep 2025 15:00:52 -0400 Subject: [PATCH 20/23] Added file property for version 4 --- packages/datadog-instrumentations/src/express.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/datadog-instrumentations/src/express.js b/packages/datadog-instrumentations/src/express.js index f75125dbabb..d7b4931dd06 100644 --- a/packages/datadog-instrumentations/src/express.js +++ b/packages/datadog-instrumentations/src/express.js @@ -68,7 +68,7 @@ addHook({ name: 'express', versions: ['>=4'], file: ['lib/express.js'] }, expres return express }) -addHook({ name: 'express', versions: ['4'] }, express => { +addHook({ name: 'express', versions: ['4'], file: ['lib/express.js'] }, express => { shimmer.wrap(express.Router, 'use', wrapRouterMethod) shimmer.wrap(express.Router, 'route', wrapRouterMethod) From 0a599dbd08ebc4f5036ed0de21e8419c834c82a4 Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Fri, 12 Sep 2025 15:02:08 -0400 Subject: [PATCH 21/23] Adding file property for version 5.0.0 --- packages/datadog-instrumentations/src/express.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/datadog-instrumentations/src/express.js b/packages/datadog-instrumentations/src/express.js index d7b4931dd06..631ec121a8c 100644 --- a/packages/datadog-instrumentations/src/express.js +++ b/packages/datadog-instrumentations/src/express.js @@ -68,14 +68,14 @@ addHook({ name: 'express', versions: ['>=4'], file: ['lib/express.js'] }, expres return express }) -addHook({ name: 'express', versions: ['4'], file: ['lib/express.js'] }, express => { +addHook({ name: 'express', versions: ['4'] }, express => { shimmer.wrap(express.Router, 'use', wrapRouterMethod) shimmer.wrap(express.Router, 'route', wrapRouterMethod) return express }) -addHook({ name: 'express', versions: ['>=5.0.0'] }, express => { +addHook({ name: 'express', versions: ['>=5.0.0'], file: ['lib/express.js'] }, express => { shimmer.wrap(express.Router.prototype, 'use', wrapRouterMethod) shimmer.wrap(express.Router.prototype, 'route', wrapRouterMethod) From 5328b823faf07abbb26fc40c38f64443f4d9c0fb Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Fri, 12 Sep 2025 15:03:15 -0400 Subject: [PATCH 22/23] removed file for version 5.0.0 --- packages/datadog-instrumentations/src/express.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/datadog-instrumentations/src/express.js b/packages/datadog-instrumentations/src/express.js index 631ec121a8c..f75125dbabb 100644 --- a/packages/datadog-instrumentations/src/express.js +++ b/packages/datadog-instrumentations/src/express.js @@ -75,7 +75,7 @@ addHook({ name: 'express', versions: ['4'] }, express => { return express }) -addHook({ name: 'express', versions: ['>=5.0.0'], file: ['lib/express.js'] }, express => { +addHook({ name: 'express', versions: ['>=5.0.0'] }, express => { shimmer.wrap(express.Router.prototype, 'use', wrapRouterMethod) shimmer.wrap(express.Router.prototype, 'route', wrapRouterMethod) From 0082d63daad584296e98214ba1a88ee3a5f73a70 Mon Sep 17 00:00:00 2001 From: perhardhernandez Date: Fri, 12 Sep 2025 15:04:43 -0400 Subject: [PATCH 23/23] Added back file property for version 4 --- packages/datadog-instrumentations/src/express.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/datadog-instrumentations/src/express.js b/packages/datadog-instrumentations/src/express.js index f75125dbabb..d7b4931dd06 100644 --- a/packages/datadog-instrumentations/src/express.js +++ b/packages/datadog-instrumentations/src/express.js @@ -68,7 +68,7 @@ addHook({ name: 'express', versions: ['>=4'], file: ['lib/express.js'] }, expres return express }) -addHook({ name: 'express', versions: ['4'] }, express => { +addHook({ name: 'express', versions: ['4'], file: ['lib/express.js'] }, express => { shimmer.wrap(express.Router, 'use', wrapRouterMethod) shimmer.wrap(express.Router, 'route', wrapRouterMethod)