dd-trace 6.3.0 → 6.4.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.electron.js +3 -0
- package/package.json +6 -2
- package/packages/datadog-instrumentations/src/ai.js +29 -24
- package/packages/datadog-instrumentations/src/cucumber.js +4 -3
- package/packages/datadog-instrumentations/src/express.js +20 -2
- package/packages/datadog-instrumentations/src/grpc/server.js +18 -0
- package/packages/datadog-instrumentations/src/helpers/router-helper.js +8 -8
- package/packages/datadog-instrumentations/src/http2/server.js +143 -17
- package/packages/datadog-instrumentations/src/jest.js +10 -4
- package/packages/datadog-instrumentations/src/router.js +180 -105
- package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +41 -16
- package/packages/datadog-plugin-aws-sdk/src/services/sns.js +21 -21
- package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +14 -8
- package/packages/datadog-plugin-aws-sdk/src/util.js +0 -22
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +5 -5
- package/packages/datadog-plugin-graphql/src/execute.js +90 -14
- package/packages/datadog-plugin-graphql/src/parse.js +22 -1
- package/packages/datadog-plugin-graphql/src/request.js +32 -1
- package/packages/datadog-plugin-graphql/src/utils.js +42 -0
- package/packages/datadog-plugin-graphql/src/validate.js +13 -1
- package/packages/datadog-plugin-http2/src/server.js +38 -6
- package/packages/datadog-plugin-jest/src/util.js +21 -6
- package/packages/datadog-plugin-vitest/src/index.js +4 -2
- package/packages/dd-trace/index.electron.js +3 -0
- package/packages/dd-trace/index.js +2 -37
- package/packages/dd-trace/src/bootstrap.js +39 -0
- package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +14 -2
- package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +22 -6
- package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +5 -0
- package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +55 -5
- package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +8 -1
- package/packages/dd-trace/src/ci-visibility/test-optimization-http-cache.js +5 -1
- package/packages/dd-trace/src/config/generated-config-types.d.ts +4 -0
- package/packages/dd-trace/src/config/supported-configurations.json +17 -0
- package/packages/dd-trace/src/constants.js +7 -0
- package/packages/dd-trace/src/datastreams/pathway.js +6 -4
- package/packages/dd-trace/src/feature-registry.js +22 -0
- package/packages/dd-trace/src/llmobs/constants/tags.js +1 -0
- package/packages/dd-trace/src/llmobs/index.js +10 -2
- package/packages/dd-trace/src/llmobs/tagger.js +11 -7
- package/packages/dd-trace/src/noop/proxy.js +5 -4
- package/packages/dd-trace/src/openfeature/register.js +46 -0
- package/packages/dd-trace/src/opentracing/propagation/log.js +11 -2
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +80 -14
- package/packages/dd-trace/src/opentracing/propagation/text_map_dsm.js +10 -1
- package/packages/dd-trace/src/opentracing/tracer.js +7 -1
- package/packages/dd-trace/src/plugins/util/test.js +9 -4
- package/packages/dd-trace/src/plugins/util/web.js +12 -0
- package/packages/dd-trace/src/proxy.js +21 -9
- package/packages/dd-trace/src/standalone/index.js +0 -22
- package/vendor/dist/@datadog/sketches-js/index.js +1 -1
- package/vendor/dist/protobufjs/index.js +1 -1
- package/vendor/dist/protobufjs/minimal/index.js +1 -1
|
@@ -8,6 +8,7 @@ const log = require('../../log')
|
|
|
8
8
|
const tags = require('../../../../../ext/tags')
|
|
9
9
|
const { getConfiguredEnvName } = require('../../config/helper')
|
|
10
10
|
const { setAllBaggageItems, getAllBaggageItems, removeAllBaggageItems } = require('../../baggage')
|
|
11
|
+
const { hasTraceSourcePropagationTag } = require('../../standalone/tracesource')
|
|
11
12
|
const telemetryMetrics = require('../../telemetry/metrics')
|
|
12
13
|
const { DD_MAJOR } = require('../../../../../version')
|
|
13
14
|
|
|
@@ -119,22 +120,35 @@ class TextMapPropagator {
|
|
|
119
120
|
return this.#baggageTagKeysSet
|
|
120
121
|
}
|
|
121
122
|
|
|
123
|
+
/**
|
|
124
|
+
* @param {DatadogSpanContext | null | undefined} spanContext
|
|
125
|
+
* @param {Record<string, string>} [carrier]
|
|
126
|
+
* @returns {Record<string, string> | undefined}
|
|
127
|
+
*/
|
|
122
128
|
inject (spanContext, carrier) {
|
|
123
|
-
if (
|
|
124
|
-
this._injectBaggageItems(spanContext, carrier)
|
|
125
|
-
if (!spanContext) return
|
|
129
|
+
if (carrier === null) return
|
|
130
|
+
let injectedCarrier = this._injectBaggageItems(spanContext, carrier)
|
|
131
|
+
if (!spanContext) return injectedCarrier
|
|
126
132
|
|
|
127
|
-
this.
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
injectCh.publish({ spanContext, carrier })
|
|
133
|
+
const injectTraceContext = this._config.apmTracingEnabled !== false ||
|
|
134
|
+
hasTraceSourcePropagationTag(spanContext._trace.tags)
|
|
135
|
+
if (injectTraceContext) {
|
|
136
|
+
injectedCarrier = this._injectDatadog(spanContext, injectedCarrier ?? carrier) ?? injectedCarrier
|
|
137
|
+
injectedCarrier = this._injectB3MultipleHeaders(spanContext, injectedCarrier ?? carrier) ?? injectedCarrier
|
|
138
|
+
injectedCarrier = this._injectB3SingleHeader(spanContext, injectedCarrier ?? carrier) ?? injectedCarrier
|
|
134
139
|
}
|
|
140
|
+
injectedCarrier = this
|
|
141
|
+
._injectTraceparent(spanContext, injectedCarrier ?? carrier, injectTraceContext) ?? injectedCarrier
|
|
142
|
+
|
|
143
|
+
if (injectedCarrier === undefined) return
|
|
144
|
+
|
|
145
|
+
carrier = injectedCarrier
|
|
146
|
+
if (injectCh.hasSubscribers) injectCh.publish({ spanContext, carrier })
|
|
135
147
|
|
|
136
148
|
// eslint-disable-next-line eslint-rules/eslint-log-printf-style
|
|
137
149
|
log.debug(() => `Inject into carrier: ${JSON.stringify(pick(carrier, logKeys))}.`)
|
|
150
|
+
|
|
151
|
+
return carrier
|
|
138
152
|
}
|
|
139
153
|
|
|
140
154
|
extract (carrier) {
|
|
@@ -156,15 +170,23 @@ class TextMapPropagator {
|
|
|
156
170
|
return spanContext
|
|
157
171
|
}
|
|
158
172
|
|
|
173
|
+
/**
|
|
174
|
+
* @param {DatadogSpanContext} spanContext
|
|
175
|
+
* @param {Record<string, string>} [carrier]
|
|
176
|
+
* @returns {Record<string, string> | undefined}
|
|
177
|
+
*/
|
|
159
178
|
_injectDatadog (spanContext, carrier) {
|
|
160
179
|
if (!this._hasPropagationStyle('inject', 'datadog')) return
|
|
161
180
|
|
|
181
|
+
carrier ??= {}
|
|
162
182
|
carrier[traceKey] = spanContext.toTraceId()
|
|
163
183
|
carrier[spanKey] = spanContext.toSpanId()
|
|
164
184
|
|
|
165
185
|
this._injectOrigin(spanContext, carrier)
|
|
166
186
|
this._injectSamplingPriority(spanContext, carrier)
|
|
167
187
|
this._injectTags(spanContext, carrier)
|
|
188
|
+
|
|
189
|
+
return carrier
|
|
168
190
|
}
|
|
169
191
|
|
|
170
192
|
_injectOrigin (spanContext, carrier) {
|
|
@@ -183,7 +205,13 @@ class TextMapPropagator {
|
|
|
183
205
|
}
|
|
184
206
|
}
|
|
185
207
|
|
|
208
|
+
/**
|
|
209
|
+
* @param {DatadogSpanContext | null | undefined} spanContext
|
|
210
|
+
* @param {Record<string, string>} [carrier]
|
|
211
|
+
* @returns {Record<string, string> | undefined}
|
|
212
|
+
*/
|
|
186
213
|
_injectBaggageItems (spanContext, carrier) {
|
|
214
|
+
let injectedCarrier
|
|
187
215
|
if (this._config.legacyBaggageEnabled) {
|
|
188
216
|
const baggageItems = spanContext?._baggageItems
|
|
189
217
|
if (baggageItems) {
|
|
@@ -202,7 +230,8 @@ class TextMapPropagator {
|
|
|
202
230
|
if (invalidHeaderValueCharExpr.test(headerValue)) {
|
|
203
231
|
headerValue = encodeURIComponent(headerValue)
|
|
204
232
|
}
|
|
205
|
-
carrier
|
|
233
|
+
injectedCarrier ??= carrier ?? {}
|
|
234
|
+
injectedCarrier[headerName] = headerValue
|
|
206
235
|
}
|
|
207
236
|
}
|
|
208
237
|
}
|
|
@@ -213,7 +242,6 @@ class TextMapPropagator {
|
|
|
213
242
|
let byteCounter = 0
|
|
214
243
|
|
|
215
244
|
const baggageItems = getAllBaggageItems()
|
|
216
|
-
if (!baggageItems) return
|
|
217
245
|
for (const key of Object.keys(baggageItems)) {
|
|
218
246
|
const baggageKey = key.trim()
|
|
219
247
|
if (!baggageTokenExpr.test(baggageKey)) continue
|
|
@@ -242,10 +270,13 @@ class TextMapPropagator {
|
|
|
242
270
|
|
|
243
271
|
baggage = baggage.slice(0, -1)
|
|
244
272
|
if (baggage) {
|
|
245
|
-
carrier
|
|
273
|
+
injectedCarrier ??= carrier ?? {}
|
|
274
|
+
injectedCarrier.baggage = baggage
|
|
246
275
|
tracerMetrics.count('context_header_style.injected', ['header_style:baggage']).inc()
|
|
247
276
|
}
|
|
248
277
|
}
|
|
278
|
+
|
|
279
|
+
return injectedCarrier
|
|
249
280
|
}
|
|
250
281
|
|
|
251
282
|
_injectTags (spanContext, carrier) {
|
|
@@ -278,12 +309,18 @@ class TextMapPropagator {
|
|
|
278
309
|
}
|
|
279
310
|
}
|
|
280
311
|
|
|
312
|
+
/**
|
|
313
|
+
* @param {DatadogSpanContext} spanContext
|
|
314
|
+
* @param {Record<string, string>} [carrier]
|
|
315
|
+
* @returns {Record<string, string> | undefined}
|
|
316
|
+
*/
|
|
281
317
|
_injectB3MultipleHeaders (spanContext, carrier) {
|
|
282
318
|
// v5 also accepts the legacy `'b3'` spelling for multi; v6 routes `'b3'` to single-header.
|
|
283
319
|
const hasB3multi = this._hasPropagationStyle('inject', 'b3multi') ||
|
|
284
320
|
(DD_MAJOR < 6 && this._hasPropagationStyle('inject', 'b3'))
|
|
285
321
|
if (!hasB3multi) return
|
|
286
322
|
|
|
323
|
+
carrier ??= {}
|
|
287
324
|
carrier[b3TraceKey] = spanContext._traceId.toTraceIdHex(spanContext._trace.tags['_dd.p.tid'])
|
|
288
325
|
carrier[b3SpanKey] = spanContext._spanId.toString(16)
|
|
289
326
|
carrier[b3SampledKey] = spanContext._sampling.priority >= AUTO_KEEP ? '1' : '0'
|
|
@@ -295,14 +332,22 @@ class TextMapPropagator {
|
|
|
295
332
|
if (spanContext._parentId) {
|
|
296
333
|
carrier[b3ParentKey] = spanContext._parentId.toString(16)
|
|
297
334
|
}
|
|
335
|
+
|
|
336
|
+
return carrier
|
|
298
337
|
}
|
|
299
338
|
|
|
339
|
+
/**
|
|
340
|
+
* @param {DatadogSpanContext} spanContext
|
|
341
|
+
* @param {Record<string, string>} [carrier]
|
|
342
|
+
* @returns {Record<string, string> | undefined}
|
|
343
|
+
*/
|
|
300
344
|
_injectB3SingleHeader (spanContext, carrier) {
|
|
301
345
|
// v6 keeps `'b3 single header'` as a back-compat alias for callers that bypass parser normalisation.
|
|
302
346
|
const hasB3SingleHeader = this._hasPropagationStyle('inject', 'b3 single header') ||
|
|
303
347
|
(DD_MAJOR >= 6 && this._hasPropagationStyle('inject', 'b3'))
|
|
304
348
|
if (!hasB3SingleHeader) return
|
|
305
349
|
|
|
350
|
+
carrier ??= {}
|
|
306
351
|
const traceId = spanContext._traceId.toTraceIdHex(spanContext._trace.tags['_dd.p.tid'])
|
|
307
352
|
const spanId = spanContext._spanId.toString(16)
|
|
308
353
|
const sampled = spanContext._sampling.priority >= AUTO_KEEP ? '1' : '0'
|
|
@@ -311,11 +356,30 @@ class TextMapPropagator {
|
|
|
311
356
|
if (spanContext._parentId) {
|
|
312
357
|
carrier[b3HeaderKey] += '-' + spanContext._parentId.toString(16)
|
|
313
358
|
}
|
|
359
|
+
|
|
360
|
+
return carrier
|
|
314
361
|
}
|
|
315
362
|
|
|
316
|
-
|
|
363
|
+
/**
|
|
364
|
+
* @param {DatadogSpanContext} spanContext
|
|
365
|
+
* @param {Record<string, string> | undefined} carrier
|
|
366
|
+
* @param {boolean} injectTraceContext
|
|
367
|
+
* @returns {Record<string, string> | undefined}
|
|
368
|
+
*/
|
|
369
|
+
_injectTraceparent (spanContext, carrier, injectTraceContext) {
|
|
317
370
|
if (!this._hasPropagationStyle('inject', 'tracecontext')) return
|
|
318
371
|
|
|
372
|
+
if (!injectTraceContext) {
|
|
373
|
+
const tracestate = TraceState.fromString(spanContext._tracestate?.toString())
|
|
374
|
+
tracestate.delete('dd')
|
|
375
|
+
const header = tracestate.toString()
|
|
376
|
+
if (!header) return
|
|
377
|
+
carrier ??= {}
|
|
378
|
+
carrier.tracestate = header
|
|
379
|
+
return carrier
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
carrier ??= {}
|
|
319
383
|
const {
|
|
320
384
|
_sampling: { priority, mechanism },
|
|
321
385
|
_tracestate: ts = new TraceState(),
|
|
@@ -363,6 +427,8 @@ class TextMapPropagator {
|
|
|
363
427
|
})
|
|
364
428
|
|
|
365
429
|
carrier.tracestate = ts.toString()
|
|
430
|
+
|
|
431
|
+
return carrier
|
|
366
432
|
}
|
|
367
433
|
|
|
368
434
|
_hasPropagationStyle (mode, name) {
|
|
@@ -13,13 +13,22 @@ class DSMTextMapPropagator {
|
|
|
13
13
|
this.config = config
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
+
/**
|
|
17
|
+
* @param {object} ctx DSM pathway context.
|
|
18
|
+
* @param {Record<string, string>} [carrier]
|
|
19
|
+
* @returns {Record<string, string> | undefined}
|
|
20
|
+
*/
|
|
16
21
|
inject (ctx, carrier) {
|
|
17
22
|
if (!this.config.dsmEnabled) return
|
|
18
23
|
|
|
19
|
-
DsmPathwayCodec.encode(ctx, carrier)
|
|
24
|
+
const injectedCarrier = DsmPathwayCodec.encode(ctx, carrier)
|
|
25
|
+
if (injectedCarrier === undefined) return
|
|
20
26
|
|
|
27
|
+
carrier = injectedCarrier
|
|
21
28
|
// eslint-disable-next-line eslint-rules/eslint-log-printf-style
|
|
22
29
|
log.debug(() => `Inject into carrier (DSM): ${JSON.stringify(pick(carrier, logKeys))}.`)
|
|
30
|
+
|
|
31
|
+
return carrier
|
|
23
32
|
}
|
|
24
33
|
|
|
25
34
|
extract (carrier) {
|
|
@@ -101,6 +101,12 @@ class DatadogTracer {
|
|
|
101
101
|
return span
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
+
/**
|
|
105
|
+
* @param {Span|SpanContext} context
|
|
106
|
+
* @param {string} format
|
|
107
|
+
* @param {object} [carrier]
|
|
108
|
+
* @returns {object | undefined}
|
|
109
|
+
*/
|
|
104
110
|
inject (context, format, carrier) {
|
|
105
111
|
if (context instanceof Span) {
|
|
106
112
|
context = context.context()
|
|
@@ -110,7 +116,7 @@ class DatadogTracer {
|
|
|
110
116
|
if (format !== 'text_map_dsm' && format !== formats.LOG) {
|
|
111
117
|
this._prioritySampler.sample(context)
|
|
112
118
|
}
|
|
113
|
-
this._propagators[format].inject(context, carrier)
|
|
119
|
+
return this._propagators[format].inject(context, carrier)
|
|
114
120
|
} catch (e) {
|
|
115
121
|
log.error('Error injecting trace', e)
|
|
116
122
|
runtimeMetrics.increment('datadog.tracer.node.inject.errors', true)
|
|
@@ -1454,7 +1454,7 @@ function parseAnnotations (annotations) {
|
|
|
1454
1454
|
* Returns 0 when the test is too slow to retry (≥ 5 min).
|
|
1455
1455
|
*
|
|
1456
1456
|
* @param {number} durationMs
|
|
1457
|
-
* @param {Record<string, number>} slowTestRetries
|
|
1457
|
+
* @param {Record<string, number>} slowTestRetries e.g. { '5s': 10, '10s': 5, '30s': 3, '5m': 2 }
|
|
1458
1458
|
* @returns {number}
|
|
1459
1459
|
*/
|
|
1460
1460
|
function getEfdRetryCount (durationMs, slowTestRetries) {
|
|
@@ -1469,12 +1469,17 @@ function getEfdRetryCount (durationMs, slowTestRetries) {
|
|
|
1469
1469
|
/**
|
|
1470
1470
|
* Returns the maximum retry count configured by the backend for EFD.
|
|
1471
1471
|
*
|
|
1472
|
-
* @param {Record<string, number>} slowTestRetries
|
|
1473
|
-
* @returns {number}
|
|
1472
|
+
* @param {Record<string, number> | undefined} slowTestRetries
|
|
1473
|
+
* @returns {number | undefined}
|
|
1474
1474
|
*/
|
|
1475
1475
|
function getMaxEfdRetryCount (slowTestRetries) {
|
|
1476
|
+
if (slowTestRetries === undefined) return
|
|
1477
|
+
|
|
1478
|
+
const retryCounts = Object.values(slowTestRetries)
|
|
1479
|
+
if (retryCounts.length === 0) return
|
|
1480
|
+
|
|
1476
1481
|
let maxRetries = 0
|
|
1477
|
-
for (const retryCount of
|
|
1482
|
+
for (const retryCount of retryCounts) {
|
|
1478
1483
|
if (retryCount > maxRetries) {
|
|
1479
1484
|
maxRetries = retryCount
|
|
1480
1485
|
}
|
|
@@ -185,6 +185,18 @@ const web = {
|
|
|
185
185
|
return context
|
|
186
186
|
},
|
|
187
187
|
|
|
188
|
+
// Key an existing context on the underlying `Http2Stream` so a second request
|
|
189
|
+
// backed by the same stream resolves to it via the `req.stream` lookup in
|
|
190
|
+
// `patch`. Only a mixed HTTP/2 server (raw-stream + 'request' listeners) needs
|
|
191
|
+
// this: it creates the span from a throwaway stream adapter, then the
|
|
192
|
+
// compatibility layer synthesizes the real `Http2ServerRequest` off the same
|
|
193
|
+
// stream and must reuse the adapter's span rather than open an orphan context.
|
|
194
|
+
// Confined to that path so the common single-listener request pays no extra
|
|
195
|
+
// per-request map write.
|
|
196
|
+
linkContextToStream (stream, context) {
|
|
197
|
+
contexts.set(stream, context)
|
|
198
|
+
},
|
|
199
|
+
|
|
188
200
|
// Return the request root span.
|
|
189
201
|
root (req) {
|
|
190
202
|
const context = contexts.get(req)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const NoopProxy = require('./noop/proxy')
|
|
4
|
+
const { features } = require('./feature-registry')
|
|
4
5
|
const DatadogTracer = require('./tracer')
|
|
5
6
|
const getConfig = require('./config')
|
|
6
7
|
const runtimeMetrics = require('./runtime_metrics')
|
|
@@ -91,7 +92,10 @@ class Tracer extends NoopProxy {
|
|
|
91
92
|
iast: new LazyModule(() => require('./appsec/iast')),
|
|
92
93
|
llmobs: new LazyModule(() => require('./llmobs')),
|
|
93
94
|
rewriter: new LazyModule(() => require('./appsec/iast/taint-tracking/rewriter')),
|
|
94
|
-
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
for (const feature of Object.values(features)) {
|
|
98
|
+
this._modules[feature.name] = new LazyModule(feature.factory)
|
|
95
99
|
}
|
|
96
100
|
}
|
|
97
101
|
|
|
@@ -114,7 +118,11 @@ class Tracer extends NoopProxy {
|
|
|
114
118
|
propagationHash.configure(config)
|
|
115
119
|
|
|
116
120
|
if (config.DD_CRASHTRACKING_ENABLED) {
|
|
117
|
-
|
|
121
|
+
try {
|
|
122
|
+
require('./crashtracking').start(config)
|
|
123
|
+
} catch (e) {
|
|
124
|
+
log.warn('Crashtracking is not available in this environment', e)
|
|
125
|
+
}
|
|
118
126
|
}
|
|
119
127
|
|
|
120
128
|
if (config.DD_HEAP_SNAPSHOT_COUNT > 0) {
|
|
@@ -176,8 +184,9 @@ class Tracer extends NoopProxy {
|
|
|
176
184
|
DynamicInstrumentation.start(config, rc)
|
|
177
185
|
}
|
|
178
186
|
|
|
179
|
-
const
|
|
180
|
-
|
|
187
|
+
for (const feature of Object.values(features)) {
|
|
188
|
+
feature.remoteConfig?.(rc, config, this)
|
|
189
|
+
}
|
|
181
190
|
}
|
|
182
191
|
|
|
183
192
|
if (config.profiling.DD_PROFILING_ENABLED === 'true') {
|
|
@@ -287,14 +296,15 @@ class Tracer extends NoopProxy {
|
|
|
287
296
|
lazyProxy(this, 'llmobs', () => require('./llmobs/sdk'), this._tracer, this._modules.llmobs, config)
|
|
288
297
|
|
|
289
298
|
if (config.experimental?.aiguard?.enabled) {
|
|
290
|
-
this._modules.aiguard.enable(this._tracer, config)
|
|
291
299
|
lazyProxy(this, 'aiguard', () => require('./aiguard/sdk'), this._tracer, config)
|
|
292
300
|
}
|
|
293
301
|
this._tracingInitialized = true
|
|
294
302
|
}
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
303
|
+
for (const feature of Object.values(features)) {
|
|
304
|
+
feature.enable?.(config, this._tracer, this, lazyProxy)
|
|
305
|
+
}
|
|
306
|
+
if (config.experimental?.aiguard?.enabled) {
|
|
307
|
+
this._modules.aiguard.enable(this._tracer, config)
|
|
298
308
|
}
|
|
299
309
|
if (config.iast.enabled) {
|
|
300
310
|
this._modules.iast.enable(config, this._tracer)
|
|
@@ -305,7 +315,9 @@ class Tracer extends NoopProxy {
|
|
|
305
315
|
this._modules.aiguard.disable()
|
|
306
316
|
this._modules.iast.disable()
|
|
307
317
|
this._modules.llmobs.disable()
|
|
308
|
-
|
|
318
|
+
for (const feature of Object.values(features)) {
|
|
319
|
+
this._modules[feature.name].disable()
|
|
320
|
+
}
|
|
309
321
|
}
|
|
310
322
|
|
|
311
323
|
if (this._tracingInitialized) {
|
|
@@ -2,13 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
const { channel } = require('dc-polyfill')
|
|
4
4
|
const { USER_KEEP } = require('../../../../ext/priority')
|
|
5
|
-
const TraceState = require('../opentracing/propagation/tracestate')
|
|
6
5
|
const { APM_TRACING_ENABLED_KEY } = require('../constants')
|
|
7
6
|
const TraceSourcePrioritySampler = require('./tracesource_priority_sampler')
|
|
8
7
|
const { hasTraceSourcePropagationTag } = require('./tracesource')
|
|
9
8
|
|
|
10
9
|
const startCh = channel('dd-trace:span:start')
|
|
11
|
-
const injectCh = channel('dd-trace:span:inject')
|
|
12
10
|
const extractCh = channel('dd-trace:span:extract')
|
|
13
11
|
|
|
14
12
|
/**
|
|
@@ -16,13 +14,11 @@ const extractCh = channel('dd-trace:span:extract')
|
|
|
16
14
|
*/
|
|
17
15
|
function configure (config) {
|
|
18
16
|
if (startCh.hasSubscribers) startCh.unsubscribe(onSpanStart)
|
|
19
|
-
if (injectCh.hasSubscribers) injectCh.unsubscribe(onSpanInject)
|
|
20
17
|
if (extractCh.hasSubscribers) extractCh.unsubscribe(onSpanExtract)
|
|
21
18
|
|
|
22
19
|
if (config.apmTracingEnabled !== false) return
|
|
23
20
|
|
|
24
21
|
startCh.subscribe(onSpanStart)
|
|
25
|
-
injectCh.subscribe(onSpanInject)
|
|
26
22
|
extractCh.subscribe(onSpanExtract)
|
|
27
23
|
|
|
28
24
|
return new TraceSourcePrioritySampler(config.env)
|
|
@@ -38,24 +34,6 @@ function onSpanStart ({ span, fields }) {
|
|
|
38
34
|
}
|
|
39
35
|
}
|
|
40
36
|
|
|
41
|
-
function onSpanInject ({ spanContext, carrier }) {
|
|
42
|
-
if (!spanContext?._trace?.tags || !carrier) return
|
|
43
|
-
|
|
44
|
-
// do not inject trace and sampling if there is no _dd.p.ts
|
|
45
|
-
if (!hasTraceSourcePropagationTag(spanContext._trace.tags)) {
|
|
46
|
-
for (const key in carrier) {
|
|
47
|
-
const lKey = key.toLowerCase()
|
|
48
|
-
if (lKey.startsWith('x-datadog') || lKey.startsWith('x-b3') || lKey === 'traceparent') {
|
|
49
|
-
delete carrier[key]
|
|
50
|
-
} else if (lKey === 'tracestate') {
|
|
51
|
-
const tracestate = TraceState.fromString(carrier[key])
|
|
52
|
-
tracestate.forVendor('dd', state => state.clear())
|
|
53
|
-
carrier[key] = tracestate.toString()
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
37
|
function onSpanExtract ({ spanContext = {} }) {
|
|
60
38
|
if (!spanContext._trace?.tags || !spanContext._sampling) return
|
|
61
39
|
|