dd-trace
Version:
Datadog APM tracing client for JavaScript
118 lines (90 loc) • 3.14 kB
JavaScript
const {
channel,
addHook
} = require('./helpers/instrument')
const shimmer = require('../../datadog-shimmer')
function wrapPino (symbol, wrapper, pino) {
return function pinoWithTrace () {
const instance = pino.apply(this, arguments)
Object.defineProperty(instance, symbol, {
configurable: true,
enumerable: true,
writable: true,
value: wrapper(instance[symbol])
})
return instance
}
}
function wrapAsJson (asJson) {
const ch = channel('apm:pino:log')
return function asJsonWithTrace (obj, msg, num, time) {
obj = arguments[0] = obj || {}
const payload = { message: obj }
ch.publish(payload)
arguments[0] = payload.message
return asJson.apply(this, arguments)
}
}
function wrapMixin (mixin) {
const ch = channel('apm:pino:log')
return function mixinWithTrace () {
let obj = {}
if (mixin) {
obj = mixin.apply(this, arguments)
}
const payload = { message: obj }
ch.publish(payload)
return payload.message
}
}
function wrapPrettifyObject (prettifyObject) {
const ch = channel('apm:pino:log')
return function prettifyObjectWithTrace (input) {
const payload = { message: input.input }
ch.publish(payload)
input.input = payload.message
return prettifyObject.apply(this, arguments)
}
}
function wrapPrettyFactory (prettyFactory) {
const ch = channel('apm:pino:log')
return function prettyFactoryWithTrace () {
const pretty = prettyFactory.apply(this, arguments)
return function prettyWithTrace (obj) {
const payload = { message: obj }
ch.publish(payload)
arguments[0] = payload.message
return pretty.apply(this, arguments)
}
}
}
addHook({ name: 'pino', versions: ['2 - 3', '4'], patchDefault: true }, (pino) => {
const asJsonSym = (pino.symbols && pino.symbols.asJsonSym) || 'asJson'
const wrapped = shimmer.wrapFunction(pino, pino => wrapPino(asJsonSym, wrapAsJson, pino))
return wrapped
})
addHook({ name: 'pino', versions: ['>=5 <5.14.0'], patchDefault: true }, (pino) => {
const asJsonSym = ((pino.default || pino)?.symbols.asJsonSym) || 'asJson'
const wrapped = shimmer.wrapFunction(pino, pino => wrapPino(asJsonSym, wrapAsJson, pino))
return wrapped
})
addHook({ name: 'pino', versions: ['>=5.14.0 <6.8.0'] }, (pino) => {
const mixinSym = (pino.default || pino).symbols.mixinSym
const wrapped = shimmer.wrapFunction(pino, pino => wrapPino(mixinSym, wrapMixin, pino.default || pino))
return wrapped
})
addHook({ name: 'pino', versions: ['>=6.8.0'], patchDefault: false }, (pino, _1, _2, isIitm) => {
const mixinSym = pino.symbols.mixinSym
const wrapped = shimmer.wrapFunction(pino, pino => wrapPino(mixinSym, wrapMixin, pino))
wrapped.pino = wrapped
wrapped.default = wrapped
return wrapped
})
addHook({ name: 'pino-pretty', file: 'lib/utils.js', versions: ['>=3'] }, utils => {
shimmer.wrap(utils, 'prettifyObject', wrapPrettifyObject)
return utils
})
addHook({ name: 'pino-pretty', versions: ['1 - 2'] }, prettyFactory => {
return shimmer.wrapFunction(prettyFactory, wrapPrettyFactory)
})