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.
@@ -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
- context.error = error
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]: url.split('?')[0],
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: deprecate binding event emitters in 3.0
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
 
@@ -107,10 +107,6 @@ class DatadogTracer extends Tracer {
107
107
  return this._scope
108
108
  }
109
109
 
110
- currentSpan () {
111
- return this.scope().active()
112
- }
113
-
114
110
  getRumData () {
115
111
  if (!this._enableGetRumData) {
116
112
  return ''
package/cypress/plugin.js DELETED
@@ -1,5 +0,0 @@
1
- require('..').init({
2
- startupLogs: false
3
- })
4
-
5
- module.exports = require('../packages/datadog-plugin-cypress/src/plugin')
@@ -1 +0,0 @@
1
- require('../packages/datadog-plugin-cypress/src/support')