signalfx-tracing
Version:
Provides auto-instrumentation for JavaScript libraries and frameworks
70 lines (56 loc) • 1.77 kB
JavaScript
const tx = require('./util/log')
function createWrapWrite (tracer, config) {
return function wrapWrite (write) {
return function writeWithTrace (chunk, encoding, callback) {
arguments[0] = tx.correlate(tracer, chunk)
return write.apply(this, arguments)
}
}
}
function createWrapLog (tracer, config) {
return function wrapLog (log) {
return function logWithTrace (level, msg, meta, callback) {
const scope = tracer.scope().active()
if (!scope || arguments.length < 1) return log.apply(this, arguments)
for (let i = 0, l = arguments.length; i < l; i++) {
if (typeof arguments[i] !== 'object') continue
arguments[i] = tx.correlate(tracer, arguments[i])
return log.apply(this, arguments)
}
meta = tx.correlate(tracer)
callback = arguments[arguments.length - 1]
const index = typeof callback === 'function'
? arguments.length - 1
: arguments.length
Array.prototype.splice.call(arguments, index, 0, meta)
return log.apply(this, arguments)
}
}
}
module.exports = [
{
name: 'winston',
file: 'lib/winston/logger.js',
versions: ['>=3'],
patch (Logger, tracer, config) {
if (!tracer._logInjection) return
this.wrap(Logger.prototype, 'write', createWrapWrite(tracer, config))
},
unpatch (Logger) {
this.unwrap(Logger.prototype, 'write')
}
},
{
name: 'winston',
file: 'lib/winston/logger.js',
versions: ['1 - 2'],
patch (logger, tracer, config) {
if (!tracer._logInjection) return
this.wrap(logger.Logger.prototype, 'log', createWrapLog(tracer, config))
},
unpatch (logger) {
this.unwrap(logger.Logger.prototype, 'log')
}
}
]