dd-trace
Version:
Datadog APM tracing client for JavaScript
66 lines (52 loc) • 1.47 kB
JavaScript
const dc = require('dc-polyfill')
const shimmer = require('../../datadog-shimmer')
const {
channel,
addHook
} = require('./helpers/instrument')
const prepareCh = channel('datadog:mquery:filter:prepare')
const tracingCh = dc.tracingChannel('datadog:mquery:filter')
const methods = [
'find',
'findOne',
'findOneAndRemove',
'findOneAndDelete',
'count',
'distinct',
'where'
]
const methodsOptionalArgs = ['findOneAndUpdate']
function getFilters (args, methodName) {
const [arg0, arg1] = args
const filters = arg0 !== null && typeof arg0 === 'object' ? [arg0] : []
if (arg1 !== null && typeof arg1 === 'object' && methodsOptionalArgs.includes(methodName)) {
filters.push(arg1)
}
return filters
}
addHook({
name: 'mquery',
versions: ['>=5.0.0']
}, Query => {
[...methods, ...methodsOptionalArgs].forEach(methodName => {
if (!(methodName in Query.prototype)) return
shimmer.wrap(Query.prototype, methodName, method => {
return function () {
if (prepareCh.hasSubscribers) {
const filters = getFilters(arguments, methodName)
if (filters?.length) {
prepareCh.publish({ filters })
}
}
return method.apply(this, arguments)
}
})
})
shimmer.wrap(Query.prototype, 'exec', originalExec => {
return function wrappedExec () {
return tracingCh.tracePromise(originalExec, {}, this, arguments)
}
})
return Query
})