dd-trace 2.7.0 → 2.9.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/LICENSE-3rdparty.csv +1 -2
- package/ci/init.js +22 -6
- package/ci/jest/env.js +19 -7
- package/ext/tags.d.ts +1 -0
- package/ext/tags.js +2 -1
- package/index.d.ts +4 -2
- package/package.json +3 -5
- package/packages/datadog-core/src/storage/async_resource.js +1 -1
- package/packages/datadog-instrumentations/index.js +3 -0
- package/packages/datadog-instrumentations/src/amqp10.js +33 -32
- package/packages/datadog-instrumentations/src/amqplib.js +16 -11
- package/packages/datadog-instrumentations/src/aws-sdk.js +105 -0
- package/packages/datadog-instrumentations/src/cassandra-driver.js +53 -51
- package/packages/datadog-instrumentations/src/connect.js +5 -5
- package/packages/datadog-instrumentations/src/couchbase.js +41 -39
- package/packages/datadog-instrumentations/src/cucumber.js +38 -38
- package/packages/datadog-instrumentations/src/dns.js +20 -19
- package/packages/datadog-instrumentations/src/elasticsearch.js +30 -32
- package/packages/datadog-instrumentations/src/fastify.js +75 -87
- package/packages/datadog-instrumentations/src/hapi.js +210 -0
- package/packages/datadog-instrumentations/src/http/client.js +44 -44
- package/packages/datadog-instrumentations/src/http/server.js +15 -13
- package/packages/datadog-instrumentations/src/ioredis.js +16 -17
- package/packages/datadog-instrumentations/src/jest.js +5 -5
- package/packages/datadog-instrumentations/src/koa.js +13 -10
- package/packages/datadog-instrumentations/src/memcached.js +14 -12
- package/packages/datadog-instrumentations/src/mocha.js +37 -39
- package/packages/datadog-instrumentations/src/moleculer/client.js +46 -0
- package/packages/datadog-instrumentations/src/moleculer/server.js +59 -0
- package/packages/datadog-instrumentations/src/moleculer.js +4 -0
- package/packages/datadog-instrumentations/src/mongodb-core.js +29 -33
- package/packages/datadog-instrumentations/src/mysql.js +30 -29
- package/packages/datadog-instrumentations/src/mysql2.js +8 -9
- package/packages/datadog-instrumentations/src/net.js +23 -24
- package/packages/datadog-instrumentations/src/pg.js +30 -30
- package/packages/datadog-instrumentations/src/redis.js +49 -47
- package/packages/datadog-instrumentations/src/rhea.js +51 -49
- package/packages/datadog-instrumentations/src/router.js +5 -5
- package/packages/datadog-instrumentations/src/sharedb.js +20 -20
- package/packages/datadog-instrumentations/src/tedious.js +19 -19
- package/packages/datadog-plugin-amqp10/src/index.js +2 -7
- package/packages/datadog-plugin-amqplib/src/index.js +1 -2
- package/packages/datadog-plugin-aws-sdk/src/base.js +146 -0
- package/packages/datadog-plugin-aws-sdk/src/index.js +16 -106
- package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +4 -2
- package/packages/datadog-plugin-aws-sdk/src/services/default.js +7 -0
- package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +3 -1
- package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +5 -4
- package/packages/datadog-plugin-aws-sdk/src/services/index.js +12 -0
- package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +4 -3
- package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +4 -3
- package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +3 -1
- package/packages/datadog-plugin-aws-sdk/src/services/s3.js +3 -1
- package/packages/datadog-plugin-aws-sdk/src/services/sns.js +4 -3
- package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +45 -6
- package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -5
- package/packages/datadog-plugin-couchbase/src/index.js +3 -4
- package/packages/datadog-plugin-cucumber/src/index.js +1 -9
- package/packages/datadog-plugin-dns/src/index.js +3 -4
- package/packages/datadog-plugin-elasticsearch/src/index.js +1 -5
- package/packages/datadog-plugin-hapi/src/index.js +34 -3
- package/packages/datadog-plugin-http/src/client.js +1 -3
- package/packages/datadog-plugin-http/src/server.js +0 -4
- package/packages/datadog-plugin-http2/src/server.js +3 -1
- package/packages/datadog-plugin-jest/src/index.js +2 -3
- package/packages/datadog-plugin-kafkajs/src/index.js +0 -4
- package/packages/datadog-plugin-memcached/src/index.js +1 -5
- package/packages/datadog-plugin-mocha/src/index.js +3 -7
- package/packages/datadog-plugin-moleculer/src/client.js +34 -44
- package/packages/datadog-plugin-moleculer/src/index.js +32 -3
- package/packages/datadog-plugin-moleculer/src/server.js +28 -50
- package/packages/datadog-plugin-mongodb-core/src/index.js +1 -5
- package/packages/datadog-plugin-mysql/src/index.js +19 -12
- package/packages/datadog-plugin-net/src/index.js +3 -7
- package/packages/datadog-plugin-pg/src/index.js +1 -5
- package/packages/datadog-plugin-redis/src/index.js +1 -5
- package/packages/datadog-plugin-rhea/src/index.js +1 -5
- package/packages/datadog-plugin-router/src/index.js +1 -1
- package/packages/datadog-plugin-sharedb/src/index.js +1 -5
- package/packages/datadog-plugin-tedious/src/index.js +1 -5
- package/packages/dd-trace/lib/version.js +1 -1
- package/packages/dd-trace/src/appsec/callbacks/ddwaf.js +2 -1
- package/packages/dd-trace/src/appsec/index.js +3 -3
- package/packages/dd-trace/src/encode/agentless-ci-visibility.js +3 -1
- package/packages/dd-trace/src/plugins/plugin.js +0 -8
- package/packages/dd-trace/src/plugins/util/test.js +5 -1
- package/packages/dd-trace/src/plugins/util/web.js +3 -1
- package/scripts/install_plugin_modules.js +25 -15
- package/packages/datadog-plugin-aws-sdk/src/helpers.js +0 -103
- package/packages/datadog-plugin-hapi/src/route.js +0 -75
- package/packages/datadog-plugin-hapi/src/server.js +0 -204
|
@@ -56,7 +56,7 @@ class MochaPlugin extends Plugin {
|
|
|
56
56
|
this.enter(span, store)
|
|
57
57
|
})
|
|
58
58
|
|
|
59
|
-
this.addSub('ci:mocha:test:
|
|
59
|
+
this.addSub('ci:mocha:test:finish', (status) => {
|
|
60
60
|
// if the status is skipped the span has already been finished
|
|
61
61
|
if (status === 'skipped') {
|
|
62
62
|
return
|
|
@@ -69,10 +69,6 @@ class MochaPlugin extends Plugin {
|
|
|
69
69
|
finishAllTraceSpans(span)
|
|
70
70
|
})
|
|
71
71
|
|
|
72
|
-
this.addSub('ci:mocha:test:end', () => {
|
|
73
|
-
this.exit()
|
|
74
|
-
})
|
|
75
|
-
|
|
76
72
|
// This covers programmatically skipped tests (that do go through `runTest`)
|
|
77
73
|
this.addSub('ci:mocha:test:skip', () => {
|
|
78
74
|
const span = storage.getStore().span
|
|
@@ -92,7 +88,7 @@ class MochaPlugin extends Plugin {
|
|
|
92
88
|
}
|
|
93
89
|
})
|
|
94
90
|
|
|
95
|
-
this.addSub('ci:mocha:suite:
|
|
91
|
+
this.addSub('ci:mocha:suite:finish', tests => {
|
|
96
92
|
tests.forEach(test => {
|
|
97
93
|
const { pending: isSkipped } = test
|
|
98
94
|
// `tests` includes every test, so we need a way to mark
|
|
@@ -121,7 +117,7 @@ class MochaPlugin extends Plugin {
|
|
|
121
117
|
this._testNameToParams[name] = params
|
|
122
118
|
})
|
|
123
119
|
|
|
124
|
-
this.addSub('ci:mocha:run:
|
|
120
|
+
this.addSub('ci:mocha:run:finish', () => {
|
|
125
121
|
this.tracer._exporter._writer.flush()
|
|
126
122
|
})
|
|
127
123
|
}
|
|
@@ -1,60 +1,50 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
+
const { storage } = require('../../datadog-core')
|
|
4
|
+
const Plugin = require('../../dd-trace/src/plugins/plugin')
|
|
3
5
|
const { moleculerTags } = require('./util')
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
class MoleculerClientPlugin extends Plugin {
|
|
8
|
+
constructor (...args) {
|
|
9
|
+
super(...args)
|
|
10
|
+
|
|
11
|
+
this.addSub('apm:moleculer:call:start', ({ actionName, params, opts }) => {
|
|
12
|
+
const store = storage.getStore()
|
|
13
|
+
const childOf = store && store.span
|
|
14
|
+
const span = this.tracer.startSpan('moleculer.call', {
|
|
15
|
+
childOf,
|
|
11
16
|
tags: {
|
|
12
|
-
'
|
|
17
|
+
'service.name': this.config.service || this.tracer._service,
|
|
18
|
+
'span.kind': 'client',
|
|
19
|
+
'resource.name': actionName
|
|
13
20
|
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
opts = arguments[2] = opts || {}
|
|
17
|
-
opts.meta = opts.meta || {}
|
|
21
|
+
})
|
|
18
22
|
|
|
19
|
-
|
|
23
|
+
this.tracer.inject(span, 'text_map', opts.meta)
|
|
20
24
|
|
|
21
|
-
|
|
22
|
-
|
|
25
|
+
this.enter(span, store)
|
|
26
|
+
})
|
|
23
27
|
|
|
24
|
-
|
|
28
|
+
this.addSub('apm:moleculer:call:finish', ({ broker, ctx }) => {
|
|
29
|
+
const store = storage.getStore()
|
|
30
|
+
const span = store.span
|
|
25
31
|
|
|
26
|
-
|
|
32
|
+
if (ctx) {
|
|
33
|
+
const endpoint = ctx.endpoint || {}
|
|
34
|
+
const node = endpoint.node || {}
|
|
27
35
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
36
|
+
span.addTags({
|
|
37
|
+
'out.host': node.hostname,
|
|
38
|
+
'out.port': node.port,
|
|
39
|
+
...moleculerTags(broker, ctx, this.config)
|
|
40
|
+
})
|
|
41
|
+
}
|
|
31
42
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
'out.port': node.port,
|
|
35
|
-
...moleculerTags(this, promise.ctx, config)
|
|
36
|
-
})
|
|
37
|
-
}
|
|
43
|
+
span.finish()
|
|
44
|
+
})
|
|
38
45
|
|
|
39
|
-
|
|
40
|
-
})
|
|
41
|
-
}
|
|
46
|
+
this.addSub('apm:moleculer:call:error', this.addError)
|
|
42
47
|
}
|
|
43
48
|
}
|
|
44
49
|
|
|
45
|
-
module.exports =
|
|
46
|
-
{
|
|
47
|
-
name: 'moleculer',
|
|
48
|
-
versions: ['>=0.14'],
|
|
49
|
-
patch ({ ServiceBroker }, tracer, config) {
|
|
50
|
-
if (config.client === false) return
|
|
51
|
-
|
|
52
|
-
config = Object.assign({}, config, config.client)
|
|
53
|
-
|
|
54
|
-
this.wrap(ServiceBroker.prototype, 'call', createWrapCall(tracer, config))
|
|
55
|
-
},
|
|
56
|
-
unpatch ({ ServiceBroker }) {
|
|
57
|
-
this.unwrap(ServiceBroker.prototype, 'call')
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
]
|
|
50
|
+
module.exports = MoleculerClientPlugin
|
|
@@ -2,7 +2,36 @@
|
|
|
2
2
|
|
|
3
3
|
// TODO: support https://moleculer.services/docs/0.13/actions.html#Streaming
|
|
4
4
|
|
|
5
|
-
const
|
|
6
|
-
const
|
|
5
|
+
const Plugin = require('../../dd-trace/src/plugins/plugin')
|
|
6
|
+
const MoleculerServerPlugin = require('./server')
|
|
7
|
+
const MoleculerClientPlugin = require('./client')
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
class MoleculerPlugin extends Plugin {
|
|
10
|
+
static get name () {
|
|
11
|
+
return 'moleculer'
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
constructor (...args) {
|
|
15
|
+
super(...args)
|
|
16
|
+
|
|
17
|
+
this.server = new MoleculerServerPlugin(...args)
|
|
18
|
+
this.client = new MoleculerClientPlugin(...args)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
configure (config) {
|
|
22
|
+
const clientConfig = config.client === false ? false : {
|
|
23
|
+
...config,
|
|
24
|
+
...config.client
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const serverConfig = config.server === false ? false : {
|
|
28
|
+
...config,
|
|
29
|
+
...config.server
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
this.server.configure(serverConfig)
|
|
33
|
+
this.client.configure(clientConfig)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
module.exports = MoleculerPlugin
|
|
@@ -1,61 +1,39 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
+
const { storage } = require('../../datadog-core')
|
|
4
|
+
const Plugin = require('../../dd-trace/src/plugins/plugin')
|
|
3
5
|
const { moleculerTags } = require('./util')
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
class MoleculerServerPlugin extends Plugin {
|
|
8
|
+
constructor (...args) {
|
|
9
|
+
super(...args)
|
|
10
|
+
|
|
11
|
+
this.addSub('apm:moleculer:action:start', ({ action, ctx, broker }) => {
|
|
12
|
+
const store = storage.getStore()
|
|
13
|
+
const followsFrom = this.tracer.extract('text_map', ctx.meta)
|
|
14
|
+
const span = this.tracer.startSpan('moleculer.action', {
|
|
15
|
+
childOf: followsFrom || (store && store.span),
|
|
16
|
+
tags: {
|
|
17
|
+
'service.name': this.config.service || this.tracer._service,
|
|
18
|
+
'span.type': 'web',
|
|
19
|
+
'span.kind': 'server',
|
|
20
|
+
'resource.name': action.name,
|
|
21
|
+
...moleculerTags(broker, ctx, this.config)
|
|
22
|
+
}
|
|
23
|
+
})
|
|
11
24
|
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
}
|
|
25
|
+
this.enter(span, store)
|
|
26
|
+
})
|
|
16
27
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
localAction (next, action) {
|
|
22
|
-
const broker = this
|
|
23
|
-
|
|
24
|
-
return function datadogMiddleware (ctx) {
|
|
25
|
-
const childOf = tracer.extract('text_map', ctx.meta)
|
|
26
|
-
const options = {
|
|
27
|
-
service: config.service,
|
|
28
|
-
resource: action.name,
|
|
29
|
-
type: 'web',
|
|
30
|
-
tags: {
|
|
31
|
-
'span.kind': 'server',
|
|
32
|
-
...moleculerTags(broker, ctx, config)
|
|
33
|
-
}
|
|
34
|
-
}
|
|
28
|
+
this.addSub('apm:moleculer:action:finish', () => {
|
|
29
|
+
const store = storage.getStore()
|
|
30
|
+
const span = store.span
|
|
35
31
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
32
|
+
span.finish()
|
|
33
|
+
})
|
|
39
34
|
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
}
|
|
35
|
+
this.addSub('apm:moleculer:action:error', this.addError)
|
|
43
36
|
}
|
|
44
37
|
}
|
|
45
38
|
|
|
46
|
-
module.exports =
|
|
47
|
-
{
|
|
48
|
-
name: 'moleculer',
|
|
49
|
-
versions: ['>=0.14'],
|
|
50
|
-
patch ({ ServiceBroker }, tracer, config) {
|
|
51
|
-
if (config.server === false) return
|
|
52
|
-
|
|
53
|
-
config = Object.assign({}, config, config.server)
|
|
54
|
-
|
|
55
|
-
this.wrap(ServiceBroker.prototype, 'registerMiddlewares', createWrapRegisterMiddlewares(tracer, config))
|
|
56
|
-
},
|
|
57
|
-
unpatch ({ ServiceBroker }) {
|
|
58
|
-
this.unwrap(ServiceBroker.prototype, 'registerMiddlewares')
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
]
|
|
39
|
+
module.exports = MoleculerServerPlugin
|
|
@@ -43,15 +43,11 @@ class MongodbCorePlugin extends Plugin {
|
|
|
43
43
|
this.enter(span, store)
|
|
44
44
|
})
|
|
45
45
|
|
|
46
|
-
this.addSub(`apm:mongodb:query:end`, () => {
|
|
47
|
-
this.exit()
|
|
48
|
-
})
|
|
49
|
-
|
|
50
46
|
this.addSub(`apm:mongodb:query:error`, err => {
|
|
51
47
|
storage.getStore().span.setTag('error', err)
|
|
52
48
|
})
|
|
53
49
|
|
|
54
|
-
this.addSub(`apm:mongodb:query:
|
|
50
|
+
this.addSub(`apm:mongodb:query:finish`, () => {
|
|
55
51
|
storage.getStore().span.finish()
|
|
56
52
|
})
|
|
57
53
|
}
|
|
@@ -12,35 +12,32 @@ class MySQLPlugin extends Plugin {
|
|
|
12
12
|
constructor (...args) {
|
|
13
13
|
super(...args)
|
|
14
14
|
|
|
15
|
-
this.addSub(`apm:${this.constructor.name}:query:start`, ({ sql, conf }) => {
|
|
15
|
+
this.addSub(`apm:${this.constructor.name}:query:start`, ({ sql, conf: dbConfig }) => {
|
|
16
|
+
const service = getServiceName(this.tracer, this.config, dbConfig)
|
|
16
17
|
const store = storage.getStore()
|
|
17
18
|
const childOf = store ? store.span : store
|
|
18
19
|
const span = this.tracer.startSpan('mysql.query', {
|
|
19
20
|
childOf,
|
|
20
21
|
tags: {
|
|
21
|
-
'service.name':
|
|
22
|
+
'service.name': service,
|
|
22
23
|
'span.type': 'sql',
|
|
23
24
|
'span.kind': 'client',
|
|
24
25
|
'db.type': 'mysql',
|
|
25
|
-
'db.user':
|
|
26
|
-
'out.host':
|
|
27
|
-
'out.port':
|
|
26
|
+
'db.user': dbConfig.user,
|
|
27
|
+
'out.host': dbConfig.host,
|
|
28
|
+
'out.port': dbConfig.port,
|
|
28
29
|
'resource.name': sql
|
|
29
30
|
}
|
|
30
31
|
})
|
|
31
32
|
|
|
32
|
-
if (
|
|
33
|
-
span.setTag('db.name',
|
|
33
|
+
if (dbConfig.database) {
|
|
34
|
+
span.setTag('db.name', dbConfig.database)
|
|
34
35
|
}
|
|
35
36
|
|
|
36
37
|
analyticsSampler.sample(span, this.config.measured)
|
|
37
38
|
this.enter(span, store)
|
|
38
39
|
})
|
|
39
40
|
|
|
40
|
-
this.addSub(`apm:${this.constructor.name}:query:end`, () => {
|
|
41
|
-
this.exit()
|
|
42
|
-
})
|
|
43
|
-
|
|
44
41
|
this.addSub(`apm:${this.constructor.name}:query:error`, err => {
|
|
45
42
|
if (err) {
|
|
46
43
|
const span = storage.getStore().span
|
|
@@ -48,11 +45,21 @@ class MySQLPlugin extends Plugin {
|
|
|
48
45
|
}
|
|
49
46
|
})
|
|
50
47
|
|
|
51
|
-
this.addSub(`apm:${this.constructor.name}:query:
|
|
48
|
+
this.addSub(`apm:${this.constructor.name}:query:finish`, () => {
|
|
52
49
|
const span = storage.getStore().span
|
|
53
50
|
span.finish()
|
|
54
51
|
})
|
|
55
52
|
}
|
|
56
53
|
}
|
|
57
54
|
|
|
55
|
+
function getServiceName (tracer, config, dbConfig) {
|
|
56
|
+
if (typeof config.service === 'function') {
|
|
57
|
+
return config.service(dbConfig)
|
|
58
|
+
} else if (config.service) {
|
|
59
|
+
return config.service
|
|
60
|
+
} else {
|
|
61
|
+
return `${tracer._service}-mysql`
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
58
65
|
module.exports = MySQLPlugin
|
|
@@ -30,11 +30,9 @@ class NetPlugin extends Plugin {
|
|
|
30
30
|
this.enter(span, store)
|
|
31
31
|
})
|
|
32
32
|
|
|
33
|
-
this.addSub(`apm:net:ipc:end`, this.exit.bind(this))
|
|
34
|
-
|
|
35
33
|
this.addSub(`apm:net:ipc:error`, errorHandler)
|
|
36
34
|
|
|
37
|
-
this.addSub(`apm:net:ipc:
|
|
35
|
+
this.addSub(`apm:net:ipc:finish`, defaultFinish)
|
|
38
36
|
|
|
39
37
|
this.addSub(`apm:net:tcp:start`, ({ options }) => {
|
|
40
38
|
const store = storage.getStore()
|
|
@@ -62,11 +60,9 @@ class NetPlugin extends Plugin {
|
|
|
62
60
|
this.enter(span, store)
|
|
63
61
|
})
|
|
64
62
|
|
|
65
|
-
this.addSub(`apm:net:tcp:end`, this.exit.bind(this))
|
|
66
|
-
|
|
67
63
|
this.addSub(`apm:net:tcp:error`, errorHandler)
|
|
68
64
|
|
|
69
|
-
this.addSub(`apm:net:tcp:
|
|
65
|
+
this.addSub(`apm:net:tcp:finish`, defaultFinish)
|
|
70
66
|
|
|
71
67
|
this.addSub(`apm:net:tcp:connection`, ({ socket }) => {
|
|
72
68
|
const span = storage.getStore().span
|
|
@@ -78,7 +74,7 @@ class NetPlugin extends Plugin {
|
|
|
78
74
|
}
|
|
79
75
|
}
|
|
80
76
|
|
|
81
|
-
function
|
|
77
|
+
function defaultFinish () {
|
|
82
78
|
storage.getStore().span.finish()
|
|
83
79
|
}
|
|
84
80
|
|
|
@@ -40,16 +40,12 @@ class PGPlugin extends Plugin {
|
|
|
40
40
|
this.enter(span, store)
|
|
41
41
|
})
|
|
42
42
|
|
|
43
|
-
this.addSub(`apm:pg:query:end`, () => {
|
|
44
|
-
this.exit()
|
|
45
|
-
})
|
|
46
|
-
|
|
47
43
|
this.addSub(`apm:pg:query:error`, err => {
|
|
48
44
|
const span = storage.getStore().span
|
|
49
45
|
span.setTag('error', err)
|
|
50
46
|
})
|
|
51
47
|
|
|
52
|
-
this.addSub(`apm:pg:query:
|
|
48
|
+
this.addSub(`apm:pg:query:finish`, () => {
|
|
53
49
|
const span = storage.getStore().span
|
|
54
50
|
span.finish()
|
|
55
51
|
})
|
|
@@ -55,16 +55,12 @@ class RedisPlugin extends Plugin {
|
|
|
55
55
|
this.enter(span, store)
|
|
56
56
|
})
|
|
57
57
|
|
|
58
|
-
this.addSub(`apm:${this.constructor.name}:command:end`, () => {
|
|
59
|
-
this.exit()
|
|
60
|
-
})
|
|
61
|
-
|
|
62
58
|
this.addSub(`apm:${this.constructor.name}:command:error`, err => {
|
|
63
59
|
const span = storage.getStore().span
|
|
64
60
|
span.setTag('error', err)
|
|
65
61
|
})
|
|
66
62
|
|
|
67
|
-
this.addSub(`apm:${this.constructor.name}:command:
|
|
63
|
+
this.addSub(`apm:${this.constructor.name}:command:finish`, () => {
|
|
68
64
|
const span = storage.getStore().span
|
|
69
65
|
span.finish()
|
|
70
66
|
})
|
|
@@ -61,15 +61,11 @@ class RheaPlugin extends Plugin {
|
|
|
61
61
|
storage.getStore().span.setTag('error', error)
|
|
62
62
|
})
|
|
63
63
|
|
|
64
|
-
this.addSub(`apm:rhea:
|
|
64
|
+
this.addSub(`apm:rhea:finish`, () => {
|
|
65
65
|
const span = storage.getStore().span
|
|
66
66
|
span.finish()
|
|
67
67
|
})
|
|
68
68
|
|
|
69
|
-
this.addSub(`apm:rhea:end`, () => {
|
|
70
|
-
this.exit()
|
|
71
|
-
})
|
|
72
|
-
|
|
73
69
|
this.addSub(`apm:rhea:dispatch`, ({ state }) => {
|
|
74
70
|
const span = storage.getStore().span
|
|
75
71
|
span.setTag('amqp.delivery.state', state)
|
|
@@ -26,7 +26,7 @@ class RouterPlugin extends WebPlugin {
|
|
|
26
26
|
web.setRoute(req, context.route)
|
|
27
27
|
})
|
|
28
28
|
|
|
29
|
-
this.addSub(`apm:${this.constructor.name}:middleware:
|
|
29
|
+
this.addSub(`apm:${this.constructor.name}:middleware:next`, ({ req }) => {
|
|
30
30
|
const context = this._contexts.get(req)
|
|
31
31
|
|
|
32
32
|
if (!context) return
|
|
@@ -31,16 +31,12 @@ class SharedbPlugin extends Plugin {
|
|
|
31
31
|
this.enter(span, store)
|
|
32
32
|
})
|
|
33
33
|
|
|
34
|
-
this.addSub(`apm:sharedb:request:end`, () => {
|
|
35
|
-
this.exit()
|
|
36
|
-
})
|
|
37
|
-
|
|
38
34
|
this.addSub(`apm:sharedb:request:error`, err => {
|
|
39
35
|
const span = storage.getStore().span
|
|
40
36
|
span.setTag('error', err)
|
|
41
37
|
})
|
|
42
38
|
|
|
43
|
-
this.addSub(`apm:sharedb:request:
|
|
39
|
+
this.addSub(`apm:sharedb:request:finish`, ({ request, res }) => {
|
|
44
40
|
const span = storage.getStore().span
|
|
45
41
|
if (this.config.hooks && this.config.hooks.reply) {
|
|
46
42
|
this.config.hooks.reply(span, request, res)
|
|
@@ -35,16 +35,12 @@ class TediousPlugin extends Plugin {
|
|
|
35
35
|
this.enter(span, store)
|
|
36
36
|
})
|
|
37
37
|
|
|
38
|
-
this.addSub(`apm:tedious:request:end`, () => {
|
|
39
|
-
this.exit()
|
|
40
|
-
})
|
|
41
|
-
|
|
42
38
|
this.addSub(`apm:tedious:request:error`, err => {
|
|
43
39
|
const span = storage.getStore().span
|
|
44
40
|
span.setTag('error', err)
|
|
45
41
|
})
|
|
46
42
|
|
|
47
|
-
this.addSub(`apm:tedious:request:
|
|
43
|
+
this.addSub(`apm:tedious:request:finish`, () => {
|
|
48
44
|
const span = storage.getStore().span
|
|
49
45
|
span.finish()
|
|
50
46
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
module.exports = '2.
|
|
1
|
+
module.exports = '2.9.0'
|
|
@@ -33,10 +33,11 @@ class WAFCallback {
|
|
|
33
33
|
|
|
34
34
|
Reporter.metricsQueue.set('_dd.appsec.waf.version', `${version.major}.${version.minor}.${version.patch}`)
|
|
35
35
|
|
|
36
|
-
const { loaded, failed } = this.ddwaf.rulesInfo
|
|
36
|
+
const { loaded, failed, errors } = this.ddwaf.rulesInfo
|
|
37
37
|
|
|
38
38
|
Reporter.metricsQueue.set('_dd.appsec.event_rules.loaded', loaded)
|
|
39
39
|
Reporter.metricsQueue.set('_dd.appsec.event_rules.error_count', failed)
|
|
40
|
+
if (failed) Reporter.metricsQueue.set('_dd.appsec.event_rules.errors', JSON.stringify(errors))
|
|
40
41
|
|
|
41
42
|
Reporter.metricsQueue.set('manual.keep', true)
|
|
42
43
|
|
|
@@ -47,15 +47,15 @@ function incomingHttpStartTranslator (data) {
|
|
|
47
47
|
'_dd.runtime_family': 'nodejs'
|
|
48
48
|
})
|
|
49
49
|
}
|
|
50
|
+
}
|
|
50
51
|
|
|
52
|
+
function incomingHttpEndTranslator (data) {
|
|
51
53
|
const store = Gateway.startContext()
|
|
52
54
|
|
|
53
55
|
store.set('req', data.req)
|
|
54
56
|
store.set('res', data.res)
|
|
55
|
-
}
|
|
56
57
|
|
|
57
|
-
|
|
58
|
-
const context = Gateway.getContext()
|
|
58
|
+
const context = store.get('context')
|
|
59
59
|
|
|
60
60
|
if (!context) return
|
|
61
61
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
const { truncateSpan, normalizeSpan } = require('./tags-processors')
|
|
3
3
|
const Chunk = require('./chunk')
|
|
4
4
|
const { AgentEncoder } = require('./0.4')
|
|
5
|
+
const { version: ddTraceVersion } = require('../../../../package.json')
|
|
5
6
|
|
|
6
7
|
const ENCODING_VERSION = 1
|
|
7
8
|
|
|
@@ -156,7 +157,8 @@ class AgentlessCiVisibilityEncoder extends AgentEncoder {
|
|
|
156
157
|
version: ENCODING_VERSION,
|
|
157
158
|
metadata: {
|
|
158
159
|
'*': {
|
|
159
|
-
'language': 'javascript'
|
|
160
|
+
'language': 'javascript',
|
|
161
|
+
'library_version': ddTraceVersion
|
|
160
162
|
}
|
|
161
163
|
},
|
|
162
164
|
events: []
|
|
@@ -27,7 +27,6 @@ module.exports = class Plugin {
|
|
|
27
27
|
constructor (tracer) {
|
|
28
28
|
this._subscriptions = []
|
|
29
29
|
this._enabled = false
|
|
30
|
-
this._storeStack = []
|
|
31
30
|
this._tracer = tracer
|
|
32
31
|
}
|
|
33
32
|
|
|
@@ -37,21 +36,14 @@ module.exports = class Plugin {
|
|
|
37
36
|
|
|
38
37
|
enter (span, store) {
|
|
39
38
|
store = store || storage.getStore()
|
|
40
|
-
this._storeStack.push(store)
|
|
41
39
|
storage.enterWith({ ...store, span })
|
|
42
40
|
}
|
|
43
41
|
|
|
44
42
|
/** Prevents creation of spans here and for all async descendants. */
|
|
45
43
|
skip () {
|
|
46
|
-
const store = storage.getStore()
|
|
47
|
-
this._storeStack.push(store)
|
|
48
44
|
storage.enterWith({ noop: true })
|
|
49
45
|
}
|
|
50
46
|
|
|
51
|
-
exit () {
|
|
52
|
-
storage.enterWith(this._storeStack.pop())
|
|
53
|
-
}
|
|
54
|
-
|
|
55
47
|
addSub (channelName, handler) {
|
|
56
48
|
this._subscriptions.push(new Subscription(channelName, handler))
|
|
57
49
|
}
|
|
@@ -22,6 +22,7 @@ const id = require('../../id')
|
|
|
22
22
|
const { SPAN_TYPE, RESOURCE_NAME, SAMPLING_PRIORITY } = require('../../../../../ext/tags')
|
|
23
23
|
const { SAMPLING_RULE_DECISION } = require('../../constants')
|
|
24
24
|
const { AUTO_KEEP } = require('../../../../../ext/priority')
|
|
25
|
+
const { version: ddTraceVersion } = require('../../../../../package.json')
|
|
25
26
|
|
|
26
27
|
const TEST_FRAMEWORK = 'test.framework'
|
|
27
28
|
const TEST_FRAMEWORK_VERSION = 'test.framework_version'
|
|
@@ -33,6 +34,7 @@ const TEST_PARAMETERS = 'test.parameters'
|
|
|
33
34
|
const TEST_SKIP_REASON = 'test.skip_reason'
|
|
34
35
|
const TEST_IS_RUM_ACTIVE = 'test.is_rum_active'
|
|
35
36
|
const TEST_CODE_OWNERS = 'test.codeowners'
|
|
37
|
+
const LIBRARY_VERSION = 'library_version'
|
|
36
38
|
|
|
37
39
|
const ERROR_TYPE = 'error.type'
|
|
38
40
|
const ERROR_MESSAGE = 'error.msg'
|
|
@@ -58,6 +60,7 @@ module.exports = {
|
|
|
58
60
|
ERROR_MESSAGE,
|
|
59
61
|
ERROR_STACK,
|
|
60
62
|
CI_APP_ORIGIN,
|
|
63
|
+
LIBRARY_VERSION,
|
|
61
64
|
getTestEnvironmentMetadata,
|
|
62
65
|
getTestParametersString,
|
|
63
66
|
finishAllTraceSpans,
|
|
@@ -149,7 +152,8 @@ function getTestCommonTags (name, suite, version) {
|
|
|
149
152
|
[TEST_NAME]: name,
|
|
150
153
|
[TEST_SUITE]: suite,
|
|
151
154
|
[RESOURCE_NAME]: `${suite}.${name}`,
|
|
152
|
-
[TEST_FRAMEWORK_VERSION]: version
|
|
155
|
+
[TEST_FRAMEWORK_VERSION]: version,
|
|
156
|
+
[LIBRARY_VERSION]: ddTraceVersion
|
|
153
157
|
}
|
|
154
158
|
}
|
|
155
159
|
|
|
@@ -23,6 +23,7 @@ const HTTP_STATUS_CODE = tags.HTTP_STATUS_CODE
|
|
|
23
23
|
const HTTP_ROUTE = tags.HTTP_ROUTE
|
|
24
24
|
const HTTP_REQUEST_HEADERS = tags.HTTP_REQUEST_HEADERS
|
|
25
25
|
const HTTP_RESPONSE_HEADERS = tags.HTTP_RESPONSE_HEADERS
|
|
26
|
+
const HTTP_USERAGENT = tags.HTTP_USERAGENT
|
|
26
27
|
const MANUAL_DROP = tags.MANUAL_DROP
|
|
27
28
|
|
|
28
29
|
const HTTP2_HEADER_AUTHORITY = ':authority'
|
|
@@ -412,7 +413,8 @@ function addRequestTags (context) {
|
|
|
412
413
|
[HTTP_URL]: url.split('?')[0],
|
|
413
414
|
[HTTP_METHOD]: req.method,
|
|
414
415
|
[SPAN_KIND]: SERVER,
|
|
415
|
-
[SPAN_TYPE]: WEB
|
|
416
|
+
[SPAN_TYPE]: WEB,
|
|
417
|
+
[HTTP_USERAGENT]: req.headers['user-agent']
|
|
416
418
|
})
|
|
417
419
|
|
|
418
420
|
addHeaders(context)
|