dd-trace 5.71.0 → 5.72.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 +5 -0
- package/index.d.ts +93 -1
- package/package.json +21 -2
- package/packages/datadog-instrumentations/src/azure-event-hubs.js +37 -0
- package/packages/datadog-instrumentations/src/azure-functions.js +3 -0
- package/packages/datadog-instrumentations/src/cucumber.js +7 -7
- package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -0
- package/packages/datadog-instrumentations/src/jest.js +29 -36
- package/packages/datadog-instrumentations/src/mocha/main.js +8 -9
- package/packages/datadog-instrumentations/src/mocha/utils.js +1 -1
- package/packages/datadog-instrumentations/src/mocha/worker.js +2 -2
- package/packages/datadog-instrumentations/src/pg.js +1 -1
- package/packages/datadog-instrumentations/src/playwright.js +5 -5
- package/packages/datadog-instrumentations/src/vitest.js +8 -8
- package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +73 -27
- package/packages/datadog-plugin-azure-event-hubs/src/index.js +15 -0
- package/packages/datadog-plugin-azure-event-hubs/src/producer.js +82 -0
- package/packages/datadog-plugin-azure-functions/src/index.js +37 -0
- package/packages/datadog-plugin-cucumber/src/index.js +3 -3
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +9 -9
- package/packages/datadog-plugin-jest/src/util.js +10 -2
- package/packages/datadog-plugin-mocha/src/index.js +2 -2
- package/packages/datadog-plugin-playwright/src/index.js +2 -2
- package/packages/datadog-plugin-vitest/src/index.js +2 -2
- package/packages/datadog-plugin-ws/src/server.js +5 -3
- package/packages/dd-trace/src/config.js +108 -26
- package/packages/dd-trace/src/config_defaults.js +12 -0
- package/packages/dd-trace/src/git_properties.js +90 -5
- package/packages/dd-trace/src/noop/proxy.js +3 -0
- package/packages/dd-trace/src/openfeature/constants/constants.js +51 -0
- package/packages/dd-trace/src/openfeature/flagging_provider.js +45 -0
- package/packages/dd-trace/src/openfeature/index.js +77 -0
- package/packages/dd-trace/src/openfeature/noop.js +101 -0
- package/packages/dd-trace/src/openfeature/writers/base.js +181 -0
- package/packages/dd-trace/src/openfeature/writers/exposures.js +173 -0
- package/packages/dd-trace/src/openfeature/writers/util.js +43 -0
- package/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +100 -0
- package/packages/dd-trace/src/opentelemetry/logs/index.js +87 -0
- package/packages/dd-trace/src/opentelemetry/logs/logger.js +77 -0
- package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +126 -0
- package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +173 -0
- package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +367 -0
- package/packages/dd-trace/src/opentelemetry/protos/common.proto +116 -0
- package/packages/dd-trace/src/opentelemetry/protos/logs.proto +226 -0
- package/packages/dd-trace/src/opentelemetry/protos/logs_service.proto +78 -0
- package/packages/dd-trace/src/opentelemetry/protos/protobuf_loader.js +48 -0
- package/packages/dd-trace/src/opentelemetry/protos/resource.proto +45 -0
- package/packages/dd-trace/src/plugins/ci_plugin.js +7 -6
- package/packages/dd-trace/src/plugins/index.js +1 -0
- package/packages/dd-trace/src/plugins/util/test.js +6 -5
- package/packages/dd-trace/src/profiling/config.js +21 -1
- package/packages/dd-trace/src/profiling/exporters/event_serializer.js +3 -2
- package/packages/dd-trace/src/profiling/profiler.js +44 -22
- package/packages/dd-trace/src/profiling/profilers/events.js +12 -3
- package/packages/dd-trace/src/profiling/profilers/space.js +35 -24
- package/packages/dd-trace/src/profiling/profilers/wall.js +14 -6
- package/packages/dd-trace/src/proxy.js +22 -1
- package/packages/dd-trace/src/remote_config/capabilities.js +1 -0
- package/packages/dd-trace/src/remote_config/index.js +1 -0
- package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +4 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +8 -0
- package/packages/dd-trace/src/supported-configurations.json +17 -0
- package/packages/dd-trace/src/telemetry/telemetry.js +13 -1
|
@@ -41,9 +41,16 @@ function findWebSpan (startedSpans, spanId) {
|
|
|
41
41
|
return false
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
function processInfo (infos, info, type) {
|
|
45
|
+
if (Object.keys(info).length > 0) {
|
|
46
|
+
infos[type] = info
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
44
50
|
class Profiler extends EventEmitter {
|
|
45
51
|
#compressionFn
|
|
46
52
|
#compressionOptions
|
|
53
|
+
#config
|
|
47
54
|
#enabled = false
|
|
48
55
|
#endpointCounts = new Map()
|
|
49
56
|
#lastStart
|
|
@@ -54,10 +61,13 @@ class Profiler extends EventEmitter {
|
|
|
54
61
|
|
|
55
62
|
constructor () {
|
|
56
63
|
super()
|
|
57
|
-
this._config = undefined
|
|
58
64
|
this._timeoutInterval = undefined
|
|
59
65
|
}
|
|
60
66
|
|
|
67
|
+
get flushInterval () {
|
|
68
|
+
return this.#config?.flushInterval
|
|
69
|
+
}
|
|
70
|
+
|
|
61
71
|
start (options) {
|
|
62
72
|
return this._start(options).catch((err) => {
|
|
63
73
|
logError(options.logger, 'Error starting profiler. For troubleshooting tips, see ' +
|
|
@@ -77,7 +87,7 @@ class Profiler extends EventEmitter {
|
|
|
77
87
|
async _start (options) {
|
|
78
88
|
if (this.enabled) return true
|
|
79
89
|
|
|
80
|
-
const config = this
|
|
90
|
+
const config = this.#config = new Config(options)
|
|
81
91
|
|
|
82
92
|
this.#logger = config.logger
|
|
83
93
|
this.#enabled = true
|
|
@@ -158,16 +168,18 @@ class Profiler extends EventEmitter {
|
|
|
158
168
|
}
|
|
159
169
|
}
|
|
160
170
|
|
|
161
|
-
#nearOOMExport (profileType, encodedProfile) {
|
|
171
|
+
#nearOOMExport (profileType, encodedProfile, info) {
|
|
162
172
|
const start = this.#lastStart
|
|
163
173
|
const end = new Date()
|
|
174
|
+
const infos = this.#createInitialInfos()
|
|
175
|
+
processInfo(infos, info, profileType)
|
|
164
176
|
this.#submit({
|
|
165
177
|
[profileType]: encodedProfile
|
|
166
|
-
}, start, end, snapshotKinds.ON_OUT_OF_MEMORY)
|
|
178
|
+
}, infos, start, end, snapshotKinds.ON_OUT_OF_MEMORY)
|
|
167
179
|
}
|
|
168
180
|
|
|
169
181
|
_setInterval () {
|
|
170
|
-
this._timeoutInterval = this.
|
|
182
|
+
this._timeoutInterval = this.#config.flushInterval
|
|
171
183
|
}
|
|
172
184
|
|
|
173
185
|
stop () {
|
|
@@ -189,7 +201,7 @@ class Profiler extends EventEmitter {
|
|
|
189
201
|
this.#spanFinishListener = undefined
|
|
190
202
|
}
|
|
191
203
|
|
|
192
|
-
for (const profiler of this.
|
|
204
|
+
for (const profiler of this.#config.profilers) {
|
|
193
205
|
profiler.stop()
|
|
194
206
|
this.#logger.debug(`Stopped ${profiler.type} profiler in ${threadNamePrefix} thread`)
|
|
195
207
|
}
|
|
@@ -229,28 +241,34 @@ class Profiler extends EventEmitter {
|
|
|
229
241
|
}
|
|
230
242
|
}
|
|
231
243
|
|
|
244
|
+
#createInitialInfos () {
|
|
245
|
+
return {
|
|
246
|
+
settings: this.#config.systemInfoReport
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
232
250
|
async _collect (snapshotKind, restart = true) {
|
|
233
251
|
if (!this.enabled) return
|
|
234
252
|
|
|
235
|
-
const startDate = this.#lastStart
|
|
236
|
-
const endDate = new Date()
|
|
237
|
-
const profiles = []
|
|
238
|
-
const encodedProfiles = {}
|
|
239
|
-
|
|
240
253
|
try {
|
|
241
|
-
if (this.
|
|
254
|
+
if (this.#config.profilers.length === 0) {
|
|
242
255
|
throw new Error('No profile types configured.')
|
|
243
256
|
}
|
|
244
257
|
|
|
258
|
+
const startDate = this.#lastStart
|
|
259
|
+
const endDate = new Date()
|
|
260
|
+
const profiles = []
|
|
261
|
+
|
|
245
262
|
crashtracker.withProfilerSerializing(() => {
|
|
246
263
|
// collect profiles synchronously so that profilers can be safely stopped asynchronously
|
|
247
|
-
for (const profiler of this.
|
|
264
|
+
for (const profiler of this.#config.profilers) {
|
|
265
|
+
const info = profiler.getInfo()
|
|
248
266
|
const profile = profiler.profile(restart, startDate, endDate)
|
|
249
267
|
if (!restart) {
|
|
250
268
|
this.#logger.debug(`Stopped ${profiler.type} profiler in ${threadNamePrefix} thread`)
|
|
251
269
|
}
|
|
252
270
|
if (!profile) continue
|
|
253
|
-
profiles.push({ profiler, profile })
|
|
271
|
+
profiles.push({ profiler, profile, info })
|
|
254
272
|
}
|
|
255
273
|
})
|
|
256
274
|
|
|
@@ -260,16 +278,20 @@ class Profiler extends EventEmitter {
|
|
|
260
278
|
|
|
261
279
|
let hasEncoded = false
|
|
262
280
|
|
|
281
|
+
const encodedProfiles = {}
|
|
282
|
+
const infos = this.#createInitialInfos()
|
|
283
|
+
|
|
263
284
|
// encode and export asynchronously
|
|
264
|
-
await Promise.all(profiles.map(async ({ profiler, profile }) => {
|
|
285
|
+
await Promise.all(profiles.map(async ({ profiler, profile, info }) => {
|
|
265
286
|
try {
|
|
266
287
|
const encoded = await profiler.encode(profile)
|
|
267
288
|
const compressed = encoded instanceof Buffer && this.#compressionFn !== undefined
|
|
268
289
|
? await this.#compressionFn(encoded, this.#compressionOptions)
|
|
269
290
|
: encoded
|
|
270
291
|
encodedProfiles[profiler.type] = compressed
|
|
292
|
+
processInfo(infos, info, profiler.type)
|
|
271
293
|
this.#logger.debug(() => {
|
|
272
|
-
const profileJson = JSON.stringify(profile, (
|
|
294
|
+
const profileJson = JSON.stringify(profile, (_, value) => {
|
|
273
295
|
return typeof value === 'bigint' ? value.toString() : value
|
|
274
296
|
})
|
|
275
297
|
return `Collected ${profiler.type} profile: ` + profileJson
|
|
@@ -283,7 +305,7 @@ class Profiler extends EventEmitter {
|
|
|
283
305
|
}))
|
|
284
306
|
|
|
285
307
|
if (hasEncoded) {
|
|
286
|
-
await this.#submit(encodedProfiles, startDate, endDate, snapshotKind)
|
|
308
|
+
await this.#submit(encodedProfiles, infos, startDate, endDate, snapshotKind)
|
|
287
309
|
profileSubmittedChannel.publish()
|
|
288
310
|
this.#logger.debug('Submitted profiles')
|
|
289
311
|
}
|
|
@@ -293,8 +315,8 @@ class Profiler extends EventEmitter {
|
|
|
293
315
|
}
|
|
294
316
|
}
|
|
295
317
|
|
|
296
|
-
#submit (profiles, start, end, snapshotKind) {
|
|
297
|
-
const { tags } = this
|
|
318
|
+
#submit (profiles, infos, start, end, snapshotKind) {
|
|
319
|
+
const { tags } = this.#config
|
|
298
320
|
|
|
299
321
|
// Flatten endpoint counts
|
|
300
322
|
const endpointCounts = {}
|
|
@@ -305,8 +327,8 @@ class Profiler extends EventEmitter {
|
|
|
305
327
|
|
|
306
328
|
tags.snapshot = snapshotKind
|
|
307
329
|
tags.profile_seq = this.#profileSeq++
|
|
308
|
-
const exportSpec = { profiles, start, end, tags, endpointCounts }
|
|
309
|
-
const tasks = this.
|
|
330
|
+
const exportSpec = { profiles, infos, start, end, tags, endpointCounts }
|
|
331
|
+
const tasks = this.#config.exporters.map(exporter =>
|
|
310
332
|
exporter.export(exportSpec).catch(err => {
|
|
311
333
|
if (this.#logger) {
|
|
312
334
|
this.#logger.warn(err)
|
|
@@ -336,7 +358,7 @@ class ServerlessProfiler extends Profiler {
|
|
|
336
358
|
|
|
337
359
|
_setInterval () {
|
|
338
360
|
this._timeoutInterval = this.#interval * 1000
|
|
339
|
-
this.#flushAfterIntervals = this.
|
|
361
|
+
this.#flushAfterIntervals = this.flushInterval / 1000
|
|
340
362
|
}
|
|
341
363
|
|
|
342
364
|
async _collect (snapshotKind, restart = true) {
|
|
@@ -383,17 +383,20 @@ function createPoissonProcessSamplingFilter (samplingIntervalMillis) {
|
|
|
383
383
|
* source with a sampling event filter and an event serializer.
|
|
384
384
|
*/
|
|
385
385
|
class EventsProfiler {
|
|
386
|
-
|
|
387
|
-
#
|
|
386
|
+
#maxSamples = 0
|
|
387
|
+
#timelineSamplingEnabled = false
|
|
388
388
|
#eventSerializer
|
|
389
389
|
#eventSources
|
|
390
390
|
|
|
391
|
+
get type () { return 'events' }
|
|
392
|
+
|
|
391
393
|
constructor (options = {}) {
|
|
392
394
|
this.#maxSamples = getMaxSamples(options)
|
|
395
|
+
this.#timelineSamplingEnabled = !!options.timelineSamplingEnabled
|
|
393
396
|
this.#eventSerializer = new EventSerializer(this.#maxSamples)
|
|
394
397
|
|
|
395
398
|
const eventHandler = event => this.#eventSerializer.addEvent(event)
|
|
396
|
-
const eventFilter =
|
|
399
|
+
const eventFilter = this.#timelineSamplingEnabled
|
|
397
400
|
? createPoissonProcessSamplingFilter(options.samplingInterval)
|
|
398
401
|
: () => true
|
|
399
402
|
const filteringEventHandler = event => {
|
|
@@ -432,6 +435,12 @@ class EventsProfiler {
|
|
|
432
435
|
return () => thatEventSerializer.createProfile(startDate, endDate)
|
|
433
436
|
}
|
|
434
437
|
|
|
438
|
+
getInfo () {
|
|
439
|
+
return {
|
|
440
|
+
maxSamples: this.#maxSamples
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
435
444
|
encode (profile) {
|
|
436
445
|
return encodeProfileAsync(profile())
|
|
437
446
|
}
|
|
@@ -7,59 +7,70 @@ function strategiesToCallbackMode (strategies, callbackMode) {
|
|
|
7
7
|
return strategies.includes(oomExportStrategies.ASYNC_CALLBACK) ? callbackMode.Async : 0
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
+
const STACK_DEPTH = 64
|
|
11
|
+
|
|
10
12
|
class NativeSpaceProfiler {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
#mapper
|
|
14
|
+
#oomMonitoring
|
|
15
|
+
#pprof
|
|
16
|
+
#samplingInterval = 512 * 1024
|
|
17
|
+
#started = false
|
|
14
18
|
|
|
15
19
|
constructor (options = {}) {
|
|
16
20
|
// TODO: Remove default value. It is only used in testing.
|
|
17
|
-
this
|
|
18
|
-
this
|
|
19
|
-
|
|
21
|
+
this.#samplingInterval = options.heapSamplingInterval || 512 * 1024
|
|
22
|
+
this.#oomMonitoring = options.oomMonitoring || {}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
get type () {
|
|
26
|
+
return 'space'
|
|
20
27
|
}
|
|
21
28
|
|
|
22
29
|
start ({ mapper, nearOOMCallback } = {}) {
|
|
23
|
-
if (this
|
|
30
|
+
if (this.#started) return
|
|
24
31
|
|
|
25
|
-
this
|
|
26
|
-
this
|
|
27
|
-
this.
|
|
28
|
-
if (this.
|
|
29
|
-
const strategies = this.
|
|
30
|
-
this.
|
|
31
|
-
this.
|
|
32
|
-
this.
|
|
32
|
+
this.#mapper = mapper
|
|
33
|
+
this.#pprof = require('@datadog/pprof')
|
|
34
|
+
this.#pprof.heap.start(this.#samplingInterval, STACK_DEPTH)
|
|
35
|
+
if (this.#oomMonitoring.enabled) {
|
|
36
|
+
const strategies = this.#oomMonitoring.exportStrategies
|
|
37
|
+
this.#pprof.heap.monitorOutOfMemory(
|
|
38
|
+
this.#oomMonitoring.heapLimitExtensionSize,
|
|
39
|
+
this.#oomMonitoring.maxHeapExtensionCount,
|
|
33
40
|
strategies.includes(oomExportStrategies.LOGS),
|
|
34
|
-
strategies.includes(oomExportStrategies.PROCESS) ? this.
|
|
35
|
-
(profile) => nearOOMCallback(this.type, this.
|
|
36
|
-
strategiesToCallbackMode(strategies, this.
|
|
41
|
+
strategies.includes(oomExportStrategies.PROCESS) ? this.#oomMonitoring.exportCommand : [],
|
|
42
|
+
(profile) => nearOOMCallback(this.type, this.#pprof.encodeSync(profile), this.getInfo()),
|
|
43
|
+
strategiesToCallbackMode(strategies, this.#pprof.heap.CallbackMode)
|
|
37
44
|
)
|
|
38
45
|
}
|
|
39
46
|
|
|
40
|
-
this
|
|
47
|
+
this.#started = true
|
|
41
48
|
}
|
|
42
49
|
|
|
43
50
|
profile (restart) {
|
|
44
|
-
const profile = this.
|
|
51
|
+
const profile = this.#pprof.heap.profile(undefined, this.#mapper, getThreadLabels)
|
|
45
52
|
if (!restart) {
|
|
46
53
|
this.stop()
|
|
47
54
|
}
|
|
48
55
|
return profile
|
|
49
56
|
}
|
|
50
57
|
|
|
58
|
+
getInfo () {
|
|
59
|
+
return {}
|
|
60
|
+
}
|
|
61
|
+
|
|
51
62
|
encode (profile) {
|
|
52
63
|
return encodeProfileAsync(profile)
|
|
53
64
|
}
|
|
54
65
|
|
|
55
66
|
stop () {
|
|
56
|
-
if (!this
|
|
57
|
-
this.
|
|
58
|
-
this
|
|
67
|
+
if (!this.#started) return
|
|
68
|
+
this.#pprof.heap.stop()
|
|
69
|
+
this.#started = false
|
|
59
70
|
}
|
|
60
71
|
|
|
61
72
|
isStarted () {
|
|
62
|
-
return this
|
|
73
|
+
return this.#started
|
|
63
74
|
}
|
|
64
75
|
}
|
|
65
76
|
|
|
@@ -25,7 +25,6 @@ const profilerTelemetryMetrics = telemetryMetrics.manager.namespace('profilers')
|
|
|
25
25
|
const ProfilingContext = Symbol('NativeWallProfiler.ProfilingContext')
|
|
26
26
|
|
|
27
27
|
let kSampleCount
|
|
28
|
-
let kCPEDContextCount
|
|
29
28
|
|
|
30
29
|
function getActiveSpan () {
|
|
31
30
|
const store = storage('legacy').getStore()
|
|
@@ -167,7 +166,6 @@ class NativeWallProfiler {
|
|
|
167
166
|
this.#mapper = mapper
|
|
168
167
|
this.#pprof = require('@datadog/pprof')
|
|
169
168
|
kSampleCount = this.#pprof.time.constants.kSampleCount
|
|
170
|
-
kCPEDContextCount = this.#pprof.time.constants.kCPEDContextCount
|
|
171
169
|
|
|
172
170
|
// pprof otherwise crashes in worker threads
|
|
173
171
|
if (!process._startProfilerIdleNotifier) {
|
|
@@ -213,12 +211,14 @@ class NativeWallProfiler {
|
|
|
213
211
|
}
|
|
214
212
|
|
|
215
213
|
#setupTelemetryMetrics () {
|
|
216
|
-
const
|
|
214
|
+
const asyncContextsLiveGauge = profilerTelemetryMetrics.gauge('wall.async_contexts_live')
|
|
215
|
+
const asyncContextsUsedGauge = profilerTelemetryMetrics.gauge('wall.async_contexts_used')
|
|
217
216
|
|
|
218
|
-
const that = this
|
|
219
217
|
this._contextCountGaugeUpdater = setInterval(() => {
|
|
220
|
-
|
|
221
|
-
|
|
218
|
+
const { totalAsyncContextCount, usedAsyncContextCount } = this.#pprof.time.getMetrics()
|
|
219
|
+
asyncContextsLiveGauge.mark(totalAsyncContextCount)
|
|
220
|
+
asyncContextsUsedGauge.mark(usedAsyncContextCount)
|
|
221
|
+
}, this.#telemetryHeartbeatIntervalMillis)
|
|
222
222
|
this._contextCountGaugeUpdater.unref()
|
|
223
223
|
}
|
|
224
224
|
|
|
@@ -410,6 +410,14 @@ class NativeWallProfiler {
|
|
|
410
410
|
return this.#stop(restart)
|
|
411
411
|
}
|
|
412
412
|
|
|
413
|
+
getInfo () {
|
|
414
|
+
const { totalAsyncContextCount, usedAsyncContextCount } = this.#pprof.time.getMetrics()
|
|
415
|
+
return {
|
|
416
|
+
totalAsyncContextCount,
|
|
417
|
+
usedAsyncContextCount
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
413
421
|
encode (profile) {
|
|
414
422
|
return encodeProfileAsync(profile)
|
|
415
423
|
}
|
|
@@ -84,7 +84,8 @@ class Tracer extends NoopProxy {
|
|
|
84
84
|
appsec: new LazyModule(() => require('./appsec')),
|
|
85
85
|
iast: new LazyModule(() => require('./appsec/iast')),
|
|
86
86
|
llmobs: new LazyModule(() => require('./llmobs')),
|
|
87
|
-
rewriter: new LazyModule(() => require('./appsec/iast/taint-tracking/rewriter'))
|
|
87
|
+
rewriter: new LazyModule(() => require('./appsec/iast/taint-tracking/rewriter')),
|
|
88
|
+
openfeature: new LazyModule(() => require('./openfeature'))
|
|
88
89
|
}
|
|
89
90
|
}
|
|
90
91
|
|
|
@@ -158,6 +159,15 @@ class Tracer extends NoopProxy {
|
|
|
158
159
|
if (config.dynamicInstrumentation.enabled) {
|
|
159
160
|
DynamicInstrumentation.start(config, rc)
|
|
160
161
|
}
|
|
162
|
+
|
|
163
|
+
if (config.experimental.flaggingProvider.enabled) {
|
|
164
|
+
rc.setProductHandler('FFE_FLAGS', (action, conf) => {
|
|
165
|
+
// Feed UFC config directly to OpenFeature provider
|
|
166
|
+
if (action === 'apply' || action === 'modify') {
|
|
167
|
+
this.openfeature._setConfiguration(conf.flag_configuration)
|
|
168
|
+
}
|
|
169
|
+
})
|
|
170
|
+
}
|
|
161
171
|
}
|
|
162
172
|
|
|
163
173
|
if (config.profiling.enabled === 'true') {
|
|
@@ -204,6 +214,11 @@ class Tracer extends NoopProxy {
|
|
|
204
214
|
}
|
|
205
215
|
}
|
|
206
216
|
|
|
217
|
+
if (config.otelLogsEnabled) {
|
|
218
|
+
const { initializeOpenTelemetryLogs } = require('./opentelemetry/logs')
|
|
219
|
+
initializeOpenTelemetryLogs(config)
|
|
220
|
+
}
|
|
221
|
+
|
|
207
222
|
if (config.isTestDynamicInstrumentationEnabled) {
|
|
208
223
|
const getDynamicInstrumentationClient = require('./ci-visibility/dynamic-instrumentation')
|
|
209
224
|
// We instantiate the client but do not start the Worker here. The worker is started lazily
|
|
@@ -249,6 +264,11 @@ class Tracer extends NoopProxy {
|
|
|
249
264
|
}
|
|
250
265
|
this._tracingInitialized = true
|
|
251
266
|
}
|
|
267
|
+
if (config.experimental.flaggingProvider.enabled) {
|
|
268
|
+
this._modules.openfeature.enable(config)
|
|
269
|
+
lazyProxy(this, 'openfeature', config, () =>
|
|
270
|
+
require('./openfeature/flagging_provider'), this._tracer, config)
|
|
271
|
+
}
|
|
252
272
|
if (config.iast.enabled) {
|
|
253
273
|
this._modules.iast.enable(config, this._tracer)
|
|
254
274
|
}
|
|
@@ -257,6 +277,7 @@ class Tracer extends NoopProxy {
|
|
|
257
277
|
this._modules.appsec.disable()
|
|
258
278
|
this._modules.iast.disable()
|
|
259
279
|
this._modules.llmobs.disable()
|
|
280
|
+
this._modules.openfeature.disable()
|
|
260
281
|
}
|
|
261
282
|
|
|
262
283
|
if (this._tracingInitialized) {
|
|
@@ -32,6 +32,7 @@ module.exports = {
|
|
|
32
32
|
ASM_DD_MULTICONFIG: 1n << 42n,
|
|
33
33
|
ASM_TRACE_TAGGING_RULES: 1n << 43n,
|
|
34
34
|
ASM_EXTENDED_DATA_COLLECTION: 1n << 44n,
|
|
35
|
+
FFE_FLAG_CONFIGURATION_RULES: 1n << 46n,
|
|
35
36
|
/*
|
|
36
37
|
DO NOT ADD ARBITRARY CAPABILITIES IN YOUR CODE
|
|
37
38
|
UNLESS THEY ARE ALREADY DEFINED IN THE BACKEND SOURCE OF TRUTH
|
|
@@ -17,6 +17,7 @@ function enable (config, appsec) {
|
|
|
17
17
|
rc.updateCapabilities(RemoteConfigCapabilities.APM_TRACING_SAMPLE_RATE, true)
|
|
18
18
|
rc.updateCapabilities(RemoteConfigCapabilities.APM_TRACING_ENABLED, true)
|
|
19
19
|
rc.updateCapabilities(RemoteConfigCapabilities.APM_TRACING_SAMPLE_RULES, true)
|
|
20
|
+
rc.updateCapabilities(RemoteConfigCapabilities.FFE_FLAG_CONFIGURATION_RULES, true)
|
|
20
21
|
|
|
21
22
|
const activation = Activation.fromConfig(config)
|
|
22
23
|
|
|
@@ -16,6 +16,10 @@ const messaging = {
|
|
|
16
16
|
opName: () => 'amqp.send',
|
|
17
17
|
serviceName: amqpServiceName
|
|
18
18
|
},
|
|
19
|
+
'azure-event-hubs': {
|
|
20
|
+
opName: () => 'azure.eventhubs.send',
|
|
21
|
+
serviceName: ({ tracerService }) => `${tracerService}-azure-event-hubs`
|
|
22
|
+
},
|
|
19
23
|
'azure-service-bus': {
|
|
20
24
|
opName: () => 'azure.servicebus.send',
|
|
21
25
|
serviceName: ({ tracerService }) => `${tracerService}-azure-service-bus`
|
|
@@ -16,6 +16,14 @@ const messaging = {
|
|
|
16
16
|
producer: {
|
|
17
17
|
amqplib: amqpOutbound,
|
|
18
18
|
amqp10: amqpOutbound,
|
|
19
|
+
'azure-service-bus': {
|
|
20
|
+
opName: () => 'azure.servicebus.send',
|
|
21
|
+
serviceName: identityService
|
|
22
|
+
},
|
|
23
|
+
'azure-event-hubs': {
|
|
24
|
+
opName: () => 'azure.eventhubs.send',
|
|
25
|
+
serviceName: identityService
|
|
26
|
+
},
|
|
19
27
|
'google-cloud-pubsub': {
|
|
20
28
|
opName: () => 'gcp.pubsub.send',
|
|
21
29
|
serviceName: identityService
|
|
@@ -69,9 +69,11 @@
|
|
|
69
69
|
"DD_DYNAMIC_INSTRUMENTATION_UPLOAD_INTERVAL_SECONDS": ["A"],
|
|
70
70
|
"DD_ENV": ["A"],
|
|
71
71
|
"DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED": ["A"],
|
|
72
|
+
"DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED": ["A"],
|
|
72
73
|
"DD_EXPERIMENTAL_TEST_OPT_GIT_CACHE_ENABLED": ["A"],
|
|
73
74
|
"DD_EXPERIMENTAL_TEST_OPT_GIT_CACHE_DIR": ["A"],
|
|
74
75
|
"DD_EXTERNAL_ENV": ["A"],
|
|
76
|
+
"DD_FLAGGING_PROVIDER_ENABLED": ["A"],
|
|
75
77
|
"DD_GIT_BRANCH": ["A"],
|
|
76
78
|
"DD_GIT_COMMIT_AUTHOR_DATE": ["A"],
|
|
77
79
|
"DD_GIT_COMMIT_AUTHOR_EMAIL": ["A"],
|
|
@@ -82,6 +84,7 @@
|
|
|
82
84
|
"DD_GIT_COMMIT_MESSAGE": ["A"],
|
|
83
85
|
"DD_GIT_COMMIT_SHA": ["A"],
|
|
84
86
|
"DD_GIT_PROPERTIES_FILE": ["A"],
|
|
87
|
+
"DD_GIT_FOLDER_PATH": ["A"],
|
|
85
88
|
"DD_GIT_REPOSITORY_URL": ["A"],
|
|
86
89
|
"DD_GIT_TAG": ["A"],
|
|
87
90
|
"DD_GIT_PULL_REQUEST_BASE_BRANCH": ["A"],
|
|
@@ -120,6 +123,7 @@
|
|
|
120
123
|
"DD_LLMOBS_ML_APP": ["A"],
|
|
121
124
|
"DD_LOG_LEVEL": ["A"],
|
|
122
125
|
"DD_LOGS_INJECTION": ["A"],
|
|
126
|
+
"DD_LOGS_OTEL_ENABLED": ["A"],
|
|
123
127
|
"DD_MINI_AGENT_PATH": ["A"],
|
|
124
128
|
"DD_OPENAI_LOGS_ENABLED": ["A"],
|
|
125
129
|
"DD_OPENAI_SPAN_CHAR_LIMIT": ["A"],
|
|
@@ -225,6 +229,8 @@
|
|
|
225
229
|
"DD_TRACE_AWS_SDK_STEPFUNCTIONS_BATCH_PROPAGATION_ENABLED": ["A"],
|
|
226
230
|
"DD_TRACE_AWS_SDK_STEPFUNCTIONS_ENABLED": ["A"],
|
|
227
231
|
"DD_TRACE_AXIOS_ENABLED": ["A"],
|
|
232
|
+
"DD_TRACE_AZURE_EVENT_HUBS_ENABLED": ["A"],
|
|
233
|
+
"DD_TRACE_AZURE_EVENTHUBS_BATCH_LINKS_ENABLED": ["A"],
|
|
228
234
|
"DD_TRACE_AZURE_FUNCTIONS_ENABLED": ["A"],
|
|
229
235
|
"DD_TRACE_AZURE_SERVICE_BUS_ENABLED": ["A"],
|
|
230
236
|
"DD_TRACE_BAGGAGE_MAX_BYTES": ["A"],
|
|
@@ -438,6 +444,17 @@
|
|
|
438
444
|
"DD_VERTEXAI_SPAN_PROMPT_COMPLETION_SAMPLE_RATE": ["A"],
|
|
439
445
|
"OTEL_LOG_LEVEL": ["A"],
|
|
440
446
|
"OTEL_LOGS_EXPORTER": ["A"],
|
|
447
|
+
"OTEL_EXPORTER_OTLP_LOGS_ENDPOINT": ["A"],
|
|
448
|
+
"OTEL_EXPORTER_OTLP_LOGS_HEADERS": ["A"],
|
|
449
|
+
"OTEL_EXPORTER_OTLP_LOGS_PROTOCOL": ["A"],
|
|
450
|
+
"OTEL_EXPORTER_OTLP_LOGS_TIMEOUT": ["A"],
|
|
451
|
+
"OTEL_EXPORTER_OTLP_ENDPOINT": ["A"],
|
|
452
|
+
"OTEL_EXPORTER_OTLP_HEADERS": ["A"],
|
|
453
|
+
"OTEL_EXPORTER_OTLP_PROTOCOL": ["A"],
|
|
454
|
+
"OTEL_EXPORTER_OTLP_TIMEOUT": ["A"],
|
|
455
|
+
"OTEL_BSP_SCHEDULE_DELAY": ["A"],
|
|
456
|
+
"OTEL_BSP_MAX_EXPORT_BATCH_SIZE": ["A"],
|
|
457
|
+
"OTEL_BSP_MAX_QUEUE_SIZE": ["A"],
|
|
441
458
|
"OTEL_METRICS_EXPORTER": ["A"],
|
|
442
459
|
"OTEL_PROPAGATORS": ["A"],
|
|
443
460
|
"OTEL_RESOURCE_ATTRIBUTES": ["A"],
|
|
@@ -328,7 +328,19 @@ const nameMapping = {
|
|
|
328
328
|
instrumentationSource: 'instrumentation_source',
|
|
329
329
|
injectionEnabled: 'ssi_injection_enabled',
|
|
330
330
|
injectForce: 'ssi_forced_injection_enabled',
|
|
331
|
-
'runtimeMetrics.enabled': 'runtimeMetrics'
|
|
331
|
+
'runtimeMetrics.enabled': 'runtimeMetrics',
|
|
332
|
+
otelLogsEnabled: 'DD_LOGS_OTEL_ENABLED',
|
|
333
|
+
otelUrl: 'OTEL_EXPORTER_OTLP_ENDPOINT',
|
|
334
|
+
otelEndpoint: 'OTEL_EXPORTER_OTLP_ENDPOINT',
|
|
335
|
+
otelHeaders: 'OTEL_EXPORTER_OTLP_HEADERS',
|
|
336
|
+
otelProtocol: 'OTEL_EXPORTER_OTLP_PROTOCOL',
|
|
337
|
+
otelTimeout: 'OTEL_EXPORTER_OTLP_TIMEOUT',
|
|
338
|
+
otelLogsHeaders: 'OTEL_EXPORTER_OTLP_LOGS_HEADERS',
|
|
339
|
+
otelLogsProtocol: 'OTEL_EXPORTER_OTLP_LOGS_PROTOCOL',
|
|
340
|
+
otelLogsTimeout: 'OTEL_EXPORTER_OTLP_LOGS_TIMEOUT',
|
|
341
|
+
otelLogsUrl: 'OTEL_EXPORTER_OTLP_LOGS_ENDPOINT',
|
|
342
|
+
otelLogsBatchTimeout: 'OTEL_BSP_SCHEDULE_DELAY',
|
|
343
|
+
otelLogsMaxExportBatchSize: 'OTEL_BSP_MAX_EXPORT_BATCH_SIZE',
|
|
332
344
|
}
|
|
333
345
|
|
|
334
346
|
const namesNeedFormatting = new Set(['DD_TAGS', 'peerServiceMapping', 'serviceMapping'])
|