UNPKG

@brainbits/node-logger-plugin-sentry

Version:
162 lines (161 loc) 5.23 kB
"use strict"; 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;