Skip to content

Commit 775df15

Browse files
fix: exposed preload flags in debug mode (#1268)
refs INSTA-778
1 parent 22cb204 commit 775df15

File tree

3 files changed

+133
-0
lines changed

3 files changed

+133
-0
lines changed

packages/core/src/tracing/index.js

+8
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const {
2222
isESMApp
2323
} = require('../util/esm');
2424
const iitmHook = require('../util/iitmHook');
25+
const { getPreloadFlags } = require('../util/getPreloadFlags');
2526

2627
let tracingEnabled = false;
2728
let tracingActivated = false;
@@ -180,6 +181,13 @@ exports.preInit = function preInit(preliminaryConfig) {
180181
* @param {CollectorPIDStore} _processIdentityProvider
181182
*/
182183
exports.init = function init(_config, downstreamConnection, _processIdentityProvider) {
184+
if (process.env.INSTANA_DEBUG || process.env.INSTANA_LOG_LEVEL === 'debug') {
185+
const preloadFlags = getPreloadFlags();
186+
187+
// eslint-disable-next-line no-console
188+
console.debug(`The App is using the following preload flags: ${preloadFlags}`);
189+
}
190+
183191
// Consider removing this in the next major release(v4.x) of the @instana package.
184192
if (hasExperimentalLoaderFlag()) {
185193
// eslint-disable-next-line no-console
+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* (c) Copyright IBM Corp. 2024
3+
*/
4+
5+
'use strict';
6+
7+
/** @type {import('../logger').GenericLogger} */
8+
let logger;
9+
logger = require('../logger').getLogger('util/getPreloadFlags', newLogger => {
10+
logger = newLogger;
11+
});
12+
13+
exports.getPreloadFlags = function getPreloadFlags() {
14+
const flags = ['--require', '--import', '--experimental-loader'];
15+
16+
/**
17+
* @param {string[]} optionArray
18+
*/
19+
function extractOption(optionArray) {
20+
const relevantOptions = [];
21+
22+
for (let i = 0; i < optionArray.length; i++) {
23+
if (flags.some(flag => optionArray[i].includes(flag))) {
24+
relevantOptions.push(`${optionArray[i]} ${optionArray[i + 1]}`);
25+
i++;
26+
}
27+
}
28+
29+
return relevantOptions.join(', ');
30+
}
31+
32+
try {
33+
let nodeOptions = '';
34+
if (process.env.NODE_OPTIONS) {
35+
const nodeOptionsArray = process.env.NODE_OPTIONS.split(' ');
36+
nodeOptions = extractOption(nodeOptionsArray);
37+
}
38+
39+
let execArgs = '';
40+
if (process.execArgv.length > 0) {
41+
execArgs = extractOption(process.execArgv);
42+
}
43+
44+
const result = [nodeOptions, execArgs].filter(Boolean).join(', ') || 'noFlags';
45+
return result;
46+
} catch (error) {
47+
logger.error('Error occurred while doing preload flag filtering: %s ', error);
48+
return '';
49+
}
50+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*
2+
* (c) Copyright IBM Corp. 2024
3+
*/
4+
5+
'use strict';
6+
7+
const expect = require('chai').expect;
8+
9+
const { getPreloadFlags } = require('../../src/util/getPreloadFlags');
10+
11+
describe('util.getPreloadFlags', () => {
12+
const originalNodeOptions = process.env.NODE_OPTIONS;
13+
const originalExecArgv = process.execArgv.slice();
14+
15+
const resetEnvironment = () => {
16+
process.env.NODE_OPTIONS = '';
17+
process.execArgv = [];
18+
};
19+
20+
beforeEach(() => {
21+
resetEnvironment();
22+
});
23+
24+
afterEach(() => {
25+
resetEnvironment();
26+
});
27+
28+
after(() => {
29+
process.env.NODE_OPTIONS = originalNodeOptions;
30+
process.execArgv = originalExecArgv;
31+
});
32+
33+
it('should return relevant flags from NODE_OPTIONS', () => {
34+
process.env.NODE_OPTIONS =
35+
"INSTANA_DEBUG=true node --require '@instana/collector/src/immediate.js' ./dummy-app/src/index.js";
36+
37+
const result = getPreloadFlags();
38+
39+
expect(result).equal("--require '@instana/collector/src/immediate.js'");
40+
});
41+
42+
it('should return relevant flags from execArgv', () => {
43+
process.execArgv = ['--require', '@instana/collector/src/immediate.js'];
44+
45+
const result = getPreloadFlags();
46+
47+
expect(result).equal('--require @instana/collector/src/immediate.js');
48+
});
49+
50+
it('should return relevant flags from both NODE_OPTIONS and execArgv', () => {
51+
process.env.NODE_OPTIONS = '--require /path/to/some/file';
52+
process.execArgv = ['--import', '/path/to/instana/node_modules/@instana/collector/esm-register.mjs'];
53+
54+
const result = getPreloadFlags();
55+
56+
expect(result).equal(
57+
'--require /path/to/some/file, --import /path/to/instana/node_modules/@instana/collector/esm-register.mjs'
58+
);
59+
});
60+
61+
it('should return "noFlags" when no relevant flags are found', () => {
62+
process.env.NODE_OPTIONS = '--inspect value';
63+
process.execArgv = ['--anotherFlag', 'value'];
64+
65+
const result = getPreloadFlags();
66+
67+
expect(result).equal('noFlags');
68+
});
69+
70+
it('should return "noFlags" when NODE_OPTIONS and execArgv are empty', () => {
71+
const result = getPreloadFlags();
72+
73+
expect(result).equal('noFlags');
74+
});
75+
});

0 commit comments

Comments
 (0)