node/lib/internal/process/report.js
Ethan Arrowood 009665fb56
report: add --report-exclude-network option
New option `--report-exclude-network`, also available as
`report.excludeNetwork`, enables the user to exclude
networking interfaces in their diagnostic report.
On some systems, this can cause the report to take minutes
to generate so this option can be used to optimize that.

Fixes: https://github.com/nodejs/node/issues/46060

PR-URL: https://github.com/nodejs/node/pull/51645

Co-authored-by: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Yagiz Nizipli <yagiz.nizipli@sentry.io>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
2024-03-01 21:50:04 +00:00

131 lines
2.7 KiB
JavaScript

'use strict';
const {
ERR_SYNTHETIC,
} = require('internal/errors').codes;
const { getValidatedPath } = require('internal/fs/utils');
const {
validateBoolean,
validateObject,
validateSignalName,
validateString,
} = require('internal/validators');
const nr = internalBinding('report');
const {
JSONParse,
} = primordials;
const report = {
writeReport(file, err) {
if (typeof file === 'object' && file !== null) {
err = file;
file = undefined;
} else if (file !== undefined) {
validateString(file, 'file');
file = getValidatedPath(file);
}
if (err === undefined) {
err = new ERR_SYNTHETIC();
} else {
validateObject(err, 'err');
}
return nr.writeReport('JavaScript API', 'API', file, err);
},
getReport(err) {
if (err === undefined)
err = new ERR_SYNTHETIC();
else
validateObject(err, 'err');
return JSONParse(nr.getReport(err));
},
get directory() {
return nr.getDirectory();
},
set directory(dir) {
validateString(dir, 'directory');
nr.setDirectory(dir);
},
get filename() {
return nr.getFilename();
},
set filename(name) {
validateString(name, 'filename');
nr.setFilename(name);
},
get compact() {
return nr.getCompact();
},
set compact(b) {
validateBoolean(b, 'compact');
nr.setCompact(b);
},
get excludeNetwork() {
return nr.getExcludeNetwork();
},
set excludeNetwork(b) {
validateBoolean(b, 'excludeNetwork');
nr.setExcludeNetwork(b);
},
get signal() {
return nr.getSignal();
},
set signal(sig) {
validateSignalName(sig, 'signal');
removeSignalHandler();
addSignalHandler(sig);
nr.setSignal(sig);
},
get reportOnFatalError() {
return nr.shouldReportOnFatalError();
},
set reportOnFatalError(trigger) {
validateBoolean(trigger, 'trigger');
nr.setReportOnFatalError(trigger);
},
get reportOnSignal() {
return nr.shouldReportOnSignal();
},
set reportOnSignal(trigger) {
validateBoolean(trigger, 'trigger');
nr.setReportOnSignal(trigger);
removeSignalHandler();
addSignalHandler();
},
get reportOnUncaughtException() {
return nr.shouldReportOnUncaughtException();
},
set reportOnUncaughtException(trigger) {
validateBoolean(trigger, 'trigger');
nr.setReportOnUncaughtException(trigger);
},
};
function addSignalHandler(sig) {
if (nr.shouldReportOnSignal()) {
if (typeof sig !== 'string')
sig = nr.getSignal();
process.on(sig, signalHandler);
}
}
function removeSignalHandler() {
const sig = nr.getSignal();
if (sig)
process.removeListener(sig, signalHandler);
}
function signalHandler(sig) {
nr.writeReport(sig, 'Signal', null, '');
}
module.exports = {
addSignalHandler,
report,
};