UNPKG

dd-trace

Version:

Datadog APM tracing client for JavaScript

60 lines (50 loc) 1.61 kB
'use strict' 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), }) } }