dd-trace 2.7.1 → 2.9.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.
Files changed (77) 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 +2 -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 +5 -4
  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 +84 -92
  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-cassandra-driver/src/index.js +1 -5
  44. package/packages/datadog-plugin-couchbase/src/index.js +3 -4
  45. package/packages/datadog-plugin-cucumber/src/index.js +1 -9
  46. package/packages/datadog-plugin-dns/src/index.js +3 -4
  47. package/packages/datadog-plugin-elasticsearch/src/index.js +1 -5
  48. package/packages/datadog-plugin-hapi/src/index.js +34 -3
  49. package/packages/datadog-plugin-http/src/client.js +1 -3
  50. package/packages/datadog-plugin-http/src/server.js +0 -4
  51. package/packages/datadog-plugin-http2/src/server.js +3 -1
  52. package/packages/datadog-plugin-jest/src/index.js +2 -3
  53. package/packages/datadog-plugin-kafkajs/src/index.js +0 -4
  54. package/packages/datadog-plugin-memcached/src/index.js +1 -5
  55. package/packages/datadog-plugin-mocha/src/index.js +3 -7
  56. package/packages/datadog-plugin-moleculer/src/client.js +34 -44
  57. package/packages/datadog-plugin-moleculer/src/index.js +32 -3
  58. package/packages/datadog-plugin-moleculer/src/server.js +28 -50
  59. package/packages/datadog-plugin-mongodb-core/src/index.js +1 -5
  60. package/packages/datadog-plugin-mysql/src/index.js +19 -12
  61. package/packages/datadog-plugin-net/src/index.js +3 -7
  62. package/packages/datadog-plugin-pg/src/index.js +1 -5
  63. package/packages/datadog-plugin-redis/src/index.js +1 -5
  64. package/packages/datadog-plugin-rhea/src/index.js +1 -5
  65. package/packages/datadog-plugin-router/src/index.js +1 -1
  66. package/packages/datadog-plugin-sharedb/src/index.js +1 -5
  67. package/packages/datadog-plugin-tedious/src/index.js +1 -5
  68. package/packages/dd-trace/lib/version.js +1 -1
  69. package/packages/dd-trace/src/appsec/callbacks/ddwaf.js +2 -1
  70. package/packages/dd-trace/src/appsec/index.js +3 -3
  71. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +3 -1
  72. package/packages/dd-trace/src/plugins/plugin.js +0 -8
  73. package/packages/dd-trace/src/plugins/util/test.js +5 -1
  74. package/packages/dd-trace/src/plugins/util/web.js +3 -1
  75. package/scripts/install_plugin_modules.js +25 -15
  76. package/packages/datadog-plugin-hapi/src/route.js +0 -75
  77. package/packages/datadog-plugin-hapi/src/server.js +0 -204
@@ -31,10 +31,6 @@ class HttpServerPlugin extends Plugin {
31
31
  }
32
32
  })
33
33
 
34
- this.addSub('apm:http:server:request:end', () => {
35
- this.exit()
36
- })
37
-
38
34
  this.addSub('apm:http:server:request:error', (error) => {
39
35
  const span = storage.getStore().span
40
36
  span.addTags({
@@ -22,6 +22,7 @@ const HTTP_STATUS_CODE = tags.HTTP_STATUS_CODE
22
22
  const HTTP_ROUTE = tags.HTTP_ROUTE
23
23
  const HTTP_REQUEST_HEADERS = tags.HTTP_REQUEST_HEADERS
24
24
  const HTTP_RESPONSE_HEADERS = tags.HTTP_RESPONSE_HEADERS
25
+ const HTTP_USERAGENT = tags.HTTP_USERAGENT
25
26
  const MANUAL_DROP = tags.MANUAL_DROP
26
27
 
27
28
  const HTTP_STATUS_OK = 200
@@ -141,7 +142,8 @@ function addRequestTags (stream, headers) {
141
142
  [HTTP_METHOD]: headers[HTTP2_HEADER_METHOD],
142
143
  [HTTP_URL]: url.split('?')[0],
143
144
  [SPAN_KIND]: SERVER,
144
- [SPAN_TYPE]: WEB
145
+ [SPAN_TYPE]: WEB,
146
+ [HTTP_USERAGENT]: headers['user-agent']
145
147
  })
146
148
  }
147
149
 
@@ -48,15 +48,14 @@ class JestPlugin extends Plugin {
48
48
  this.enter(span, store)
49
49
  })
50
50
 
51
- this.addSub('ci:jest:test:end', (status) => {
51
+ this.addSub('ci:jest:test:finish', (status) => {
52
52
  const span = storage.getStore().span
53
53
  span.setTag(TEST_STATUS, status)
54
54
  span.finish()
55
55
  finishAllTraceSpans(span)
56
- this.exit()
57
56
  })
58
57
 
59
- this.addSub('ci:jest:test-suite:end', () => {
58
+ this.addSub('ci:jest:test-suite:finish', () => {
60
59
  this.tracer._exporter._writer.flush()
61
60
  })
62
61
 
@@ -60,10 +60,6 @@ class KafkajsPlugin extends Plugin {
60
60
  this.enter(span, store)
61
61
  })
62
62
 
63
- this.addSub(`apm:kafkajs:end`, () => {
64
- this.exit()
65
- })
66
-
67
63
  this.addSub(`apm:kafkajs:consume:error`, errorHandler)
68
64
 
69
65
  this.addSub(`apm:kafkajs:consume:finish`, finishHandler)
@@ -28,10 +28,6 @@ class MemcachedPlugin extends Plugin {
28
28
  this.enter(span, store)
29
29
  })
30
30
 
31
- this.addSub('apm:memcached:command:end', () => {
32
- this.exit()
33
- })
34
-
35
31
  this.addSub('apm:memcached:command:start:with-args', ({ client, server, query }) => {
36
32
  const span = storage.getStore().span
37
33
  span.addTags({
@@ -54,7 +50,7 @@ class MemcachedPlugin extends Plugin {
54
50
  span.setTag('error', err)
55
51
  })
56
52
 
57
- this.addSub('apm:memcached:command:async-end', () => {
53
+ this.addSub('apm:memcached:command:finish', () => {
58
54
  const span = storage.getStore().span
59
55
  span.finish()
60
56
  })
@@ -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.1'
1
+ module.exports = '2.9.1'
@@ -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
  }