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.
Files changed (91) hide show
  1. package/LICENSE-3rdparty.csv +1 -2
  2. package/ci/init.js +22 -6
  3. package/ci/jest/env.js +19 -7
  4. package/ext/tags.d.ts +1 -0
  5. package/ext/tags.js +2 -1
  6. package/index.d.ts +4 -2
  7. package/package.json +3 -5
  8. package/packages/datadog-core/src/storage/async_resource.js +1 -1
  9. package/packages/datadog-instrumentations/index.js +3 -0
  10. package/packages/datadog-instrumentations/src/amqp10.js +33 -32
  11. package/packages/datadog-instrumentations/src/amqplib.js +16 -11
  12. package/packages/datadog-instrumentations/src/aws-sdk.js +105 -0
  13. package/packages/datadog-instrumentations/src/cassandra-driver.js +53 -51
  14. package/packages/datadog-instrumentations/src/connect.js +5 -5
  15. package/packages/datadog-instrumentations/src/couchbase.js +41 -39
  16. package/packages/datadog-instrumentations/src/cucumber.js +38 -38
  17. package/packages/datadog-instrumentations/src/dns.js +20 -19
  18. package/packages/datadog-instrumentations/src/elasticsearch.js +30 -32
  19. package/packages/datadog-instrumentations/src/fastify.js +75 -87
  20. package/packages/datadog-instrumentations/src/hapi.js +210 -0
  21. package/packages/datadog-instrumentations/src/http/client.js +44 -44
  22. package/packages/datadog-instrumentations/src/http/server.js +15 -13
  23. package/packages/datadog-instrumentations/src/ioredis.js +16 -17
  24. package/packages/datadog-instrumentations/src/jest.js +5 -5
  25. package/packages/datadog-instrumentations/src/koa.js +13 -10
  26. package/packages/datadog-instrumentations/src/memcached.js +14 -12
  27. package/packages/datadog-instrumentations/src/mocha.js +37 -39
  28. package/packages/datadog-instrumentations/src/moleculer/client.js +46 -0
  29. package/packages/datadog-instrumentations/src/moleculer/server.js +59 -0
  30. package/packages/datadog-instrumentations/src/moleculer.js +4 -0
  31. package/packages/datadog-instrumentations/src/mongodb-core.js +29 -33
  32. package/packages/datadog-instrumentations/src/mysql.js +30 -29
  33. package/packages/datadog-instrumentations/src/mysql2.js +8 -9
  34. package/packages/datadog-instrumentations/src/net.js +23 -24
  35. package/packages/datadog-instrumentations/src/pg.js +30 -30
  36. package/packages/datadog-instrumentations/src/redis.js +49 -47
  37. package/packages/datadog-instrumentations/src/rhea.js +51 -49
  38. package/packages/datadog-instrumentations/src/router.js +5 -5
  39. package/packages/datadog-instrumentations/src/sharedb.js +20 -20
  40. package/packages/datadog-instrumentations/src/tedious.js +19 -19
  41. package/packages/datadog-plugin-amqp10/src/index.js +2 -7
  42. package/packages/datadog-plugin-amqplib/src/index.js +1 -2
  43. package/packages/datadog-plugin-aws-sdk/src/base.js +146 -0
  44. package/packages/datadog-plugin-aws-sdk/src/index.js +16 -106
  45. package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +4 -2
  46. package/packages/datadog-plugin-aws-sdk/src/services/default.js +7 -0
  47. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +3 -1
  48. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +5 -4
  49. package/packages/datadog-plugin-aws-sdk/src/services/index.js +12 -0
  50. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +4 -3
  51. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +4 -3
  52. package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +3 -1
  53. package/packages/datadog-plugin-aws-sdk/src/services/s3.js +3 -1
  54. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +4 -3
  55. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +45 -6
  56. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -5
  57. package/packages/datadog-plugin-couchbase/src/index.js +3 -4
  58. package/packages/datadog-plugin-cucumber/src/index.js +1 -9
  59. package/packages/datadog-plugin-dns/src/index.js +3 -4
  60. package/packages/datadog-plugin-elasticsearch/src/index.js +1 -5
  61. package/packages/datadog-plugin-hapi/src/index.js +34 -3
  62. package/packages/datadog-plugin-http/src/client.js +1 -3
  63. package/packages/datadog-plugin-http/src/server.js +0 -4
  64. package/packages/datadog-plugin-http2/src/server.js +3 -1
  65. package/packages/datadog-plugin-jest/src/index.js +2 -3
  66. package/packages/datadog-plugin-kafkajs/src/index.js +0 -4
  67. package/packages/datadog-plugin-memcached/src/index.js +1 -5
  68. package/packages/datadog-plugin-mocha/src/index.js +3 -7
  69. package/packages/datadog-plugin-moleculer/src/client.js +34 -44
  70. package/packages/datadog-plugin-moleculer/src/index.js +32 -3
  71. package/packages/datadog-plugin-moleculer/src/server.js +28 -50
  72. package/packages/datadog-plugin-mongodb-core/src/index.js +1 -5
  73. package/packages/datadog-plugin-mysql/src/index.js +19 -12
  74. package/packages/datadog-plugin-net/src/index.js +3 -7
  75. package/packages/datadog-plugin-pg/src/index.js +1 -5
  76. package/packages/datadog-plugin-redis/src/index.js +1 -5
  77. package/packages/datadog-plugin-rhea/src/index.js +1 -5
  78. package/packages/datadog-plugin-router/src/index.js +1 -1
  79. package/packages/datadog-plugin-sharedb/src/index.js +1 -5
  80. package/packages/datadog-plugin-tedious/src/index.js +1 -5
  81. package/packages/dd-trace/lib/version.js +1 -1
  82. package/packages/dd-trace/src/appsec/callbacks/ddwaf.js +2 -1
  83. package/packages/dd-trace/src/appsec/index.js +3 -3
  84. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +3 -1
  85. package/packages/dd-trace/src/plugins/plugin.js +0 -8
  86. package/packages/dd-trace/src/plugins/util/test.js +5 -1
  87. package/packages/dd-trace/src/plugins/util/web.js +3 -1
  88. package/scripts/install_plugin_modules.js +25 -15
  89. package/packages/datadog-plugin-aws-sdk/src/helpers.js +0 -103
  90. package/packages/datadog-plugin-hapi/src/route.js +0 -75
  91. 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:async-end', (status) => {
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:end', tests => {
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:end', () => {
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
- function createWrapCall (tracer, config) {
6
- return function wrapCall (call) {
7
- return function callWithTrace (actionName, params, opts) {
8
- const options = {
9
- service: config.service,
10
- resource: actionName,
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
- 'span.kind': 'client'
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
- arguments.length = Math.max(3, arguments.length)
23
+ this.tracer.inject(span, 'text_map', opts.meta)
20
24
 
21
- return tracer.trace('moleculer.call', options, () => {
22
- const span = tracer.scope().active()
25
+ this.enter(span, store)
26
+ })
23
27
 
24
- tracer.inject(span, 'text_map', opts.meta)
28
+ this.addSub('apm:moleculer:call:finish', ({ broker, ctx }) => {
29
+ const store = storage.getStore()
30
+ const span = store.span
25
31
 
26
- const promise = call.apply(this, arguments)
32
+ if (ctx) {
33
+ const endpoint = ctx.endpoint || {}
34
+ const node = endpoint.node || {}
27
35
 
28
- if (promise.ctx) {
29
- const endpoint = promise.ctx.endpoint || {}
30
- const node = endpoint.node || {}
36
+ span.addTags({
37
+ 'out.host': node.hostname,
38
+ 'out.port': node.port,
39
+ ...moleculerTags(broker, ctx, this.config)
40
+ })
41
+ }
31
42
 
32
- span.addTags({
33
- 'out.host': node.hostname,
34
- 'out.port': node.port,
35
- ...moleculerTags(this, promise.ctx, config)
36
- })
37
- }
43
+ span.finish()
44
+ })
38
45
 
39
- return promise
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 client = require('./client')
6
- const server = require('./server')
5
+ const Plugin = require('../../dd-trace/src/plugins/plugin')
6
+ const MoleculerServerPlugin = require('./server')
7
+ const MoleculerClientPlugin = require('./client')
7
8
 
8
- module.exports = [].concat(client, server)
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
- function createWrapRegisterMiddlewares (tracer, config) {
6
- return function wrapRegisterMiddlewares (registerMiddlewares) {
7
- return function registerMiddlewaresWithTrace (userMiddlewares) {
8
- if (this.middlewares && this.middlewares.add) {
9
- this.middlewares.add(createMiddleware(tracer, config))
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
- return registerMiddlewares.apply(this, arguments)
13
- }
14
- }
15
- }
25
+ this.enter(span, store)
26
+ })
16
27
 
17
- function createMiddleware (tracer, config) {
18
- return {
19
- name: 'Datadog',
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
- if (childOf) {
37
- options.childOf = childOf
38
- }
32
+ span.finish()
33
+ })
39
34
 
40
- return tracer.trace('moleculer.action', options, () => next(ctx))
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:async-end`, () => {
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': this.config.service || `${this.tracer._service}-mysql`,
22
+ 'service.name': service,
22
23
  'span.type': 'sql',
23
24
  'span.kind': 'client',
24
25
  'db.type': 'mysql',
25
- 'db.user': conf.user,
26
- 'out.host': conf.host,
27
- 'out.port': conf.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 (conf.database) {
33
- span.setTag('db.name', conf.database)
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:async-end`, () => {
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:async-end`, defaultAsyncEnd)
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:async-end`, defaultAsyncEnd)
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 defaultAsyncEnd () {
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:async-end`, () => {
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:async-end`, () => {
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:async-end`, () => {
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:exit`, ({ req }) => {
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:async-end`, ({ request, res }) => {
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:async-end`, () => {
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.7.0'
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
- function incomingHttpEndTranslator (data) {
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)