dd-trace 2.0.0-appsec-beta.3 → 2.0.0

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.
Files changed (91) hide show
  1. package/MIGRATING.md +65 -0
  2. package/NOTICE +4 -0
  3. package/ci/cypress/plugin.js +3 -0
  4. package/ci/cypress/support.js +1 -0
  5. package/ci/init.js +13 -0
  6. package/ci/jest/env.js +14 -0
  7. package/index.d.ts +35 -48
  8. package/package.json +7 -4
  9. package/packages/datadog-instrumentations/index.js +10 -0
  10. package/packages/datadog-instrumentations/src/bluebird.js +26 -0
  11. package/packages/datadog-instrumentations/src/dns.js +94 -0
  12. package/packages/datadog-instrumentations/src/helpers/instrument.js +120 -0
  13. package/packages/datadog-instrumentations/src/helpers/promise.js +29 -0
  14. package/packages/datadog-instrumentations/src/memcached.js +53 -0
  15. package/packages/datadog-instrumentations/src/mysql.js +67 -0
  16. package/packages/datadog-instrumentations/src/promise-js.js +15 -0
  17. package/packages/datadog-instrumentations/src/promise.js +14 -0
  18. package/packages/datadog-instrumentations/src/q.js +13 -0
  19. package/packages/datadog-instrumentations/src/when.js +14 -0
  20. package/packages/datadog-plugin-cucumber/src/index.js +4 -4
  21. package/packages/datadog-plugin-cypress/src/plugin.js +12 -2
  22. package/packages/datadog-plugin-cypress/src/support.js +21 -6
  23. package/packages/datadog-plugin-dns/src/index.js +65 -178
  24. package/packages/datadog-plugin-fs/src/index.js +7 -3
  25. package/packages/datadog-plugin-http/src/client.js +9 -24
  26. package/packages/datadog-plugin-http/src/server.js +5 -0
  27. package/packages/datadog-plugin-http2/src/client.js +1 -24
  28. package/packages/datadog-plugin-http2/src/server.js +2 -2
  29. package/packages/datadog-plugin-jest/src/jest-environment.js +4 -4
  30. package/packages/datadog-plugin-jest/src/jest-jasmine2.js +2 -2
  31. package/packages/datadog-plugin-knex/src/index.js +3 -3
  32. package/packages/datadog-plugin-memcached/src/index.js +41 -63
  33. package/packages/datadog-plugin-mocha/src/index.js +3 -2
  34. package/packages/datadog-plugin-moleculer/src/client.js +60 -0
  35. package/packages/datadog-plugin-moleculer/src/index.js +8 -0
  36. package/packages/datadog-plugin-moleculer/src/server.js +61 -0
  37. package/packages/datadog-plugin-moleculer/src/util.js +21 -0
  38. package/packages/datadog-plugin-mongoose/src/index.js +2 -2
  39. package/packages/datadog-plugin-mysql/src/index.js +37 -89
  40. package/packages/datadog-plugin-net/src/index.js +5 -0
  41. package/packages/datadog-plugin-pino/src/index.js +25 -1
  42. package/packages/datadog-plugin-redis/src/index.js +31 -1
  43. package/packages/datadog-plugin-router/src/index.js +28 -3
  44. package/packages/dd-trace/lib/version.js +1 -1
  45. package/packages/dd-trace/src/appsec/addresses.js +11 -4
  46. package/packages/dd-trace/src/appsec/callbacks/ddwaf.js +5 -8
  47. package/packages/dd-trace/src/{gateway → appsec/gateway}/als.js +1 -0
  48. package/packages/dd-trace/src/appsec/gateway/channels.js +11 -0
  49. package/packages/dd-trace/src/{gateway → appsec/gateway}/engine/engine.js +20 -30
  50. package/packages/dd-trace/src/{gateway → appsec/gateway}/engine/index.js +0 -0
  51. package/packages/dd-trace/src/{gateway → appsec/gateway}/engine/runner.js +2 -0
  52. package/packages/dd-trace/src/appsec/index.js +54 -38
  53. package/packages/dd-trace/src/appsec/recommended.json +1 -1
  54. package/packages/dd-trace/src/appsec/reporter.js +27 -10
  55. package/packages/dd-trace/src/config.js +31 -27
  56. package/packages/dd-trace/src/constants.js +6 -3
  57. package/packages/dd-trace/src/exporters/agent/request.js +8 -0
  58. package/packages/dd-trace/src/format.js +26 -39
  59. package/packages/dd-trace/src/instrumenter.js +6 -1
  60. package/packages/dd-trace/src/log.js +6 -15
  61. package/packages/dd-trace/src/noop/span_context.js +0 -1
  62. package/packages/dd-trace/src/noop/tracer.js +0 -6
  63. package/packages/dd-trace/src/opentracing/propagation/text_map.js +79 -46
  64. package/packages/dd-trace/src/opentracing/span.js +2 -7
  65. package/packages/dd-trace/src/opentracing/span_context.js +2 -4
  66. package/packages/dd-trace/src/opentracing/tracer.js +5 -23
  67. package/packages/dd-trace/src/plugin_manager.js +65 -0
  68. package/packages/dd-trace/src/plugins/index.js +1 -5
  69. package/packages/dd-trace/src/plugins/plugin.js +63 -0
  70. package/packages/dd-trace/src/plugins/util/ci.js +13 -4
  71. package/packages/dd-trace/src/plugins/util/redis.js +0 -2
  72. package/packages/dd-trace/src/plugins/util/test.js +9 -4
  73. package/packages/dd-trace/src/plugins/util/user-provided-git.js +17 -2
  74. package/packages/dd-trace/src/plugins/util/web.js +6 -16
  75. package/packages/dd-trace/src/priority_sampler.js +71 -19
  76. package/packages/dd-trace/src/profiling/exporters/agent.js +35 -34
  77. package/packages/dd-trace/src/proxy.js +39 -35
  78. package/packages/dd-trace/src/ritm.js +40 -16
  79. package/packages/dd-trace/src/span_processor.js +0 -7
  80. package/packages/dd-trace/src/tracer.js +5 -6
  81. package/scripts/install_plugin_modules.js +30 -1
  82. package/packages/datadog-plugin-bluebird/src/index.js +0 -69
  83. package/packages/datadog-plugin-promise/src/index.js +0 -17
  84. package/packages/datadog-plugin-promise-js/src/index.js +0 -20
  85. package/packages/datadog-plugin-q/src/index.js +0 -16
  86. package/packages/datadog-plugin-when/src/index.js +0 -17
  87. package/packages/dd-trace/src/gateway/channels.js +0 -8
  88. package/packages/dd-trace/src/gateway/dc_block.js +0 -68
  89. package/packages/dd-trace/src/plugins/util/ci-app-spec.json +0 -36
  90. package/packages/dd-trace/src/plugins/util/promise.js +0 -31
  91. package/packages/dd-trace/src/scope/noop/scope_manager.js +0 -28
@@ -0,0 +1,67 @@
1
+ 'use strict'
2
+
3
+ const {
4
+ channel,
5
+ addHook,
6
+ AsyncResource
7
+ } = require('./helpers/instrument')
8
+ const shimmer = require('../../datadog-shimmer')
9
+
10
+ addHook({ name: 'mysql', file: 'lib/Connection.js', versions: ['>=2'] }, Connection => {
11
+ const startCh = channel('apm:mysql:query:start')
12
+ const asyncEndCh = channel('apm:mysql:query:async-end')
13
+ const endCh = channel('apm:mysql:query:end')
14
+ const errorCh = channel('apm:mysql:query:error')
15
+
16
+ shimmer.wrap(Connection.prototype, 'query', query => function () {
17
+ const asyncResource = new AsyncResource('bound-anonymous-fn')
18
+ if (!startCh.hasSubscribers) {
19
+ return query.apply(this, arguments)
20
+ }
21
+
22
+ const sql = arguments[0].sql ? arguments[0].sql : arguments[0]
23
+ const startArgs = [sql, this.config]
24
+
25
+ startCh.publish(startArgs)
26
+
27
+ try {
28
+ const res = query.apply(this, arguments)
29
+
30
+ if (res._callback) {
31
+ const cb = asyncResource.bind(res._callback)
32
+ res._callback = AsyncResource.bind(function (error, result) {
33
+ if (error) {
34
+ errorCh.publish(error)
35
+ }
36
+ asyncEndCh.publish(result)
37
+
38
+ return cb.apply(this, arguments)
39
+ })
40
+ } else {
41
+ const cb = AsyncResource.bind(function () {
42
+ asyncEndCh.publish(undefined)
43
+ })
44
+ res.on('end', cb)
45
+ }
46
+
47
+ return res
48
+ } catch (err) {
49
+ err.stack // trigger getting the stack at the original throwing point
50
+ errorCh.publish(err)
51
+
52
+ throw err
53
+ } finally {
54
+ endCh.publish(undefined)
55
+ }
56
+ })
57
+
58
+ return Connection
59
+ })
60
+
61
+ addHook({ name: 'mysql', file: 'lib/Pool.js', versions: ['>=2'] }, Pool => {
62
+ shimmer.wrap(Pool.prototype, 'getConnection', getConnection => function (cb) {
63
+ arguments[0] = AsyncResource.bind(cb)
64
+ return getConnection.apply(this, arguments)
65
+ })
66
+ return Pool
67
+ })
@@ -0,0 +1,15 @@
1
+ 'use strict'
2
+
3
+ const { addHook } = require('./helpers/instrument')
4
+ const { wrapThen } = require('./helpers/promise')
5
+ const shimmer = require('../../datadog-shimmer')
6
+
7
+ addHook({
8
+ name: 'promise-js',
9
+ versions: ['>=0.0.3']
10
+ }, Promise => {
11
+ if (Promise !== global.Promise) {
12
+ shimmer.wrap(Promise.prototype, 'then', wrapThen)
13
+ }
14
+ return Promise
15
+ })
@@ -0,0 +1,14 @@
1
+ 'use strict'
2
+
3
+ const { addHook } = require('./helpers/instrument')
4
+ const { wrapThen } = require('./helpers/promise')
5
+ const shimmer = require('../../datadog-shimmer')
6
+
7
+ addHook({
8
+ name: 'promise',
9
+ file: 'lib/core.js',
10
+ versions: ['>=7']
11
+ }, Promise => {
12
+ shimmer.wrap(Promise.prototype, 'then', wrapThen)
13
+ return Promise
14
+ })
@@ -0,0 +1,13 @@
1
+ 'use strict'
2
+
3
+ const { addHook } = require('./helpers/instrument')
4
+ const { wrapThen } = require('./helpers/promise')
5
+ const shimmer = require('../../datadog-shimmer')
6
+
7
+ addHook({
8
+ name: 'q',
9
+ versions: ['>=1']
10
+ }, Q => {
11
+ shimmer.wrap(Q.makePromise.prototype, 'then', wrapThen)
12
+ return Q
13
+ })
@@ -0,0 +1,14 @@
1
+ 'use strict'
2
+
3
+ const { addHook } = require('./helpers/instrument')
4
+ const { wrapThen } = require('./helpers/promise')
5
+ const shimmer = require('../../datadog-shimmer')
6
+
7
+ addHook({
8
+ name: 'when',
9
+ file: 'lib/Promise.js',
10
+ versions: ['>=3']
11
+ }, Promise => {
12
+ shimmer.wrap(Promise.prototype, 'then', wrapThen)
13
+ return Promise
14
+ })
@@ -103,8 +103,8 @@ module.exports = [
103
103
  name: '@cucumber/cucumber',
104
104
  versions: ['7.0.0 - 7.2.1'],
105
105
  file: 'lib/runtime/pickle_runner.js',
106
- patch (PickleRunner, tracer) {
107
- const testEnvironmentMetadata = getTestEnvironmentMetadata('cucumber')
106
+ patch (PickleRunner, tracer, config) {
107
+ const testEnvironmentMetadata = getTestEnvironmentMetadata('cucumber', config)
108
108
  const sourceRoot = process.cwd()
109
109
  const pl = PickleRunner.default
110
110
  this.wrap(
@@ -127,8 +127,8 @@ module.exports = [
127
127
  name: '@cucumber/cucumber',
128
128
  versions: ['>=7.3.0'],
129
129
  file: 'lib/runtime/test_case_runner.js',
130
- patch (TestCaseRunner, tracer) {
131
- const testEnvironmentMetadata = getTestEnvironmentMetadata('cucumber')
130
+ patch (TestCaseRunner, tracer, config) {
131
+ const testEnvironmentMetadata = getTestEnvironmentMetadata('cucumber', config)
132
132
  const sourceRoot = process.cwd()
133
133
  const pl = TestCaseRunner.default
134
134
  this.wrap(
@@ -4,6 +4,7 @@ const {
4
4
  TEST_SUITE,
5
5
  TEST_STATUS,
6
6
  TEST_FRAMEWORK_VERSION,
7
+ TEST_IS_RUM_ACTIVE,
7
8
  getTestEnvironmentMetadata,
8
9
  CI_APP_ORIGIN,
9
10
  getTestParentSpan
@@ -66,19 +67,28 @@ module.exports = (on, config) => {
66
67
  }
67
68
  })
68
69
  }
69
- return null
70
+ return activeSpan ? activeSpan._spanContext._traceId.toString(10) : null
70
71
  },
71
72
  'dd:afterEach': (test) => {
72
- const { state, error } = test
73
+ const { state, error, isRUMActive } = test
73
74
  if (activeSpan) {
74
75
  activeSpan.setTag(TEST_STATUS, CYPRESS_STATUS_TO_TEST_STATUS[state])
75
76
  if (error) {
76
77
  activeSpan.setTag('error', error)
77
78
  }
79
+ if (isRUMActive) {
80
+ activeSpan.setTag(TEST_IS_RUM_ACTIVE, 'true')
81
+ }
78
82
  activeSpan.finish()
79
83
  }
80
84
  activeSpan = null
81
85
  return null
86
+ },
87
+ 'dd:addTags': (tags) => {
88
+ if (activeSpan) {
89
+ activeSpan.addTags(tags)
90
+ }
91
+ return null
82
92
  }
83
93
  })
84
94
  }
@@ -3,15 +3,30 @@ beforeEach(() => {
3
3
  cy.task('dd:beforeEach', {
4
4
  testName: Cypress.mocha.getRunner().suite.ctx.currentTest.fullTitle(),
5
5
  testSuite: Cypress.mocha.getRootSuite().file
6
+ }).then(traceId => {
7
+ Cypress.env('traceId', traceId)
6
8
  })
7
9
  })
8
10
 
11
+ after(() => {
12
+ cy.window().then(win => {
13
+ win.dispatchEvent(new Event('beforeunload'))
14
+ })
15
+ })
16
+
17
+
9
18
  afterEach(() => {
10
- const currentTest = Cypress.mocha.getRunner().suite.ctx.currentTest
11
- cy.task('dd:afterEach', {
12
- testName: currentTest.fullTitle(),
13
- testSuite: Cypress.mocha.getRootSuite().file,
14
- state: currentTest.state,
15
- error: currentTest.err
19
+ cy.window().then(win => {
20
+ const currentTest = Cypress.mocha.getRunner().suite.ctx.currentTest
21
+ const testInfo = {
22
+ testName: currentTest.fullTitle(),
23
+ testSuite: Cypress.mocha.getRootSuite().file,
24
+ state: currentTest.state,
25
+ error: currentTest.err,
26
+ }
27
+ if (win.DD_RUM) {
28
+ testInfo.isRUMActive = true
29
+ }
30
+ cy.task('dd:afterEach', testInfo)
16
31
  })
17
32
  })
@@ -1,201 +1,88 @@
1
1
  'use strict'
2
2
 
3
3
  const analyticsSampler = require('../../dd-trace/src/analytics_sampler')
4
- const tx = require('../../dd-trace/src/plugins/util/tx')
4
+ const Plugin = require('../../dd-trace/src/plugins/plugin')
5
+ const { storage } = require('../../datadog-core')
5
6
 
6
- const rrtypes = {
7
- resolveAny: 'ANY',
8
- resolve4: 'A',
9
- resolve6: 'AAAA',
10
- resolveCname: 'CNAME',
11
- resolveMx: 'MX',
12
- resolveNs: 'NS',
13
- resolveTxt: 'TXT',
14
- resolveSrv: 'SRV',
15
- resolvePtr: 'PTR',
16
- resolveNaptr: 'NAPTR',
17
- resolveSoa: 'SOA'
18
- }
19
-
20
- function createWrapLookup (tracer, config) {
21
- return function wrapLookup (lookup) {
22
- return function lookupWithTrace (hostname, options, callback) {
23
- if (!isArgsValid(arguments, 2)) return lookup.apply(this, arguments)
24
-
25
- const span = startSpan(tracer, config, 'dns.lookup', {
26
- 'resource.name': hostname,
27
- 'dns.hostname': hostname
28
- })
29
-
30
- wrapArgs(span, arguments, (e, address) => {
31
- span.setTag('dns.address', address)
32
- })
33
-
34
- return tracer.scope().activate(span, () => lookup.apply(this, arguments))
35
- }
7
+ class DNSPlugin extends Plugin {
8
+ static get name () {
9
+ return 'dns'
36
10
  }
37
- }
38
-
39
- function createWrapLookupService (tracer, config) {
40
- return function wrapLookupService (lookupService) {
41
- return function lookupServiceWithTrace (address, port, callback) {
42
- if (!isArgsValid(arguments, 3)) return lookupService.apply(this, arguments)
43
-
44
- const span = startSpan(tracer, config, 'dns.lookup_service', {
45
- 'resource.name': `${address}:${port}`,
46
- 'dns.address': address,
47
- 'dns.port': port
48
- })
49
11
 
50
- wrapArgs(span, arguments)
51
-
52
- return tracer.scope().activate(span, () => lookupService.apply(this, arguments))
53
- }
12
+ addSubs (func, start, asyncEnd = defaultAsyncEnd) {
13
+ this.addSub(`apm:dns:${func}:start`, start)
14
+ this.addSub(`apm:dns:${func}:end`, this.exit.bind(this))
15
+ this.addSub(`apm:dns:${func}:error`, errorHandler)
16
+ this.addSub(`apm:dns:${func}:async-end`, asyncEnd)
54
17
  }
55
- }
56
-
57
- function createWrapResolve (tracer, config) {
58
- return function wrapResolve (resolve) {
59
- return function resolveWithTrace (hostname, rrtype, callback) {
60
- if (!isArgsValid(arguments, 2)) return resolve.apply(this, arguments)
61
-
62
- if (typeof rrtype !== 'string') {
63
- rrtype = 'A'
64
- }
65
-
66
- const span = wrapResolver(tracer, config, rrtype, arguments)
67
18
 
68
- return tracer.scope().activate(span, () => resolve.apply(this, arguments))
19
+ startSpan (name, customTags, store) {
20
+ const tags = {
21
+ 'service.name': this.config.service || this.tracer._service,
22
+ 'span.kind': 'client'
69
23
  }
70
- }
71
- }
72
-
73
- function createWrapResolver (tracer, config, rrtype) {
74
- return function wrapResolve (resolve) {
75
- return function resolveWithTrace (hostname, callback) {
76
- if (!isArgsValid(arguments, 2)) return resolve.apply(this, arguments)
77
-
78
- const span = wrapResolver(tracer, config, rrtype, arguments)
79
-
80
- return tracer.scope().activate(span, () => resolve.apply(this, arguments))
81
- }
82
- }
83
- }
84
-
85
- function createWrapReverse (tracer, config) {
86
- return function wrapReverse (reverse) {
87
- return function reverseWithTrace (ip, callback) {
88
- if (!isArgsValid(arguments, 2)) return reverse.apply(this, arguments)
89
-
90
- const span = startSpan(tracer, config, 'dns.reverse', {
91
- 'resource.name': ip,
92
- 'dns.ip': ip
93
- })
94
-
95
- wrapArgs(span, arguments)
96
-
97
- return tracer.scope().activate(span, () => reverse.apply(this, arguments))
24
+ for (const tag in customTags) {
25
+ tags[tag] = customTags[tag]
98
26
  }
27
+ const span = this.tracer.startSpan(name, {
28
+ childOf: store ? store.span : null,
29
+ tags
30
+ })
31
+ analyticsSampler.sample(span, this.config.measured)
32
+ return span
99
33
  }
100
- }
101
-
102
- function startSpan (tracer, config, operation, tags) {
103
- const childOf = tracer.scope().active()
104
- const span = tracer.startSpan(operation, {
105
- childOf,
106
- tags: Object.assign({
107
- 'service.name': config.service || tracer._service,
108
- 'span.kind': 'client'
109
- }, tags)
110
- })
111
-
112
- analyticsSampler.sample(span, config.measured)
113
34
 
114
- return span
115
- }
35
+ constructor (...args) {
36
+ super(...args)
116
37
 
117
- function isArgsValid (args, minLength) {
118
- if (args.length < minLength) return false
119
- if (typeof args[args.length - 1] !== 'function') return false
38
+ this.addSubs('lookup', ([hostname]) => {
39
+ const store = storage.getStore()
40
+ const span = this.startSpan('dns.lookup', {
41
+ 'resource.name': hostname,
42
+ 'dns.hostname': hostname
43
+ }, store)
44
+ this.enter(span, store)
45
+ }, (result) => {
46
+ const { span } = storage.getStore()
47
+ span.setTag('dns.address', result)
48
+ span.finish()
49
+ })
120
50
 
121
- return true
122
- }
51
+ this.addSubs('lookup_service', ([address, port]) => {
52
+ const store = storage.getStore()
53
+ const span = this.startSpan('dns.lookup_service', {
54
+ 'resource.name': `${address}:${port}`,
55
+ 'dns.address': address,
56
+ 'dns.port': port
57
+ }, store)
58
+ this.enter(span, store)
59
+ })
123
60
 
124
- function wrapArgs (span, args, callback) {
125
- const original = args[args.length - 1]
126
- const fn = tx.wrap(span, original)
61
+ this.addSubs('resolve', ([hostname, maybeType]) => {
62
+ const store = storage.getStore()
63
+ const rrtype = typeof maybeType === 'string' ? maybeType : 'A'
64
+ const span = this.startSpan('dns.resolve', {
65
+ 'resource.name': `${rrtype} ${hostname}`,
66
+ 'dns.hostname': hostname,
67
+ 'dns.rrtype': rrtype
68
+ }, store)
69
+ this.enter(span, store)
70
+ })
127
71
 
128
- args[args.length - 1] = function () {
129
- callback && callback.apply(null, arguments)
130
- return fn.apply(this, arguments)
72
+ this.addSubs('reverse', ([ip]) => {
73
+ const store = storage.getStore()
74
+ const span = this.startSpan('dns.reverse', { 'resource.name': ip, 'dns.ip': ip }, store)
75
+ this.enter(span, store)
76
+ })
131
77
  }
132
78
  }
133
79
 
134
- function wrapResolver (tracer, config, rrtype, args) {
135
- const hostname = args[0]
136
- const span = startSpan(tracer, config, 'dns.resolve', {
137
- 'resource.name': `${rrtype} ${hostname}`,
138
- 'dns.hostname': hostname,
139
- 'dns.rrtype': rrtype
140
- })
141
-
142
- wrapArgs(span, args)
143
-
144
- return span
145
- }
146
-
147
- function patchResolveShorthands (tracer, config, shim, prototype) {
148
- Object.keys(rrtypes)
149
- .filter(method => !!prototype[method])
150
- .forEach(method => {
151
- shim.wrap(prototype, method, createWrapResolver(tracer, config, rrtypes[method]))
152
- })
80
+ function defaultAsyncEnd () {
81
+ storage.getStore().span.finish()
153
82
  }
154
83
 
155
- function unpatchResolveShorthands (shim, prototype) {
156
- Object.keys(rrtypes)
157
- .filter(method => !!prototype[method])
158
- .forEach(method => {
159
- shim.unwrap(prototype, method)
160
- })
84
+ function errorHandler (error) {
85
+ storage.getStore().span.setTag('error', error)
161
86
  }
162
87
 
163
- module.exports = [
164
- {
165
- name: 'dns',
166
- patch (dns, tracer, config) {
167
- this.wrap(dns, 'lookup', createWrapLookup(tracer, config))
168
- this.wrap(dns, 'lookupService', createWrapLookupService(tracer, config))
169
- this.wrap(dns, 'resolve', createWrapResolve(tracer, config))
170
- this.wrap(dns, 'reverse', createWrapReverse(tracer, config))
171
-
172
- patchResolveShorthands(tracer, config, this, dns)
173
-
174
- if (dns.Resolver) {
175
- this.wrap(dns.Resolver.prototype, 'resolve', createWrapResolve(tracer, config))
176
- this.wrap(dns.Resolver.prototype, 'reverse', createWrapReverse(tracer, config))
177
-
178
- patchResolveShorthands(tracer, config, this, dns.Resolver.prototype)
179
- }
180
- },
181
- unpatch (dns) {
182
- this.unwrap(dns, [
183
- 'lookup',
184
- 'lookupService',
185
- 'resolve',
186
- 'reverse'
187
- ])
188
-
189
- unpatchResolveShorthands(this, dns)
190
-
191
- if (dns.Resolver) {
192
- this.unwrap(dns.prototype.Resolver, [
193
- 'resolve',
194
- 'reverse'
195
- ])
196
-
197
- unpatchResolveShorthands(this, dns.Resolver.prototype)
198
- }
199
- }
200
- }
201
- ]
88
+ module.exports = DNSPlugin
@@ -1,5 +1,7 @@
1
1
  'use strict'
2
2
 
3
+ const { storage } = require('../../datadog-core')
4
+
3
5
  let kDirReadPromisified
4
6
  let kDirClosePromisified
5
7
  let kHandle
@@ -52,7 +54,7 @@ const orphanable = false
52
54
  function createWrapCreateReadStream (config, tracer) {
53
55
  return function wrapCreateReadStream (createReadStream) {
54
56
  return function createReadStreamWithTrace (path, options) {
55
- if (!hasParent(tracer)) {
57
+ if (!hasParent()) {
56
58
  return createReadStream.apply(this, arguments)
57
59
  }
58
60
  const tags = makeFSFlagTags('ReadStream', path, options, 'r', config, tracer)
@@ -282,8 +284,10 @@ function getSymbolName (sym) {
282
284
  return sym.description || sym.toString()
283
285
  }
284
286
 
285
- function hasParent (tracer) {
286
- return !!tracer.scope().active()
287
+ function hasParent () {
288
+ const store = storage.getStore()
289
+
290
+ return store && store.span && !store.noop
287
291
  }
288
292
 
289
293
  function createWrapCb (tracer, config, name, tagMaker) {
@@ -1,16 +1,13 @@
1
1
  'use strict'
2
2
 
3
3
  const url = require('url')
4
- const opentracing = require('opentracing')
5
4
  const log = require('../../dd-trace/src/log')
6
- const constants = require('../../dd-trace/src/constants')
7
5
  const tags = require('../../../ext/tags')
8
6
  const kinds = require('../../../ext/kinds')
9
7
  const formats = require('../../../ext/formats')
10
8
  const urlFilter = require('../../dd-trace/src/plugins/util/urlfilter')
11
9
  const analyticsSampler = require('../../dd-trace/src/analytics_sampler')
12
-
13
- const Reference = opentracing.Reference
10
+ const { storage } = require('../../datadog-core')
14
11
 
15
12
  const HTTP_HEADERS = formats.HTTP_HEADERS
16
13
  const HTTP_STATUS_CODE = tags.HTTP_STATUS_CODE
@@ -18,8 +15,6 @@ const HTTP_REQUEST_HEADERS = tags.HTTP_REQUEST_HEADERS
18
15
  const HTTP_RESPONSE_HEADERS = tags.HTTP_RESPONSE_HEADERS
19
16
  const SPAN_KIND = tags.SPAN_KIND
20
17
  const CLIENT = kinds.CLIENT
21
- const REFERENCE_CHILD_OF = opentracing.REFERENCE_CHILD_OF
22
- const REFERENCE_NOOP = constants.REFERENCE_NOOP
23
18
 
24
19
  function patch (http, methodName, tracer, config) {
25
20
  config = normalizeConfig(tracer, config)
@@ -27,6 +22,10 @@ function patch (http, methodName, tracer, config) {
27
22
 
28
23
  function makeRequestTrace (request) {
29
24
  return function requestTrace () {
25
+ const store = storage.getStore()
26
+
27
+ if (store && store.noop) return request.apply(this, arguments)
28
+
30
29
  let args
31
30
 
32
31
  try {
@@ -50,11 +49,8 @@ function patch (http, methodName, tracer, config) {
50
49
 
51
50
  const scope = tracer.scope()
52
51
  const childOf = scope.active()
53
- const type = config.filter(uri) ? REFERENCE_CHILD_OF : REFERENCE_NOOP
54
52
  const span = tracer.startSpan('http.request', {
55
- references: [
56
- new Reference(type, childOf)
57
- ],
53
+ childOf,
58
54
  tags: {
59
55
  [SPAN_KIND]: CLIENT,
60
56
  'service.name': getServiceName(tracer, config, options),
@@ -286,35 +282,24 @@ function getStatusValidator (config) {
286
282
  return code => code < 400 || code >= 500
287
283
  }
288
284
 
289
- function getFilter (tracer, config) {
290
- const blocklist = tracer._url ? [getAgentFilter(tracer._url)] : []
291
-
285
+ function getFilter (config) {
292
286
  config = Object.assign({}, config, {
293
- blocklist: blocklist.concat(config.blocklist || [])
287
+ blocklist: config.blocklist || []
294
288
  })
295
289
 
296
290
  return urlFilter.getFilter(config)
297
291
  }
298
292
 
299
- function getAgentFilter (url) {
300
- // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
301
- const agentFilter = url.href.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
302
-
303
- return RegExp(`^${agentFilter}.*$`, 'i')
304
- }
305
-
306
293
  function normalizeConfig (tracer, config) {
307
294
  config = config.client || config
308
295
 
309
296
  const validateStatus = getStatusValidator(config)
310
- const filter = getFilter(tracer, config)
311
- const propagationFilter = getFilter(tracer, { blocklist: config.propagationBlocklist })
297
+ const propagationFilter = getFilter({ blocklist: config.propagationBlocklist })
312
298
  const headers = getHeaders(config)
313
299
  const hooks = getHooks(config)
314
300
 
315
301
  return Object.assign({}, config, {
316
302
  validateStatus,
317
- filter,
318
303
  propagationFilter,
319
304
  headers,
320
305
  hooks
@@ -2,6 +2,7 @@
2
2
 
3
3
  const web = require('../../dd-trace/src/plugins/util/web')
4
4
  const Scope = require('../../dd-trace/src/scope')
5
+ const { incomingHttpRequestStart } = require('../../dd-trace/src/appsec/gateway/channels')
5
6
 
6
7
  function createWrapEmit (tracer, config) {
7
8
  config = web.normalizeConfig(config)
@@ -10,6 +11,10 @@ function createWrapEmit (tracer, config) {
10
11
  return function emitWithTrace (eventName, req, res) {
11
12
  if (eventName === 'request') {
12
13
  return web.instrument(tracer, config, req, res, 'http.request', () => {
14
+ if (incomingHttpRequestStart.hasSubscribers) {
15
+ incomingHttpRequestStart.publish({ req, res })
16
+ }
17
+
13
18
  return emit.apply(this, arguments)
14
19
  })
15
20
  }