3v324v23's picture
Add PNG files and track with Git LFS
befd7da
'use strict';
const omit = require('lodash.omit');
// // //
/**
* Sentry stream for Bunyan
*/
class SentryStream {
/**
* SentryStream constructor
* @param {Object} client the Sentry client
* @return {void}
*/
constructor(client) {
this.client = client;
}
/**
* Method call by Bunyan to save log record
* @param {Object} record log properties
* @return {Boolean} true
*/
write(record) {
const err = record.err;
const tags = record.tags;
const level = this.getSentryLevel(record);
if (err) {
const extra = omit(record, 'err', 'tags');
this.client.captureException(this.deserializeError(err), { extra, level, tags });
} else {
const extra = omit(record, 'msg', 'tags');
this.client.captureMessage(record.msg, { extra, level, tags });
}
return (true);
}
/**
* Convert Bunyan level number to Sentry level label.
* Rule : >50=error ; 40=warning ; info otherwise
* @param {Object} record Bunyan log record
* @return {String} Sentry level
*/
getSentryLevel(record) {
const level = record.level;
if (level >= 50) return 'error';
if (level === 40) return 'warning';
return 'info';
}
/**
* Error deserialiazing function. Bunyan serialize the error to object : https://github.com/trentm/node-bunyan/blob/master/lib/bunyan.js#L1089
* @param {object} data serialized Bunyan
* @return {Error} the deserialiazed error
*/
deserializeError(data) {
if (data instanceof Error) return data;
const error = new Error(data.message);
error.name = data.name;
error.stack = data.stack;
error.code = data.code;
error.signal = data.signal;
return error;
}
}
module.exports = SentryStream;