Skip to content

Commit b6a2ccd

Browse files
feat: warn user when a instrumented package was already required open-telemetry#636 (open-telemetry#654)
* feat: warn user when a instrumented package was already required open-telemetry#636 * chore: address PR comments * chore: extract package name from require.cache * chore: use find instead of some * chore: use require.resolve to find already required modules * chore: try/catch require.resolve Co-authored-by: Mayur Kale <[email protected]>
1 parent 82723ef commit b6a2ccd

File tree

4 files changed

+51
-0
lines changed

4 files changed

+51
-0
lines changed

packages/opentelemetry-node/src/instrumentation/PluginLoader.ts

+19
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,25 @@ export class PluginLoader {
8383
return this;
8484
}
8585

86+
const alreadyRequiredModules = Object.keys(require.cache);
87+
const requiredModulesToHook = modulesToHook.filter(
88+
name =>
89+
alreadyRequiredModules.find(cached => {
90+
try {
91+
return require.resolve(name) === cached;
92+
} catch (err) {
93+
return false;
94+
}
95+
}) !== undefined
96+
);
97+
if (requiredModulesToHook.length > 0) {
98+
this.logger.warn(
99+
`Some modules (${requiredModulesToHook.join(
100+
', '
101+
)}) were already required when their respective plugin was loaded, some plugins might not work. Make sure the SDK is setup before you require in other modules.`
102+
);
103+
}
104+
86105
// Enable the require hook.
87106
hook(modulesToHook, (exports, name, baseDir) => {
88107
if (this._hookState !== HookState.ENABLED) return exports;

packages/opentelemetry-node/test/instrumentation/PluginLoader.test.ts

+24
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,13 @@ const notSupportedVersionPlugins: Plugins = {
8686
},
8787
};
8888

89+
const alreadyRequiredPlugins: Plugins = {
90+
'already-require-module': {
91+
enabled: true,
92+
path: '@opentelemetry/plugin-supported-module',
93+
},
94+
};
95+
8996
describe('PluginLoader', () => {
9097
const provider = new NoopTracerProvider();
9198
const logger = new NoopLogger();
@@ -219,6 +226,23 @@ describe('PluginLoader', () => {
219226
assert.strictEqual(require('simple-module').value(), 0);
220227
pluginLoader.unload();
221228
});
229+
230+
it(`should warn when module was already loaded`, callback => {
231+
const verifyWarnLogger = {
232+
error: logger.error,
233+
info: logger.info,
234+
debug: logger.debug,
235+
warn: (message: string, ...args: unknown[]) => {
236+
assert(message.match(/were already required when/));
237+
assert(message.match(/(already-require-module)/));
238+
return callback();
239+
},
240+
};
241+
require('already-require-module');
242+
const pluginLoader = new PluginLoader(provider, verifyWarnLogger);
243+
pluginLoader.load(alreadyRequiredPlugins);
244+
pluginLoader.unload();
245+
});
222246
});
223247

224248
describe('.unload()', () => {

packages/opentelemetry-node/test/instrumentation/node_modules/already-require-module/index.js

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/opentelemetry-node/test/instrumentation/node_modules/already-require-module/package.json

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)