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.
- package/MIGRATING.md +65 -0
- package/NOTICE +4 -0
- package/ci/cypress/plugin.js +3 -0
- package/ci/cypress/support.js +1 -0
- package/ci/init.js +13 -0
- package/ci/jest/env.js +14 -0
- package/index.d.ts +35 -48
- package/package.json +7 -4
- package/packages/datadog-instrumentations/index.js +10 -0
- package/packages/datadog-instrumentations/src/bluebird.js +26 -0
- package/packages/datadog-instrumentations/src/dns.js +94 -0
- package/packages/datadog-instrumentations/src/helpers/instrument.js +120 -0
- package/packages/datadog-instrumentations/src/helpers/promise.js +29 -0
- package/packages/datadog-instrumentations/src/memcached.js +53 -0
- package/packages/datadog-instrumentations/src/mysql.js +67 -0
- package/packages/datadog-instrumentations/src/promise-js.js +15 -0
- package/packages/datadog-instrumentations/src/promise.js +14 -0
- package/packages/datadog-instrumentations/src/q.js +13 -0
- package/packages/datadog-instrumentations/src/when.js +14 -0
- package/packages/datadog-plugin-cucumber/src/index.js +4 -4
- package/packages/datadog-plugin-cypress/src/plugin.js +12 -2
- package/packages/datadog-plugin-cypress/src/support.js +21 -6
- package/packages/datadog-plugin-dns/src/index.js +65 -178
- package/packages/datadog-plugin-fs/src/index.js +7 -3
- package/packages/datadog-plugin-http/src/client.js +9 -24
- package/packages/datadog-plugin-http/src/server.js +5 -0
- package/packages/datadog-plugin-http2/src/client.js +1 -24
- package/packages/datadog-plugin-http2/src/server.js +2 -2
- package/packages/datadog-plugin-jest/src/jest-environment.js +4 -4
- package/packages/datadog-plugin-jest/src/jest-jasmine2.js +2 -2
- package/packages/datadog-plugin-knex/src/index.js +3 -3
- package/packages/datadog-plugin-memcached/src/index.js +41 -63
- package/packages/datadog-plugin-mocha/src/index.js +3 -2
- package/packages/datadog-plugin-moleculer/src/client.js +60 -0
- package/packages/datadog-plugin-moleculer/src/index.js +8 -0
- package/packages/datadog-plugin-moleculer/src/server.js +61 -0
- package/packages/datadog-plugin-moleculer/src/util.js +21 -0
- package/packages/datadog-plugin-mongoose/src/index.js +2 -2
- package/packages/datadog-plugin-mysql/src/index.js +37 -89
- package/packages/datadog-plugin-net/src/index.js +5 -0
- package/packages/datadog-plugin-pino/src/index.js +25 -1
- package/packages/datadog-plugin-redis/src/index.js +31 -1
- package/packages/datadog-plugin-router/src/index.js +28 -3
- package/packages/dd-trace/lib/version.js +1 -1
- package/packages/dd-trace/src/appsec/addresses.js +11 -4
- package/packages/dd-trace/src/appsec/callbacks/ddwaf.js +5 -8
- package/packages/dd-trace/src/{gateway → appsec/gateway}/als.js +1 -0
- package/packages/dd-trace/src/appsec/gateway/channels.js +11 -0
- package/packages/dd-trace/src/{gateway → appsec/gateway}/engine/engine.js +20 -30
- package/packages/dd-trace/src/{gateway → appsec/gateway}/engine/index.js +0 -0
- package/packages/dd-trace/src/{gateway → appsec/gateway}/engine/runner.js +2 -0
- package/packages/dd-trace/src/appsec/index.js +54 -38
- package/packages/dd-trace/src/appsec/recommended.json +1 -1
- package/packages/dd-trace/src/appsec/reporter.js +27 -10
- package/packages/dd-trace/src/config.js +31 -27
- package/packages/dd-trace/src/constants.js +6 -3
- package/packages/dd-trace/src/exporters/agent/request.js +8 -0
- package/packages/dd-trace/src/format.js +26 -39
- package/packages/dd-trace/src/instrumenter.js +6 -1
- package/packages/dd-trace/src/log.js +6 -15
- package/packages/dd-trace/src/noop/span_context.js +0 -1
- package/packages/dd-trace/src/noop/tracer.js +0 -6
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +79 -46
- package/packages/dd-trace/src/opentracing/span.js +2 -7
- package/packages/dd-trace/src/opentracing/span_context.js +2 -4
- package/packages/dd-trace/src/opentracing/tracer.js +5 -23
- package/packages/dd-trace/src/plugin_manager.js +65 -0
- package/packages/dd-trace/src/plugins/index.js +1 -5
- package/packages/dd-trace/src/plugins/plugin.js +63 -0
- package/packages/dd-trace/src/plugins/util/ci.js +13 -4
- package/packages/dd-trace/src/plugins/util/redis.js +0 -2
- package/packages/dd-trace/src/plugins/util/test.js +9 -4
- package/packages/dd-trace/src/plugins/util/user-provided-git.js +17 -2
- package/packages/dd-trace/src/plugins/util/web.js +6 -16
- package/packages/dd-trace/src/priority_sampler.js +71 -19
- package/packages/dd-trace/src/profiling/exporters/agent.js +35 -34
- package/packages/dd-trace/src/proxy.js +39 -35
- package/packages/dd-trace/src/ritm.js +40 -16
- package/packages/dd-trace/src/span_processor.js +0 -7
- package/packages/dd-trace/src/tracer.js +5 -6
- package/scripts/install_plugin_modules.js +30 -1
- package/packages/datadog-plugin-bluebird/src/index.js +0 -69
- package/packages/datadog-plugin-promise/src/index.js +0 -17
- package/packages/datadog-plugin-promise-js/src/index.js +0 -20
- package/packages/datadog-plugin-q/src/index.js +0 -16
- package/packages/datadog-plugin-when/src/index.js +0 -17
- package/packages/dd-trace/src/gateway/channels.js +0 -8
- package/packages/dd-trace/src/gateway/dc_block.js +0 -68
- package/packages/dd-trace/src/plugins/util/ci-app-spec.json +0 -36
- package/packages/dd-trace/src/plugins/util/promise.js +0 -31
- 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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
|
4
|
+
const Plugin = require('../../dd-trace/src/plugins/plugin')
|
|
5
|
+
const { storage } = require('../../datadog-core')
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
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
|
-
|
|
115
|
-
|
|
35
|
+
constructor (...args) {
|
|
36
|
+
super(...args)
|
|
116
37
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
-
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
|
135
|
-
|
|
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
|
|
156
|
-
|
|
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(
|
|
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 (
|
|
286
|
-
|
|
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
|
-
|
|
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 (
|
|
290
|
-
const blocklist = tracer._url ? [getAgentFilter(tracer._url)] : []
|
|
291
|
-
|
|
285
|
+
function getFilter (config) {
|
|
292
286
|
config = Object.assign({}, config, {
|
|
293
|
-
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
|
|
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
|
}
|