dd-trace 2.12.0 → 3.0.0-pre.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ci/init.js +2 -26
- package/ci/jest/env.js +2 -3
- package/index.d.ts +0 -7
- package/package.json +1 -1
- package/packages/datadog-instrumentations/src/connect.js +4 -4
- package/packages/datadog-instrumentations/src/fastify.js +12 -25
- package/packages/datadog-instrumentations/src/koa.js +4 -4
- package/packages/datadog-instrumentations/src/router.js +4 -4
- package/packages/datadog-plugin-grpc/src/client.js +2 -2
- package/packages/datadog-plugin-grpc/src/server.js +2 -2
- package/packages/datadog-plugin-http/src/client.js +1 -1
- package/packages/datadog-plugin-http/src/server.js +1 -1
- package/packages/datadog-plugin-http2/src/client.js +1 -1
- package/packages/datadog-plugin-router/src/index.js +13 -8
- package/packages/dd-trace/src/config.js +8 -0
- package/packages/dd-trace/src/encode/0.4.js +4 -0
- package/packages/dd-trace/src/exporters/common/request.js +48 -34
- package/packages/dd-trace/src/exporters/common/writer.js +8 -1
- package/packages/dd-trace/src/noop/tracer.js +0 -4
- package/packages/dd-trace/src/plugin_manager.js +5 -1
- package/packages/dd-trace/src/plugins/index.js +0 -1
- package/packages/dd-trace/src/plugins/util/web.js +52 -4
- package/packages/dd-trace/src/proxy.js +0 -19
- package/packages/dd-trace/src/scope.js +1 -126
- package/packages/dd-trace/src/tracer.js +0 -4
- package/cypress/plugin.js +0 -5
- package/cypress/support.js +0 -1
- package/packages/datadog-plugin-fs/src/index.js +0 -548
|
@@ -43,13 +43,15 @@ const web = {
|
|
|
43
43
|
const hooks = getHooks(config)
|
|
44
44
|
const filter = urlFilter.getFilter(config)
|
|
45
45
|
const middleware = getMiddlewareSetting(config)
|
|
46
|
+
const queryStringObfuscation = getQsObfuscator(config)
|
|
46
47
|
|
|
47
48
|
return Object.assign({}, config, {
|
|
48
49
|
headers,
|
|
49
50
|
validateStatus,
|
|
50
51
|
hooks,
|
|
51
52
|
filter,
|
|
52
|
-
middleware
|
|
53
|
+
middleware,
|
|
54
|
+
queryStringObfuscation
|
|
53
55
|
})
|
|
54
56
|
},
|
|
55
57
|
|
|
@@ -270,7 +272,10 @@ const web = {
|
|
|
270
272
|
addError (req, error) {
|
|
271
273
|
if (error instanceof Error) {
|
|
272
274
|
const context = contexts.get(req)
|
|
273
|
-
|
|
275
|
+
|
|
276
|
+
if (context) {
|
|
277
|
+
context.error = error
|
|
278
|
+
}
|
|
274
279
|
}
|
|
275
280
|
},
|
|
276
281
|
|
|
@@ -315,6 +320,23 @@ const web = {
|
|
|
315
320
|
web.finishSpan(context)
|
|
316
321
|
},
|
|
317
322
|
|
|
323
|
+
obfuscateQs (config, url) {
|
|
324
|
+
const { queryStringObfuscation } = config
|
|
325
|
+
|
|
326
|
+
if (queryStringObfuscation === false) return url
|
|
327
|
+
|
|
328
|
+
const i = url.indexOf('?')
|
|
329
|
+
if (i === -1) return url
|
|
330
|
+
|
|
331
|
+
const path = url.slice(0, i)
|
|
332
|
+
if (queryStringObfuscation === true) return path
|
|
333
|
+
|
|
334
|
+
let qs = url.slice(i + 1)
|
|
335
|
+
|
|
336
|
+
qs = qs.replace(queryStringObfuscation, '<redacted>')
|
|
337
|
+
|
|
338
|
+
return `${path}?${qs}`
|
|
339
|
+
},
|
|
318
340
|
wrapWriteHead (context) {
|
|
319
341
|
const { req, res } = context
|
|
320
342
|
const writeHead = res.writeHead
|
|
@@ -404,11 +426,11 @@ function reactivate (req, fn) {
|
|
|
404
426
|
}
|
|
405
427
|
|
|
406
428
|
function addRequestTags (context) {
|
|
407
|
-
const { req, span } = context
|
|
429
|
+
const { req, span, config } = context
|
|
408
430
|
const url = extractURL(req)
|
|
409
431
|
|
|
410
432
|
span.addTags({
|
|
411
|
-
[HTTP_URL]:
|
|
433
|
+
[HTTP_URL]: web.obfuscateQs(config, url),
|
|
412
434
|
[HTTP_METHOD]: req.method,
|
|
413
435
|
[SPAN_KIND]: SERVER,
|
|
414
436
|
[SPAN_TYPE]: WEB,
|
|
@@ -519,4 +541,30 @@ function getMiddlewareSetting (config) {
|
|
|
519
541
|
return true
|
|
520
542
|
}
|
|
521
543
|
|
|
544
|
+
function getQsObfuscator (config) {
|
|
545
|
+
const obfuscator = config.queryStringObfuscation
|
|
546
|
+
|
|
547
|
+
if (typeof obfuscator === 'boolean') {
|
|
548
|
+
return obfuscator
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
if (typeof obfuscator === 'string') {
|
|
552
|
+
if (obfuscator === '') return false // disable obfuscator
|
|
553
|
+
|
|
554
|
+
if (obfuscator === '.*') return true // optimize full redact
|
|
555
|
+
|
|
556
|
+
try {
|
|
557
|
+
return new RegExp(obfuscator, 'gi')
|
|
558
|
+
} catch (err) {
|
|
559
|
+
log.error(err)
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
if (config.hasOwnProperty('queryStringObfuscation')) {
|
|
564
|
+
log.error('Expected `queryStringObfuscation` to be a regex string or boolean.')
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
return true
|
|
568
|
+
}
|
|
569
|
+
|
|
522
570
|
module.exports = web
|
|
@@ -22,11 +22,6 @@ class Tracer extends BaseTracer {
|
|
|
22
22
|
this._tracer = noop
|
|
23
23
|
this._instrumenter = new Instrumenter(this)
|
|
24
24
|
this._pluginManager = new PluginManager(this)
|
|
25
|
-
this._deprecate = method => log.deprecate(`tracer.${method}`, [
|
|
26
|
-
`tracer.${method}() is deprecated.`,
|
|
27
|
-
'Please use tracer.startSpan() and tracer.scope() instead.',
|
|
28
|
-
'See: https://datadog.github.io/dd-trace-js/#manual-instrumentation.'
|
|
29
|
-
].join(' '))
|
|
30
25
|
}
|
|
31
26
|
|
|
32
27
|
init (options) {
|
|
@@ -126,20 +121,6 @@ class Tracer extends BaseTracer {
|
|
|
126
121
|
return this._tracer.scope.apply(this._tracer, arguments)
|
|
127
122
|
}
|
|
128
123
|
|
|
129
|
-
currentSpan () {
|
|
130
|
-
this._deprecate('currentSpan')
|
|
131
|
-
return this._tracer.currentSpan.apply(this._tracer, arguments)
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
bind (callback) {
|
|
135
|
-
this._deprecate('bind')
|
|
136
|
-
return callback
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
bindEmitter () {
|
|
140
|
-
this._deprecate('bindEmitter')
|
|
141
|
-
}
|
|
142
|
-
|
|
143
124
|
getRumData () {
|
|
144
125
|
return this._tracer.getRumData.apply(this._tracer, arguments)
|
|
145
126
|
}
|
|
@@ -2,13 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
const { storage } = require('../../datadog-core')
|
|
4
4
|
|
|
5
|
-
// TODO:
|
|
5
|
+
// TODO: refactor bind to use shimmer once the new internal tracer lands
|
|
6
6
|
|
|
7
7
|
const originals = new WeakMap()
|
|
8
|
-
const listenerMaps = new WeakMap()
|
|
9
|
-
const emitterSpans = new WeakMap()
|
|
10
|
-
const emitterScopes = new WeakMap()
|
|
11
|
-
const emitters = new WeakSet()
|
|
12
8
|
|
|
13
9
|
class Scope {
|
|
14
10
|
active () {
|
|
@@ -39,7 +35,6 @@ class Scope {
|
|
|
39
35
|
}
|
|
40
36
|
|
|
41
37
|
bind (target, span) {
|
|
42
|
-
target = this._bindEmitter(target, span)
|
|
43
38
|
target = this._bindPromise(target, span)
|
|
44
39
|
target = this._bindFn(target, span)
|
|
45
40
|
|
|
@@ -49,7 +44,6 @@ class Scope {
|
|
|
49
44
|
unbind (target) {
|
|
50
45
|
target = this._unbindFn(target)
|
|
51
46
|
target = this._unbindPromise(target)
|
|
52
|
-
target = this._unbindEmitter(target)
|
|
53
47
|
|
|
54
48
|
return target
|
|
55
49
|
}
|
|
@@ -77,37 +71,6 @@ class Scope {
|
|
|
77
71
|
return originals.get(fn) || fn
|
|
78
72
|
}
|
|
79
73
|
|
|
80
|
-
_bindEmitter (emitter, span) {
|
|
81
|
-
if (!this._isEmitter(emitter)) return emitter
|
|
82
|
-
if (!emitters.has(emitter)) {
|
|
83
|
-
Scope._wrapEmitter(emitter)
|
|
84
|
-
}
|
|
85
|
-
emitterSpans.set(emitter, span)
|
|
86
|
-
emitterScopes.set(emitter, this)
|
|
87
|
-
return emitter
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Occasionally we want to wrap a prototype rather than emitter instances,
|
|
91
|
-
// so we're exposing this as a static method. This gives us a faster
|
|
92
|
-
// path for binding instances of known EventEmitter subclasses.
|
|
93
|
-
static _wrapEmitter (emitter) {
|
|
94
|
-
wrapMethod(emitter, 'addListener', wrapAddListener)
|
|
95
|
-
wrapMethod(emitter, 'prependListener', wrapAddListener)
|
|
96
|
-
wrapMethod(emitter, 'on', wrapAddListener)
|
|
97
|
-
wrapMethod(emitter, 'once', wrapAddListener)
|
|
98
|
-
wrapMethod(emitter, 'removeListener', wrapRemoveListener)
|
|
99
|
-
wrapMethod(emitter, 'off', wrapRemoveListener)
|
|
100
|
-
wrapMethod(emitter, 'removeAllListeners', wrapRemoveAllListeners)
|
|
101
|
-
emitters.add(emitter)
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
_unbindEmitter (emitter) {
|
|
105
|
-
if (!this._isEmitter(emitter)) return emitter
|
|
106
|
-
emitterScopes.delete(emitter)
|
|
107
|
-
emitterSpans.delete(emitter)
|
|
108
|
-
return emitter
|
|
109
|
-
}
|
|
110
|
-
|
|
111
74
|
_bindPromise (promise, span) {
|
|
112
75
|
if (!this._isPromise(promise)) return promise
|
|
113
76
|
|
|
@@ -128,31 +91,11 @@ class Scope {
|
|
|
128
91
|
return span !== undefined ? span : this.active()
|
|
129
92
|
}
|
|
130
93
|
|
|
131
|
-
_isEmitter (emitter) {
|
|
132
|
-
return emitter &&
|
|
133
|
-
typeof emitter.emit === 'function' &&
|
|
134
|
-
typeof emitter.on === 'function' &&
|
|
135
|
-
typeof emitter.addListener === 'function' &&
|
|
136
|
-
typeof emitter.removeListener === 'function'
|
|
137
|
-
}
|
|
138
|
-
|
|
139
94
|
_isPromise (promise) {
|
|
140
95
|
return promise && typeof promise.then === 'function'
|
|
141
96
|
}
|
|
142
97
|
}
|
|
143
98
|
|
|
144
|
-
function getScope (emitter) {
|
|
145
|
-
return emitterScopes.get(emitter) || emitterScopes.get(emitter.constructor.prototype)
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
function getSpan (emitter) {
|
|
149
|
-
return emitterSpans.get(emitter) || emitterSpans.get(emitter.constructor.prototype)
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
function hasScope (emitter) {
|
|
153
|
-
return emitterScopes.has(emitter) || emitterScopes.has(emitter.constructor.prototype)
|
|
154
|
-
}
|
|
155
|
-
|
|
156
99
|
function wrapThen (then, scope, span) {
|
|
157
100
|
return function thenWithTrace (onFulfilled, onRejected) {
|
|
158
101
|
const args = new Array(arguments.length)
|
|
@@ -165,74 +108,6 @@ function wrapThen (then, scope, span) {
|
|
|
165
108
|
}
|
|
166
109
|
}
|
|
167
110
|
|
|
168
|
-
function wrapAddListener (addListener) {
|
|
169
|
-
return function addListenerWithTrace (eventName, listener) {
|
|
170
|
-
const scope = getScope(this)
|
|
171
|
-
if (!scope || !listener || originals.has(listener) || listener.listener) {
|
|
172
|
-
return addListener.apply(this, arguments)
|
|
173
|
-
}
|
|
174
|
-
const span = getSpan(this)
|
|
175
|
-
|
|
176
|
-
const bound = scope.bind(listener, scope._spanOrActive(span))
|
|
177
|
-
const listenerMap = listenerMaps.get(this) || {}
|
|
178
|
-
|
|
179
|
-
listenerMaps.set(this, listenerMap)
|
|
180
|
-
|
|
181
|
-
if (!listenerMap[eventName]) {
|
|
182
|
-
listenerMap[eventName] = new WeakMap()
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
const events = listenerMap[eventName]
|
|
186
|
-
|
|
187
|
-
if (!events.has(listener)) {
|
|
188
|
-
events.set(listener, [])
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
events.get(listener).push(bound)
|
|
192
|
-
|
|
193
|
-
return addListener.call(this, eventName, bound)
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
function wrapRemoveListener (removeListener) {
|
|
198
|
-
return function removeListenerWithTrace (eventName, listener) {
|
|
199
|
-
if (!hasScope(this)) {
|
|
200
|
-
return removeListener.apply(this, arguments)
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
const listenerMap = listenerMaps.get(this)
|
|
204
|
-
const listeners = listenerMap && listenerMap[eventName]
|
|
205
|
-
|
|
206
|
-
if (!listener || !listeners || !listeners.has(listener)) {
|
|
207
|
-
return removeListener.apply(this, arguments)
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
for (const bound of listeners.get(listener)) {
|
|
211
|
-
removeListener.call(this, eventName, bound)
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
listeners.delete(listener)
|
|
215
|
-
|
|
216
|
-
return removeListener.apply(this, arguments)
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
function wrapRemoveAllListeners (removeAllListeners) {
|
|
221
|
-
return function removeAllListenersWithTrace (eventName) {
|
|
222
|
-
const listenerMap = listenerMaps.get(this)
|
|
223
|
-
|
|
224
|
-
if (hasScope(this) && listenerMap) {
|
|
225
|
-
if (eventName) {
|
|
226
|
-
delete listenerMap[eventName]
|
|
227
|
-
} else {
|
|
228
|
-
listenerMaps.delete(this)
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
return removeAllListeners.apply(this, arguments)
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
111
|
function wrapMethod (target, name, wrapper, ...args) {
|
|
237
112
|
if (!target[name] || originals.has(target[name])) return
|
|
238
113
|
|
package/cypress/plugin.js
DELETED
package/cypress/support.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
require('../packages/datadog-plugin-cypress/src/support')
|