dd-trace
Version:
Datadog APM tracing client for JavaScript
60 lines (50 loc) • 1.61 kB
JavaScript
const { LOG } = require('../../../../ext/formats')
const { storage } = require('../../../datadog-core')
const Plugin = require('./plugin')
const legacyStorage = storage('legacy')
function messageProxy (message, holder) {
return new Proxy(message, {
get (target, key) {
if (shouldOverride(target, key)) {
return holder.dd
}
return target[key]
},
set (target, key, value) {
return Reflect.set(target, key, value)
},
ownKeys (target) {
const ownKeys = Reflect.ownKeys(target)
if (!Object.hasOwn(target, 'dd') && Reflect.isExtensible(target)) {
ownKeys.push('dd')
}
return ownKeys
},
getOwnPropertyDescriptor (target, p) {
return Reflect.getOwnPropertyDescriptor(shouldOverride(target, p) ? holder : target, p)
},
})
}
function shouldOverride (target, p) {
return p === 'dd' && !Object.hasOwn(target, p) && Reflect.isExtensible(target)
}
module.exports = class LogPlugin extends Plugin {
constructor (...args) {
super(...args)
this.addSub(`apm:${this.constructor.id}:log`, (arg) => {
const span = legacyStorage.getStore()?.span
// NOTE: This needs to run whether or not there is a span
// so service, version, and env will always get injected.
const holder = {}
this.tracer.inject(span, LOG, holder)
arg.message = messageProxy(arg.message, holder)
})
}
configure (config) {
return super.configure({
...config,
enabled: config.enabled && (config.logInjection || config.DD_AGENTLESS_LOG_SUBMISSION_ENABLED),
})
}
}