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.
- package/LICENSE-3rdparty.csv +4 -3
- package/index.d.ts +27 -0
- package/package.json +4 -4
- package/packages/datadog-instrumentations/src/aws-sdk.js +5 -0
- package/packages/datadog-instrumentations/src/cassandra-driver.js +6 -3
- package/packages/datadog-instrumentations/src/elasticsearch.js +39 -1
- package/packages/datadog-instrumentations/src/express.js +23 -0
- package/packages/datadog-instrumentations/src/helpers/hooks.js +4 -0
- package/packages/datadog-instrumentations/src/kafkajs.js +2 -2
- package/packages/datadog-instrumentations/src/openai.js +50 -0
- package/packages/datadog-instrumentations/src/opensearch.js +2 -1
- package/packages/datadog-instrumentations/src/passport-http.js +22 -0
- package/packages/datadog-instrumentations/src/passport-local.js +22 -0
- package/packages/datadog-instrumentations/src/passport-utils.js +36 -0
- package/packages/datadog-instrumentations/src/pg.js +17 -4
- package/packages/datadog-plugin-aws-sdk/src/base.js +3 -3
- package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +1 -0
- package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +1 -0
- package/packages/datadog-plugin-aws-sdk/src/services/s3.js +1 -0
- package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -0
- package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +1 -0
- package/packages/datadog-plugin-cassandra-driver/src/index.js +6 -6
- package/packages/datadog-plugin-dns/src/lookup.js +1 -1
- package/packages/datadog-plugin-elasticsearch/src/index.js +2 -2
- package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +1 -1
- package/packages/datadog-plugin-graphql/src/execute.js +1 -1
- package/packages/datadog-plugin-graphql/src/parse.js +1 -1
- package/packages/datadog-plugin-graphql/src/resolve.js +0 -5
- package/packages/datadog-plugin-graphql/src/validate.js +1 -1
- package/packages/datadog-plugin-grpc/src/client.js +9 -3
- package/packages/datadog-plugin-grpc/src/server.js +3 -3
- package/packages/datadog-plugin-http/src/client.js +1 -1
- package/packages/datadog-plugin-http/src/server.js +38 -34
- package/packages/datadog-plugin-http2/src/client.js +0 -5
- package/packages/datadog-plugin-http2/src/server.js +23 -23
- package/packages/datadog-plugin-kafkajs/src/consumer.js +6 -1
- package/packages/datadog-plugin-kafkajs/src/producer.js +8 -1
- package/packages/datadog-plugin-mocha/src/index.js +3 -3
- package/packages/datadog-plugin-moleculer/src/client.js +3 -3
- package/packages/datadog-plugin-moleculer/src/server.js +2 -2
- package/packages/datadog-plugin-mongodb-core/src/index.js +15 -4
- package/packages/datadog-plugin-next/src/index.js +50 -52
- package/packages/datadog-plugin-openai/src/index.js +685 -0
- package/packages/datadog-plugin-openai/src/services.js +43 -0
- package/packages/datadog-plugin-oracledb/src/index.js +3 -10
- package/packages/datadog-plugin-pg/src/index.js +3 -11
- package/packages/datadog-plugin-sharedb/src/index.js +1 -1
- package/packages/dd-trace/src/appsec/channels.js +1 -0
- package/packages/dd-trace/src/appsec/iast/taint-tracking/origin-types.js +3 -2
- package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +12 -2
- package/packages/dd-trace/src/appsec/index.js +20 -0
- package/packages/dd-trace/src/appsec/passport.js +110 -0
- package/packages/dd-trace/src/appsec/sdk/track_event.js +14 -5
- package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +17 -4
- package/packages/dd-trace/src/ci-visibility/test-api-manual/test-api-manual-plugin.js +45 -0
- package/packages/dd-trace/src/config.js +38 -1
- package/packages/dd-trace/src/constants.js +2 -0
- package/packages/dd-trace/src/data_streams_context.js +15 -0
- package/packages/dd-trace/src/datastreams/pathway.js +58 -0
- package/packages/dd-trace/src/datastreams/processor.js +194 -0
- package/packages/dd-trace/src/datastreams/writer.js +66 -0
- package/packages/dd-trace/src/dogstatsd.js +12 -4
- package/packages/dd-trace/src/external-logger/src/index.js +4 -0
- package/packages/dd-trace/src/opentelemetry/span.js +1 -0
- package/packages/dd-trace/src/opentracing/span.js +32 -0
- package/packages/dd-trace/src/opentracing/tracer.js +3 -1
- package/packages/dd-trace/src/plugin_manager.js +7 -2
- package/packages/dd-trace/src/plugins/client.js +1 -0
- package/packages/dd-trace/src/plugins/database.js +2 -1
- package/packages/dd-trace/src/plugins/index.js +2 -0
- package/packages/dd-trace/src/plugins/outbound.js +59 -1
- package/packages/dd-trace/src/plugins/server.js +2 -0
- package/packages/dd-trace/src/plugins/tracing.js +5 -1
- package/packages/dd-trace/src/plugins/util/exec.js +2 -0
- package/packages/dd-trace/src/plugins/util/git.js +38 -10
- package/packages/dd-trace/src/plugins/util/user-provided-git.js +36 -2
- package/packages/dd-trace/src/profiling/config.js +34 -7
- package/packages/dd-trace/src/proxy.js +6 -0
- package/packages/dd-trace/src/service-naming/index.js +13 -1
- package/packages/dd-trace/src/service-naming/schemas/v0/index.js +2 -1
- package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +34 -1
- package/packages/dd-trace/src/service-naming/schemas/v0/web.js +27 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/index.js +2 -1
- package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +31 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/web.js +26 -0
- package/packages/dd-trace/src/telemetry/index.js +3 -0
- package/packages/dd-trace/src/telemetry/metrics.js +281 -0
- 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(
|
|
15
|
-
service: this.config.service ||
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
71
|
+
super.finish()
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
configure (config) {
|
|
@@ -1,63 +1,67 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const
|
|
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
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
28
|
+
span.setTag(COMPONENT, this.constructor.id)
|
|
24
29
|
|
|
25
|
-
|
|
26
|
-
|
|
30
|
+
this._parentStore = store
|
|
31
|
+
this.enter(span, { ...store, req, res })
|
|
27
32
|
|
|
28
|
-
|
|
33
|
+
const context = web.getContext(req)
|
|
29
34
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
35
|
+
if (!context.instrumented) {
|
|
36
|
+
context.res.writeHead = web.wrapWriteHead(context)
|
|
37
|
+
context.instrumented = true
|
|
38
|
+
}
|
|
34
39
|
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
45
|
+
error (error) {
|
|
46
|
+
web.addError(error)
|
|
47
|
+
}
|
|
43
48
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
this.enter(span, this._parentStore)
|
|
47
|
-
this._parentStore = undefined
|
|
48
|
-
})
|
|
49
|
+
finish ({ req }) {
|
|
50
|
+
const context = web.getContext(req)
|
|
49
51
|
|
|
50
|
-
|
|
51
|
-
const context = web.getContext(req)
|
|
52
|
+
if (!context || !context.res) return // Not created by a http.Server instance.
|
|
52
53
|
|
|
53
|
-
|
|
54
|
+
if (incomingHttpRequestEnd.hasSubscribers) {
|
|
55
|
+
incomingHttpRequestEnd.publish({ req, res: context.res })
|
|
56
|
+
}
|
|
54
57
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
+
web.finishAll(context)
|
|
59
|
+
}
|
|
58
60
|
|
|
59
|
-
|
|
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) {
|
|
@@ -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
|
|
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
|
|
10
|
+
class Http2ServerPlugin extends ServerPlugin {
|
|
11
11
|
static get id () {
|
|
12
12
|
return 'http2'
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
addTraceSub (eventName, handler) {
|
|
16
|
+
this.addSub(`apm:${this.constructor.id}:server:${this.operation}:${eventName}`, handler)
|
|
17
|
+
}
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
23
|
+
span.setTag(COMPONENT, this.constructor.id)
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
this.enter(span, { ...store, req, res })
|
|
25
26
|
|
|
26
|
-
|
|
27
|
+
const context = web.getContext(req)
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
if (!context.instrumented) {
|
|
30
|
+
context.res.writeHead = web.wrapWriteHead(context)
|
|
31
|
+
context.instrumented = true
|
|
32
|
+
}
|
|
33
|
+
}
|
|
33
34
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
})
|
|
35
|
+
finish ({ req }) {
|
|
36
|
+
const context = web.getContext(req)
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
const context = web.getContext(req)
|
|
38
|
+
if (!context || !context.res) return // Not created by a http.Server instance.
|
|
40
39
|
|
|
41
|
-
|
|
40
|
+
web.finishAll(context)
|
|
41
|
+
}
|
|
42
42
|
|
|
43
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
34
|
+
analyticsSampler.sample(span, this.config.measured, true)
|
|
41
35
|
|
|
42
|
-
this.
|
|
43
|
-
const store = storage.getStore()
|
|
36
|
+
this.enter(span, store)
|
|
44
37
|
|
|
45
|
-
|
|
38
|
+
this._requests.set(span, req)
|
|
39
|
+
}
|
|
46
40
|
|
|
47
|
-
|
|
48
|
-
|
|
41
|
+
finish ({ req, res }) {
|
|
42
|
+
const store = storage.getStore()
|
|
49
43
|
|
|
50
|
-
|
|
51
|
-
span.setTag('error', true)
|
|
52
|
-
}
|
|
44
|
+
if (!store) return
|
|
53
45
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
})
|
|
46
|
+
const span = store.span
|
|
47
|
+
const error = span.context()._tags['error']
|
|
57
48
|
|
|
58
|
-
|
|
49
|
+
if (!this.config.validateStatus(res.statusCode) && !error) {
|
|
50
|
+
span.setTag('error', true)
|
|
51
|
+
}
|
|
59
52
|
|
|
60
|
-
|
|
53
|
+
span.addTags({
|
|
54
|
+
'http.status_code': res.statusCode
|
|
61
55
|
})
|
|
62
56
|
|
|
63
|
-
this.
|
|
64
|
-
const store = storage.getStore()
|
|
57
|
+
this.config.hooks.request(span, req, res)
|
|
65
58
|
|
|
66
|
-
|
|
59
|
+
span.finish()
|
|
60
|
+
}
|
|
67
61
|
|
|
68
|
-
|
|
69
|
-
|
|
62
|
+
pageLoad ({ page }) {
|
|
63
|
+
const store = storage.getStore()
|
|
70
64
|
|
|
71
|
-
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
|