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.
Files changed (63) hide show
  1. package/LICENSE-3rdparty.csv +5 -0
  2. package/index.d.ts +93 -1
  3. package/package.json +21 -2
  4. package/packages/datadog-instrumentations/src/azure-event-hubs.js +37 -0
  5. package/packages/datadog-instrumentations/src/azure-functions.js +3 -0
  6. package/packages/datadog-instrumentations/src/cucumber.js +7 -7
  7. package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -0
  8. package/packages/datadog-instrumentations/src/jest.js +29 -36
  9. package/packages/datadog-instrumentations/src/mocha/main.js +8 -9
  10. package/packages/datadog-instrumentations/src/mocha/utils.js +1 -1
  11. package/packages/datadog-instrumentations/src/mocha/worker.js +2 -2
  12. package/packages/datadog-instrumentations/src/pg.js +1 -1
  13. package/packages/datadog-instrumentations/src/playwright.js +5 -5
  14. package/packages/datadog-instrumentations/src/vitest.js +8 -8
  15. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +73 -27
  16. package/packages/datadog-plugin-azure-event-hubs/src/index.js +15 -0
  17. package/packages/datadog-plugin-azure-event-hubs/src/producer.js +82 -0
  18. package/packages/datadog-plugin-azure-functions/src/index.js +37 -0
  19. package/packages/datadog-plugin-cucumber/src/index.js +3 -3
  20. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +9 -9
  21. package/packages/datadog-plugin-jest/src/util.js +10 -2
  22. package/packages/datadog-plugin-mocha/src/index.js +2 -2
  23. package/packages/datadog-plugin-playwright/src/index.js +2 -2
  24. package/packages/datadog-plugin-vitest/src/index.js +2 -2
  25. package/packages/datadog-plugin-ws/src/server.js +5 -3
  26. package/packages/dd-trace/src/config.js +108 -26
  27. package/packages/dd-trace/src/config_defaults.js +12 -0
  28. package/packages/dd-trace/src/git_properties.js +90 -5
  29. package/packages/dd-trace/src/noop/proxy.js +3 -0
  30. package/packages/dd-trace/src/openfeature/constants/constants.js +51 -0
  31. package/packages/dd-trace/src/openfeature/flagging_provider.js +45 -0
  32. package/packages/dd-trace/src/openfeature/index.js +77 -0
  33. package/packages/dd-trace/src/openfeature/noop.js +101 -0
  34. package/packages/dd-trace/src/openfeature/writers/base.js +181 -0
  35. package/packages/dd-trace/src/openfeature/writers/exposures.js +173 -0
  36. package/packages/dd-trace/src/openfeature/writers/util.js +43 -0
  37. package/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +100 -0
  38. package/packages/dd-trace/src/opentelemetry/logs/index.js +87 -0
  39. package/packages/dd-trace/src/opentelemetry/logs/logger.js +77 -0
  40. package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +126 -0
  41. package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +173 -0
  42. package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +367 -0
  43. package/packages/dd-trace/src/opentelemetry/protos/common.proto +116 -0
  44. package/packages/dd-trace/src/opentelemetry/protos/logs.proto +226 -0
  45. package/packages/dd-trace/src/opentelemetry/protos/logs_service.proto +78 -0
  46. package/packages/dd-trace/src/opentelemetry/protos/protobuf_loader.js +48 -0
  47. package/packages/dd-trace/src/opentelemetry/protos/resource.proto +45 -0
  48. package/packages/dd-trace/src/plugins/ci_plugin.js +7 -6
  49. package/packages/dd-trace/src/plugins/index.js +1 -0
  50. package/packages/dd-trace/src/plugins/util/test.js +6 -5
  51. package/packages/dd-trace/src/profiling/config.js +21 -1
  52. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +3 -2
  53. package/packages/dd-trace/src/profiling/profiler.js +44 -22
  54. package/packages/dd-trace/src/profiling/profilers/events.js +12 -3
  55. package/packages/dd-trace/src/profiling/profilers/space.js +35 -24
  56. package/packages/dd-trace/src/profiling/profilers/wall.js +14 -6
  57. package/packages/dd-trace/src/proxy.js +22 -1
  58. package/packages/dd-trace/src/remote_config/capabilities.js +1 -0
  59. package/packages/dd-trace/src/remote_config/index.js +1 -0
  60. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +4 -0
  61. package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +8 -0
  62. package/packages/dd-trace/src/supported-configurations.json +17 -0
  63. 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._config = new Config(options)
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._config.flushInterval
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._config.profilers) {
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._config.profilers.length === 0) {
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._config.profilers) {
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, (key, value) => {
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._config
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._config.exporters.map(exporter =>
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._config.flushInterval / 1000
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
- type = 'events'
387
- #maxSamples
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 = options.timelineSamplingEnabled
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
- type = 'space'
12
- _pprof
13
- _started = false
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._samplingInterval = options.heapSamplingInterval || 512 * 1024
18
- this._stackDepth = options.stackDepth || 64
19
- this._oomMonitoring = options.oomMonitoring || {}
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._started) return
30
+ if (this.#started) return
24
31
 
25
- this._mapper = mapper
26
- this._pprof = require('@datadog/pprof')
27
- this._pprof.heap.start(this._samplingInterval, this._stackDepth)
28
- if (this._oomMonitoring.enabled) {
29
- const strategies = this._oomMonitoring.exportStrategies
30
- this._pprof.heap.monitorOutOfMemory(
31
- this._oomMonitoring.heapLimitExtensionSize,
32
- this._oomMonitoring.maxHeapExtensionCount,
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._oomMonitoring.exportCommand : [],
35
- (profile) => nearOOMCallback(this.type, this._pprof.encodeSync(profile)),
36
- strategiesToCallbackMode(strategies, this._pprof.heap.CallbackMode)
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._started = true
47
+ this.#started = true
41
48
  }
42
49
 
43
50
  profile (restart) {
44
- const profile = this._pprof.heap.profile(undefined, this._mapper, getThreadLabels)
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._started) return
57
- this._pprof.heap.stop()
58
- this._started = false
67
+ if (!this.#started) return
68
+ this.#pprof.heap.stop()
69
+ this.#started = false
59
70
  }
60
71
 
61
72
  isStarted () {
62
- return this._started
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 contextCountGauge = profilerTelemetryMetrics.gauge('wall.sample_contexts')
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
- contextCountGauge.mark(that._profilerState[kCPEDContextCount])
221
- }, that.#telemetryHeartbeatIntervalMillis)
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'])