dd-trace 5.97.0 → 5.98.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/index.d.ts +26 -2
- package/package.json +1 -1
- package/packages/datadog-instrumentations/src/cucumber.js +65 -3
- package/packages/datadog-instrumentations/src/cypress-config.js +31 -37
- package/packages/datadog-instrumentations/src/jest.js +104 -12
- package/packages/datadog-instrumentations/src/mocha/utils.js +8 -0
- package/packages/datadog-instrumentations/src/redis.js +12 -6
- package/packages/datadog-plugin-aws-sdk/src/base.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +1 -0
- package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +1 -0
- package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +1 -0
- package/packages/datadog-plugin-aws-sdk/src/services/redshift.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-cucumber/src/index.js +6 -0
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +109 -1
- package/packages/datadog-plugin-cypress/src/index.js +59 -2
- package/packages/datadog-plugin-fs/src/index.js +1 -1
- package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +2 -1
- package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-push-subscription.js +2 -7
- package/packages/datadog-plugin-http/src/client.js +1 -1
- package/packages/datadog-plugin-http/src/server.js +10 -2
- package/packages/datadog-plugin-http2/src/client.js +1 -1
- package/packages/datadog-plugin-http2/src/server.js +10 -2
- package/packages/datadog-plugin-mongodb-core/src/index.js +3 -3
- package/packages/datadog-plugin-mysql/src/index.js +1 -1
- package/packages/datadog-plugin-next/src/index.js +8 -2
- package/packages/datadog-plugin-pg/src/index.js +1 -1
- package/packages/datadog-plugin-tedious/src/index.js +1 -1
- package/packages/datadog-plugin-ws/src/close.js +1 -1
- package/packages/datadog-plugin-ws/src/receiver.js +1 -1
- package/packages/dd-trace/src/aiguard/sdk.js +22 -22
- package/packages/dd-trace/src/appsec/blocked_templates.js +4 -3
- package/packages/dd-trace/src/appsec/blocking.js +62 -34
- package/packages/dd-trace/src/appsec/sdk/set_user.js +1 -1
- package/packages/dd-trace/src/appsec/sdk/track_event.js +5 -5
- package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -2
- package/packages/dd-trace/src/appsec/sdk/utils.js +4 -2
- package/packages/dd-trace/src/config/defaults.js +0 -1
- package/packages/dd-trace/src/config/generated-config-types.d.ts +5 -0
- package/packages/dd-trace/src/config/index.js +55 -28
- package/packages/dd-trace/src/config/supported-configurations.json +61 -4
- package/packages/dd-trace/src/constants.js +1 -0
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +5 -2
- package/packages/dd-trace/src/encode/0.4.js +7 -6
- package/packages/dd-trace/src/encode/span-stats.js +4 -1
- package/packages/dd-trace/src/log/index.js +0 -10
- package/packages/dd-trace/src/openfeature/remote_config.js +6 -1
- package/packages/dd-trace/src/opentelemetry/context_manager.js +6 -4
- package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +17 -2
- package/packages/dd-trace/src/opentelemetry/otlp/protobuf_loader.js +14 -2
- package/packages/dd-trace/src/opentelemetry/otlp/trace.proto +358 -0
- package/packages/dd-trace/src/opentelemetry/otlp/trace_service.proto +78 -0
- package/packages/dd-trace/src/opentelemetry/trace/index.js +75 -0
- package/packages/dd-trace/src/opentelemetry/trace/otlp_http_trace_exporter.js +66 -0
- package/packages/dd-trace/src/opentelemetry/trace/otlp_transformer.js +332 -0
- package/packages/dd-trace/src/opentracing/tracer.js +9 -4
- package/packages/dd-trace/src/plugins/log_plugin.js +3 -0
- package/packages/dd-trace/src/plugins/plugin.js +6 -11
- package/packages/dd-trace/src/plugins/storage.js +2 -2
- package/packages/dd-trace/src/plugins/tracing.js +22 -5
- package/packages/dd-trace/src/plugins/util/test.js +2 -0
- package/packages/dd-trace/src/plugins/util/web.js +6 -88
- package/packages/dd-trace/src/profiling/profiler.js +34 -77
- package/packages/dd-trace/src/proxy.js +8 -3
- package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +15 -11
- package/packages/dd-trace/src/service-naming/index.js +1 -1
- package/packages/dd-trace/src/service-naming/schemas/definition.js +4 -1
- package/packages/dd-trace/src/service-naming/schemas/util.js +15 -1
- package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +24 -1
- package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +60 -0
- package/packages/dd-trace/src/service-naming/schemas/v0/web.js +17 -1
- package/packages/dd-trace/src/service-naming/schemas/v0/websocket.js +5 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +17 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/web.js +11 -1
- package/packages/dd-trace/src/service-naming/schemas/v1/websocket.js +6 -0
- package/packages/dd-trace/src/span_stats.js +5 -1
- package/packages/dd-trace/src/tracer.js +2 -2
- package/vendor/dist/@apm-js-collab/code-transformer/index.js +28 -6
- package/vendor/dist/protobufjs/index.js +1 -1
- package/packages/dd-trace/src/log/utils.js +0 -16
|
@@ -7,8 +7,9 @@ const log = require('../../log')
|
|
|
7
7
|
const tags = require('../../../../../ext/tags')
|
|
8
8
|
const types = require('../../../../../ext/types')
|
|
9
9
|
const kinds = require('../../../../../ext/kinds')
|
|
10
|
-
const { ERROR_MESSAGE
|
|
10
|
+
const { ERROR_MESSAGE } = require('../../constants')
|
|
11
11
|
const TracingPlugin = require('../tracing')
|
|
12
|
+
const { storage } = require('../../../../datadog-core')
|
|
12
13
|
const urlFilter = require('./urlfilter')
|
|
13
14
|
const { createInferredProxySpan, finishInferredProxySpan } = require('./inferred_proxy')
|
|
14
15
|
const { extractURL, obfuscateQs, calculateHttpEndpoint } = require('./url')
|
|
@@ -125,33 +126,13 @@ const web = {
|
|
|
125
126
|
context.tracer = tracer
|
|
126
127
|
context.span = span
|
|
127
128
|
context.res = res
|
|
129
|
+
context.store = storage('legacy').getStore()
|
|
128
130
|
|
|
129
131
|
this.setConfig(req, config)
|
|
130
132
|
addRequestTags(context, this.TYPE)
|
|
131
133
|
|
|
132
134
|
return span
|
|
133
135
|
},
|
|
134
|
-
wrap (req) {
|
|
135
|
-
const context = contexts.get(req)
|
|
136
|
-
if (!context.instrumented) {
|
|
137
|
-
this.wrapEnd(context)
|
|
138
|
-
context.instrumented = true
|
|
139
|
-
}
|
|
140
|
-
},
|
|
141
|
-
// Start a span and activate a scope for a request.
|
|
142
|
-
instrument (tracer, config, req, res, name, callback) {
|
|
143
|
-
const span = this.startSpan(tracer, config, req, res, name)
|
|
144
|
-
|
|
145
|
-
this.wrap(req)
|
|
146
|
-
|
|
147
|
-
return callback && tracer.scope().activate(span, () => callback(span))
|
|
148
|
-
},
|
|
149
|
-
|
|
150
|
-
// Reactivate the request scope in case it was changed by a middleware.
|
|
151
|
-
reactivate (req, fn) {
|
|
152
|
-
return reactivate(req, fn)
|
|
153
|
-
},
|
|
154
|
-
|
|
155
136
|
// Add a route segment that will be used for the resource name.
|
|
156
137
|
enterRoute (req, path) {
|
|
157
138
|
if (typeof path === 'string') {
|
|
@@ -172,61 +153,6 @@ const web = {
|
|
|
172
153
|
contexts.get(req).paths.pop()
|
|
173
154
|
},
|
|
174
155
|
|
|
175
|
-
// Start a new middleware span and activate a new scope with the span.
|
|
176
|
-
wrapMiddleware (req, middleware, name, fn) {
|
|
177
|
-
if (!this.active(req)) return fn()
|
|
178
|
-
|
|
179
|
-
const context = contexts.get(req)
|
|
180
|
-
const tracer = context.tracer
|
|
181
|
-
const childOf = this.active(req)
|
|
182
|
-
const config = context.config
|
|
183
|
-
const traceCtx = context.traceCtx
|
|
184
|
-
|
|
185
|
-
if (config.middleware === false) return this.bindAndWrapMiddlewareErrors(fn, req, tracer, childOf)
|
|
186
|
-
|
|
187
|
-
const span = startSpanHelper(tracer, name, { childOf }, traceCtx, config)
|
|
188
|
-
|
|
189
|
-
analyticsSampler.sample(span, config.measured)
|
|
190
|
-
|
|
191
|
-
span.addTags({
|
|
192
|
-
[RESOURCE_NAME]: middleware._name || middleware.name || '<anonymous>',
|
|
193
|
-
})
|
|
194
|
-
|
|
195
|
-
context.middleware.push(span)
|
|
196
|
-
|
|
197
|
-
return tracer.scope().activate(span, fn)
|
|
198
|
-
},
|
|
199
|
-
|
|
200
|
-
// catch errors and apply to active span
|
|
201
|
-
bindAndWrapMiddlewareErrors (fn, req, tracer, activeSpan) {
|
|
202
|
-
try {
|
|
203
|
-
return tracer.scope().bind(fn, activeSpan).apply(this, arguments)
|
|
204
|
-
} catch (e) {
|
|
205
|
-
web.addError(req, e) // TODO: remove when error formatting is moved to Span
|
|
206
|
-
throw e
|
|
207
|
-
}
|
|
208
|
-
},
|
|
209
|
-
|
|
210
|
-
// Finish the active middleware span.
|
|
211
|
-
finish (req, error) {
|
|
212
|
-
if (!this.active(req)) return
|
|
213
|
-
|
|
214
|
-
const context = contexts.get(req)
|
|
215
|
-
const span = context.middleware.pop()
|
|
216
|
-
|
|
217
|
-
if (span) {
|
|
218
|
-
if (error) {
|
|
219
|
-
span.addTags({
|
|
220
|
-
[ERROR_TYPE]: error.name,
|
|
221
|
-
[ERROR_MESSAGE]: error.message,
|
|
222
|
-
[ERROR_STACK]: error.stack,
|
|
223
|
-
})
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
span.finish()
|
|
227
|
-
}
|
|
228
|
-
},
|
|
229
|
-
|
|
230
156
|
// Register a callback to run before res.end() is called.
|
|
231
157
|
beforeEnd (req, callback) {
|
|
232
158
|
contexts.get(req).beforeEnd.push(callback)
|
|
@@ -278,7 +204,6 @@ const web = {
|
|
|
278
204
|
startServerlessSpanWithInferredProxy (tracer, config, name, req, traceCtx) {
|
|
279
205
|
const headers = req.headers
|
|
280
206
|
const reqCtx = contexts.get(req)
|
|
281
|
-
const { storage } = require('../../../../datadog-core')
|
|
282
207
|
const store = storage('legacy').getStore()
|
|
283
208
|
const pubsubSpan = store?.span?._name === 'pubsub.push.receive' ? store.span : null
|
|
284
209
|
|
|
@@ -391,7 +316,6 @@ const web = {
|
|
|
391
316
|
}
|
|
392
317
|
},
|
|
393
318
|
wrapEnd (context) {
|
|
394
|
-
const scope = context.tracer.scope()
|
|
395
319
|
const req = context.req
|
|
396
320
|
const res = context.res
|
|
397
321
|
const end = res.end
|
|
@@ -406,7 +330,9 @@ const web = {
|
|
|
406
330
|
return ends.get(this)
|
|
407
331
|
},
|
|
408
332
|
set (value) {
|
|
409
|
-
ends.set(this,
|
|
333
|
+
ends.set(this, function () {
|
|
334
|
+
return storage('legacy').run(context.store, value, ...arguments)
|
|
335
|
+
})
|
|
410
336
|
},
|
|
411
337
|
})
|
|
412
338
|
},
|
|
@@ -453,14 +379,6 @@ function splitHeader (str) {
|
|
|
453
379
|
return typeof str === 'string' ? str.split(/\s*,\s*/) : []
|
|
454
380
|
}
|
|
455
381
|
|
|
456
|
-
function reactivate (req, fn) {
|
|
457
|
-
const context = contexts.get(req)
|
|
458
|
-
|
|
459
|
-
return context
|
|
460
|
-
? context.tracer.scope().activate(context.span, fn)
|
|
461
|
-
: fn()
|
|
462
|
-
}
|
|
463
|
-
|
|
464
382
|
function addRequestTags (context, spanType) {
|
|
465
383
|
const { req, span, inferredProxySpan, config } = context
|
|
466
384
|
const url = extractURL(req)
|
|
@@ -12,12 +12,6 @@ const { isWebServerSpan, endpointNameFromTags, getStartedSpans } = require('./we
|
|
|
12
12
|
const profileSubmittedChannel = dc.channel('datadog:profiling:profile-submitted')
|
|
13
13
|
const spanFinishedChannel = dc.channel('dd-trace:span:finish')
|
|
14
14
|
|
|
15
|
-
function logError (logger, ...args) {
|
|
16
|
-
if (logger) {
|
|
17
|
-
logger.error(...args)
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
15
|
function findWebSpan (startedSpans, spanId) {
|
|
22
16
|
for (let i = startedSpans.length; --i >= 0;) {
|
|
23
17
|
const ispan = startedSpans[i]
|
|
@@ -71,33 +65,6 @@ class Profiler extends EventEmitter {
|
|
|
71
65
|
return this.#config?.flushInterval
|
|
72
66
|
}
|
|
73
67
|
|
|
74
|
-
/**
|
|
75
|
-
* @param {import('../config/config-base')} config - Tracer configuration
|
|
76
|
-
*/
|
|
77
|
-
start (config) {
|
|
78
|
-
// TODO: Unify with main logger and rewrite template strings to use printf formatting.
|
|
79
|
-
const logger = {
|
|
80
|
-
debug: log.debug.bind(log),
|
|
81
|
-
info: log.info.bind(log),
|
|
82
|
-
warn: log.warn.bind(log),
|
|
83
|
-
error: log.error.bind(log),
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// TODO: Rewrite this to not need to copy the config.
|
|
87
|
-
const options = {
|
|
88
|
-
...config,
|
|
89
|
-
logger,
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
try {
|
|
93
|
-
return this._start(options)
|
|
94
|
-
} catch (err) {
|
|
95
|
-
logError(logger, 'Error starting profiler. For troubleshooting tips, see ' +
|
|
96
|
-
'<https://dtdg.co/nodejs-profiler-troubleshooting>', err)
|
|
97
|
-
return false
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
68
|
get enabled () {
|
|
102
69
|
return this.#enabled
|
|
103
70
|
}
|
|
@@ -141,10 +108,6 @@ class Profiler extends EventEmitter {
|
|
|
141
108
|
return fn()
|
|
142
109
|
}
|
|
143
110
|
|
|
144
|
-
#logError (err) {
|
|
145
|
-
logError(this.#logger, err)
|
|
146
|
-
}
|
|
147
|
-
|
|
148
111
|
#getCompressionFn () {
|
|
149
112
|
if (!this.#compressionFnInitialized) {
|
|
150
113
|
this.#compressionFnInitialized = true
|
|
@@ -181,8 +144,8 @@ class Profiler extends EventEmitter {
|
|
|
181
144
|
}
|
|
182
145
|
break
|
|
183
146
|
}
|
|
184
|
-
} catch (
|
|
185
|
-
|
|
147
|
+
} catch (error) {
|
|
148
|
+
log.error(error)
|
|
186
149
|
}
|
|
187
150
|
}
|
|
188
151
|
return this.#compressionFn
|
|
@@ -191,41 +154,36 @@ class Profiler extends EventEmitter {
|
|
|
191
154
|
/**
|
|
192
155
|
* @param {import('../config/config-base')} options - Tracer configuration
|
|
193
156
|
*/
|
|
194
|
-
|
|
157
|
+
start (options) {
|
|
195
158
|
if (this.enabled) return true
|
|
159
|
+
this.#enabled = true
|
|
196
160
|
|
|
197
161
|
const config = this.#config = new Config(options)
|
|
198
|
-
|
|
199
162
|
this.#logger = config.logger
|
|
200
|
-
this.#enabled = true
|
|
201
|
-
this._setInterval()
|
|
202
163
|
|
|
164
|
+
this._setInterval()
|
|
203
165
|
// Log errors if the source map finder fails, but don't prevent the rest
|
|
204
166
|
// of the profiler from running without source maps.
|
|
205
167
|
let mapper
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
.
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
.
|
|
224
|
-
|
|
225
|
-
})
|
|
226
|
-
}
|
|
227
|
-
} catch (err) {
|
|
228
|
-
this.#logError(err)
|
|
168
|
+
const { setLogger, SourceMapper } = require('@datadog/pprof')
|
|
169
|
+
setLogger(config.logger)
|
|
170
|
+
|
|
171
|
+
if (config.sourceMap) {
|
|
172
|
+
mapper = new SourceMapper(config.debugSourceMaps)
|
|
173
|
+
mapper.loadDirectory(process.cwd())
|
|
174
|
+
.then(() => {
|
|
175
|
+
if (config.debugSourceMaps) {
|
|
176
|
+
const count = mapper.infoMap.size
|
|
177
|
+
this.#logger.debug(() => {
|
|
178
|
+
return count === 0
|
|
179
|
+
? 'Found no source maps'
|
|
180
|
+
: `Found source maps for following files: [${[...mapper.infoMap.keys()].join(', ')}]`
|
|
181
|
+
})
|
|
182
|
+
}
|
|
183
|
+
})
|
|
184
|
+
.catch((error) => {
|
|
185
|
+
log.error(error)
|
|
186
|
+
})
|
|
229
187
|
}
|
|
230
188
|
|
|
231
189
|
try {
|
|
@@ -246,12 +204,13 @@ class Profiler extends EventEmitter {
|
|
|
246
204
|
}
|
|
247
205
|
|
|
248
206
|
this._capture(this._timeoutInterval, start)
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
this.#logError(e)
|
|
207
|
+
} catch (error) {
|
|
208
|
+
log.error(error)
|
|
252
209
|
this.#stop()
|
|
253
210
|
return false
|
|
254
211
|
}
|
|
212
|
+
|
|
213
|
+
return true
|
|
255
214
|
}
|
|
256
215
|
|
|
257
216
|
#nearOOMExport (profileType, encodedProfile, info) {
|
|
@@ -389,10 +348,10 @@ class Profiler extends EventEmitter {
|
|
|
389
348
|
return `Collected ${profiler.type} profile: ` + profileJson
|
|
390
349
|
})
|
|
391
350
|
hasEncoded = true
|
|
392
|
-
} catch (
|
|
351
|
+
} catch (error) {
|
|
393
352
|
// If encoding one of the profile types fails, we should still try to
|
|
394
353
|
// encode and submit the other profile types.
|
|
395
|
-
|
|
354
|
+
log.error(error)
|
|
396
355
|
}
|
|
397
356
|
}))
|
|
398
357
|
|
|
@@ -401,8 +360,8 @@ class Profiler extends EventEmitter {
|
|
|
401
360
|
profileSubmittedChannel.publish()
|
|
402
361
|
this.#logger.debug('Submitted profiles')
|
|
403
362
|
}
|
|
404
|
-
} catch (
|
|
405
|
-
|
|
363
|
+
} catch (error) {
|
|
364
|
+
log.error(error)
|
|
406
365
|
this.#stop()
|
|
407
366
|
}
|
|
408
367
|
}
|
|
@@ -424,10 +383,8 @@ class Profiler extends EventEmitter {
|
|
|
424
383
|
: undefined
|
|
425
384
|
const exportSpec = { profiles, infos, start, end, tags, endpointCounts, customAttributes }
|
|
426
385
|
const tasks = this.#config.exporters.map(exporter =>
|
|
427
|
-
exporter.export(exportSpec).catch(
|
|
428
|
-
|
|
429
|
-
this.#logger.warn(err)
|
|
430
|
-
}
|
|
386
|
+
exporter.export(exportSpec).catch(error => {
|
|
387
|
+
log.warn(error)
|
|
431
388
|
})
|
|
432
389
|
)
|
|
433
390
|
|
|
@@ -255,10 +255,10 @@ class Tracer extends NoopProxy {
|
|
|
255
255
|
// do not stop tracer initialization if the profiler fails to be imported
|
|
256
256
|
try {
|
|
257
257
|
return require('./profiler').start(config)
|
|
258
|
-
} catch (
|
|
258
|
+
} catch (error) {
|
|
259
259
|
log.error(
|
|
260
260
|
'Error starting profiler. For troubleshooting tips, see <https://dtdg.co/nodejs-profiler-troubleshooting>',
|
|
261
|
-
|
|
261
|
+
error
|
|
262
262
|
)
|
|
263
263
|
return false
|
|
264
264
|
}
|
|
@@ -279,7 +279,12 @@ class Tracer extends NoopProxy {
|
|
|
279
279
|
const prioritySampler = config.apmTracingEnabled === false
|
|
280
280
|
? require('./standalone').configure(config)
|
|
281
281
|
: undefined
|
|
282
|
-
|
|
282
|
+
let otlpExporter
|
|
283
|
+
if (config.otelTracesEnabled) {
|
|
284
|
+
const { buildResourceAttributes, createOtlpTraceExporter } = require('./opentelemetry/trace')
|
|
285
|
+
otlpExporter = createOtlpTraceExporter(config, buildResourceAttributes(config))
|
|
286
|
+
}
|
|
287
|
+
this._tracer = new DatadogTracer(config, prioritySampler, otlpExporter)
|
|
283
288
|
this.dataStreamsCheckpointer = this._tracer.dataStreamsCheckpointer
|
|
284
289
|
lazyProxy(this, 'appsec', () => require('./appsec/sdk'), this._tracer, config)
|
|
285
290
|
lazyProxy(this, 'llmobs', () => require('./llmobs/sdk'), this._tracer, this._modules.llmobs, config)
|
|
@@ -55,17 +55,21 @@ module.exports = {
|
|
|
55
55
|
startGCObserver()
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
58
|
+
const useNative = config.runtimeMetrics.native !== false
|
|
59
|
+
|
|
60
|
+
if (useNative) {
|
|
61
|
+
// Using no-gc prevents the native gc metrics from being tracked. Not
|
|
62
|
+
// passing any options means all metrics are tracked.
|
|
63
|
+
// TODO: This is a workaround. We should find a better solution.
|
|
64
|
+
const watchers = trackEventLoop ? ['loop'] : ['no-gc']
|
|
65
|
+
|
|
66
|
+
try {
|
|
67
|
+
nativeMetrics = require('@datadog/native-metrics')
|
|
68
|
+
nativeMetrics.start(...watchers)
|
|
69
|
+
} catch (error) {
|
|
70
|
+
log.error('Error starting native metrics', error)
|
|
71
|
+
nativeMetrics = null
|
|
72
|
+
}
|
|
69
73
|
}
|
|
70
74
|
|
|
71
75
|
client = new MetricsAggregationClient(new DogStatsDClient(clientConfig))
|
|
@@ -41,7 +41,7 @@ class SchemaManager {
|
|
|
41
41
|
* @param {string} kind
|
|
42
42
|
* @param {string} plugin
|
|
43
43
|
* @param {object} opts
|
|
44
|
-
* @returns {
|
|
44
|
+
* @returns {object} {name, source}
|
|
45
45
|
*/
|
|
46
46
|
serviceName (type, kind, plugin, opts) {
|
|
47
47
|
const schema = this.shouldUseConsistentServiceNaming
|
|
@@ -12,7 +12,10 @@ class SchemaDefinition {
|
|
|
12
12
|
|
|
13
13
|
getServiceName (type, kind, plugin, opts) {
|
|
14
14
|
const item = this.schema[type][kind][plugin]
|
|
15
|
-
return
|
|
15
|
+
return {
|
|
16
|
+
name: item.serviceName(opts),
|
|
17
|
+
source: item.serviceSource?.(opts),
|
|
18
|
+
}
|
|
16
19
|
}
|
|
17
20
|
}
|
|
18
21
|
|
|
@@ -18,8 +18,22 @@ function httpPluginClientService ({ tracerService, pluginConfig, sessionDetails
|
|
|
18
18
|
return tracerService
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
function optionServiceSource ({ pluginConfig }) {
|
|
22
|
+
if (pluginConfig.splitByDomain) {
|
|
23
|
+
return 'opt.split_by_domain'
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (pluginConfig.service) {
|
|
27
|
+
return 'opt.plugin'
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
21
31
|
function awsServiceV0 ({ tracerService, awsService }) {
|
|
22
32
|
return `${tracerService}-aws-${awsService}`
|
|
23
33
|
}
|
|
24
34
|
|
|
25
|
-
|
|
35
|
+
function awsServiceSource ({ awsService }) {
|
|
36
|
+
return awsService
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
module.exports = { identityService, httpPluginClientService, awsServiceV0, optionServiceSource, awsServiceSource }
|
|
@@ -1,66 +1,83 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const { identityService, awsServiceV0 } = require('../util')
|
|
3
|
+
const { identityService, awsServiceV0, awsServiceSource } = require('../util')
|
|
4
4
|
|
|
5
5
|
function amqpServiceName ({ tracerService }) {
|
|
6
6
|
return `${tracerService}-amqp`
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
+
function integrationSource (source) {
|
|
10
|
+
return () => source
|
|
11
|
+
}
|
|
12
|
+
|
|
9
13
|
const messaging = {
|
|
10
14
|
producer: {
|
|
11
15
|
amqplib: {
|
|
12
16
|
opName: () => 'amqp.command',
|
|
13
17
|
serviceName: amqpServiceName,
|
|
18
|
+
serviceSource: integrationSource('amqp'),
|
|
14
19
|
},
|
|
15
20
|
amqp10: {
|
|
16
21
|
opName: () => 'amqp.send',
|
|
17
22
|
serviceName: amqpServiceName,
|
|
23
|
+
serviceSource: integrationSource('amqp'),
|
|
18
24
|
},
|
|
19
25
|
'azure-event-hubs': {
|
|
20
26
|
opName: () => 'azure.eventhubs.send',
|
|
21
27
|
serviceName: ({ tracerService }) => `${tracerService}-azure-event-hubs`,
|
|
28
|
+
serviceSource: integrationSource('azure-event-hubs'),
|
|
22
29
|
},
|
|
23
30
|
'azure-service-bus': {
|
|
24
31
|
opName: () => 'azure.servicebus.send',
|
|
25
32
|
serviceName: ({ tracerService }) => `${tracerService}-azure-service-bus`,
|
|
33
|
+
serviceSource: integrationSource('azure-service-bus'),
|
|
26
34
|
},
|
|
27
35
|
'google-cloud-pubsub': {
|
|
28
36
|
opName: () => 'pubsub.request',
|
|
29
37
|
serviceName: ({ tracerService }) => `${tracerService}-pubsub`,
|
|
38
|
+
serviceSource: integrationSource('google-cloud-pubsub'),
|
|
30
39
|
},
|
|
31
40
|
kafkajs: {
|
|
32
41
|
opName: () => 'kafka.produce',
|
|
33
42
|
serviceName: ({ tracerService }) => `${tracerService}-kafka`,
|
|
43
|
+
serviceSource: integrationSource('kafka'),
|
|
34
44
|
},
|
|
35
45
|
'confluentinc-kafka-javascript': {
|
|
36
46
|
opName: () => 'kafka.produce',
|
|
37
47
|
serviceName: ({ tracerService }) => `${tracerService}-kafka`,
|
|
48
|
+
serviceSource: integrationSource('kafka'),
|
|
38
49
|
},
|
|
39
50
|
rhea: {
|
|
40
51
|
opName: () => 'amqp.send',
|
|
41
52
|
serviceName: ({ tracerService }) => `${tracerService}-amqp-producer`,
|
|
53
|
+
serviceSource: integrationSource('amqp'),
|
|
42
54
|
},
|
|
43
55
|
sqs: {
|
|
44
56
|
opName: () => 'aws.request',
|
|
45
57
|
serviceName: awsServiceV0,
|
|
58
|
+
serviceSource: awsServiceSource,
|
|
46
59
|
},
|
|
47
60
|
sns: {
|
|
48
61
|
opName: () => 'aws.request',
|
|
49
62
|
serviceName: awsServiceV0,
|
|
63
|
+
serviceSource: awsServiceSource,
|
|
50
64
|
},
|
|
51
65
|
bullmq: {
|
|
52
66
|
opName: () => 'bullmq.add',
|
|
53
67
|
serviceName: ({ tracerService }) => `${tracerService}-bullmq`,
|
|
68
|
+
serviceSource: integrationSource('bullmq'),
|
|
54
69
|
},
|
|
55
70
|
},
|
|
56
71
|
consumer: {
|
|
57
72
|
amqplib: {
|
|
58
73
|
opName: () => 'amqp.command',
|
|
59
74
|
serviceName: amqpServiceName,
|
|
75
|
+
serviceSource: integrationSource('amqp'),
|
|
60
76
|
},
|
|
61
77
|
amqp10: {
|
|
62
78
|
opName: () => 'amqp.receive',
|
|
63
79
|
serviceName: amqpServiceName,
|
|
80
|
+
serviceSource: integrationSource('amqp'),
|
|
64
81
|
},
|
|
65
82
|
'google-cloud-pubsub': {
|
|
66
83
|
opName: () => 'pubsub.receive',
|
|
@@ -69,10 +86,12 @@ const messaging = {
|
|
|
69
86
|
kafkajs: {
|
|
70
87
|
opName: () => 'kafka.consume',
|
|
71
88
|
serviceName: ({ tracerService }) => `${tracerService}-kafka`,
|
|
89
|
+
serviceSource: integrationSource('kafka'),
|
|
72
90
|
},
|
|
73
91
|
'confluentinc-kafka-javascript': {
|
|
74
92
|
opName: () => 'kafka.consume',
|
|
75
93
|
serviceName: ({ tracerService }) => `${tracerService}-kafka`,
|
|
94
|
+
serviceSource: integrationSource('kafka'),
|
|
76
95
|
},
|
|
77
96
|
rhea: {
|
|
78
97
|
opName: () => 'amqp.receive',
|
|
@@ -81,20 +100,24 @@ const messaging = {
|
|
|
81
100
|
sqs: {
|
|
82
101
|
opName: () => 'aws.request',
|
|
83
102
|
serviceName: awsServiceV0,
|
|
103
|
+
serviceSource: awsServiceSource,
|
|
84
104
|
},
|
|
85
105
|
bullmq: {
|
|
86
106
|
opName: () => 'bullmq.processJob',
|
|
87
107
|
serviceName: ({ tracerService }) => `${tracerService}-bullmq`,
|
|
108
|
+
serviceSource: integrationSource('bullmq'),
|
|
88
109
|
},
|
|
89
110
|
},
|
|
90
111
|
client: {
|
|
91
112
|
amqplib: {
|
|
92
113
|
opName: () => 'amqp.command',
|
|
93
114
|
serviceName: amqpServiceName,
|
|
115
|
+
serviceSource: integrationSource('amqp'),
|
|
94
116
|
},
|
|
95
117
|
'google-cloud-pubsub': {
|
|
96
118
|
opName: () => 'pubsub.request',
|
|
97
119
|
serviceName: ({ tracerService }) => `${tracerService}-pubsub`,
|
|
120
|
+
serviceSource: integrationSource('google-cloud-pubsub'),
|
|
98
121
|
},
|
|
99
122
|
},
|
|
100
123
|
}
|