@sentry/core
Version:
Base implementation for all Sentry JavaScript SDKs
125 lines (104 loc) • 3.94 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const debugBuild = require('../debug-build.js');
const integration = require('../integration.js');
const is = require('../utils-hoist/is.js');
const logger = require('../utils-hoist/logger.js');
const normalize = require('../utils-hoist/normalize.js');
const object = require('../utils-hoist/object.js');
const string = require('../utils-hoist/string.js');
const INTEGRATION_NAME = 'ExtraErrorData';
/**
* Extract additional data for from original exceptions.
*/
const _extraErrorDataIntegration = ((options = {}) => {
const { depth = 3, captureErrorCause = true } = options;
return {
name: INTEGRATION_NAME,
processEvent(event, hint, client) {
const { maxValueLength = 250 } = client.getOptions();
return _enhanceEventWithErrorData(event, hint, depth, captureErrorCause, maxValueLength);
},
};
}) ;
const extraErrorDataIntegration = integration.defineIntegration(_extraErrorDataIntegration);
function _enhanceEventWithErrorData(
event,
hint = {},
depth,
captureErrorCause,
maxValueLength,
) {
if (!hint.originalException || !is.isError(hint.originalException)) {
return event;
}
const exceptionName = (hint.originalException ).name || hint.originalException.constructor.name;
const errorData = _extractErrorData(hint.originalException , captureErrorCause, maxValueLength);
if (errorData) {
const contexts = {
...event.contexts,
};
const normalizedErrorData = normalize.normalize(errorData, depth);
if (is.isPlainObject(normalizedErrorData)) {
// We mark the error data as "already normalized" here, because we don't want other normalization procedures to
// potentially truncate the data we just already normalized, with a certain depth setting.
object.addNonEnumerableProperty(normalizedErrorData, '__sentry_skip_normalization__', true);
contexts[exceptionName] = normalizedErrorData;
}
return {
...event,
contexts,
};
}
return event;
}
/**
* Extract extra information from the Error object
*/
function _extractErrorData(
error,
captureErrorCause,
maxValueLength,
) {
// We are trying to enhance already existing event, so no harm done if it won't succeed
try {
const nativeKeys = [
'name',
'message',
'stack',
'line',
'column',
'fileName',
'lineNumber',
'columnNumber',
'toJSON',
];
const extraErrorInfo = {};
// We want only enumerable properties, thus `getOwnPropertyNames` is redundant here, as we filter keys anyway.
for (const key of Object.keys(error)) {
if (nativeKeys.indexOf(key) !== -1) {
continue;
}
const value = error[key];
extraErrorInfo[key] = is.isError(value) || typeof value === 'string' ? string.truncate(`${value}`, maxValueLength) : value;
}
// Error.cause is a standard property that is non enumerable, we therefore need to access it separately.
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause
if (captureErrorCause && error.cause !== undefined) {
extraErrorInfo.cause = is.isError(error.cause) ? error.cause.toString() : error.cause;
}
// Check if someone attached `toJSON` method to grab even more properties (eg. axios is doing that)
if (typeof error.toJSON === 'function') {
const serializedError = error.toJSON() ;
for (const key of Object.keys(serializedError)) {
const value = serializedError[key];
extraErrorInfo[key] = is.isError(value) ? value.toString() : value;
}
}
return extraErrorInfo;
} catch (oO) {
debugBuild.DEBUG_BUILD && logger.logger.error('Unable to extract extra data from the Error object:', oO);
}
return null;
}
exports.extraErrorDataIntegration = extraErrorDataIntegration;
//# sourceMappingURL=extraerrordata.js.map