pino-datadog
Version:
A transport for pino that sends messages to DataDog
61 lines (52 loc) • 1.72 kB
JavaScript
const batch2 = require('batch2')
const split2 = require('split2')
const through2 = require('through2')
const fastJsonParse = require('fast-json-parse')
function batchStream (size) {
return batch2.obj({ size })
}
function parseJsonStream () {
return split2(function (str) {
const result = fastJsonParse(str)
if (result.err) return
return result.value
})
}
function levelToStatus (level) {
if (level === 10 || level === 20) { return 'debug' }
if (level === 40) { return 'warning' }
if (level === 50) { return 'error' }
if (level >= 60) { return 'critical' }
return 'info'
}
function toLogEntry (item) {
const timestamp = item.time || new Date().getTime()
const status = levelToStatus(item.level)
const message = item.msg || status
const host = item.hostname || ''
const service = item.service || ''
const ddsource = item.ddsource || item.source || ''
const objTags = (item.labels || item.tags || {})
const ddtags = Object.keys(objTags).map(k => { return `${k}:${objTags[k]}` }).join(',')
const entry = Object.assign({}, item, { timestamp, status, message, host, service, ddsource, ddtags })
delete entry.time; delete entry.level; delete entry.hostname; delete entry.source; delete entry.labels; delete entry.tags
if (!service) { delete entry.service }
if (!ddsource) { delete entry.ddsource }
if (!ddtags) { delete entry.ddtags }
return entry
}
function toLogEntryStream (options = {}) {
return through2.obj(function transport (chunk, enc, cb) {
const entry = toLogEntry(chunk)
if (!options.keepMsg) {
delete entry.msg
}
cb(null, entry)
})
}
module.exports = {
batchStream,
parseJsonStream,
toLogEntryStream
}