UNPKG

good-bunyan

Version:

Bunyan reporting for Good process monitor

133 lines (119 loc) 4.38 kB
'use strict'; const safeStringify = require('fast-safe-stringify'); /** * Converts provided num in a string representing Mb amount. * @private * @param {number} num - Number to convert in Mb * @return {string} String with number in Mb and "Mb" suffix */ const inMb = num => `${Math.round(num / (1024 * 1024))}Mb`; /** * Zips data with provided tag. * @private * @param {string} tag - Log tag * @param {object} data - Data to log * @return {array} Array with data and the provided tag */ const withTag = (tag, data) => [data, `[${tag}]`]; /** * Formats payload of "ops" events. * @see {@link https://github.com/hapijs/good/blob/master/API.md#ops} * @public * @param {object} payload - Event payload * @return {array} Array with ops data and "[ops]" tag. * Ops data is an object with this interface: * { * memory: '<Number>Mb' where <Number> is 'resident set size' - the amount of the process held in memory * uptime: '<Number>s' where <Number> is uptime of the running process in seconds * load: <String> with useful information (requests, concurrents connections, response times, sockets) * } */ const ops = payload => withTag('ops', { memory: inMb(payload.proc.mem.rss), uptime: `${payload.proc.uptime}s`, load: payload.os.load.join(', ') }); /** * Formats payload of "response" events. * @see {@link https://github.com/hapijs/good/blob/master/API.md#requestsent} * @public * @param {object} payload - Event payload * @return {array} Array with response data and "[response]" tag. * Response data is an object with this interface: * { * instance: <String> maps to request.connection.info.uri * method: <String> method used by the request - Maps to request.method * path: <String> incoming path requested - maps to request.path * statusCode: <Number> the status code of the response * responseTime: `<Number>ms` where <Number> is calculated value of Date.now() - request.info.received * requestPayload: <String> stringified version of requestPayload (if any) * responsePayload: <String> stringified version of responsePayload (if any) * query: <String> stringified version of query object used by request - maps to request.query * } */ const response = payload => { let reqPayload; let resPayload; if (payload.requestPayload) { if (typeof payload.requestPayload === 'object' || Array.isArray(payload.requestPayload)) { reqPayload = safeStringify(payload.requestPayload); } } if (payload.responsePayload) { if (typeof payload.responsePayload === 'object' || Array.isArray(payload.responsePayload)) { resPayload = safeStringify(payload.responsePayload); } } const res = { instance: payload.instance, method: payload.method, path: payload.path, statusCode: payload.statusCode, responseTime: `${payload.responseTime}ms`, requestPayload: reqPayload, responsePayload: resPayload, query: JSON.stringify(payload.query) }; return withTag('response', {res}); }; /** * Formats payload of "error" events. * @see {@link https://github.com/hapijs/good/blob/master/API.md#requesterror} * @public * @param {object} payload - Event payload * @return {array} Array with error data, a "[error]" tag and the error message. * Error data is an object with this interface: * { * err: <Object> the raw error object * } */ const error = payload => withTag('error', {err: payload.error}).concat([payload.error.message]); /** * Formats payload of "log" events with simple formatter. * @see {@link https://github.com/hapijs/good/blob/master/API.md#serverlog} * @see simple * @public * @param {object} payload - Event payload * @return {array} Array with log data and a "[log]" */ const log = payload => { const message = withTag('log', payload.data); // Reverse message when payload.data is not an object in order to level out log return typeof payload.data !== 'object' ? message.reverse() : message; }; /** * Formats payload of "request" events with simple formatter. * @see {@link https://github.com/hapijs/good/blob/master/API.md#requestlog} * @see simple * @public * @param {object} payload - Event payload * @return {array} Array with request data and a "[request]" tag */ const request = payload => withTag('request', {req: payload}); module.exports = { ops, response, error, log, request };