dd-trace
Version:
Datadog APM tracing client for JavaScript
53 lines (39 loc) • 1.44 kB
JavaScript
const {
channel,
addHook,
AsyncResource
} = require('./helpers/instrument')
const shimmer = require('../../datadog-shimmer')
addHook({ name: 'memcached', versions: ['>=2.2'] }, Memcached => {
const startCh = channel('apm:memcached:command:start')
const finishCh = channel('apm:memcached:command:finish')
const errorCh = channel('apm:memcached:command:error')
shimmer.wrap(Memcached.prototype, 'command', command => function (queryCompiler, server) {
if (!startCh.hasSubscribers) {
return command.apply(this, arguments)
}
const callbackResource = new AsyncResource('bound-anonymous-fn')
const asyncResource = new AsyncResource('bound-anonymous-fn')
const client = this
const wrappedQueryCompiler = asyncResource.bind(function () {
const query = queryCompiler.apply(this, arguments)
const callback = callbackResource.bind(query.callback)
query.callback = shimmer.wrapFunction(callback, callback => asyncResource.bind(function (err) {
if (err) {
errorCh.publish(err)
}
finishCh.publish()
return callback.apply(this, arguments)
}))
startCh.publish({ client, server, query })
return query
})
return asyncResource.runInAsyncScope(() => {
arguments[0] = wrappedQueryCompiler
const result = command.apply(this, arguments)
return result
})
})
return Memcached
})