@brainbits/node-logger-plugin-sentry
Version:
Logger plugin sentry
162 lines (161 loc) • 5.23 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var Sentry = _interopRequireWildcard(require("@sentry/node"));
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /* eslint-disable class-methods-use-this */
class PluginSentry {
constructor(config = {}) {
_defineProperty(this, "defaults", {
debug: false,
dsn: '',
environment: 'dev',
release: null,
maxBreadcrumbs: 50,
exceptionLevel: 'error',
breadcrumbLevelMap: {
emergency: 'error',
alert: 'error',
critical: 'error',
error: 'error',
warning: 'warning',
notice: 'info',
info: 'info',
debug: 'debug'
},
tags: {}
});
_defineProperty(this, "breadCrumbs", []);
const {
sentry,
...rest
} = config;
this.config = {
sentry: {
...this.defaults,
...sentry
},
...rest
};
if (!Sentry.isInitialized()) {
Sentry.init({
debug: this.config.sentry.debug,
dsn: this.config.sentry.dsn,
environment: this.config.sentry.environment,
release: this.config.sentry.release,
maxBreadcrumbs: this.config.sentry.maxBreadcrumbs,
integrations(integrations) {
return integrations.filter(integration => integration.name !== 'Console');
}
});
}
}
log(event) {
if (this.isException(event)) {
this.logException(event);
return;
}
this.addBreadcrumb(event);
}
isException({
level
}) {
const {
levels,
sentry
} = this.config;
return levels.indexOf(sentry.exceptionLevel) >= levels.indexOf(level);
}
logException({
level,
message,
meta = {}
}) {
const {
sentry,
context = {}
} = this.config;
Sentry.withScope(scope => {
const {
user: configUser,
...configExtras
} = context;
const {
tags = {},
user: metaUser,
...extras
} = meta;
const user = metaUser ?? configUser;
if (user) {
scope.setUser(this.ensureUser(user));
}
Object.entries(configExtras).forEach(([key, value]) => {
scope.setExtra(key, value);
});
Object.entries(extras).forEach(([key, value]) => {
scope.setExtra(key, value);
});
Object.entries(sentry.tags).forEach(([key, value]) => {
scope.setTag(key, value);
});
Object.entries(tags).forEach(([key, value]) => {
scope.setTag(key, value);
});
this.breadCrumbs.forEach(breadCrumb => {
Sentry.addBreadcrumb({
category: breadCrumb.level,
message: breadCrumb.message,
level: sentry.breadcrumbLevelMap[breadCrumb.level],
data: breadCrumb.meta
});
});
scope.setLevel(level);
Sentry.captureException(message);
});
}
addBreadcrumb(event) {
const {
sentry
} = this.config;
if (!Object.keys(sentry.breadcrumbLevelMap).includes(event.level)) {
return;
}
this.breadCrumbs.push(event);
if (this.breadCrumbs.length > sentry.maxBreadcrumbs) {
this.breadCrumbs.shift();
}
}
intersect(aParam, bParam) {
let a = aParam;
let b = bParam;
if (b.length > a.length) {
[b, a] = [a, b];
}
return a.filter(e => b.includes(e));
}
ensureUser(user) {
if (!user) {
return null;
}
if (typeof user !== 'object') {
return {
id: user
};
}
const keys = ['id', 'username', 'email', 'ip_address'];
const keyIntersect = this.intersect(keys, Object.keys(user));
if (keyIntersect.length === 0) {
return {
...user,
id: 'unknown'
};
}
return user;
}
}
exports.default = PluginSentry;