From 1be8bed1fd6fbd4ec38e9ac5b3cefdd7869c0f63 Mon Sep 17 00:00:00 2001 From: Arya Date: Tue, 25 Nov 2025 11:41:44 +0530 Subject: [PATCH 01/10] fix: handled undefined application entrypoint --- .../core/src/util/applicationUnderMonitoring.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/core/src/util/applicationUnderMonitoring.js b/packages/core/src/util/applicationUnderMonitoring.js index 103eacfe18..7d05c19e3e 100644 --- a/packages/core/src/util/applicationUnderMonitoring.js +++ b/packages/core/src/util/applicationUnderMonitoring.js @@ -187,7 +187,20 @@ function getMainPackageJsonPathStartingAtDirectory(startDirectory, cb) { } } - startDirectory = path.dirname(mainModule.filename); + try { + // The collector may be preloaded via --require in ESM apps or frameworks (e.g., react-scripts), + // which is not supported and can happen in auto-tracing setups. + // In such cases, require.main or process.argv[1] might be missing or invalid, + // so mainModule.filename can be undefined. + if (!mainModule?.filename) { + logger.warn('Application entrypoint could not be identified. Package.json resolution will be skipped.'); + return process.nextTick(cb); + } + startDirectory = path.dirname(mainModule.filename); + } catch (e) { + logger.warn(`Unable to resolve application entrypoint ${e.message}. Package.json resolution will be skipped.`); + return process.nextTick(cb); + } } searchForPackageJsonInDirectoryTreeUpwards(startDirectory, (err, main) => { From a272b3162a0e33e3221365734240e85335703622 Mon Sep 17 00:00:00 2001 From: Arya Date: Tue, 25 Nov 2025 13:27:56 +0530 Subject: [PATCH 02/10] chore: no try catch --- .../core/src/util/applicationUnderMonitoring.js | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/packages/core/src/util/applicationUnderMonitoring.js b/packages/core/src/util/applicationUnderMonitoring.js index 7d05c19e3e..e9966d3cbc 100644 --- a/packages/core/src/util/applicationUnderMonitoring.js +++ b/packages/core/src/util/applicationUnderMonitoring.js @@ -187,20 +187,13 @@ function getMainPackageJsonPathStartingAtDirectory(startDirectory, cb) { } } - try { - // The collector may be preloaded via --require in ESM apps or frameworks (e.g., react-scripts), - // which is not supported and can happen in auto-tracing setups. - // In such cases, require.main or process.argv[1] might be missing or invalid, - // so mainModule.filename can be undefined. - if (!mainModule?.filename) { - logger.warn('Application entrypoint could not be identified. Package.json resolution will be skipped.'); - return process.nextTick(cb); - } - startDirectory = path.dirname(mainModule.filename); - } catch (e) { - logger.warn(`Unable to resolve application entrypoint ${e.message}. Package.json resolution will be skipped.`); + // In case if require.main or process.argv[1] might be missing or invalid, + // so mainModule.filename can be undefined. + if (!mainModule?.filename) { + logger.warn('Application entrypoint could not be identified. Package.json resolution will be skipped.'); return process.nextTick(cb); } + startDirectory = path.dirname(mainModule.filename); } searchForPackageJsonInDirectoryTreeUpwards(startDirectory, (err, main) => { From 682e6afb713dc65dbcfd91064e3159d3b9beb680 Mon Sep 17 00:00:00 2001 From: kirrg001 Date: Tue, 25 Nov 2025 11:28:33 +0100 Subject: [PATCH 03/10] chore: reproduced + fixed --- .../test/tracing/misc/invalid_app/test.js | 42 +++++++++++++++++++ .../src/util/applicationUnderMonitoring.js | 11 +++-- .../serverless-collector/src/metrics/name.js | 5 ++- packages/shared-metrics/src/description.js | 9 +++- packages/shared-metrics/src/keywords.js | 8 +++- packages/shared-metrics/src/name.js | 7 +++- packages/shared-metrics/src/version.js | 8 +++- 7 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 packages/collector/test/tracing/misc/invalid_app/test.js diff --git a/packages/collector/test/tracing/misc/invalid_app/test.js b/packages/collector/test/tracing/misc/invalid_app/test.js new file mode 100644 index 0000000000..80b560ab8c --- /dev/null +++ b/packages/collector/test/tracing/misc/invalid_app/test.js @@ -0,0 +1,42 @@ +/* + * (c) Copyright IBM Corp. 2025 + */ + +'use strict'; + +const path = require('path'); +const childProcess = require('child_process'); +const expect = require('chai').expect; +const supportedVersion = require('@instana/core').tracing.supportedVersion; +const config = require('../../../../../core/test/config'); +const mochaSuiteFn = supportedVersion(process.versions.node) ? describe : describe.skip; + +mochaSuiteFn('tracing/invalidApp', function () { + this.timeout(config.getTestTimeout() * 3); + + it('when the collector is required in interactive shell', cb => { + const child = childProcess.spawn( + process.execPath, + ['--require', path.join(__dirname, '..', '..', '..', '..', 'src', 'immediate.js')], + { + stdio: 'inherit', + cwd: process.cwd(), + env: process.env + } + ); + + child.on('error', err => { + cb(err); + }); + + child.on('exit', (code, signal) => { + expect(signal).to.equal('SIGTERM'); + expect(code).to.not.exist; + cb(); + }); + + setTimeout(() => { + child.kill('SIGTERM'); + }, 3 * 1000); + }); +}); diff --git a/packages/core/src/util/applicationUnderMonitoring.js b/packages/core/src/util/applicationUnderMonitoring.js index e9966d3cbc..42fc35caf7 100644 --- a/packages/core/src/util/applicationUnderMonitoring.js +++ b/packages/core/src/util/applicationUnderMonitoring.js @@ -187,12 +187,17 @@ function getMainPackageJsonPathStartingAtDirectory(startDirectory, cb) { } } - // In case if require.main or process.argv[1] might be missing or invalid, - // so mainModule.filename can be undefined. + // CASE: node --require .../src/immediate.js if (!mainModule?.filename) { logger.warn('Application entrypoint could not be identified. Package.json resolution will be skipped.'); - return process.nextTick(cb); + const err = new Error('Application entrypoint could not be identified. Search for package.json failed.'); + + // @ts-ignore + err.code = 'INSTANA_NO_MAIN_MODULE'; + + return process.nextTick(cb, err, null); } + startDirectory = path.dirname(mainModule.filename); } diff --git a/packages/serverless-collector/src/metrics/name.js b/packages/serverless-collector/src/metrics/name.js index 5ca1edf7e5..b517e671a4 100644 --- a/packages/serverless-collector/src/metrics/name.js +++ b/packages/serverless-collector/src/metrics/name.js @@ -21,10 +21,13 @@ module.exports = config => { return process.env.INSTANA_SERVICE_NAME; } + // TODO: all metrics call `getMainPackageJsonStartingAtMainModule` - if `getMainPackageJsonStartingAtMainModule` fails + // for the 1st metrics, the other metrics will try again...we should initiate + // `getMainPackageJsonStartingAtMainModule` only once in a central place! return new Promise(resolve => { instanaCore.util.applicationUnderMonitoring.getMainPackageJsonStartingAtMainModule((err, packageJson) => { if (err) { - logger.debug(`Failed to determine main package.json. ${err?.message} ${err?.stack}`); + logger.debug(`Failed to determine main package.json for "name" metric. ${err?.message} ${err?.stack}`); return resolve(); } diff --git a/packages/shared-metrics/src/description.js b/packages/shared-metrics/src/description.js index 9a3d03afea..2e4eece003 100644 --- a/packages/shared-metrics/src/description.js +++ b/packages/shared-metrics/src/description.js @@ -5,6 +5,8 @@ 'use strict'; +const { payloadPrefix } = require('./activeHandles'); + const { applicationUnderMonitoring } = require('@instana/core').util; /** @type {import('@instana/core/src/core').GenericLogger} */ @@ -28,9 +30,14 @@ let attempts = 0; exports.activate = function activate() { attempts++; + // TODO: all metrics call `getMainPackageJsonStartingAtMainModule` - if `getMainPackageJsonStartingAtMainModule` fails + // for the 1st metrics, the other metrics will try again...we should initiate + // `getMainPackageJsonStartingAtMainModule` only once in a central place! applicationUnderMonitoring.getMainPackageJsonStartingAtMainModule((err, packageJson) => { if (err) { - return logger.warn(`Failed to determine main package json. Reason: ${err?.message} ${err?.stack}`); + return logger.warn( + `Failed to determine main package.json for "${payloadPrefix}" metric. Reason: ${err?.message} ${err?.stack}` + ); } else if (!packageJson && attempts < MAX_ATTEMPTS) { setTimeout(exports.activate, DELAY).unref(); return; diff --git a/packages/shared-metrics/src/keywords.js b/packages/shared-metrics/src/keywords.js index 596896d9e1..a4fe8e1053 100644 --- a/packages/shared-metrics/src/keywords.js +++ b/packages/shared-metrics/src/keywords.js @@ -29,9 +29,15 @@ let attempts = 0; exports.activate = function activate() { attempts++; + // TODO: all metrics call `getMainPackageJsonStartingAtMainModule` - if `getMainPackageJsonStartingAtMainModule` fails + // for the 1st metrics, the other metrics will try again...we should initiate + // `getMainPackageJsonStartingAtMainModule` only once in a central place! applicationUnderMonitoring.getMainPackageJsonStartingAtMainModule((err, packageJson) => { if (err) { - return logger.warn(`Failed to determine main package json. Reason: ${err?.message} ${err?.stack}`); + return logger.warn( + // eslint-disable-next-line max-len + `Failed to determine main package.json for "${exports.payloadPrefix}" metric. Reason: ${err?.message} ${err?.stack}` + ); } else if (!packageJson && attempts < MAX_ATTEMPTS) { setTimeout(exports.activate, DELAY).unref(); diff --git a/packages/shared-metrics/src/name.js b/packages/shared-metrics/src/name.js index 8c8ee92c16..b5bcea8fdd 100644 --- a/packages/shared-metrics/src/name.js +++ b/packages/shared-metrics/src/name.js @@ -28,9 +28,14 @@ let attempts = 0; exports.activate = function activate() { attempts++; + // TODO: all metrics call `getMainPackageJsonStartingAtMainModule` - if `getMainPackageJsonStartingAtMainModule` fails + // for the 1st metrics, the other metrics will try again...we should initiate + // `getMainPackageJsonStartingAtMainModule` only once in a central place! applicationUnderMonitoring.getMainPackageJsonStartingAtMainModule((err, packageJson) => { if (err) { - return logger.warn(`Failed to determine main package json. Reason: ${err?.message} ${err?.stack}`); + return logger.warn( + `Failed to determine main package.json for "${exports.payloadPrefix}". Reason: ${err?.message} ${err?.stack}` + ); } else if (!packageJson && attempts < exports.MAX_ATTEMPTS) { logger.debug('Main package.json could not be found. Will try again later.'); setTimeout(exports.activate, exports.DELAY).unref(); diff --git a/packages/shared-metrics/src/version.js b/packages/shared-metrics/src/version.js index 3f522f9a8b..134bbc00fe 100644 --- a/packages/shared-metrics/src/version.js +++ b/packages/shared-metrics/src/version.js @@ -28,9 +28,15 @@ let attempts = 0; exports.activate = function activate() { attempts++; + // TODO: all metrics call `getMainPackageJsonStartingAtMainModule` - if `getMainPackageJsonStartingAtMainModule` fails + // for the 1st metrics, the other metrics will try again...we should initiate + // `getMainPackageJsonStartingAtMainModule` only once in a central place! applicationUnderMonitoring.getMainPackageJsonStartingAtMainModule((err, packageJson) => { if (err) { - return logger.warn(`Failed to determine main package json. Reason: ${err?.message} ${err?.stack}`); + return logger.warn( + // eslint-disable-next-line max-len + `Failed to determine main package.json for "${exports.payloadPrefix}" metric. Reason: ${err?.message} ${err?.stack}` + ); } else if (!packageJson && attempts < MAX_ATTEMPTS) { setTimeout(exports.activate, DELAY).unref(); From 544c2d8776bd7c8cba85007709f9919f8bfaf35a Mon Sep 17 00:00:00 2001 From: kirrg001 Date: Tue, 25 Nov 2025 11:29:56 +0100 Subject: [PATCH 04/10] chore: cleanup --- packages/core/src/util/applicationUnderMonitoring.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core/src/util/applicationUnderMonitoring.js b/packages/core/src/util/applicationUnderMonitoring.js index 42fc35caf7..faea296f13 100644 --- a/packages/core/src/util/applicationUnderMonitoring.js +++ b/packages/core/src/util/applicationUnderMonitoring.js @@ -189,7 +189,6 @@ function getMainPackageJsonPathStartingAtDirectory(startDirectory, cb) { // CASE: node --require .../src/immediate.js if (!mainModule?.filename) { - logger.warn('Application entrypoint could not be identified. Package.json resolution will be skipped.'); const err = new Error('Application entrypoint could not be identified. Search for package.json failed.'); // @ts-ignore From 2c6db6346dc648f36f5c026fce62b8bbe6d92dee Mon Sep 17 00:00:00 2001 From: kirrg001 Date: Tue, 25 Nov 2025 14:23:13 +0100 Subject: [PATCH 05/10] chore: refac --- packages/core/src/metrics/index.js | 23 ++++-- .../src/util/applicationUnderMonitoring.js | 46 ++++++------ .../serverless-collector/src/metrics/name.js | 11 ++- packages/shared-metrics/src/dependencies.js | 65 +++++++---------- packages/shared-metrics/src/description.js | 46 +++--------- .../shared-metrics/src/directDependencies.js | 71 ++++++------------- packages/shared-metrics/src/keywords.js | 52 +++----------- packages/shared-metrics/src/name.js | 52 ++++---------- packages/shared-metrics/src/version.js | 46 +++--------- .../test/directDependencies_test.js | 11 ++- packages/shared-metrics/test/name_test.js | 69 ++---------------- 11 files changed, 151 insertions(+), 341 deletions(-) diff --git a/packages/core/src/metrics/index.js b/packages/core/src/metrics/index.js index 0aeb48b659..1e83fc0f18 100644 --- a/packages/core/src/metrics/index.js +++ b/packages/core/src/metrics/index.js @@ -5,19 +5,24 @@ 'use strict'; -const fs = require('../uninstrumentedFs'); const path = require('path'); +const fs = require('../uninstrumentedFs'); +const util = require('../util'); /** @typedef {import('../config').InstanaConfig} InstanaConfig */ /** @type {InstanaConfig} */ let config; +/** @type {import('../core').GenericLogger} */ +let logger; + /** * @param {InstanaConfig} _config */ exports.init = _config => { config = _config; + logger = config.logger; }; /** @@ -65,10 +70,20 @@ exports.registerAdditionalMetrics = function registerAdditionalMetrics(additiona }; exports.activate = () => { - metricsModules.forEach(metricsModule => { - if (metricsModule.activate) { - metricsModule.activate(config); + util.applicationUnderMonitoring.getMainPackageJsonStartingAtMainModule((err, packageJsonObj) => { + if (err) { + logger.warn( + `Failed to determine main package.json. Some metrics might not work. Reason: ${err?.message} ${err?.stack}` + ); + return; } + + metricsModules.forEach(metricsModule => { + if (metricsModule.activate) { + // @ts-ignore + metricsModule.activate(config, packageJsonObj); + } + }); }); }; diff --git a/packages/core/src/util/applicationUnderMonitoring.js b/packages/core/src/util/applicationUnderMonitoring.js index faea296f13..304c96a5d5 100644 --- a/packages/core/src/util/applicationUnderMonitoring.js +++ b/packages/core/src/util/applicationUnderMonitoring.js @@ -38,6 +38,10 @@ function isAppInstalledIntoNodeModules() { return appInstalledIntoNodeModules; } +const MAX_ATTEMPTS = 5; +const DELAY = 1500; +let attempts = 0; + /** * Looks for the app's main package.json file, parses it and returns the parsed content. The search is started at * path.dirname(require.main.filename). @@ -50,7 +54,7 @@ function isAppInstalledIntoNodeModules() { function getMainPackageJsonStartingAtMainModule(cb) { // NOTE: we already cached the package.json if (parsedMainPackageJson !== undefined) { - return cb(null, parsedMainPackageJson); + return cb(null, { file: parsedMainPackageJson, path: mainPackageJsonPath }); } // CASE: customer provided custom package.json path, let's try loading it @@ -58,7 +62,23 @@ function getMainPackageJsonStartingAtMainModule(cb) { return readFile(packageJsonPath, cb); } - return getMainPackageJsonStartingAtDirectory(null, cb); + return getMainPackageJsonStartingAtDirectory(null, (err, pkg) => { + // CASE: using --require or --import can result in an empty require.main initially + if (err && attempts < MAX_ATTEMPTS) { + attempts++; + + logger.warn( + `Could not determine main package.json yet. Retrying ${attempts}/${MAX_ATTEMPTS} after ${DELAY}ms...` + ); + + return setTimeout(() => { + getMainPackageJsonStartingAtMainModule(cb); + }, DELAY).unref(); + } + + attempts = 0; + return cb(err, pkg); + }); } /** @@ -110,22 +130,10 @@ function readFile(filePath, cb) { return cb(e, null); } - return cb(null, parsedMainPackageJson); + return cb(null, { file: parsedMainPackageJson, path: filePath }); }); } -/** - * Looks for path of the app's main package.json file, starting the search at path.dirname(require.main.filename). - * - * In case the search is successful, the result will be cached for consecutive invocations. - * - * @param {(err: Error, packageJsonPath: string) => void} cb - the callback will be called with an error or the path to - * the package.json file - */ -function getMainPackageJsonPathStartingAtMainModule(cb) { - return getMainPackageJsonPathStartingAtDirectory(null, cb); -} - /** * Looks for path of the app's main package.json file, starting the search at the given directory. If the given * directory is null or undefined, the search will start at path.dirname(require.main.filename). @@ -189,11 +197,7 @@ function getMainPackageJsonPathStartingAtDirectory(startDirectory, cb) { // CASE: node --require .../src/immediate.js if (!mainModule?.filename) { - const err = new Error('Application entrypoint could not be identified. Search for package.json failed.'); - - // @ts-ignore - err.code = 'INSTANA_NO_MAIN_MODULE'; - + const err = new Error('Application entrypoint could not be identified.'); return process.nextTick(cb, err, null); } @@ -342,6 +346,7 @@ function searchInParentDir(dir, onParentDir, cb) { const reset = () => { parsedMainPackageJson = undefined; mainPackageJsonPath = undefined; + attempts = 0; }; module.exports = { @@ -349,7 +354,6 @@ module.exports = { isAppInstalledIntoNodeModules, getMainPackageJsonStartingAtMainModule, getMainPackageJsonStartingAtDirectory, - getMainPackageJsonPathStartingAtMainModule, getMainPackageJsonPathStartingAtDirectory, findNodeModulesFolder, reset diff --git a/packages/serverless-collector/src/metrics/name.js b/packages/serverless-collector/src/metrics/name.js index b517e671a4..b5392fe1a9 100644 --- a/packages/serverless-collector/src/metrics/name.js +++ b/packages/serverless-collector/src/metrics/name.js @@ -21,18 +21,15 @@ module.exports = config => { return process.env.INSTANA_SERVICE_NAME; } - // TODO: all metrics call `getMainPackageJsonStartingAtMainModule` - if `getMainPackageJsonStartingAtMainModule` fails - // for the 1st metrics, the other metrics will try again...we should initiate - // `getMainPackageJsonStartingAtMainModule` only once in a central place! return new Promise(resolve => { - instanaCore.util.applicationUnderMonitoring.getMainPackageJsonStartingAtMainModule((err, packageJson) => { + instanaCore.util.applicationUnderMonitoring.getMainPackageJsonStartingAtMainModule((err, packageJsonObj) => { if (err) { - logger.debug(`Failed to determine main package.json for "name" metric. ${err?.message} ${err?.stack}`); + logger.debug(`Failed to determine main package.json. ${err?.message} ${err?.stack}`); return resolve(); } - logger.debug(`Found main package.json: ${packageJson.name}`); - resolve(packageJson.name); + logger.debug(`Found main package.json: ${packageJsonObj.file.name}`); + resolve(packageJsonObj.file.name); }); }); }; diff --git a/packages/shared-metrics/src/dependencies.js b/packages/shared-metrics/src/dependencies.js index bcf0dc3fb2..d9d31c3906 100644 --- a/packages/shared-metrics/src/dependencies.js +++ b/packages/shared-metrics/src/dependencies.js @@ -36,48 +36,37 @@ const preliminaryPayload = {}; // @ts-ignore: Cannot redeclare exported variable 'currentPayload' exports.currentPayload = {}; -exports.MAX_ATTEMPTS = 20; +// @ts-ignore +exports.activate = function activate(config, packageJsonObj) { + const started = Date.now(); -const DELAY = 1000; -let attempts = 0; + if (!packageJsonObj || !packageJsonObj.file) { + util.applicationUnderMonitoring.findNodeModulesFolder((errNodeModules, nodeModulesFolder) => { + if (errNodeModules) { + return logger.warn( + `Failed to determine node_modules folder. Reason: ${errNodeModules?.message}, ${errNodeModules?.stack}` + ); + } else if (!nodeModulesFolder) { + return logger.warn( + 'Neither the package.json file nor the node_modules folder could be found. Stopping dependency analysis.' + ); + } -exports.activate = function activate() { - attempts++; + addAllDependencies(path.join(nodeModulesFolder), started, null); + }); - const started = Date.now(); - util.applicationUnderMonitoring.getMainPackageJsonPathStartingAtMainModule((err, mainPackageJsonPath) => { - if (err) { - return logger.warn(`Failed to determine main package.json. Reason: ${err?.message}, ${err?.stack}`); - } else if (!mainPackageJsonPath && attempts < exports.MAX_ATTEMPTS) { - logger.debug(`Main package.json could not be found at ${mainPackageJsonPath}. Will try again later.`); - setTimeout(exports.activate, DELAY).unref(); - return; - } else if (!mainPackageJsonPath) { - logger.info( - `Main package.json could not be found after ${attempts} retries. Looking for node_modules folder now.` - ); - util.applicationUnderMonitoring.findNodeModulesFolder((errNodeModules, nodeModulesFolder) => { - if (errNodeModules) { - return logger.warn(`Failed to determine node_modules folder. Reason: ${err?.message}, ${err?.stack}`); - } else if (!nodeModulesFolder) { - return logger.warn( - 'Neither the package.json file nor the node_modules folder could be found. Stopping dependency analysis.' - ); - } - - addAllDependencies(path.join(nodeModulesFolder), started, null); - }); - return; - } + return; + } - let dependencyDir; - if (util.applicationUnderMonitoring.isAppInstalledIntoNodeModules()) { - dependencyDir = path.join(path.dirname(mainPackageJsonPath), '..', '..', 'node_modules'); - } else { - dependencyDir = path.join(path.dirname(mainPackageJsonPath), 'node_modules'); - } - addAllDependencies(dependencyDir, started, mainPackageJsonPath); - }); + let dependencyDir; + + if (util.applicationUnderMonitoring.isAppInstalledIntoNodeModules()) { + dependencyDir = path.join(path.dirname(packageJsonObj.path), '..', '..', 'node_modules'); + } else { + dependencyDir = path.join(path.dirname(packageJsonObj.path), 'node_modules'); + } + + addAllDependencies(dependencyDir, started, packageJsonObj.path); }; /** diff --git a/packages/shared-metrics/src/description.js b/packages/shared-metrics/src/description.js index 2e4eece003..dee22481ad 100644 --- a/packages/shared-metrics/src/description.js +++ b/packages/shared-metrics/src/description.js @@ -5,48 +5,18 @@ 'use strict'; -const { payloadPrefix } = require('./activeHandles'); - -const { applicationUnderMonitoring } = require('@instana/core').util; - -/** @type {import('@instana/core/src/core').GenericLogger} */ -let logger; - -/** - * @param {import('@instana/core/src/config').InstanaConfig} config - */ -exports.init = function init(config) { - logger = config.logger; -}; +exports.init = function init() {}; exports.payloadPrefix = 'description'; // @ts-ignore exports.currentPayload = undefined; -const MAX_ATTEMPTS = 20; -const DELAY = 1000; -let attempts = 0; - -exports.activate = function activate() { - attempts++; - - // TODO: all metrics call `getMainPackageJsonStartingAtMainModule` - if `getMainPackageJsonStartingAtMainModule` fails - // for the 1st metrics, the other metrics will try again...we should initiate - // `getMainPackageJsonStartingAtMainModule` only once in a central place! - applicationUnderMonitoring.getMainPackageJsonStartingAtMainModule((err, packageJson) => { - if (err) { - return logger.warn( - `Failed to determine main package.json for "${payloadPrefix}" metric. Reason: ${err?.message} ${err?.stack}` - ); - } else if (!packageJson && attempts < MAX_ATTEMPTS) { - setTimeout(exports.activate, DELAY).unref(); - return; - } else if (!packageJson) { - // final attempt failed, ignore silently - return; - } +// @ts-ignore +exports.activate = function activate(config, packageJsonObj) { + if (!packageJsonObj || !packageJsonObj.file) { + return; + } - // @ts-ignore - exports.currentPayload = packageJson.description; - }); + // @ts-ignore + exports.currentPayload = packageJsonObj.file.description; }; diff --git a/packages/shared-metrics/src/directDependencies.js b/packages/shared-metrics/src/directDependencies.js index d5159c1cc3..f2c820d7b7 100644 --- a/packages/shared-metrics/src/directDependencies.js +++ b/packages/shared-metrics/src/directDependencies.js @@ -5,7 +5,7 @@ 'use strict'; -const { util, uninstrumentedFs: fs } = require('@instana/core'); +const { uninstrumentedFs: fs } = require('@instana/core'); /** @type {import('@instana/core/src/core').GenericLogger} */ let logger; @@ -26,56 +26,25 @@ exports.currentPayload = { optionalDependencies: {} }; -const MAX_ATTEMPTS = 20; -const DELAY = 1000; -let attempts = 0; +exports.deactivate = function deactivate() {}; -exports.deactivate = function deactivate() { - attempts = 0; -}; - -exports.activate = function activate() { - attempts++; - util.applicationUnderMonitoring.getMainPackageJsonPathStartingAtMainModule((err, packageJsonPath) => { - if (err) { - return logger.info( - `Failed to determine main package.json for analysis of direct dependencies. - Reason: ${err?.message} ${err?.stack}` - ); - } else if (!packageJsonPath && attempts < MAX_ATTEMPTS) { - setTimeout(exports.activate, DELAY).unref(); - return; - } else if (!packageJsonPath) { - // final attempt failed, ignore silently - return; - } - - addDirectDependenciesFromMainPackageJson(packageJsonPath); - }); -}; - -/** - * @param {string} packageJsonPath - */ -function addDirectDependenciesFromMainPackageJson(packageJsonPath) { - logger.debug(`addDirectDependenciesFromMainPackageJson: ${packageJsonPath}`); +// @ts-ignore +exports.activate = function activate(config, packageJsonObj) { + if (!packageJsonObj || !packageJsonObj.file) { + return; + } const started = Date.now(); - fs.readFile(packageJsonPath, { encoding: 'utf8' }, (err, contents) => { - if (err) { - return logger.debug(`Failed to analyze direct dependencies dependency due to: ${err?.message}`); - } - - try { - const pckg = JSON.parse(contents); - exports.currentPayload.dependencies = pckg.dependencies || {}; - exports.currentPayload.peerDependencies = pckg.peerDependencies || {}; - exports.currentPayload.optionalDependencies = pckg.optionalDependencies || {}; - exports.currentPayload[pckg.name] = pckg.version; - logger.debug(`Collection of direct dependencies took ${Date.now() - started} ms.`); - } catch (subErr) { - logger.debug(`Collection of direct dependencies took ${Date.now() - started} ms.`); - return logger.debug(`Failed to parse package.json ${packageJsonPath} dependency due to: ${subErr?.message}`); - } - }); -} + const packageJson = packageJsonObj.file; + + try { + exports.currentPayload.dependencies = packageJson.dependencies || {}; + exports.currentPayload.peerDependencies = packageJson.peerDependencies || {}; + exports.currentPayload.optionalDependencies = packageJson.optionalDependencies || {}; + exports.currentPayload[packageJson.name] = packageJson.version; + logger.debug(`Collection of direct dependencies took ${Date.now() - started} ms.`); + } catch (subErr) { + logger.debug(`Collection of direct dependencies took ${Date.now() - started} ms.`); + return logger.debug(`Failed to parse package.json dependency due to: ${subErr?.message}`); + } +}; diff --git a/packages/shared-metrics/src/keywords.js b/packages/shared-metrics/src/keywords.js index a4fe8e1053..e64164f9a8 100644 --- a/packages/shared-metrics/src/keywords.js +++ b/packages/shared-metrics/src/keywords.js @@ -5,51 +5,21 @@ 'use strict'; -const { applicationUnderMonitoring } = require('@instana/core').util; - -/** @type {import('@instana/core/src/core').GenericLogger} */ -let logger; - -/** - * @param {import('@instana/core/src/config').InstanaConfig} config - */ -exports.init = function init(config) { - logger = config.logger; -}; +exports.init = function init() {}; exports.payloadPrefix = 'keywords'; /** @type {Array.} */ // @ts-ignore exports.currentPayload = []; -const MAX_ATTEMPTS = 20; -const DELAY = 1000; -let attempts = 0; - -exports.activate = function activate() { - attempts++; - - // TODO: all metrics call `getMainPackageJsonStartingAtMainModule` - if `getMainPackageJsonStartingAtMainModule` fails - // for the 1st metrics, the other metrics will try again...we should initiate - // `getMainPackageJsonStartingAtMainModule` only once in a central place! - applicationUnderMonitoring.getMainPackageJsonStartingAtMainModule((err, packageJson) => { - if (err) { - return logger.warn( - // eslint-disable-next-line max-len - `Failed to determine main package.json for "${exports.payloadPrefix}" metric. Reason: ${err?.message} ${err?.stack}` - ); - } else if (!packageJson && attempts < MAX_ATTEMPTS) { - setTimeout(exports.activate, DELAY).unref(); - - return; - } else if (!packageJson) { - // final attempt failed, ignore silently - return; - } - - if (packageJson.keywords) { - // @ts-ignore - exports.currentPayload = packageJson.keywords; - } - }); +// @ts-ignore +exports.activate = function activate(config, packageJsonObj) { + if (!packageJsonObj || !packageJsonObj.file) { + return; + } + + if (packageJsonObj.file.keywords) { + // @ts-ignore + exports.currentPayload = packageJsonObj.file.keywords; + } }; diff --git a/packages/shared-metrics/src/name.js b/packages/shared-metrics/src/name.js index b5bcea8fdd..f819ec5ee3 100644 --- a/packages/shared-metrics/src/name.js +++ b/packages/shared-metrics/src/name.js @@ -5,8 +5,6 @@ 'use strict'; -const { applicationUnderMonitoring } = require('@instana/core').util; - /** @type {import('@instana/core/src/core').GenericLogger} */ let logger; @@ -21,45 +19,25 @@ exports.payloadPrefix = 'name'; // @ts-ignore exports.currentPayload = undefined; -exports.MAX_ATTEMPTS = 60; -exports.DELAY = 1000; -let attempts = 0; - -exports.activate = function activate() { - attempts++; - - // TODO: all metrics call `getMainPackageJsonStartingAtMainModule` - if `getMainPackageJsonStartingAtMainModule` fails - // for the 1st metrics, the other metrics will try again...we should initiate - // `getMainPackageJsonStartingAtMainModule` only once in a central place! - applicationUnderMonitoring.getMainPackageJsonStartingAtMainModule((err, packageJson) => { - if (err) { - return logger.warn( - `Failed to determine main package.json for "${exports.payloadPrefix}". Reason: ${err?.message} ${err?.stack}` - ); - } else if (!packageJson && attempts < exports.MAX_ATTEMPTS) { - logger.debug('Main package.json could not be found. Will try again later.'); - setTimeout(exports.activate, exports.DELAY).unref(); - return; - } else if (!packageJson) { - if (require.main) { - // @ts-ignore - exports.currentPayload = require.main.filename; - } - - return logger.warn( - `Main package.json could not be found. This Node.js app will be labeled "${ - exports.currentPayload ? exports.currentPayload : 'Unknown' - }" in Instana.` - ); +// @ts-ignore +exports.activate = function activate(config, packageJsonObj) { + if (!packageJsonObj || !packageJsonObj.file) { + if (require.main) { + // @ts-ignore + exports.currentPayload = require.main.filename; } - // @ts-ignore - exports.currentPayload = packageJson.name; - }); + return logger.warn( + `Main package.json could not be found. This Node.js app will be labeled "${ + exports.currentPayload ? exports.currentPayload : 'Unknown' + }" in Instana.` + ); + } + + // @ts-ignore + exports.currentPayload = packageJsonObj.file.name; }; exports.reset = () => { exports.currentPayload = undefined; - exports.MAX_ATTEMPTS = 60; - exports.DELAY = 1000; }; diff --git a/packages/shared-metrics/src/version.js b/packages/shared-metrics/src/version.js index 134bbc00fe..d16a7cdfbc 100644 --- a/packages/shared-metrics/src/version.js +++ b/packages/shared-metrics/src/version.js @@ -5,48 +5,18 @@ 'use strict'; -const { applicationUnderMonitoring } = require('@instana/core').util; - -/** @type {import('@instana/core/src/core').GenericLogger} */ -let logger; - -/** - * @param {import('@instana/core/src/config').InstanaConfig} config - */ -exports.init = function init(config) { - logger = config.logger; -}; +exports.init = function init() {}; exports.payloadPrefix = 'version'; // @ts-ignore exports.currentPayload = undefined; -const MAX_ATTEMPTS = 20; -const DELAY = 1000; -let attempts = 0; - -exports.activate = function activate() { - attempts++; - - // TODO: all metrics call `getMainPackageJsonStartingAtMainModule` - if `getMainPackageJsonStartingAtMainModule` fails - // for the 1st metrics, the other metrics will try again...we should initiate - // `getMainPackageJsonStartingAtMainModule` only once in a central place! - applicationUnderMonitoring.getMainPackageJsonStartingAtMainModule((err, packageJson) => { - if (err) { - return logger.warn( - // eslint-disable-next-line max-len - `Failed to determine main package.json for "${exports.payloadPrefix}" metric. Reason: ${err?.message} ${err?.stack}` - ); - } else if (!packageJson && attempts < MAX_ATTEMPTS) { - setTimeout(exports.activate, DELAY).unref(); - - return; - } else if (!packageJson) { - // final attempt failed, ignore silently - return; - } +// @ts-ignore +exports.activate = function activate(config, packageJsonObj) { + if (!packageJsonObj || !packageJsonObj.file) { + return; + } - // @ts-ignore - exports.currentPayload = packageJson.version; - }); + // @ts-ignore + exports.currentPayload = packageJsonObj.file.version; }; diff --git a/packages/shared-metrics/test/directDependencies_test.js b/packages/shared-metrics/test/directDependencies_test.js index 2bb455a02a..b576e321f8 100644 --- a/packages/shared-metrics/test/directDependencies_test.js +++ b/packages/shared-metrics/test/directDependencies_test.js @@ -6,6 +6,8 @@ 'use strict'; const expect = require('chai').expect; +const path = require('path'); +const fs = require('fs'); const testUtils = require('@instana/core/test/test_util'); const directDependencies = require('../src/directDependencies'); @@ -29,11 +31,14 @@ describe('metrics.directDependencies', function () { }); it('should provide the set of dependencies with versions', () => { - directDependencies.activate(); + // We simply simulate that mocha is our app. It does not matter which package.json we use as long as it has + // dependencies. + const anyPackageJsonPath = path.join(path.dirname(require.resolve('mocha')), 'package.json'); + const anyPackageJsonFile = JSON.parse(fs.readFileSync(anyPackageJsonPath, 'utf8')); + + directDependencies.activate({}, { file: anyPackageJsonFile, path: anyPackageJsonPath }); return testUtils.retry(() => { - // Mocha is the main module when running the tests and direct dependencies are evaluated as the content of the - // the main modules accompanying package.json file. Thus testing against Mocha dependencies here. const deps = directDependencies.currentPayload.dependencies; expect(deps).to.exist; expect(deps['browser-stdout']).to.equal('1.3.1'); diff --git a/packages/shared-metrics/test/name_test.js b/packages/shared-metrics/test/name_test.js index 00fc772cef..47f0a9b26d 100644 --- a/packages/shared-metrics/test/name_test.js +++ b/packages/shared-metrics/test/name_test.js @@ -6,11 +6,10 @@ 'use strict'; const expect = require('chai').expect; -const sinon = require('sinon'); +const fs = require('fs'); const path = require('path'); const testUtils = require('../../core/test/test_util'); const name = require('../src/name'); -const { applicationUnderMonitoring } = require('@instana/core').util; describe('metrics.name', () => { before(() => { @@ -19,7 +18,6 @@ describe('metrics.name', () => { afterEach(() => { name.reset(); - applicationUnderMonitoring.reset(); }); it('should export a name payload prefix', () => { @@ -28,7 +26,10 @@ describe('metrics.name', () => { describe('when the package.json can be found', function () { it('it should extract the package.json name', async () => { - name.activate(); + const anyPackageJsonPath = path.join(path.dirname(require.resolve('mocha')), 'package.json'); + const anyPackageJsonFile = JSON.parse(fs.readFileSync(anyPackageJsonPath, 'utf8')); + + name.activate({}, { file: anyPackageJsonFile, path: anyPackageJsonPath }); return testUtils.retry(() => { // Mocha is used to execute the tests via the mocha executable. @@ -39,70 +40,12 @@ describe('metrics.name', () => { }); describe('when the package.json cannot be found', function () { - before(() => { - sinon.stub(applicationUnderMonitoring, 'getMainPackageJsonStartingAtMainModule').callsFake(cb => { - cb(null, null); - }); - }); - - after(() => { - sinon.restore(); - }); - it('it should use the main module name', async () => { - name.MAX_ATTEMPTS = 5; - name.DELAY = 50; - name.activate(); + name.activate({}, { file: null, path: null }); return testUtils.retry(() => { expect(name.currentPayload).to.contain('node_modules/mocha/bin/mocha'); }); }); }); - - describe('when packageJsonPath is provided', function () { - it('[absolute] it should use the provided package json', async () => { - name.MAX_ATTEMPTS = 5; - name.DELAY = 50; - - applicationUnderMonitoring.init({ - packageJsonPath: path.join(__dirname, './esm-require-in-preload/module/package.json') - }); - - name.activate(); - - return testUtils.retry(() => { - expect(name.currentPayload).to.contain('esm-require-in-preload'); - }); - }); - - it('[relative] it should use the provided package json', async () => { - name.MAX_ATTEMPTS = 5; - name.DELAY = 50; - - applicationUnderMonitoring.init({ - // NOTE: relative to process.cwd() - packageJsonPath: 'test/esm-require-in-preload/module/package.json' - }); - - name.activate(); - - return testUtils.retry(() => { - expect(name.currentPayload).to.contain('esm-require-in-preload'); - }); - }); - - it('it should not use the provided package json', async () => { - name.MAX_ATTEMPTS = 5; - name.DELAY = 50; - - applicationUnderMonitoring.init({ packageJsonPath: null }); - - name.activate(); - - return testUtils.retry(() => { - expect(name.currentPayload).to.contain('mocha'); - }); - }); - }); }); From 4c9f247be8247e9837f527494dbe8ca573e18ce3 Mon Sep 17 00:00:00 2001 From: kirrg001 Date: Tue, 25 Nov 2025 14:24:39 +0100 Subject: [PATCH 06/10] chore: ts --- packages/shared-metrics/src/description.js | 5 ++++- packages/shared-metrics/src/keywords.js | 5 ++++- packages/shared-metrics/src/version.js | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/shared-metrics/src/description.js b/packages/shared-metrics/src/description.js index dee22481ad..bc14a62f65 100644 --- a/packages/shared-metrics/src/description.js +++ b/packages/shared-metrics/src/description.js @@ -5,7 +5,10 @@ 'use strict'; -exports.init = function init() {}; +/** + * @param {import('@instana/core/src/config').InstanaConfig} config + */ +exports.init = function init(config) {}; exports.payloadPrefix = 'description'; // @ts-ignore diff --git a/packages/shared-metrics/src/keywords.js b/packages/shared-metrics/src/keywords.js index e64164f9a8..76e9372d00 100644 --- a/packages/shared-metrics/src/keywords.js +++ b/packages/shared-metrics/src/keywords.js @@ -5,7 +5,10 @@ 'use strict'; -exports.init = function init() {}; +/** + * @param {import('@instana/core/src/config').InstanaConfig} config + */ +exports.init = function init(config) {}; exports.payloadPrefix = 'keywords'; /** @type {Array.} */ diff --git a/packages/shared-metrics/src/version.js b/packages/shared-metrics/src/version.js index d16a7cdfbc..ab33f355a4 100644 --- a/packages/shared-metrics/src/version.js +++ b/packages/shared-metrics/src/version.js @@ -5,7 +5,10 @@ 'use strict'; -exports.init = function init() {}; +/** + * @param {import('@instana/core/src/config').InstanaConfig} config + */ +exports.init = function init(config) {}; exports.payloadPrefix = 'version'; // @ts-ignore From 4f3714a8c1fed9bee1325066464e89fff0611150 Mon Sep 17 00:00:00 2001 From: kirrg001 Date: Tue, 25 Nov 2025 14:26:32 +0100 Subject: [PATCH 07/10] chore: lint --- packages/shared-metrics/src/directDependencies.js | 2 -- packages/shared-metrics/src/keywords.js | 1 + packages/shared-metrics/src/version.js | 2 ++ 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/shared-metrics/src/directDependencies.js b/packages/shared-metrics/src/directDependencies.js index f2c820d7b7..c52bcf435d 100644 --- a/packages/shared-metrics/src/directDependencies.js +++ b/packages/shared-metrics/src/directDependencies.js @@ -5,8 +5,6 @@ 'use strict'; -const { uninstrumentedFs: fs } = require('@instana/core'); - /** @type {import('@instana/core/src/core').GenericLogger} */ let logger; diff --git a/packages/shared-metrics/src/keywords.js b/packages/shared-metrics/src/keywords.js index 76e9372d00..c12b4a25fb 100644 --- a/packages/shared-metrics/src/keywords.js +++ b/packages/shared-metrics/src/keywords.js @@ -8,6 +8,7 @@ /** * @param {import('@instana/core/src/config').InstanaConfig} config */ +// eslint-disable-next-line no-unused-vars exports.init = function init(config) {}; exports.payloadPrefix = 'keywords'; diff --git a/packages/shared-metrics/src/version.js b/packages/shared-metrics/src/version.js index ab33f355a4..9caf38c925 100644 --- a/packages/shared-metrics/src/version.js +++ b/packages/shared-metrics/src/version.js @@ -8,6 +8,8 @@ /** * @param {import('@instana/core/src/config').InstanaConfig} config */ + +// eslint-disable-next-line no-unused-vars exports.init = function init(config) {}; exports.payloadPrefix = 'version'; From bc8d385148624f7ef2fdc9707854875b56244b43 Mon Sep 17 00:00:00 2001 From: kirrg001 Date: Tue, 25 Nov 2025 14:27:06 +0100 Subject: [PATCH 08/10] chore: lint --- packages/shared-metrics/src/directDependencies.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/shared-metrics/src/directDependencies.js b/packages/shared-metrics/src/directDependencies.js index c52bcf435d..fa093338fe 100644 --- a/packages/shared-metrics/src/directDependencies.js +++ b/packages/shared-metrics/src/directDependencies.js @@ -11,6 +11,7 @@ let logger; /** * @param {import('@instana/core/src/config').InstanaConfig} config */ +// eslint-disable-next-line no-unused-vars exports.init = function init(config) { logger = config.logger; }; From 48a0261f78e8de3d2f50693b7a4290ac66361e3b Mon Sep 17 00:00:00 2001 From: kirrg001 Date: Tue, 25 Nov 2025 14:27:29 +0100 Subject: [PATCH 09/10] chore: lint --- packages/shared-metrics/src/description.js | 1 + packages/shared-metrics/src/directDependencies.js | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shared-metrics/src/description.js b/packages/shared-metrics/src/description.js index bc14a62f65..801e017cc0 100644 --- a/packages/shared-metrics/src/description.js +++ b/packages/shared-metrics/src/description.js @@ -8,6 +8,7 @@ /** * @param {import('@instana/core/src/config').InstanaConfig} config */ +// eslint-disable-next-line no-unused-vars exports.init = function init(config) {}; exports.payloadPrefix = 'description'; diff --git a/packages/shared-metrics/src/directDependencies.js b/packages/shared-metrics/src/directDependencies.js index fa093338fe..c52bcf435d 100644 --- a/packages/shared-metrics/src/directDependencies.js +++ b/packages/shared-metrics/src/directDependencies.js @@ -11,7 +11,6 @@ let logger; /** * @param {import('@instana/core/src/config').InstanaConfig} config */ -// eslint-disable-next-line no-unused-vars exports.init = function init(config) { logger = config.logger; }; From e65511d71bdf83e10f496e8d0ee7df8c54b5434a Mon Sep 17 00:00:00 2001 From: kirrg001 Date: Tue, 25 Nov 2025 15:14:22 +0100 Subject: [PATCH 10/10] chore: fix tests --- .../test/nativeModuleRetry/preinstall.sh | 29 ++++++++++++++++++ .../collector/test/nativeModuleRetry/test.js | 30 +++---------------- .../test/tracing/opentelemetry/preinstall.sh | 10 ++++++- .../test/tracing/opentelemetry/test.js | 6 ++++ 4 files changed, 48 insertions(+), 27 deletions(-) create mode 100755 packages/collector/test/nativeModuleRetry/preinstall.sh diff --git a/packages/collector/test/nativeModuleRetry/preinstall.sh b/packages/collector/test/nativeModuleRetry/preinstall.sh new file mode 100755 index 0000000000..e23a1f8255 --- /dev/null +++ b/packages/collector/test/nativeModuleRetry/preinstall.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +####################################### +# (c) Copyright IBM Corp. 2025 +####################################### + +cd "$(dirname "$0")/../../../collector" +echo "Running npm pack in $(pwd)" +npm pack + +version=$(node -p "require('./package.json').version") +tarball="instana-collector-${version}.tgz" +cp "./${tarball}" "./test/nativeModuleRetry/collector.tgz" + +cd "$(dirname "$0")/../core" +echo "Running npm pack in $(pwd)" +npm pack + +version=$(node -p "require('./package.json').version") +tarball="instana-core-${version}.tgz" +cp "./${tarball}" "../collector/test/nativeModuleRetry/core.tgz" + +cd "$(dirname "$0")/../shared-metrics" +echo "Running npm pack in $(pwd)" +npm pack + +version=$(node -p "require('./package.json').version") +tarball="instana-shared-metrics-${version}.tgz" +cp "./${tarball}" "../collector/test/nativeModuleRetry/shared-metrics.tgz" diff --git a/packages/collector/test/nativeModuleRetry/test.js b/packages/collector/test/nativeModuleRetry/test.js index 00ca249370..4d434d42a6 100644 --- a/packages/collector/test/nativeModuleRetry/test.js +++ b/packages/collector/test/nativeModuleRetry/test.js @@ -94,42 +94,20 @@ mochaSuiteFn('retry loading native addons', function () { before(async () => { execSync(`rm -rf ${tmpFolder}`, { cwd: __dirname, stdio: 'inherit' }); execSync(`mkdir -p ${tmpFolder}`, { cwd: __dirname, stdio: 'inherit' }); - execSync(`cp app.js ${tmpFolder}/`, { cwd: __dirname, stdio: 'inherit' }); // eslint-disable-next-line no-console console.log('Running npm install in', tmpFolder); execSync('rm -rf node_modules', { cwd: tmpFolder, stdio: 'inherit' }); - const copath = path.join(__dirname, '..', '..', '..', 'collector'); - runCommandSync('npm pack', copath); - - const coversion = require(`${copath}/package.json`).version; - runCommandSync( - `npm install --production --no-optional --no-audit ${copath}/instana-collector-${coversion}.tgz`, - tmpFolder - ); - - // NOTE: Override the core npm dependency with the local code base - const corepath = path.join(__dirname, '..', '..', '..', 'core'); - runCommandSync('npm pack', corepath); - - const coreversion = require(`${copath}/package.json`).version; - runCommandSync( - `npm install --prefix ./ --production --no-optional --no-audit ${corepath}/instana-core-${coreversion}.tgz`, - tmpFolder - ); - - // Install the shared metrics module - const sharedMetricsPath = path.join(__dirname, '..', '..', '..', 'shared-metrics'); - runCommandSync('npm pack', sharedMetricsPath); + execSync('./preinstall.sh', { cwd: __dirname, stdio: 'inherit' }); - const sharedMetricsVersion = require(`${copath}/package.json`).version; + runCommandSync(`npm install --no-save --no-package-lock --prefix ./ ${__dirname}/core.tgz`, tmpFolder); runCommandSync( - // eslint-disable-next-line max-len - `npm install --prefix ./ --production --no-optional --no-audit ${sharedMetricsPath}/instana-shared-metrics-${sharedMetricsVersion}.tgz`, + `npm install --no-save --no-package-lock --prefix ./ ${__dirname}/shared-metrics.tgz`, tmpFolder ); + runCommandSync(`npm install --no-save --no-package-lock --prefix ./ ${__dirname}/collector.tgz`, tmpFolder); // Remove the target c++ module execSync(`rm -rf node_modules/${opts.name}`, { cwd: tmpFolder, stdio: 'inherit' }); diff --git a/packages/collector/test/tracing/opentelemetry/preinstall.sh b/packages/collector/test/tracing/opentelemetry/preinstall.sh index f32d7cfaa2..cda23409f3 100755 --- a/packages/collector/test/tracing/opentelemetry/preinstall.sh +++ b/packages/collector/test/tracing/opentelemetry/preinstall.sh @@ -18,4 +18,12 @@ npm pack version=$(node -p "require('./package.json').version") tarball="instana-core-${version}.tgz" -cp "./${tarball}" "../collector/test/tracing/opentelemetry/core.tgz" \ No newline at end of file +cp "./${tarball}" "../collector/test/tracing/opentelemetry/core.tgz" + +cd "$(dirname "$0")/../shared-metrics" +echo "Running npm pack in $(pwd)" +npm pack + +version=$(node -p "require('./package.json').version") +tarball="instana-shared-metrics-${version}.tgz" +cp "./${tarball}" "../collector/test/tracing/opentelemetry/shared-metrics.tgz" diff --git a/packages/collector/test/tracing/opentelemetry/test.js b/packages/collector/test/tracing/opentelemetry/test.js index d95a48dfa1..657798b8a7 100644 --- a/packages/collector/test/tracing/opentelemetry/test.js +++ b/packages/collector/test/tracing/opentelemetry/test.js @@ -53,11 +53,17 @@ mochaSuiteFn('opentelemetry tests', function () { if (process.env.INSTANA_TEST_SKIP_INSTALLING_DEPS === 'true') { return; } + execSync('npm install --no-save --no-package-lock --prefix ./ ./core.tgz', { cwd: __dirname, stdio: 'inherit' }); + execSync('npm install --no-save --no-package-lock --prefix ./ ./shared-metrics.tgz', { + cwd: __dirname, + stdio: 'inherit' + }); + execSync('npm install --no-save --no-package-lock --prefix ./ ./collector.tgz', { cwd: __dirname, stdio: 'inherit'