dd-trace 2.37.0 → 2.39.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 (88) hide show
  1. package/LICENSE-3rdparty.csv +4 -3
  2. package/index.d.ts +27 -0
  3. package/package.json +4 -4
  4. package/packages/datadog-instrumentations/src/aws-sdk.js +5 -0
  5. package/packages/datadog-instrumentations/src/cassandra-driver.js +6 -3
  6. package/packages/datadog-instrumentations/src/elasticsearch.js +39 -1
  7. package/packages/datadog-instrumentations/src/express.js +23 -0
  8. package/packages/datadog-instrumentations/src/helpers/hooks.js +4 -0
  9. package/packages/datadog-instrumentations/src/kafkajs.js +2 -2
  10. package/packages/datadog-instrumentations/src/openai.js +50 -0
  11. package/packages/datadog-instrumentations/src/opensearch.js +2 -1
  12. package/packages/datadog-instrumentations/src/passport-http.js +22 -0
  13. package/packages/datadog-instrumentations/src/passport-local.js +22 -0
  14. package/packages/datadog-instrumentations/src/passport-utils.js +36 -0
  15. package/packages/datadog-instrumentations/src/pg.js +17 -4
  16. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -3
  17. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +1 -0
  18. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +1 -0
  19. package/packages/datadog-plugin-aws-sdk/src/services/s3.js +1 -0
  20. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -0
  21. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +1 -0
  22. package/packages/datadog-plugin-cassandra-driver/src/index.js +6 -6
  23. package/packages/datadog-plugin-dns/src/lookup.js +1 -1
  24. package/packages/datadog-plugin-elasticsearch/src/index.js +2 -2
  25. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +1 -1
  26. package/packages/datadog-plugin-graphql/src/execute.js +1 -1
  27. package/packages/datadog-plugin-graphql/src/parse.js +1 -1
  28. package/packages/datadog-plugin-graphql/src/resolve.js +0 -5
  29. package/packages/datadog-plugin-graphql/src/validate.js +1 -1
  30. package/packages/datadog-plugin-grpc/src/client.js +9 -3
  31. package/packages/datadog-plugin-grpc/src/server.js +3 -3
  32. package/packages/datadog-plugin-http/src/client.js +1 -1
  33. package/packages/datadog-plugin-http/src/server.js +38 -34
  34. package/packages/datadog-plugin-http2/src/client.js +0 -5
  35. package/packages/datadog-plugin-http2/src/server.js +23 -23
  36. package/packages/datadog-plugin-kafkajs/src/consumer.js +6 -1
  37. package/packages/datadog-plugin-kafkajs/src/producer.js +8 -1
  38. package/packages/datadog-plugin-mocha/src/index.js +3 -3
  39. package/packages/datadog-plugin-moleculer/src/client.js +3 -3
  40. package/packages/datadog-plugin-moleculer/src/server.js +2 -2
  41. package/packages/datadog-plugin-mongodb-core/src/index.js +15 -4
  42. package/packages/datadog-plugin-next/src/index.js +50 -52
  43. package/packages/datadog-plugin-openai/src/index.js +685 -0
  44. package/packages/datadog-plugin-openai/src/services.js +43 -0
  45. package/packages/datadog-plugin-oracledb/src/index.js +3 -10
  46. package/packages/datadog-plugin-pg/src/index.js +3 -11
  47. package/packages/datadog-plugin-sharedb/src/index.js +1 -1
  48. package/packages/dd-trace/src/appsec/channels.js +1 -0
  49. package/packages/dd-trace/src/appsec/iast/taint-tracking/origin-types.js +3 -2
  50. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +12 -2
  51. package/packages/dd-trace/src/appsec/index.js +20 -0
  52. package/packages/dd-trace/src/appsec/passport.js +110 -0
  53. package/packages/dd-trace/src/appsec/sdk/track_event.js +14 -5
  54. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +17 -4
  55. package/packages/dd-trace/src/ci-visibility/test-api-manual/test-api-manual-plugin.js +45 -0
  56. package/packages/dd-trace/src/config.js +38 -1
  57. package/packages/dd-trace/src/constants.js +2 -0
  58. package/packages/dd-trace/src/data_streams_context.js +15 -0
  59. package/packages/dd-trace/src/datastreams/pathway.js +58 -0
  60. package/packages/dd-trace/src/datastreams/processor.js +194 -0
  61. package/packages/dd-trace/src/datastreams/writer.js +66 -0
  62. package/packages/dd-trace/src/dogstatsd.js +12 -4
  63. package/packages/dd-trace/src/external-logger/src/index.js +4 -0
  64. package/packages/dd-trace/src/opentelemetry/span.js +1 -0
  65. package/packages/dd-trace/src/opentracing/span.js +32 -0
  66. package/packages/dd-trace/src/opentracing/tracer.js +3 -1
  67. package/packages/dd-trace/src/plugin_manager.js +7 -2
  68. package/packages/dd-trace/src/plugins/client.js +1 -0
  69. package/packages/dd-trace/src/plugins/database.js +2 -1
  70. package/packages/dd-trace/src/plugins/index.js +2 -0
  71. package/packages/dd-trace/src/plugins/outbound.js +59 -1
  72. package/packages/dd-trace/src/plugins/server.js +2 -0
  73. package/packages/dd-trace/src/plugins/tracing.js +5 -1
  74. package/packages/dd-trace/src/plugins/util/exec.js +2 -0
  75. package/packages/dd-trace/src/plugins/util/git.js +38 -10
  76. package/packages/dd-trace/src/plugins/util/user-provided-git.js +36 -2
  77. package/packages/dd-trace/src/profiling/config.js +34 -7
  78. package/packages/dd-trace/src/proxy.js +6 -0
  79. package/packages/dd-trace/src/service-naming/index.js +13 -1
  80. package/packages/dd-trace/src/service-naming/schemas/v0/index.js +2 -1
  81. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +34 -1
  82. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +27 -0
  83. package/packages/dd-trace/src/service-naming/schemas/v1/index.js +2 -1
  84. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +31 -0
  85. package/packages/dd-trace/src/service-naming/schemas/v1/web.js +26 -0
  86. package/packages/dd-trace/src/telemetry/index.js +3 -0
  87. package/packages/dd-trace/src/telemetry/metrics.js +281 -0
  88. package/packages/dd-trace/src/tracer.js +19 -1
@@ -7,12 +7,13 @@ const { addMetadataTags, getFilter, getMethodMetadata } = require('./util')
7
7
  class GrpcClientPlugin extends ClientPlugin {
8
8
  static get id () { return 'grpc' }
9
9
  static get operation () { return 'client:request' }
10
+ static get peerServicePrecursors () { return ['rpc.service'] }
10
11
 
11
12
  start ({ metadata, path, type }) {
12
13
  const metadataFilter = this.config.metadataFilter
13
14
  const method = getMethodMetadata(path, type)
14
- const span = this.startSpan('grpc.request', {
15
- service: this.config.service || `${this.tracer._service}-grpc-client`,
15
+ const span = this.startSpan(this.operationName(), {
16
+ service: this.config.service || this.serviceName(),
16
17
  resource: path,
17
18
  kind: 'client',
18
19
  type: 'http',
@@ -29,6 +30,11 @@ class GrpcClientPlugin extends ClientPlugin {
29
30
  }
30
31
  })
31
32
 
33
+ // needed as precursor for peer.service
34
+ if (method.service && method.package) {
35
+ span.setTag('rpc.service', method.package + '.' + method.service)
36
+ }
37
+
32
38
  if (metadata) {
33
39
  addMetadataTags(span, metadata, metadataFilter, 'request')
34
40
  inject(this.tracer, span, metadata)
@@ -57,7 +63,7 @@ class GrpcClientPlugin extends ClientPlugin {
57
63
  addMetadataTags(span, metadata, metadataFilter, 'response')
58
64
  }
59
65
 
60
- span.finish()
66
+ super.finish()
61
67
  }
62
68
 
63
69
  configure (config) {
@@ -24,9 +24,9 @@ class GrpcServerPlugin extends ServerPlugin {
24
24
  const metadataFilter = this.config.metadataFilter
25
25
  const childOf = extract(this.tracer, metadata)
26
26
  const method = getMethodMetadata(name, type)
27
- const span = this.startSpan('grpc.request', {
27
+ const span = this.startSpan(this.operationName(), {
28
28
  childOf,
29
- service: this.config.service,
29
+ service: this.config.service || this.serviceName(),
30
30
  resource: name,
31
31
  kind: 'server',
32
32
  type: 'web',
@@ -68,7 +68,7 @@ class GrpcServerPlugin extends ServerPlugin {
68
68
  addMetadataTags(span, trailer, metadataFilter, 'response')
69
69
  }
70
70
 
71
- span.finish()
71
+ super.finish()
72
72
  }
73
73
 
74
74
  configure (config) {
@@ -87,7 +87,7 @@ class HttpClientPlugin extends ClientPlugin {
87
87
  addRequestHeaders(req, span, this.config)
88
88
 
89
89
  this.config.hooks.request(span, req, res)
90
- span.finish()
90
+ super.finish()
91
91
  }
92
92
 
93
93
  error (err) {
@@ -1,63 +1,67 @@
1
1
  'use strict'
2
2
 
3
- const Plugin = require('../../dd-trace/src/plugins/plugin')
3
+ const ServerPlugin = require('../../dd-trace/src/plugins/server')
4
4
  const { storage } = require('../../datadog-core')
5
5
  const web = require('../../dd-trace/src/plugins/util/web')
6
6
  const { incomingHttpRequestStart, incomingHttpRequestEnd } = require('../../dd-trace/src/appsec/channels')
7
7
  const { COMPONENT } = require('../../dd-trace/src/constants')
8
8
 
9
- class HttpServerPlugin extends Plugin {
9
+ class HttpServerPlugin extends ServerPlugin {
10
10
  static get id () {
11
11
  return 'http'
12
12
  }
13
13
 
14
14
  constructor (...args) {
15
15
  super(...args)
16
-
17
16
  this._parentStore = undefined
17
+ this.addTraceSub('exit', message => this.exit(message))
18
+ }
19
+
20
+ addTraceSub (eventName, handler) {
21
+ this.addSub(`apm:${this.constructor.id}:server:${this.operation}:${eventName}`, handler)
22
+ }
18
23
 
19
- this.addSub('apm:http:server:request:start', ({ req, res, abortController }) => {
20
- const store = storage.getStore()
21
- const span = web.startSpan(this.tracer, this.config, req, res, 'http.request')
24
+ start ({ req, res, abortController }) {
25
+ const store = storage.getStore()
26
+ const span = web.startSpan(this.tracer, this.config, req, res, 'http.request') // v2.x branch uses wrong value
22
27
 
23
- span.setTag(COMPONENT, this.constructor.id)
28
+ span.setTag(COMPONENT, this.constructor.id)
24
29
 
25
- this._parentStore = store
26
- this.enter(span, { ...store, req, res })
30
+ this._parentStore = store
31
+ this.enter(span, { ...store, req, res })
27
32
 
28
- const context = web.getContext(req)
33
+ const context = web.getContext(req)
29
34
 
30
- if (!context.instrumented) {
31
- context.res.writeHead = web.wrapWriteHead(context)
32
- context.instrumented = true
33
- }
35
+ if (!context.instrumented) {
36
+ context.res.writeHead = web.wrapWriteHead(context)
37
+ context.instrumented = true
38
+ }
34
39
 
35
- if (incomingHttpRequestStart.hasSubscribers) {
36
- incomingHttpRequestStart.publish({ req, res, abortController }) // TODO: no need to make a new object here
37
- }
38
- })
40
+ if (incomingHttpRequestStart.hasSubscribers) {
41
+ incomingHttpRequestStart.publish({ req, res, abortController }) // TODO: no need to make a new object here
42
+ }
43
+ }
39
44
 
40
- this.addSub('apm:http:server:request:error', (error) => {
41
- web.addError(error)
42
- })
45
+ error (error) {
46
+ web.addError(error)
47
+ }
43
48
 
44
- this.addSub('apm:http:server:request:exit', ({ req }) => {
45
- const span = this._parentStore && this._parentStore.span
46
- this.enter(span, this._parentStore)
47
- this._parentStore = undefined
48
- })
49
+ finish ({ req }) {
50
+ const context = web.getContext(req)
49
51
 
50
- this.addSub('apm:http:server:request:finish', ({ req }) => {
51
- const context = web.getContext(req)
52
+ if (!context || !context.res) return // Not created by a http.Server instance.
52
53
 
53
- if (!context || !context.res) return // Not created by a http.Server instance.
54
+ if (incomingHttpRequestEnd.hasSubscribers) {
55
+ incomingHttpRequestEnd.publish({ req, res: context.res })
56
+ }
54
57
 
55
- if (incomingHttpRequestEnd.hasSubscribers) {
56
- incomingHttpRequestEnd.publish({ req, res: context.res })
57
- }
58
+ web.finishAll(context)
59
+ }
58
60
 
59
- web.finishAll(context)
60
- })
61
+ exit ({ req }) {
62
+ const span = this._parentStore && this._parentStore.span
63
+ this.enter(span, this._parentStore)
64
+ this._parentStore = undefined
61
65
  }
62
66
 
63
67
  configure (config) {
@@ -93,11 +93,6 @@ class Http2ClientPlugin extends ClientPlugin {
93
93
  this.enter(span, store)
94
94
  }
95
95
 
96
- finish () {
97
- const span = storage.getStore().span
98
- span.finish()
99
- }
100
-
101
96
  configure (config) {
102
97
  return super.configure(normalizeConfig(config))
103
98
  }
@@ -2,46 +2,46 @@
2
2
 
3
3
  // Plugin temporarily disabled. See https://github.com/DataDog/dd-trace-js/issues/312
4
4
 
5
- const Plugin = require('../../dd-trace/src/plugins/plugin')
5
+ const ServerPlugin = require('../../dd-trace/src/plugins/server')
6
6
  const { storage } = require('../../datadog-core')
7
7
  const web = require('../../dd-trace/src/plugins/util/web')
8
8
  const { COMPONENT } = require('../../dd-trace/src/constants')
9
9
 
10
- class Http2ServerPlugin extends Plugin {
10
+ class Http2ServerPlugin extends ServerPlugin {
11
11
  static get id () {
12
12
  return 'http2'
13
13
  }
14
14
 
15
- constructor (...args) {
16
- super(...args)
15
+ addTraceSub (eventName, handler) {
16
+ this.addSub(`apm:${this.constructor.id}:server:${this.operation}:${eventName}`, handler)
17
+ }
17
18
 
18
- this.addSub('apm:http2:server:request:start', ({ req, res }) => {
19
- const store = storage.getStore()
20
- const span = web.startSpan(this.tracer, this.config, req, res, 'web.request')
19
+ start ({ req, res }) {
20
+ const store = storage.getStore()
21
+ const span = web.startSpan(this.tracer, this.config, req, res, 'web.request')
21
22
 
22
- span.setTag(COMPONENT, this.constructor.id)
23
+ span.setTag(COMPONENT, this.constructor.id)
23
24
 
24
- this.enter(span, { ...store, req, res })
25
+ this.enter(span, { ...store, req, res })
25
26
 
26
- const context = web.getContext(req)
27
+ const context = web.getContext(req)
27
28
 
28
- if (!context.instrumented) {
29
- context.res.writeHead = web.wrapWriteHead(context)
30
- context.instrumented = true
31
- }
32
- })
29
+ if (!context.instrumented) {
30
+ context.res.writeHead = web.wrapWriteHead(context)
31
+ context.instrumented = true
32
+ }
33
+ }
33
34
 
34
- this.addSub('apm:http2:server:request:error', (error) => {
35
- web.addError(error)
36
- })
35
+ finish ({ req }) {
36
+ const context = web.getContext(req)
37
37
 
38
- this.addSub('apm:http2:server:request:finish', ({ req }) => {
39
- const context = web.getContext(req)
38
+ if (!context || !context.res) return // Not created by a http.Server instance.
40
39
 
41
- if (!context || !context.res) return // Not created by a http.Server instance.
40
+ web.finishAll(context)
41
+ }
42
42
 
43
- web.finishAll(context)
44
- })
43
+ error (error) {
44
+ web.addError(error)
45
45
  }
46
46
 
47
47
  configure (config) {
@@ -6,7 +6,12 @@ class KafkajsConsumerPlugin extends ConsumerPlugin {
6
6
  static get id () { return 'kafkajs' }
7
7
  static get operation () { return 'consume' }
8
8
 
9
- start ({ topic, partition, message }) {
9
+ start ({ topic, partition, message, groupId }) {
10
+ if (this.config.dsmEnabled) {
11
+ this.tracer.decodeDataStreamsContext(message.headers['dd-pathway-ctx'])
12
+ this.tracer
13
+ .setCheckpoint(['direction:in', `group:${groupId}`, `topic:${topic}`, 'type:kafka'])
14
+ }
10
15
  const childOf = extract(this.tracer, message.headers)
11
16
  this.startSpan({
12
17
  childOf,
@@ -1,12 +1,19 @@
1
1
  'use strict'
2
2
 
3
3
  const ProducerPlugin = require('../../dd-trace/src/plugins/producer')
4
+ const { encodePathwayContext } = require('../../dd-trace/src/datastreams/pathway')
4
5
 
5
6
  class KafkajsProducerPlugin extends ProducerPlugin {
6
7
  static get id () { return 'kafkajs' }
7
8
  static get operation () { return 'produce' }
8
9
 
9
10
  start ({ topic, messages }) {
11
+ let pathwayCtx
12
+ if (this.config.dsmEnabled) {
13
+ const dataStreamsContext = this.tracer
14
+ .setCheckpoint(['direction:out', `topic:${topic}`, 'type:kafka'])
15
+ pathwayCtx = encodePathwayContext(dataStreamsContext)
16
+ }
10
17
  const span = this.startSpan({
11
18
  resource: topic,
12
19
  meta: {
@@ -17,9 +24,9 @@ class KafkajsProducerPlugin extends ProducerPlugin {
17
24
  'kafka.batch_size': messages.length
18
25
  }
19
26
  })
20
-
21
27
  for (const message of messages) {
22
28
  if (typeof message === 'object') {
29
+ if (this.config.dsmEnabled) message.headers['dd-pathway-ctx'] = pathwayCtx
23
30
  this.tracer.inject(span, 'text_map', message.headers)
24
31
  }
25
32
  }
@@ -70,7 +70,7 @@ class MochaPlugin extends CiPlugin {
70
70
  this.addSub('ci:mocha:test-suite:finish', (status) => {
71
71
  const store = storage.getStore()
72
72
  if (store && store.span) {
73
- const span = storage.getStore().span
73
+ const span = store.span
74
74
  // the test status of the suite may have been set in ci:mocha:test-suite:error already
75
75
  if (!span.context()._tags[TEST_STATUS]) {
76
76
  span.setTag(TEST_STATUS, status)
@@ -82,7 +82,7 @@ class MochaPlugin extends CiPlugin {
82
82
  this.addSub('ci:mocha:test-suite:error', (err) => {
83
83
  const store = storage.getStore()
84
84
  if (store && store.span) {
85
- const span = storage.getStore().span
85
+ const span = store.span
86
86
  span.setTag('error', err)
87
87
  span.setTag(TEST_STATUS, 'fail')
88
88
  }
@@ -99,7 +99,7 @@ class MochaPlugin extends CiPlugin {
99
99
  const store = storage.getStore()
100
100
 
101
101
  if (store && store.span) {
102
- const span = storage.getStore().span
102
+ const span = store.span
103
103
 
104
104
  span.setTag(TEST_STATUS, status)
105
105
 
@@ -8,8 +8,8 @@ class MoleculerClientPlugin extends ClientPlugin {
8
8
  static get operation () { return 'call' }
9
9
 
10
10
  start ({ actionName, opts }) {
11
- const span = this.startSpan('moleculer.call', {
12
- service: this.config.service,
11
+ const span = this.startSpan(this.operationName(), {
12
+ service: this.config.service || this.serviceName(),
13
13
  resource: actionName,
14
14
  kind: 'client'
15
15
  })
@@ -29,7 +29,7 @@ class MoleculerClientPlugin extends ClientPlugin {
29
29
  span.addTags(moleculerTags(broker, ctx, this.config))
30
30
  }
31
31
 
32
- span.finish()
32
+ super.finish()
33
33
  }
34
34
  }
35
35
 
@@ -10,9 +10,9 @@ class MoleculerServerPlugin extends ServerPlugin {
10
10
  start ({ action, ctx, broker }) {
11
11
  const followsFrom = this.tracer.extract('text_map', ctx.meta)
12
12
 
13
- this.startSpan('moleculer.action', {
13
+ this.startSpan(this.operationName(), {
14
14
  childOf: followsFrom || this.activeSpan,
15
- service: this.config.service,
15
+ service: this.config.service || this.serviceName(),
16
16
  resource: action.name,
17
17
  kind: 'server',
18
18
  type: 'web',
@@ -5,17 +5,19 @@ const DatabasePlugin = require('../../dd-trace/src/plugins/database')
5
5
  class MongodbCorePlugin extends DatabasePlugin {
6
6
  static get id () { return 'mongodb-core' }
7
7
  static get component () { return 'mongodb' }
8
-
8
+ // avoid using db.name for peer.service since it includes the collection name
9
+ // should be removed if one day this will be fixed
10
+ static get peerServicePrecursors () { return [] }
9
11
  start ({ ns, ops, options = {}, name }) {
10
12
  const query = getQuery(ops)
11
13
  const resource = truncate(getResource(this, ns, query, name))
12
-
13
- this.startSpan('mongodb.query', {
14
- service: this.config.service,
14
+ this.startSpan(this.operationName(), {
15
+ service: this.serviceName(this.config),
15
16
  resource,
16
17
  type: 'mongodb',
17
18
  kind: 'client',
18
19
  meta: {
20
+ // this is not technically correct since it includes the collection but we changing will break customer stuff
19
21
  'db.name': ns,
20
22
  'mongodb.query': query,
21
23
  'out.host': options.host,
@@ -23,6 +25,15 @@ class MongodbCorePlugin extends DatabasePlugin {
23
25
  }
24
26
  })
25
27
  }
28
+
29
+ getPeerService (tags) {
30
+ const ns = tags['db.name']
31
+ if (ns && tags['peer.service'] === undefined) {
32
+ // the mongo ns is either dbName either dbName.collection. So we keep the first part
33
+ tags['peer.service'] = ns.split('.', 1)[0]
34
+ }
35
+ return super.getPeerService(tags)
36
+ }
26
37
  }
27
38
 
28
39
  function getQuery (cmd) {
@@ -1,84 +1,82 @@
1
1
  'use strict'
2
2
 
3
- const Plugin = require('../../dd-trace/src/plugins/plugin')
3
+ const ServerPlugin = require('../../dd-trace/src/plugins/server')
4
4
  const { storage } = require('../../datadog-core')
5
5
  const analyticsSampler = require('../../dd-trace/src/analytics_sampler')
6
6
  const { COMPONENT } = require('../../dd-trace/src/constants')
7
7
 
8
- class NextPlugin extends Plugin {
8
+ class NextPlugin extends ServerPlugin {
9
9
  static get id () {
10
10
  return 'next'
11
11
  }
12
12
 
13
13
  constructor (...args) {
14
14
  super(...args)
15
-
16
15
  this._requests = new WeakMap()
16
+ this.addSub('apm:next:page:load', message => this.pageLoad(message))
17
+ }
17
18
 
18
- this.addSub('apm:next:request:start', ({ req, res }) => {
19
- const store = storage.getStore()
20
- const childOf = store ? store.span : store
21
- const span = this.tracer.startSpan('next.request', {
22
- childOf,
23
- tags: {
24
- [COMPONENT]: this.constructor.id,
25
- 'service.name': this.config.service || this.tracer._service,
26
- 'resource.name': req.method,
27
- 'span.type': 'web',
28
- 'span.kind': 'server',
29
- 'http.method': req.method
30
- }
31
- })
32
-
33
- analyticsSampler.sample(span, this.config.measured, true)
34
-
35
- this.enter(span, store)
36
-
37
- this._requests.set(span, req)
19
+ start ({ req, res }) {
20
+ const store = storage.getStore()
21
+ const childOf = store ? store.span : store
22
+ const span = this.tracer.startSpan('next.request', {
23
+ childOf,
24
+ tags: {
25
+ [COMPONENT]: this.constructor.id,
26
+ 'service.name': this.config.service || this.tracer._service,
27
+ 'resource.name': req.method,
28
+ 'span.type': 'web',
29
+ 'span.kind': 'server',
30
+ 'http.method': req.method
31
+ }
38
32
  })
39
33
 
40
- this.addSub('apm:next:request:error', this.addError)
34
+ analyticsSampler.sample(span, this.config.measured, true)
41
35
 
42
- this.addSub('apm:next:request:finish', ({ req, res }) => {
43
- const store = storage.getStore()
36
+ this.enter(span, store)
44
37
 
45
- if (!store) return
38
+ this._requests.set(span, req)
39
+ }
46
40
 
47
- const span = store.span
48
- const error = span.context()._tags['error']
41
+ finish ({ req, res }) {
42
+ const store = storage.getStore()
49
43
 
50
- if (!this.config.validateStatus(res.statusCode) && !error) {
51
- span.setTag('error', true)
52
- }
44
+ if (!store) return
53
45
 
54
- span.addTags({
55
- 'http.status_code': res.statusCode
56
- })
46
+ const span = store.span
47
+ const error = span.context()._tags['error']
57
48
 
58
- this.config.hooks.request(span, req, res)
49
+ if (!this.config.validateStatus(res.statusCode) && !error) {
50
+ span.setTag('error', true)
51
+ }
59
52
 
60
- span.finish()
53
+ span.addTags({
54
+ 'http.status_code': res.statusCode
61
55
  })
62
56
 
63
- this.addSub('apm:next:page:load', ({ page }) => {
64
- const store = storage.getStore()
57
+ this.config.hooks.request(span, req, res)
65
58
 
66
- if (!store) return
59
+ span.finish()
60
+ }
67
61
 
68
- const span = store.span
69
- const req = this._requests.get(span)
62
+ pageLoad ({ page }) {
63
+ const store = storage.getStore()
70
64
 
71
- // Only use error page names if there's not already a name
72
- const current = span.context()._tags['next.page']
73
- if (current && (page === '/404' || page === '/500' || page === '/_error')) {
74
- return
75
- }
65
+ if (!store) return
76
66
 
77
- span.addTags({
78
- [COMPONENT]: this.constructor.id,
79
- 'resource.name': `${req.method} ${page}`.trim(),
80
- 'next.page': page
81
- })
67
+ const span = store.span
68
+ const req = this._requests.get(span)
69
+
70
+ // Only use error page names if there's not already a name
71
+ const current = span.context()._tags['next.page']
72
+ if (current && (page === '/404' || page === '/500' || page === '/_error')) {
73
+ return
74
+ }
75
+
76
+ span.addTags({
77
+ [COMPONENT]: this.constructor.id,
78
+ 'resource.name': `${req.method} ${page}`.trim(),
79
+ 'next.page': page
82
80
  })
83
81
  }
84
82