dd-trace 2.0.0-appsec-beta.4 → 2.0.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/MIGRATING.md +65 -0
- package/ci/init.js +5 -1
- package/ci/jest/env.js +5 -1
- package/index.d.ts +31 -44
- package/package.json +5 -2
- package/packages/datadog-instrumentations/index.js +6 -0
- package/packages/datadog-instrumentations/src/bluebird.js +26 -0
- package/packages/datadog-instrumentations/src/dns.js +2 -2
- package/packages/datadog-instrumentations/src/helpers/instrument.js +24 -25
- package/packages/datadog-instrumentations/src/helpers/promise.js +29 -0
- package/packages/datadog-instrumentations/src/memcached.js +3 -5
- 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 +21 -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 +1 -1
- package/packages/datadog-plugin-fs/src/index.js +7 -3
- package/packages/datadog-plugin-http/src/client.js +9 -24
- 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-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-router/src/index.js +28 -3
- package/packages/datadog-plugin-winston/src/index.js +30 -12
- 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 +4 -7
- package/packages/dd-trace/src/appsec/gateway/als.js +1 -0
- package/packages/dd-trace/src/appsec/gateway/channels.js +3 -0
- package/packages/dd-trace/src/appsec/gateway/engine/engine.js +20 -30
- package/packages/dd-trace/src/appsec/gateway/engine/runner.js +2 -0
- package/packages/dd-trace/src/appsec/index.js +41 -25
- package/packages/dd-trace/src/appsec/recommended.json +5708 -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 +0 -2
- package/packages/dd-trace/src/exporters/agent/request.js +8 -0
- package/packages/dd-trace/src/format.js +14 -39
- 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 +46 -47
- package/packages/dd-trace/src/opentracing/span.js +2 -7
- package/packages/dd-trace/src/opentracing/span_context.js +0 -3
- package/packages/dd-trace/src/opentracing/tracer.js +5 -23
- package/packages/dd-trace/src/plugins/index.js +1 -5
- package/packages/dd-trace/src/plugins/plugin.js +7 -1
- package/packages/dd-trace/src/plugins/util/test.js +9 -4
- package/packages/dd-trace/src/plugins/util/web.js +3 -3
- package/packages/dd-trace/src/profiling/config.js +5 -1
- package/packages/dd-trace/src/profiling/exporters/agent.js +33 -32
- package/packages/dd-trace/src/profiling/profiler.js +15 -6
- package/packages/dd-trace/src/profiling/profilers/cpu.js +1 -1
- package/packages/dd-trace/src/profiling/profilers/heap.js +3 -2
- package/packages/dd-trace/src/proxy.js +35 -35
- 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 +7 -0
- package/scripts/publish_docs.js +1 -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/appsec/gateway/dc_block.js +0 -68
- package/packages/dd-trace/src/plugins/util/promise.js +0 -31
- package/packages/dd-trace/src/profiling/mapper.js +0 -91
- package/packages/dd-trace/src/scope/noop/scope_manager.js +0 -28
|
@@ -100,7 +100,7 @@ module.exports = [
|
|
|
100
100
|
},
|
|
101
101
|
{
|
|
102
102
|
name: 'pino',
|
|
103
|
-
versions: ['>=5.14.0'],
|
|
103
|
+
versions: ['>=5.14.0 <6.8.0'],
|
|
104
104
|
patch (pino, tracer, config) {
|
|
105
105
|
if (!tracer._logInjection) return
|
|
106
106
|
|
|
@@ -112,6 +112,30 @@ module.exports = [
|
|
|
112
112
|
return this.unwrapExport(pino)
|
|
113
113
|
}
|
|
114
114
|
},
|
|
115
|
+
{
|
|
116
|
+
name: 'pino',
|
|
117
|
+
versions: ['>=6.8.0'],
|
|
118
|
+
patch (pino, tracer, config) {
|
|
119
|
+
if (!tracer._logInjection) return
|
|
120
|
+
|
|
121
|
+
const mixinSym = pino.symbols.mixinSym
|
|
122
|
+
|
|
123
|
+
const wrapped = this.wrapExport(pino, createWrapPino(tracer, config, mixinSym, createWrapMixin)(pino))
|
|
124
|
+
|
|
125
|
+
wrapped.pino = wrapped
|
|
126
|
+
wrapped.default = wrapped
|
|
127
|
+
|
|
128
|
+
return wrapped
|
|
129
|
+
},
|
|
130
|
+
unpatch (pino) {
|
|
131
|
+
const unwrapped = this.unwrapExport(pino)
|
|
132
|
+
|
|
133
|
+
unwrapped.pino = unwrapped
|
|
134
|
+
unwrapped.default = unwrapped
|
|
135
|
+
|
|
136
|
+
return unwrapped
|
|
137
|
+
}
|
|
138
|
+
},
|
|
115
139
|
{
|
|
116
140
|
name: 'pino-pretty',
|
|
117
141
|
versions: ['>=3'], // will only work starting from pino@5.0.0 as previous versions are not using pino-pretty
|
|
@@ -5,6 +5,9 @@ const pathToRegExp = require('path-to-regexp')
|
|
|
5
5
|
const shimmer = require('../../datadog-shimmer')
|
|
6
6
|
const web = require('../../dd-trace/src/plugins/util/web')
|
|
7
7
|
|
|
8
|
+
// TODO: clean this up to not use web util internals
|
|
9
|
+
// TODO: stop checking for fast star and fast slash
|
|
10
|
+
|
|
8
11
|
const regexpCache = Object.create(null)
|
|
9
12
|
|
|
10
13
|
function createWrapHandle (tracer, config) {
|
|
@@ -12,6 +15,19 @@ function createWrapHandle (tracer, config) {
|
|
|
12
15
|
return function handleWithTrace (req, res, done) {
|
|
13
16
|
web.patch(req)
|
|
14
17
|
|
|
18
|
+
if (!req._datadog.router) {
|
|
19
|
+
const context = {
|
|
20
|
+
route: '',
|
|
21
|
+
stack: []
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
web.beforeEnd(req, () => {
|
|
25
|
+
req._datadog.paths = [context.route]
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
req._datadog.router = context
|
|
29
|
+
}
|
|
30
|
+
|
|
15
31
|
return handle.apply(this, arguments)
|
|
16
32
|
}
|
|
17
33
|
}
|
|
@@ -82,8 +98,8 @@ function wrapNext (layer, req, next) {
|
|
|
82
98
|
const originalNext = next
|
|
83
99
|
|
|
84
100
|
return function (error) {
|
|
85
|
-
if (
|
|
86
|
-
|
|
101
|
+
if (layer.path && !isFastStar(layer) && !isFastSlash(layer)) {
|
|
102
|
+
req._datadog.router.stack.pop()
|
|
87
103
|
}
|
|
88
104
|
|
|
89
105
|
web.finish(req, error)
|
|
@@ -99,7 +115,16 @@ function callHandle (layer, handle, req, args) {
|
|
|
99
115
|
// Try to guess which path actually matched
|
|
100
116
|
for (let i = 0; i < matchers.length; i++) {
|
|
101
117
|
if (matchers[i].test(layer)) {
|
|
102
|
-
|
|
118
|
+
const context = req._datadog.router
|
|
119
|
+
|
|
120
|
+
context.stack.push(matchers[i].path)
|
|
121
|
+
|
|
122
|
+
const route = context.stack.join('')
|
|
123
|
+
|
|
124
|
+
// Longer route is more likely to be the actual route handler route.
|
|
125
|
+
if (route.length > context.route.length) {
|
|
126
|
+
context.route = route
|
|
127
|
+
}
|
|
103
128
|
|
|
104
129
|
break
|
|
105
130
|
}
|
|
@@ -2,18 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
const { LOG } = require('../../../ext/formats')
|
|
4
4
|
|
|
5
|
+
function chunkProxy (chunk, holder) {
|
|
6
|
+
return new Proxy(chunk, {
|
|
7
|
+
get (target, p, receiver) {
|
|
8
|
+
switch (p) {
|
|
9
|
+
case Symbol.toStringTag:
|
|
10
|
+
return Object.prototype.toString.call(target).slice(8, -1)
|
|
11
|
+
case 'dd':
|
|
12
|
+
return holder.dd
|
|
13
|
+
default:
|
|
14
|
+
return Reflect.get(target, p, receiver)
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
ownKeys (target) {
|
|
18
|
+
return ['dd', ...Reflect.ownKeys(target)]
|
|
19
|
+
},
|
|
20
|
+
getOwnPropertyDescriptor (target, p) {
|
|
21
|
+
return Reflect.getOwnPropertyDescriptor(p === 'dd' ? holder : target, p)
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
}
|
|
25
|
+
|
|
5
26
|
function createWrapWrite (tracer, config) {
|
|
6
27
|
return function wrapWrite (write) {
|
|
7
28
|
return function writeWithTrace (chunk, encoding, callback) {
|
|
8
29
|
const span = tracer.scope().active()
|
|
9
30
|
|
|
10
|
-
|
|
31
|
+
const holder = {}
|
|
32
|
+
tracer.inject(span, LOG, holder)
|
|
33
|
+
arguments[0] = chunkProxy(chunk, holder)
|
|
11
34
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
delete chunk.dd
|
|
15
|
-
|
|
16
|
-
return result
|
|
35
|
+
return write.apply(this, arguments)
|
|
17
36
|
}
|
|
18
37
|
}
|
|
19
38
|
}
|
|
@@ -42,15 +61,14 @@ function createWrapLog (tracer, config) {
|
|
|
42
61
|
return function logWithTrace (level, msg, meta, callback) {
|
|
43
62
|
const span = tracer.scope().active()
|
|
44
63
|
|
|
45
|
-
meta =
|
|
64
|
+
meta = meta || {}
|
|
46
65
|
|
|
47
|
-
|
|
66
|
+
const holder = {}
|
|
67
|
+
tracer.inject(span, LOG, holder)
|
|
48
68
|
|
|
49
|
-
|
|
69
|
+
arguments[2] = chunkProxy(meta, holder)
|
|
50
70
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return result
|
|
71
|
+
return log.apply(this, arguments)
|
|
54
72
|
}
|
|
55
73
|
}
|
|
56
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
module.exports = '2.0.
|
|
1
|
+
module.exports = '2.0.1'
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
module.exports = {
|
|
4
|
-
|
|
4
|
+
HTTP_INCOMING_BODY: 'server.request.body',
|
|
5
|
+
HTTP_INCOMING_QUERY: 'server.request.query',
|
|
5
6
|
HTTP_INCOMING_HEADERS: 'server.request.headers.no_cookies',
|
|
7
|
+
// TODO: 'server.request.trailers',
|
|
8
|
+
HTTP_INCOMING_URL: 'server.request.uri.raw',
|
|
6
9
|
HTTP_INCOMING_METHOD: 'server.request.method',
|
|
7
|
-
|
|
8
|
-
|
|
10
|
+
HTTP_INCOMING_ENDPOINT: 'server.request.framework_endpoint',
|
|
11
|
+
HTTP_INCOMING_PARAMS: 'server.request.path_params',
|
|
12
|
+
HTTP_INCOMING_COOKIES: 'server.request.cookies',
|
|
9
13
|
HTTP_INCOMING_RESPONSE_CODE: 'server.response.status',
|
|
10
|
-
HTTP_INCOMING_RESPONSE_HEADERS: 'server.response.headers.no_cookies'
|
|
14
|
+
HTTP_INCOMING_RESPONSE_HEADERS: 'server.response.headers.no_cookies',
|
|
15
|
+
// TODO: 'server.response.trailers',
|
|
16
|
+
HTTP_INCOMING_REMOTE_IP: 'server.request.client_ip',
|
|
17
|
+
HTTP_INCOMING_REMOTE_PORT: 'server.request.client_port'
|
|
11
18
|
}
|
|
@@ -5,8 +5,6 @@ const addresses = require('../addresses')
|
|
|
5
5
|
const Gateway = require('../gateway/engine')
|
|
6
6
|
const Reporter = require('../reporter')
|
|
7
7
|
|
|
8
|
-
let warned = false
|
|
9
|
-
|
|
10
8
|
const validAddressSet = new Set(Object.values(addresses))
|
|
11
9
|
|
|
12
10
|
const DEFAULT_MAX_BUDGET = 5e3 // µs
|
|
@@ -20,10 +18,7 @@ class WAFCallback {
|
|
|
20
18
|
|
|
21
19
|
return new DDWAF(rules)
|
|
22
20
|
} catch (err) {
|
|
23
|
-
|
|
24
|
-
log.warn('AppSec could not load native package. In-app WAF features will not be available.')
|
|
25
|
-
warned = true
|
|
26
|
-
}
|
|
21
|
+
log.error('AppSec could not load native package. In-app WAF features will not be available.')
|
|
27
22
|
|
|
28
23
|
throw err
|
|
29
24
|
}
|
|
@@ -90,7 +85,8 @@ class WAFCallback {
|
|
|
90
85
|
|
|
91
86
|
return this.applyResult(result, store)
|
|
92
87
|
} catch (err) {
|
|
93
|
-
log.
|
|
88
|
+
log.error('Error while running the AppSec WAF')
|
|
89
|
+
log.error(err)
|
|
94
90
|
}
|
|
95
91
|
}
|
|
96
92
|
|
|
@@ -99,6 +95,7 @@ class WAFCallback {
|
|
|
99
95
|
Reporter.reportAttack(result.data, store)
|
|
100
96
|
}
|
|
101
97
|
|
|
98
|
+
// TODO: use these values later for budget management
|
|
102
99
|
// result.perfData
|
|
103
100
|
// result.perfTotalRuntime
|
|
104
101
|
}
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
const dc = require('diagnostics_channel')
|
|
4
4
|
|
|
5
|
+
// TODO: use TBD naming convention
|
|
6
|
+
// or directly use http plugin's channels
|
|
7
|
+
// when it gets converted to new plugin system
|
|
5
8
|
module.exports = {
|
|
6
9
|
incomingHttpRequestStart: dc.channel('dd-trace:incomingHttpRequestStart'),
|
|
7
10
|
incomingHttpRequestEnd: dc.channel('dd-trace:incomingHttpRequestEnd')
|
|
@@ -43,10 +43,10 @@ class SubscriptionManager {
|
|
|
43
43
|
const knownSubscriptions = new Set()
|
|
44
44
|
|
|
45
45
|
// TODO: possible optimization: collect matchedSubscriptions on the fly in Context#setValue
|
|
46
|
-
|
|
47
|
-
const matchedSubscriptions = this.addressToSubscriptions.get(
|
|
46
|
+
newAddresses.forEach((newAddress) => {
|
|
47
|
+
const matchedSubscriptions = this.addressToSubscriptions.get(newAddress)
|
|
48
48
|
|
|
49
|
-
if (matchedSubscriptions === undefined)
|
|
49
|
+
if (matchedSubscriptions === undefined) return
|
|
50
50
|
|
|
51
51
|
for (let j = 0; j < matchedSubscriptions.length; ++j) {
|
|
52
52
|
const subscription = matchedSubscriptions[j]
|
|
@@ -64,24 +64,24 @@ class SubscriptionManager {
|
|
|
64
64
|
subscriptions.add(subscription)
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
-
}
|
|
67
|
+
})
|
|
68
68
|
|
|
69
69
|
return { addresses, subscriptions }
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
dispatch (newAddresses, allAddresses, context) {
|
|
73
|
-
const
|
|
73
|
+
const matches = this.matchSubscriptions(newAddresses, allAddresses)
|
|
74
74
|
|
|
75
75
|
// TODO: possible optimization
|
|
76
|
-
// if
|
|
76
|
+
// check if matches.subscriptions is empty here instead of in runner.js
|
|
77
77
|
|
|
78
78
|
const params = {}
|
|
79
79
|
|
|
80
|
-
addresses.forEach((address) => {
|
|
80
|
+
matches.addresses.forEach((address) => {
|
|
81
81
|
params[address] = context.resolve(address)
|
|
82
82
|
})
|
|
83
83
|
|
|
84
|
-
return Runner.runSubscriptions(subscriptions, params)
|
|
84
|
+
return Runner.runSubscriptions(matches.subscriptions, params)
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
|
|
@@ -91,50 +91,40 @@ class Context {
|
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
constructor () {
|
|
94
|
+
// TODO: this probably don't need to be a Map()
|
|
94
95
|
this.store = new Map()
|
|
95
96
|
this.allAddresses = new Set()
|
|
96
|
-
this.newAddresses =
|
|
97
|
+
this.newAddresses = new Set()
|
|
97
98
|
}
|
|
98
99
|
|
|
99
100
|
clear () {
|
|
100
101
|
this.store = new Map()
|
|
101
102
|
this.allAddresses = new Set()
|
|
102
|
-
this.newAddresses =
|
|
103
|
+
this.newAddresses = new Set()
|
|
103
104
|
}
|
|
104
105
|
|
|
105
106
|
setValue (address, value) {
|
|
106
107
|
if (this.allAddresses.size >= MAX_CONTEXT_SIZE) return this
|
|
107
108
|
|
|
108
|
-
|
|
109
|
-
if (
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if (!this.newAddresses.includes(address)) {
|
|
114
|
-
this.allAddresses.add(address)
|
|
115
|
-
this.newAddresses.push(address)
|
|
109
|
+
// cannot optimize for objects because they're pointers
|
|
110
|
+
if (typeof value !== 'object') {
|
|
111
|
+
const oldValue = this.store.get(address)
|
|
112
|
+
if (oldValue === value) return this
|
|
116
113
|
}
|
|
117
114
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
setMultipleValues (params) {
|
|
122
|
-
const addresses = Object.keys(params)
|
|
123
|
-
|
|
124
|
-
for (let i = 0; i < addresses.length; ++i) {
|
|
125
|
-
const address = addresses[i]
|
|
126
|
-
this.setValue(address, params[address])
|
|
127
|
-
}
|
|
115
|
+
this.store.set(address, value)
|
|
116
|
+
this.allAddresses.add(address)
|
|
117
|
+
this.newAddresses.add(address)
|
|
128
118
|
|
|
129
119
|
return this
|
|
130
120
|
}
|
|
131
121
|
|
|
132
122
|
dispatch () {
|
|
133
|
-
if (this.newAddresses.
|
|
123
|
+
if (this.newAddresses.size === 0) return []
|
|
134
124
|
|
|
135
125
|
const result = Context.manager.dispatch(this.newAddresses, this.allAddresses, this)
|
|
136
126
|
|
|
137
|
-
this.newAddresses
|
|
127
|
+
this.newAddresses.clear()
|
|
138
128
|
|
|
139
129
|
return result
|
|
140
130
|
}
|
|
@@ -17,27 +17,28 @@ function enable (config) {
|
|
|
17
17
|
|
|
18
18
|
RuleManager.applyRules(rules)
|
|
19
19
|
} catch (err) {
|
|
20
|
-
log.error(
|
|
20
|
+
log.error('Unable to start AppSec')
|
|
21
|
+
log.error(err)
|
|
21
22
|
|
|
22
23
|
// abort AppSec start
|
|
23
24
|
RuleManager.clearAllRules()
|
|
24
25
|
return
|
|
25
26
|
}
|
|
26
27
|
|
|
28
|
+
Reporter.setRateLimit(config.appsec.rateLimit)
|
|
29
|
+
|
|
27
30
|
incomingHttpRequestStart.subscribe(incomingHttpStartTranslator)
|
|
28
31
|
incomingHttpRequestEnd.subscribe(incomingHttpEndTranslator)
|
|
29
32
|
|
|
30
|
-
// add needed
|
|
31
|
-
Gateway.manager.addresses.add(addresses.HTTP_INCOMING_URL)
|
|
33
|
+
// add fields needed for HTTP context reporting
|
|
32
34
|
Gateway.manager.addresses.add(addresses.HTTP_INCOMING_HEADERS)
|
|
33
|
-
Gateway.manager.addresses.add(addresses.
|
|
34
|
-
Gateway.manager.addresses.add(addresses.HTTP_INCOMING_REMOTE_IP)
|
|
35
|
-
Gateway.manager.addresses.add(addresses.HTTP_INCOMING_REMOTE_PORT)
|
|
36
|
-
Gateway.manager.addresses.add(addresses.HTTP_INCOMING_RESPONSE_CODE)
|
|
35
|
+
Gateway.manager.addresses.add(addresses.HTTP_INCOMING_ENDPOINT)
|
|
37
36
|
Gateway.manager.addresses.add(addresses.HTTP_INCOMING_RESPONSE_HEADERS)
|
|
37
|
+
Gateway.manager.addresses.add(addresses.HTTP_INCOMING_REMOTE_IP)
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
function incomingHttpStartTranslator (data) {
|
|
41
|
+
// TODO: get span from datadog-core storage instead
|
|
41
42
|
const topSpan = data.req._datadog && data.req._datadog.span
|
|
42
43
|
if (topSpan) {
|
|
43
44
|
topSpan.addTags({
|
|
@@ -50,19 +51,6 @@ function incomingHttpStartTranslator (data) {
|
|
|
50
51
|
|
|
51
52
|
store.set('req', data.req)
|
|
52
53
|
store.set('res', data.res)
|
|
53
|
-
|
|
54
|
-
const headers = Object.assign({}, data.req.headers)
|
|
55
|
-
delete headers.cookie
|
|
56
|
-
|
|
57
|
-
const context = store.get('context')
|
|
58
|
-
|
|
59
|
-
Gateway.propagate({
|
|
60
|
-
[addresses.HTTP_INCOMING_URL]: data.req.url,
|
|
61
|
-
[addresses.HTTP_INCOMING_HEADERS]: headers,
|
|
62
|
-
[addresses.HTTP_INCOMING_METHOD]: data.req.method,
|
|
63
|
-
[addresses.HTTP_INCOMING_REMOTE_IP]: data.req.socket.remoteAddress,
|
|
64
|
-
[addresses.HTTP_INCOMING_REMOTE_PORT]: data.req.socket.remotePort
|
|
65
|
-
}, context)
|
|
66
54
|
}
|
|
67
55
|
|
|
68
56
|
function incomingHttpEndTranslator (data) {
|
|
@@ -70,14 +58,41 @@ function incomingHttpEndTranslator (data) {
|
|
|
70
58
|
|
|
71
59
|
if (!context) return
|
|
72
60
|
|
|
61
|
+
const requestHeaders = Object.assign({}, data.req.headers)
|
|
62
|
+
delete requestHeaders.cookie
|
|
63
|
+
|
|
73
64
|
// TODO: this doesn't support headers sent with res.writeHead()
|
|
74
|
-
const
|
|
75
|
-
delete
|
|
65
|
+
const responseHeaders = Object.assign({}, data.res.getHeaders())
|
|
66
|
+
delete responseHeaders['set-cookie']
|
|
76
67
|
|
|
77
|
-
|
|
68
|
+
const payload = {
|
|
69
|
+
[addresses.HTTP_INCOMING_URL]: data.req.url,
|
|
70
|
+
[addresses.HTTP_INCOMING_HEADERS]: requestHeaders,
|
|
71
|
+
[addresses.HTTP_INCOMING_METHOD]: data.req.method,
|
|
72
|
+
[addresses.HTTP_INCOMING_REMOTE_IP]: data.req.socket.remoteAddress,
|
|
73
|
+
[addresses.HTTP_INCOMING_REMOTE_PORT]: data.req.socket.remotePort,
|
|
78
74
|
[addresses.HTTP_INCOMING_RESPONSE_CODE]: data.res.statusCode,
|
|
79
|
-
[addresses.HTTP_INCOMING_RESPONSE_HEADERS]:
|
|
80
|
-
}
|
|
75
|
+
[addresses.HTTP_INCOMING_RESPONSE_HEADERS]: responseHeaders
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// TODO: temporary express instrumentation, will use express plugin later
|
|
79
|
+
if (data.req.query && typeof data.req.query === 'object') {
|
|
80
|
+
payload[addresses.HTTP_INCOMING_QUERY] = data.req.query
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (data.req.route && typeof data.req.route.path === 'string') {
|
|
84
|
+
payload[addresses.HTTP_INCOMING_ENDPOINT] = data.req.route.path
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (data.req.params && typeof data.req.params === 'object') {
|
|
88
|
+
payload[addresses.HTTP_INCOMING_PARAMS] = data.req.params
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (data.req.cookies && typeof data.req.cookies === 'object') {
|
|
92
|
+
payload[addresses.HTTP_INCOMING_COOKIES] = data.req.cookies
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
Gateway.propagate(payload, context)
|
|
81
96
|
|
|
82
97
|
Reporter.finishAttacks(data.req, context)
|
|
83
98
|
}
|
|
@@ -85,6 +100,7 @@ function incomingHttpEndTranslator (data) {
|
|
|
85
100
|
function disable () {
|
|
86
101
|
RuleManager.clearAllRules()
|
|
87
102
|
|
|
103
|
+
// Channel#unsubscribe() is undefined for non active channels
|
|
88
104
|
if (incomingHttpRequestStart.hasSubscribers) incomingHttpRequestStart.unsubscribe(incomingHttpStartTranslator)
|
|
89
105
|
if (incomingHttpRequestEnd.hasSubscribers) incomingHttpRequestEnd.unsubscribe(incomingHttpEndTranslator)
|
|
90
106
|
}
|