dd-trace
Version:
Datadog APM tracing client for JavaScript
62 lines (48 loc) • 1.83 kB
JavaScript
const shimmer = require('../../datadog-shimmer')
const {
channel,
addHook,
} = require('./helpers/instrument')
const startCh = channel('apm:ioredis:command:start')
const finishCh = channel('apm:ioredis:command:finish')
const errorCh = channel('apm:ioredis:command:error')
const connectionOptionsCache = new WeakMap()
function wrapRedis (Redis) {
shimmer.wrap(Redis.prototype, 'sendCommand', sendCommand => function (command, stream) {
if (!startCh.hasSubscribers) return sendCommand.call(this, command, stream)
if (!command?.promise) return sendCommand.call(this, command, stream)
const options = this.options || {}
let connectionOptions = connectionOptionsCache.get(this)
if (connectionOptions === undefined) {
connectionOptions = { host: options.host, port: options.port }
connectionOptionsCache.set(this, connectionOptions)
}
const ctx = {
db: options.db,
command: command.name,
args: command.args,
connectionOptions,
connectionName: options.connectionName,
}
return startCh.runStores(ctx, () => {
command.promise.then(() => finish(finishCh, errorCh, ctx), err => finish(finishCh, errorCh, ctx, err))
return sendCommand.call(this, command, stream)
})
})
return Redis
}
addHook({ name: 'ioredis', versions: ['>=2 <4'], file: 'lib/redis.js' }, wrapRedis)
addHook({ name: 'ioredis', versions: ['>=4 <4.11.0'], file: 'built/redis.js' }, wrapRedis)
addHook({ name: 'ioredis', versions: ['>=4.11.0 <5'], file: 'built/redis/index.js' }, (exports) => {
wrapRedis(exports.default)
return exports
})
addHook({ name: 'ioredis', versions: ['>=5'] }, wrapRedis)
function finish (finishCh, errorCh, ctx, error) {
if (error) {
ctx.error = error
errorCh.publish(ctx)
}
finishCh.publish(ctx)
}