dd-trace 5.54.0 → 5.55.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 (178) hide show
  1. package/ci/cypress/plugin.js +8 -0
  2. package/ci/cypress/polyfills.js +23 -0
  3. package/ci/init.js +8 -7
  4. package/initialize.mjs +2 -2
  5. package/package.json +6 -6
  6. package/packages/datadog-code-origin/index.js +22 -4
  7. package/packages/datadog-core/src/utils/src/kebabcase.js +3 -3
  8. package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -6
  9. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +2 -3
  10. package/packages/datadog-instrumentations/src/cookie-parser.js +1 -1
  11. package/packages/datadog-instrumentations/src/couchbase.js +3 -6
  12. package/packages/datadog-instrumentations/src/cucumber.js +21 -28
  13. package/packages/datadog-instrumentations/src/dns.js +4 -4
  14. package/packages/datadog-instrumentations/src/elasticsearch.js +9 -10
  15. package/packages/datadog-instrumentations/src/fastify.js +7 -9
  16. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +14 -16
  17. package/packages/datadog-instrumentations/src/hapi.js +10 -11
  18. package/packages/datadog-instrumentations/src/helpers/fetch.js +4 -5
  19. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -2
  20. package/packages/datadog-instrumentations/src/helpers/register.js +6 -5
  21. package/packages/datadog-instrumentations/src/jest.js +67 -98
  22. package/packages/datadog-instrumentations/src/koa.js +2 -3
  23. package/packages/datadog-instrumentations/src/mariadb.js +11 -4
  24. package/packages/datadog-instrumentations/src/mocha/main.js +79 -75
  25. package/packages/datadog-instrumentations/src/mocha.js +3 -1
  26. package/packages/datadog-instrumentations/src/mysql.js +11 -2
  27. package/packages/datadog-instrumentations/src/nyc.js +2 -1
  28. package/packages/datadog-instrumentations/src/openai.js +2 -2
  29. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +4 -3
  30. package/packages/datadog-instrumentations/src/pg.js +2 -3
  31. package/packages/datadog-instrumentations/src/playwright.js +19 -22
  32. package/packages/datadog-instrumentations/src/protobufjs.js +3 -4
  33. package/packages/datadog-instrumentations/src/redis.js +1 -1
  34. package/packages/datadog-instrumentations/src/restify.js +9 -13
  35. package/packages/datadog-instrumentations/src/router.js +12 -11
  36. package/packages/datadog-instrumentations/src/tedious.js +1 -2
  37. package/packages/datadog-instrumentations/src/vitest.js +15 -29
  38. package/packages/datadog-plugin-avsc/src/schema_iterator.js +12 -12
  39. package/packages/datadog-plugin-aws-sdk/src/base.js +12 -8
  40. package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +3 -5
  41. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +12 -20
  42. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +4 -5
  43. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +3 -5
  44. package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +3 -5
  45. package/packages/datadog-plugin-aws-sdk/src/services/s3.js +3 -5
  46. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -2
  47. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +7 -10
  48. package/packages/datadog-plugin-cucumber/src/index.js +3 -2
  49. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +2 -1
  50. package/packages/datadog-plugin-dd-trace-api/src/index.js +2 -1
  51. package/packages/datadog-plugin-elasticsearch/src/index.js +1 -1
  52. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +1 -1
  53. package/packages/datadog-plugin-graphql/src/index.js +3 -2
  54. package/packages/datadog-plugin-graphql/src/resolve.js +17 -10
  55. package/packages/datadog-plugin-http/src/client.js +5 -6
  56. package/packages/datadog-plugin-http2/src/client.js +7 -8
  57. package/packages/datadog-plugin-jest/src/index.js +3 -2
  58. package/packages/datadog-plugin-mocha/src/index.js +6 -1
  59. package/packages/datadog-plugin-mongodb-core/src/index.js +2 -1
  60. package/packages/datadog-plugin-mysql/src/index.js +11 -0
  61. package/packages/datadog-plugin-next/src/index.js +1 -1
  62. package/packages/datadog-plugin-openai/src/tracing.js +2 -4
  63. package/packages/datadog-plugin-playwright/src/index.js +3 -2
  64. package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +8 -9
  65. package/packages/datadog-plugin-redis/src/index.js +1 -3
  66. package/packages/datadog-plugin-vitest/src/index.js +5 -4
  67. package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +0 -1
  68. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +0 -1
  69. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +0 -1
  70. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +0 -1
  71. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +1 -2
  72. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +11 -12
  73. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -1
  74. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +2 -1
  75. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +1 -1
  76. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +1 -2
  77. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/range-utils.js +10 -11
  78. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +0 -4
  79. package/packages/dd-trace/src/appsec/iast/vulnerabilities.js +0 -1
  80. package/packages/dd-trace/src/appsec/index.js +4 -4
  81. package/packages/dd-trace/src/appsec/reporter.js +5 -7
  82. package/packages/dd-trace/src/appsec/sdk/set_user.js +2 -2
  83. package/packages/dd-trace/src/appsec/sdk/track_event.js +3 -3
  84. package/packages/dd-trace/src/appsec/telemetry/index.js +31 -1
  85. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +6 -2
  86. package/packages/dd-trace/src/azure_metadata.js +8 -3
  87. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +8 -7
  88. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +2 -1
  89. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +2 -1
  90. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +2 -1
  91. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +2 -1
  92. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +4 -3
  93. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +7 -6
  94. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -1
  95. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +4 -3
  96. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +4 -3
  97. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +2 -1
  98. package/packages/dd-trace/src/config-helper.js +89 -0
  99. package/packages/dd-trace/src/config.js +77 -78
  100. package/packages/dd-trace/src/config_stable.js +7 -4
  101. package/packages/dd-trace/src/datastreams/fnv.js +1 -1
  102. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +6 -6
  103. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +1 -2
  104. package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -2
  105. package/packages/dd-trace/src/debugger/devtools_client/index.js +2 -1
  106. package/packages/dd-trace/src/debugger/devtools_client/send.js +3 -2
  107. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +1 -2
  108. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +3 -4
  109. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +1 -1
  110. package/packages/dd-trace/src/debugger/index.js +1 -0
  111. package/packages/dd-trace/src/dogstatsd.js +2 -2
  112. package/packages/dd-trace/src/encode/0.4.js +5 -2
  113. package/packages/dd-trace/src/encode/0.5.js +3 -5
  114. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +5 -5
  115. package/packages/dd-trace/src/exporter.js +2 -1
  116. package/packages/dd-trace/src/exporters/common/docker.js +3 -2
  117. package/packages/dd-trace/src/exporters/common/request.js +4 -1
  118. package/packages/dd-trace/src/exporters/common/util.js +3 -1
  119. package/packages/dd-trace/src/id.js +3 -3
  120. package/packages/dd-trace/src/index.js +4 -3
  121. package/packages/dd-trace/src/lambda/handler.js +2 -1
  122. package/packages/dd-trace/src/lambda/index.js +2 -1
  123. package/packages/dd-trace/src/lambda/runtime/patch.js +3 -2
  124. package/packages/dd-trace/src/lambda/runtime/ritm.js +3 -2
  125. package/packages/dd-trace/src/llmobs/constants/tags.js +1 -0
  126. package/packages/dd-trace/src/llmobs/index.js +21 -5
  127. package/packages/dd-trace/src/llmobs/noop.js +18 -20
  128. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/index.js +11 -13
  129. package/packages/dd-trace/src/llmobs/plugins/openai.js +1 -2
  130. package/packages/dd-trace/src/llmobs/sdk.js +2 -1
  131. package/packages/dd-trace/src/llmobs/span_processor.js +1 -1
  132. package/packages/dd-trace/src/llmobs/tagger.js +19 -6
  133. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  134. package/packages/dd-trace/src/log/index.js +5 -4
  135. package/packages/dd-trace/src/log/writer.js +1 -2
  136. package/packages/dd-trace/src/msgpack/encoder.js +3 -3
  137. package/packages/dd-trace/src/noop/span.js +1 -1
  138. package/packages/dd-trace/src/opentelemetry/tracer.js +1 -1
  139. package/packages/dd-trace/src/opentracing/propagation/log.js +4 -5
  140. package/packages/dd-trace/src/opentracing/propagation/text_map.js +17 -18
  141. package/packages/dd-trace/src/opentracing/span.js +7 -6
  142. package/packages/dd-trace/src/payload-tagging/config/index.js +17 -21
  143. package/packages/dd-trace/src/plugin_manager.js +4 -3
  144. package/packages/dd-trace/src/plugins/ci_plugin.js +25 -1
  145. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  146. package/packages/dd-trace/src/plugins/util/ci.js +7 -7
  147. package/packages/dd-trace/src/plugins/util/git.js +1 -1
  148. package/packages/dd-trace/src/plugins/util/llm.js +2 -2
  149. package/packages/dd-trace/src/plugins/util/stacktrace.js +8 -1
  150. package/packages/dd-trace/src/plugins/util/test.js +4 -3
  151. package/packages/dd-trace/src/plugins/util/user-provided-git.js +2 -1
  152. package/packages/dd-trace/src/plugins/util/web.js +3 -4
  153. package/packages/dd-trace/src/priority_sampler.js +46 -35
  154. package/packages/dd-trace/src/profiling/config.js +12 -32
  155. package/packages/dd-trace/src/profiling/exporter_cli.js +20 -20
  156. package/packages/dd-trace/src/profiling/exporters/agent.js +1 -1
  157. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +2 -1
  158. package/packages/dd-trace/src/profiling/index.js +2 -1
  159. package/packages/dd-trace/src/profiling/profiler.js +7 -4
  160. package/packages/dd-trace/src/profiling/ssi-telemetry-mock-profiler.js +3 -1
  161. package/packages/dd-trace/src/profiling/tagger.js +22 -12
  162. package/packages/dd-trace/src/proxy.js +2 -1
  163. package/packages/dd-trace/src/ritm.js +4 -4
  164. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +3 -2
  165. package/packages/dd-trace/src/sampler.js +10 -2
  166. package/packages/dd-trace/src/serverless.js +11 -4
  167. package/packages/dd-trace/src/span_processor.js +2 -1
  168. package/packages/dd-trace/src/standalone/tracesource.js +1 -2
  169. package/packages/dd-trace/src/standalone/tracesource_priority_sampler.js +1 -2
  170. package/packages/dd-trace/src/startup-log.js +5 -17
  171. package/packages/dd-trace/src/supported-configurations.json +439 -0
  172. package/packages/dd-trace/src/telemetry/dependencies.js +62 -57
  173. package/packages/dd-trace/src/telemetry/send-data.js +7 -6
  174. package/packages/dd-trace/src/telemetry/telemetry.js +12 -25
  175. package/packages/dd-trace/src/tracer.js +3 -7
  176. package/packages/dd-trace/src/util.js +0 -5
  177. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +0 -120
  178. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/header-sensitive-analyzer.js +0 -20
@@ -19,6 +19,7 @@ const telemetryMetrics = require('./telemetry/metrics')
19
19
  const { isInServerlessEnvironment, getIsGCPFunction, getIsAzureFunction } = require('./serverless')
20
20
  const { ORIGIN_KEY, GRPC_CLIENT_ERROR_STATUSES, GRPC_SERVER_ERROR_STATUSES } = require('./constants')
21
21
  const { appendRules } = require('./payload-tagging/config')
22
+ const { getEnvironmentVariable, getEnvironmentVariables } = require('./config-helper')
22
23
 
23
24
  const tracerMetrics = telemetryMetrics.manager.namespace('tracers')
24
25
 
@@ -80,10 +81,10 @@ function getFromOtelSamplerMap (otelTracesSampler, otelTracesSamplerArg) {
80
81
  }
81
82
 
82
83
  function validateOtelPropagators (propagators) {
83
- if (!process.env.PROPAGATION_STYLE_EXTRACT &&
84
- !process.env.PROPAGATION_STYLE_INJECT &&
85
- !process.env.DD_TRACE_PROPAGATION_STYLE &&
86
- process.env.OTEL_PROPAGATORS) {
84
+ if (!getEnvironmentVariable('PROPAGATION_STYLE_EXTRACT') &&
85
+ !getEnvironmentVariable('PROPAGATION_STYLE_INJECT') &&
86
+ !getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE') &&
87
+ getEnvironmentVariable('OTEL_PROPAGATORS')) {
87
88
  for (const style in propagators) {
88
89
  if (!VALID_PROPAGATION_STYLES.has(style)) {
89
90
  log.warn('unexpected value for OTEL_PROPAGATORS environment variable')
@@ -94,7 +95,7 @@ function validateOtelPropagators (propagators) {
94
95
  }
95
96
 
96
97
  function validateEnvVarType (envVar) {
97
- const value = process.env[envVar]
98
+ const value = getEnvironmentVariable(envVar)
98
99
  switch (envVar) {
99
100
  case 'OTEL_LOG_LEVEL':
100
101
  return VALID_LOG_LEVELS.has(value)
@@ -103,7 +104,7 @@ function validateEnvVarType (envVar) {
103
104
  case 'OTEL_SERVICE_NAME':
104
105
  return typeof value === 'string'
105
106
  case 'OTEL_TRACES_SAMPLER':
106
- return getFromOtelSamplerMap(value, process.env.OTEL_TRACES_SAMPLER_ARG) !== undefined
107
+ return getFromOtelSamplerMap(value, getEnvironmentVariable('OTEL_TRACES_SAMPLER_ARG')) !== undefined
107
108
  case 'OTEL_TRACES_SAMPLER_ARG':
108
109
  return !Number.isNaN(Number.parseFloat(value))
109
110
  case 'OTEL_SDK_DISABLED':
@@ -119,12 +120,12 @@ function validateEnvVarType (envVar) {
119
120
 
120
121
  function checkIfBothOtelAndDdEnvVarSet () {
121
122
  for (const [otelEnvVar, ddEnvVar] of Object.entries(otelDdEnvMapping)) {
122
- if (ddEnvVar && process.env[ddEnvVar] && process.env[otelEnvVar]) {
123
+ if (ddEnvVar && getEnvironmentVariable(ddEnvVar) && getEnvironmentVariable(otelEnvVar)) {
123
124
  log.warn(`both ${ddEnvVar} and ${otelEnvVar} environment variables are set`)
124
125
  getCounter('otel.env.hiding', ddEnvVar, otelEnvVar).inc()
125
126
  }
126
127
 
127
- if (process.env[otelEnvVar] && !validateEnvVarType(otelEnvVar)) {
128
+ if (getEnvironmentVariable(otelEnvVar) && !validateEnvVarType(otelEnvVar)) {
128
129
  log.warn(`unexpected value for ${otelEnvVar} environment variable`)
129
130
  getCounter('otel.env.invalid', ddEnvVar, otelEnvVar).inc()
130
131
  }
@@ -178,7 +179,7 @@ function validateNamingVersion (versionString) {
178
179
  * @param {string | string[]} input
179
180
  */
180
181
  function splitJSONPathRules (input) {
181
- if (!input) return null
182
+ if (!input) return
182
183
  if (Array.isArray(input)) return input
183
184
  if (input === 'all') return []
184
185
  return input.split(',')
@@ -211,7 +212,8 @@ function propagationStyle (key, option) {
211
212
  // Otherwise, fallback to env var parsing
212
213
  const envKey = `DD_TRACE_PROPAGATION_STYLE_${key.toUpperCase()}`
213
214
 
214
- const envVar = coalesce(process.env[envKey], process.env.DD_TRACE_PROPAGATION_STYLE, process.env.OTEL_PROPAGATORS)
215
+ const envVar = coalesce(getEnvironmentVariable(envKey),
216
+ getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE'), getEnvironmentVariable('OTEL_PROPAGATORS'))
215
217
  if (envVar !== undefined) {
216
218
  return envVar.split(',')
217
219
  .filter(v => v !== '')
@@ -265,14 +267,11 @@ class Config {
265
267
 
266
268
  checkIfBothOtelAndDdEnvVarSet()
267
269
 
268
- const DD_API_KEY = coalesce(
269
- process.env.DATADOG_API_KEY,
270
- process.env.DD_API_KEY
271
- )
270
+ const DD_API_KEY = getEnvironmentVariable('DD_API_KEY')
272
271
 
273
- if (process.env.DD_TRACE_PROPAGATION_STYLE && (
274
- process.env.DD_TRACE_PROPAGATION_STYLE_INJECT ||
275
- process.env.DD_TRACE_PROPAGATION_STYLE_EXTRACT
272
+ if (getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE') && (
273
+ getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE_INJECT') ||
274
+ getEnvironmentVariable('DD_TRACE_PROPAGATION_STYLE_EXTRACT')
276
275
  )) {
277
276
  log.warn(
278
277
  'Use either the DD_TRACE_PROPAGATION_STYLE environment variable or separate ' +
@@ -294,34 +293,34 @@ class Config {
294
293
  }
295
294
 
296
295
  const DD_INSTRUMENTATION_INSTALL_ID = coalesce(
297
- process.env.DD_INSTRUMENTATION_INSTALL_ID,
296
+ getEnvironmentVariable('DD_INSTRUMENTATION_INSTALL_ID'),
298
297
  null
299
298
  )
300
299
  const DD_INSTRUMENTATION_INSTALL_TIME = coalesce(
301
- process.env.DD_INSTRUMENTATION_INSTALL_TIME,
300
+ getEnvironmentVariable('DD_INSTRUMENTATION_INSTALL_TIME'),
302
301
  null
303
302
  )
304
303
  const DD_INSTRUMENTATION_INSTALL_TYPE = coalesce(
305
- process.env.DD_INSTRUMENTATION_INSTALL_TYPE,
304
+ getEnvironmentVariable('DD_INSTRUMENTATION_INSTALL_TYPE'),
306
305
  null
307
306
  )
308
307
 
309
308
  const DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING = splitJSONPathRules(
310
309
  coalesce(
311
- process.env.DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING,
310
+ getEnvironmentVariable('DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING'),
312
311
  options.cloudPayloadTagging?.request,
313
312
  ''
314
313
  ))
315
314
 
316
315
  const DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING = splitJSONPathRules(
317
316
  coalesce(
318
- process.env.DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING,
317
+ getEnvironmentVariable('DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING'),
319
318
  options.cloudPayloadTagging?.response,
320
319
  ''
321
320
  ))
322
321
 
323
322
  const DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH = coalesce(
324
- process.env.DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH,
323
+ getEnvironmentVariable('DD_TRACE_CLOUD_PAYLOAD_TAGGING_MAX_DEPTH'),
325
324
  options.cloudPayloadTagging?.maxDepth,
326
325
  10
327
326
  )
@@ -370,17 +369,17 @@ class Config {
370
369
  if (this.gitMetadataEnabled) {
371
370
  this.repositoryUrl = removeUserSensitiveInfo(
372
371
  coalesce(
373
- process.env.DD_GIT_REPOSITORY_URL,
372
+ getEnvironmentVariable('DD_GIT_REPOSITORY_URL'),
374
373
  this.tags[GIT_REPOSITORY_URL]
375
374
  )
376
375
  )
377
376
  this.commitSHA = coalesce(
378
- process.env.DD_GIT_COMMIT_SHA,
377
+ getEnvironmentVariable('DD_GIT_COMMIT_SHA'),
379
378
  this.tags[GIT_COMMIT_SHA]
380
379
  )
381
380
  if (!this.repositoryUrl || !this.commitSHA) {
382
381
  const DD_GIT_PROPERTIES_FILE = coalesce(
383
- process.env.DD_GIT_PROPERTIES_FILE,
382
+ getEnvironmentVariable('DD_GIT_PROPERTIES_FILE'),
384
383
  `${process.cwd()}/git.properties`
385
384
  )
386
385
  let gitPropertiesString
@@ -388,7 +387,7 @@ class Config {
388
387
  gitPropertiesString = fs.readFileSync(DD_GIT_PROPERTIES_FILE, 'utf8')
389
388
  } catch (e) {
390
389
  // Only log error if the user has set a git.properties path
391
- if (process.env.DD_GIT_PROPERTIES_FILE) {
390
+ if (getEnvironmentVariable('DD_GIT_PROPERTIES_FILE')) {
392
391
  log.error('Error reading DD_GIT_PROPERTIES_FILE: %s', DD_GIT_PROPERTIES_FILE, e)
393
392
  }
394
393
  }
@@ -418,7 +417,7 @@ class Config {
418
417
  // TODO: Remove the experimental env vars as a major?
419
418
  const DD_TRACE_B3_ENABLED = coalesce(
420
419
  options.experimental && options.experimental.b3,
421
- process.env.DD_TRACE_EXPERIMENTAL_B3_ENABLED,
420
+ getEnvironmentVariable('DD_TRACE_EXPERIMENTAL_B3_ENABLED'),
422
421
  false
423
422
  )
424
423
  const defaultPropagationStyle = ['datadog', 'tracecontext']
@@ -439,7 +438,7 @@ class Config {
439
438
  FUNCTION_NAME,
440
439
  K_SERVICE,
441
440
  WEBSITE_SITE_NAME
442
- } = process.env
441
+ } = getEnvironmentVariables()
443
442
 
444
443
  const service = AWS_LAMBDA_FUNCTION_NAME ||
445
444
  FUNCTION_NAME || // Google Cloud Function Name set by deprecated runtimes
@@ -643,7 +642,6 @@ class Config {
643
642
  DD_API_SECURITY_SAMPLE_DELAY,
644
643
  DD_APM_TRACING_ENABLED,
645
644
  DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE,
646
- DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING,
647
645
  DD_APPSEC_COLLECT_ALL_HEADERS,
648
646
  DD_APPSEC_ENABLED,
649
647
  DD_APPSEC_GRAPHQL_BLOCKED_TEMPLATE_JSON,
@@ -667,16 +665,14 @@ class Config {
667
665
  DD_CODE_ORIGIN_FOR_SPANS_EXPERIMENTAL_EXIT_SPANS_ENABLED,
668
666
  DD_DATA_STREAMS_ENABLED,
669
667
  DD_DBM_PROPAGATION_MODE,
670
- DD_DOGSTATSD_HOSTNAME,
671
668
  DD_DOGSTATSD_HOST,
672
669
  DD_DOGSTATSD_PORT,
673
670
  DD_DYNAMIC_INSTRUMENTATION_ENABLED,
674
671
  DD_DYNAMIC_INSTRUMENTATION_REDACTED_IDENTIFIERS,
675
672
  DD_DYNAMIC_INSTRUMENTATION_REDACTION_EXCLUDED_IDENTIFIERS,
676
673
  DD_ENV,
677
- DD_EXPERIMENTAL_API_SECURITY_ENABLED,
678
674
  DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED,
679
- DD_EXPERIMENTAL_PROFILING_ENABLED,
675
+ DD_PROFILING_ENABLED,
680
676
  DD_GRPC_CLIENT_ERROR_STATUSES,
681
677
  DD_GRPC_SERVER_ERROR_STATUSES,
682
678
  JEST_WORKER_ID,
@@ -703,7 +699,6 @@ class Config {
703
699
  DD_LLMOBS_ML_APP,
704
700
  DD_OPENAI_LOGS_ENABLED,
705
701
  DD_OPENAI_SPAN_CHAR_LIMIT,
706
- DD_PROFILING_ENABLED,
707
702
  DD_PROFILING_EXPORTERS,
708
703
  DD_PROFILING_SOURCE_MAP,
709
704
  DD_INTERNAL_PROFILING_LONG_LIVED_THRESHOLD,
@@ -712,7 +707,6 @@ class Config {
712
707
  DD_RUNTIME_METRICS_ENABLED,
713
708
  DD_SERVICE,
714
709
  DD_SERVICE_MAPPING,
715
- DD_SERVICE_NAME,
716
710
  DD_SITE,
717
711
  DD_SPAN_SAMPLING_RULES,
718
712
  DD_SPAN_SAMPLING_RULES_FILE,
@@ -724,7 +718,6 @@ class Config {
724
718
  DD_TELEMETRY_METRICS_ENABLED,
725
719
  DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED,
726
720
  DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED,
727
- DD_TRACE_AGENT_HOSTNAME,
728
721
  DD_TRACE_AGENT_PORT,
729
722
  DD_TRACE_AGENT_PROTOCOL_VERSION,
730
723
  DD_TRACE_AWS_ADD_SPAN_POINTERS,
@@ -763,7 +756,6 @@ class Config {
763
756
  DD_TRACE_SPAN_LEAK_DEBUG,
764
757
  DD_TRACE_STARTUP_LOGS,
765
758
  DD_TRACE_TAGS,
766
- DD_TRACE_TELEMETRY_ENABLED,
767
759
  DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH,
768
760
  DD_TRACING_ENABLED,
769
761
  DD_VERSION,
@@ -777,7 +769,7 @@ class Config {
777
769
  OTEL_SERVICE_NAME,
778
770
  OTEL_TRACES_SAMPLER,
779
771
  OTEL_TRACES_SAMPLER_ARG
780
- } = process.env
772
+ } = getEnvironmentVariables()
781
773
 
782
774
  const tags = {}
783
775
  const env = setHiddenProperty(this, '_env', {})
@@ -792,10 +784,7 @@ class Config {
792
784
  DD_APM_TRACING_ENABLED,
793
785
  DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED && isFalse(DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED)
794
786
  ))
795
- this._setBoolean(env, 'appsec.apiSecurity.enabled', coalesce(
796
- DD_API_SECURITY_ENABLED && isTrue(DD_API_SECURITY_ENABLED),
797
- DD_EXPERIMENTAL_API_SECURITY_ENABLED && isTrue(DD_EXPERIMENTAL_API_SECURITY_ENABLED)
798
- ))
787
+ this._setBoolean(env, 'appsec.apiSecurity.enabled', DD_API_SECURITY_ENABLED && isTrue(DD_API_SECURITY_ENABLED))
799
788
  this._setValue(env, 'appsec.apiSecurity.sampleDelay', maybeFloat(DD_API_SECURITY_SAMPLE_DELAY))
800
789
  this._setValue(env, 'appsec.blockedTemplateGraphql', maybeFile(DD_APPSEC_GRAPHQL_BLOCKED_TEMPLATE_JSON))
801
790
  this._setValue(env, 'appsec.blockedTemplateHtml', maybeFile(DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML))
@@ -803,10 +792,7 @@ class Config {
803
792
  this._setValue(env, 'appsec.blockedTemplateJson', maybeFile(DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON))
804
793
  this._envUnprocessed['appsec.blockedTemplateJson'] = DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON
805
794
  this._setBoolean(env, 'appsec.enabled', DD_APPSEC_ENABLED)
806
- this._setString(env, 'appsec.eventTracking.mode', coalesce(
807
- DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE,
808
- DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING // TODO: remove in next major
809
- ))
795
+ this._setString(env, 'appsec.eventTracking.mode', DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE)
810
796
  this._setBoolean(env, 'appsec.extendedHeadersCollection.enabled', DD_APPSEC_COLLECT_ALL_HEADERS)
811
797
  this._setBoolean(
812
798
  env,
@@ -847,7 +833,7 @@ class Config {
847
833
  DD_CODE_ORIGIN_FOR_SPANS_EXPERIMENTAL_EXIT_SPANS_ENABLED
848
834
  )
849
835
  this._setString(env, 'dbmPropagationMode', DD_DBM_PROPAGATION_MODE)
850
- this._setString(env, 'dogstatsd.hostname', DD_DOGSTATSD_HOST || DD_DOGSTATSD_HOSTNAME)
836
+ this._setString(env, 'dogstatsd.hostname', DD_DOGSTATSD_HOST)
851
837
  this._setString(env, 'dogstatsd.port', DD_DOGSTATSD_PORT)
852
838
  this._setBoolean(env, 'dsmEnabled', DD_DATA_STREAMS_ENABLED)
853
839
  this._setBoolean(env, 'dynamicInstrumentation.enabled', DD_DYNAMIC_INSTRUMENTATION_ENABLED)
@@ -869,7 +855,7 @@ class Config {
869
855
  this._setIntegerRangeSet(env, 'grpc.client.error.statuses', DD_GRPC_CLIENT_ERROR_STATUSES)
870
856
  this._setIntegerRangeSet(env, 'grpc.server.error.statuses', DD_GRPC_SERVER_ERROR_STATUSES)
871
857
  this._setArray(env, 'headerTags', DD_TRACE_HEADER_TAGS)
872
- this._setString(env, 'hostname', coalesce(DD_AGENT_HOST, DD_TRACE_AGENT_HOSTNAME))
858
+ this._setString(env, 'hostname', DD_AGENT_HOST)
873
859
  this._setValue(env, 'iast.dbRowsToTaint', maybeInt(DD_IAST_DB_ROWS_TO_TAINT))
874
860
  this._setBoolean(env, 'iast.deduplicationEnabled', DD_IAST_DEDUPLICATION_ENABLED)
875
861
  this._setBoolean(env, 'iast.enabled', DD_IAST_ENABLED)
@@ -915,7 +901,6 @@ class Config {
915
901
  this._setString(env, 'port', DD_TRACE_AGENT_PORT)
916
902
  const profilingEnabled = normalizeProfilingEnabledValue(
917
903
  coalesce(
918
- DD_EXPERIMENTAL_PROFILING_ENABLED,
919
904
  DD_PROFILING_ENABLED,
920
905
  this._isInServerlessEnvironment() ? 'false' : undefined
921
906
  )
@@ -953,10 +938,10 @@ class Config {
953
938
  this._setSamplingRule(env, 'sampler.rules', safeJsonParse(DD_TRACE_SAMPLING_RULES))
954
939
  this._envUnprocessed['sampler.rules'] = DD_TRACE_SAMPLING_RULES
955
940
  this._setString(env, 'scope', DD_TRACE_SCOPE)
956
- this._setString(env, 'service', DD_SERVICE || DD_SERVICE_NAME || tags.service || OTEL_SERVICE_NAME)
941
+ this._setString(env, 'service', DD_SERVICE || tags.service || OTEL_SERVICE_NAME)
957
942
  if (DD_SERVICE_MAPPING) {
958
943
  this._setValue(env, 'serviceMapping', Object.fromEntries(
959
- process.env.DD_SERVICE_MAPPING.split(',').map(x => x.trim().split(':'))
944
+ DD_SERVICE_MAPPING.split(',').map(x => x.trim().split(':'))
960
945
  ))
961
946
  }
962
947
  this._setString(env, 'site', DD_SITE)
@@ -971,8 +956,7 @@ class Config {
971
956
  this._setTags(env, 'tags', tags)
972
957
  this._setValue(env, 'tagsHeaderMaxLength', DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH)
973
958
  this._setBoolean(env, 'telemetry.enabled', coalesce(
974
- DD_TRACE_TELEMETRY_ENABLED, // for backward compatibility
975
- DD_INSTRUMENTATION_TELEMETRY_ENABLED, // to comply with instrumentation telemetry specs
959
+ DD_INSTRUMENTATION_TELEMETRY_ENABLED,
976
960
  !(this._isInServerlessEnvironment() || JEST_WORKER_ID)
977
961
  ))
978
962
  this._setString(env, 'instrumentation_config_id', DD_INSTRUMENTATION_CONFIG_ID)
@@ -1016,7 +1000,7 @@ class Config {
1016
1000
  const tags = {}
1017
1001
  setHiddenProperty(this, '_optsUnprocessed', {})
1018
1002
 
1019
- options = setHiddenProperty(this, '_optionsArg', Object.assign({ ingestion: {} }, options, opts))
1003
+ options = setHiddenProperty(this, '_optionsArg', { ingestion: {}, ...options, ...opts })
1020
1004
 
1021
1005
  tagger.add(tags, options.tags)
1022
1006
 
@@ -1181,20 +1165,19 @@ class Config {
1181
1165
 
1182
1166
  _isCiVisibilityItrEnabled () {
1183
1167
  return coalesce(
1184
- process.env.DD_CIVISIBILITY_ITR_ENABLED,
1168
+ getEnvironmentVariable('DD_CIVISIBILITY_ITR_ENABLED'),
1185
1169
  true
1186
1170
  )
1187
1171
  }
1188
1172
 
1189
1173
  _getHostname () {
1190
- const DD_CIVISIBILITY_AGENTLESS_URL = process.env.DD_CIVISIBILITY_AGENTLESS_URL
1174
+ const DD_CIVISIBILITY_AGENTLESS_URL = getEnvironmentVariable('DD_CIVISIBILITY_AGENTLESS_URL')
1191
1175
  const url = DD_CIVISIBILITY_AGENTLESS_URL
1192
1176
  ? new URL(DD_CIVISIBILITY_AGENTLESS_URL)
1193
1177
  : getAgentUrl(this._getTraceAgentUrl(), this._optionsArg)
1194
1178
  const DD_AGENT_HOST = coalesce(
1195
1179
  this._optionsArg.hostname,
1196
- process.env.DD_AGENT_HOST,
1197
- process.env.DD_TRACE_AGENT_HOSTNAME,
1180
+ getEnvironmentVariable('DD_AGENT_HOST'),
1198
1181
  '127.0.0.1'
1199
1182
  )
1200
1183
  return DD_AGENT_HOST || (url && url.hostname)
@@ -1204,17 +1187,17 @@ class Config {
1204
1187
  const DD_TRACE_SPAN_ATTRIBUTE_SCHEMA = validateNamingVersion(
1205
1188
  coalesce(
1206
1189
  this._optionsArg.spanAttributeSchema,
1207
- process.env.DD_TRACE_SPAN_ATTRIBUTE_SCHEMA
1190
+ getEnvironmentVariable('DD_TRACE_SPAN_ATTRIBUTE_SCHEMA')
1208
1191
  )
1209
1192
  )
1210
1193
 
1211
1194
  const peerServiceSet = (
1212
1195
  this._optionsArg.hasOwnProperty('spanComputePeerService') ||
1213
- process.env.hasOwnProperty('DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED')
1196
+ getEnvironmentVariables().hasOwnProperty('DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED')
1214
1197
  )
1215
1198
  const peerServiceValue = coalesce(
1216
1199
  this._optionsArg.spanComputePeerService,
1217
- process.env.DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED
1200
+ getEnvironmentVariable('DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED')
1218
1201
  )
1219
1202
 
1220
1203
  const spanComputePeerService = (
@@ -1230,14 +1213,14 @@ class Config {
1230
1213
 
1231
1214
  _isCiVisibilityGitUploadEnabled () {
1232
1215
  return coalesce(
1233
- process.env.DD_CIVISIBILITY_GIT_UPLOAD_ENABLED,
1216
+ getEnvironmentVariable('DD_CIVISIBILITY_GIT_UPLOAD_ENABLED'),
1234
1217
  true
1235
1218
  )
1236
1219
  }
1237
1220
 
1238
1221
  _isCiVisibilityManualApiEnabled () {
1239
1222
  return coalesce(
1240
- process.env.DD_CIVISIBILITY_MANUAL_API_ENABLED,
1223
+ getEnvironmentVariable('DD_CIVISIBILITY_MANUAL_API_ENABLED'),
1241
1224
  true
1242
1225
  )
1243
1226
  }
@@ -1248,7 +1231,7 @@ class Config {
1248
1231
 
1249
1232
  return apmTracingEnabled && coalesce(
1250
1233
  this._optionsArg.stats,
1251
- process.env.DD_TRACE_STATS_COMPUTATION_ENABLED,
1234
+ getEnvironmentVariable('DD_TRACE_STATS_COMPUTATION_ENABLED'),
1252
1235
  getIsGCPFunction() || getIsAzureFunction()
1253
1236
  )
1254
1237
  }
@@ -1256,8 +1239,7 @@ class Config {
1256
1239
  _getTraceAgentUrl () {
1257
1240
  return coalesce(
1258
1241
  this._optionsArg.url,
1259
- process.env.DD_TRACE_AGENT_URL,
1260
- process.env.DD_TRACE_URL,
1242
+ getEnvironmentVariable('DD_TRACE_AGENT_URL'),
1261
1243
  null
1262
1244
  )
1263
1245
  }
@@ -1277,7 +1259,7 @@ class Config {
1277
1259
  DD_TEST_MANAGEMENT_ENABLED,
1278
1260
  DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES,
1279
1261
  DD_CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED
1280
- } = process.env
1262
+ } = getEnvironmentVariables()
1281
1263
 
1282
1264
  if (DD_CIVISIBILITY_AGENTLESS_URL) {
1283
1265
  this._setValue(calc, 'url', new URL(DD_CIVISIBILITY_AGENTLESS_URL))
@@ -1454,12 +1436,7 @@ class Config {
1454
1436
  obj[name] = value
1455
1437
  }
1456
1438
 
1457
- // TODO: Report origin changes and errors to telemetry.
1458
- // TODO: Deeply merge configurations.
1459
- // TODO: Move change tracking to telemetry.
1460
- // for telemetry reporting, `name`s in `containers` need to be keys from:
1461
- // https://github.com/DataDog/dd-go/blob/prod/trace/apps/tracer-telemetry-intake/telemetry-payload/static/config_norm_rules.json
1462
- _merge () {
1439
+ _getContainersAndOriginsOrdered () {
1463
1440
  const containers = [
1464
1441
  this._remote,
1465
1442
  this._options,
@@ -1478,6 +1455,17 @@ class Config {
1478
1455
  'calculated',
1479
1456
  'default'
1480
1457
  ]
1458
+
1459
+ return { containers, origins }
1460
+ }
1461
+
1462
+ // TODO: Report origin changes and errors to telemetry.
1463
+ // TODO: Deeply merge configurations.
1464
+ // TODO: Move change tracking to telemetry.
1465
+ // for telemetry reporting, `name`s in `containers` need to be keys from:
1466
+ // https://github.com/DataDog/dd-go/blob/prod/trace/apps/tracer-telemetry-intake/telemetry-payload/static/config_norm_rules.json
1467
+ _merge () {
1468
+ const { containers, origins } = this._getContainersAndOriginsOrdered()
1481
1469
  const unprocessedValues = [
1482
1470
  this._remoteUnprocessed,
1483
1471
  this._optsUnprocessed,
@@ -1514,6 +1502,18 @@ class Config {
1514
1502
  updateConfig(changes, this)
1515
1503
  }
1516
1504
 
1505
+ getOrigin (name) {
1506
+ const { containers, origins } = this._getContainersAndOriginsOrdered()
1507
+
1508
+ for (let i = 0; i < containers.length; i++) {
1509
+ const container = containers[i]
1510
+ const value = container[name]
1511
+ if (value != null || container === this._defaults) {
1512
+ return origins[i]
1513
+ }
1514
+ }
1515
+ }
1516
+
1517
1517
  // TODO: Refactor the Config class so it never produces any config objects that are incompatible with MessageChannel
1518
1518
  /**
1519
1519
  * Serializes the config object so it can be passed over a Worker Thread MessageChannel.
@@ -1536,12 +1536,12 @@ function handleOtel (tagString) {
1536
1536
  ?.replace(/(^|,)deployment\.environment=/, '$1env:')
1537
1537
  .replace(/(^|,)service\.name=/, '$1service:')
1538
1538
  .replace(/(^|,)service\.version=/, '$1version:')
1539
- .replace(/=/g, ':')
1539
+ .replaceAll('=', ':')
1540
1540
  }
1541
1541
 
1542
1542
  function parseSpaceSeparatedTags (tagString) {
1543
1543
  if (tagString && !tagString.includes(',')) {
1544
- tagString = tagString.replace(/\s+/g, ',')
1544
+ tagString = tagString.replaceAll(/\s+/g, ',')
1545
1545
  }
1546
1546
  return tagString
1547
1547
  }
@@ -1564,9 +1564,8 @@ function getAgentUrl (url, options) {
1564
1564
  if (
1565
1565
  !options.hostname &&
1566
1566
  !options.port &&
1567
- !process.env.DD_AGENT_HOST &&
1568
- !process.env.DD_TRACE_AGENT_HOSTNAME &&
1569
- !process.env.DD_TRACE_AGENT_PORT &&
1567
+ !getEnvironmentVariable('DD_AGENT_HOST') &&
1568
+ !getEnvironmentVariable('DD_TRACE_AGENT_PORT') &&
1570
1569
  fs.existsSync('/var/run/datadog/apm.socket')
1571
1570
  ) {
1572
1571
  return new URL('unix:///var/run/datadog/apm.socket')
@@ -1,5 +1,6 @@
1
1
  const os = require('os')
2
2
  const fs = require('fs')
3
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
3
4
 
4
5
  class StableConfig {
5
6
  constructor () {
@@ -40,6 +41,8 @@ class StableConfig {
40
41
 
41
42
  try {
42
43
  const configurator = new libconfig.JsConfigurator()
44
+ // Intentionally pass through the raw environment variables for reporting.
45
+ // eslint-disable-next-line eslint-rules/eslint-process-env
43
46
  configurator.set_envp(Object.entries(process.env).map(([key, value]) => `${key}=${value}`))
44
47
  configurator.set_args(process.argv)
45
48
  configurator.get_configuration(localConfig.toString(), fleetConfig.toString()).forEach((entry) => {
@@ -86,11 +89,11 @@ class StableConfig {
86
89
  }
87
90
 
88
91
  // Allow overriding the paths for testing
89
- if (process.env.DD_TEST_LOCAL_CONFIG_PATH !== undefined) {
90
- localConfigPath = process.env.DD_TEST_LOCAL_CONFIG_PATH
92
+ if (getEnvironmentVariable('DD_TEST_LOCAL_CONFIG_PATH') !== undefined) {
93
+ localConfigPath = getEnvironmentVariable('DD_TEST_LOCAL_CONFIG_PATH')
91
94
  }
92
- if (process.env.DD_TEST_FLEET_CONFIG_PATH !== undefined) {
93
- fleetConfigPath = process.env.DD_TEST_FLEET_CONFIG_PATH
95
+ if (getEnvironmentVariable('DD_TEST_FLEET_CONFIG_PATH') !== undefined) {
96
+ fleetConfigPath = getEnvironmentVariable('DD_TEST_FLEET_CONFIG_PATH')
94
97
  }
95
98
 
96
99
  return { localConfigPath, fleetConfigPath }
@@ -5,7 +5,7 @@ function fnv (data, hvalInit, fnvPrime, fnvSize) {
5
5
  let hval = hvalInit
6
6
  for (const byte of data) {
7
7
  hval = (hval * fnvPrime) % fnvSize
8
- hval = hval ^ BigInt(byte)
8
+ hval ^= BigInt(byte)
9
9
  }
10
10
  return hval
11
11
  }
@@ -117,12 +117,12 @@ function convertKey (key) {
117
117
  function jsonStringify (obj, indent = 2) {
118
118
  // made to stringify json exactly similar to python / java in order for hashing to be the same
119
119
  const jsonString = JSON.stringify(obj, (_, value) => value, indent)
120
- return jsonString.replace(/^ +/gm, ' ') // Replace leading spaces with single space
121
- .replace(/\n/g, '') // Remove newlines
122
- .replace(/{ /g, '{') // Remove space after '{'
123
- .replace(/ }/g, '}') // Remove space before '}'
124
- .replace(/\[ /g, '[') // Remove space after '['
125
- .replace(/ \]/g, ']') // Remove space before ']'
120
+ return jsonString.replaceAll(/^ +/gm, ' ') // Replace leading spaces with single space
121
+ .replaceAll('\n', '') // Remove newlines
122
+ .replaceAll('{ ', '{') // Remove space after '{'
123
+ .replaceAll(' }', '}') // Remove space before '}'
124
+ .replaceAll('[ ', '[') // Remove space after '['
125
+ .replaceAll(' ]', ']') // Remove space before ']'
126
126
  }
127
127
 
128
128
  module.exports = {
@@ -170,7 +170,7 @@ async function updateBreakpointInternal (breakpoint, probe) {
170
170
  const conditionBeforeNewProbe = compileCompoundCondition([...probesAtLocation.values()])
171
171
 
172
172
  // If a probe is provided, add it to the breakpoint. If not, it's because we're removing a probe, but potentially
173
- // need to update the condtion of the breakpoint.
173
+ // need to update the condition of the breakpoint.
174
174
  if (probe) {
175
175
  probesAtLocation.set(probe.id, probe)
176
176
  probeToLocation.set(probe.id, breakpoint.locationKey)
@@ -194,7 +194,6 @@ async function updateBreakpointInternal (breakpoint, probe) {
194
194
  } catch (err) {
195
195
  throw new Error(`Error setting breakpoint for probe ${probe.id}`, { cause: err })
196
196
  }
197
- breakpoint.id = result.breakpointId
198
197
  breakpointToProbes.set(result.breakpointId, probesAtLocation)
199
198
  }
200
199
  }
@@ -105,9 +105,8 @@ function compile (node) {
105
105
  return '$dd_key'
106
106
  } else if (value === '@value') {
107
107
  return '$dd_value'
108
- } else {
109
- return assertIdentifier(value)
110
108
  }
109
+ return assertIdentifier(value)
111
110
  } else if (Array.isArray(value)) {
112
111
  const args = value.map(compile)
113
112
  switch (type) {
@@ -109,6 +109,7 @@ session.on('Debugger.paused', async ({ params }) => {
109
109
  if (probe.condition !== undefined) {
110
110
  // TODO: Bundle all conditions and evaluate them in a single call
111
111
  // TODO: Handle errors
112
+ // eslint-disable-next-line no-await-in-loop
112
113
  const { result } = await session.post('Debugger.evaluateOnCallFrame', {
113
114
  callFrameId: params.callFrames[0].callFrameId,
114
115
  expression: probe.condition,
@@ -134,7 +135,7 @@ session.on('Debugger.paused', async ({ params }) => {
134
135
 
135
136
  const timestamp = Date.now()
136
137
 
137
- let evalResults = null
138
+ let evalResults
138
139
  const { result } = await session.post('Debugger.evaluateOnCallFrame', {
139
140
  callFrameId: params.callFrames[0].callFrameId,
140
141
  expression: templateExpressions.length === 0
@@ -9,6 +9,7 @@ const request = require('../../exporters/common/request')
9
9
  const { GIT_COMMIT_SHA, GIT_REPOSITORY_URL } = require('../../plugins/util/tags')
10
10
  const log = require('../../log')
11
11
  const { version } = require('../../../../../package.json')
12
+ const { getEnvironmentVariable } = require('../../config-helper')
12
13
 
13
14
  module.exports = send
14
15
 
@@ -21,8 +22,8 @@ const hostname = getHostname()
21
22
  const service = config.service
22
23
 
23
24
  const ddtags = [
24
- ['env', process.env.DD_ENV],
25
- ['version', process.env.DD_VERSION],
25
+ ['env', getEnvironmentVariable('DD_ENV')],
26
+ ['version', getEnvironmentVariable('DD_VERSION')],
26
27
  ['debugger_version', version],
27
28
  ['host_name', hostname],
28
29
  [GIT_COMMIT_SHA, config.commitSHA],
@@ -77,9 +77,8 @@ function getObjectProperties (subtype, objectId, opts, depth) {
77
77
  return getProxy(objectId, opts, depth)
78
78
  } else if (subtype === 'arraybuffer') {
79
79
  return getArrayBuffer(objectId, opts, depth)
80
- } else {
81
- return getObject(objectId, opts, depth + 1, subtype === 'array' || subtype === 'typedarray')
82
80
  }
81
+ return getObject(objectId, opts, depth + 1, subtype === 'array' || subtype === 'typedarray')
83
82
  }
84
83
 
85
84
  // TODO: The following extra information from `internalProperties` might be relevant to include for functions:
@@ -129,11 +129,10 @@ function toFunctionOrClass (value, maxLength) {
129
129
  // This is a function
130
130
  // TODO: Would it make sense to detect if it's an arrow function or not?
131
131
  return toObject(value.className, value.properties, maxLength)
132
- } else {
133
- // This is a class
134
- const className = classMatch[1].trim()
135
- return { type: className ? `class ${className}` : 'class' }
136
132
  }
133
+ // This is a class
134
+ const className = classMatch[1].trim()
135
+ return { type: className ? `class ${className}` : 'class' }
137
136
  }
138
137
 
139
138
  function toString (str, maxLength) {
@@ -103,7 +103,7 @@ const REDACTED_IDENTIFIERS = new Set(
103
103
 
104
104
  function normalizeName (name, isSymbol) {
105
105
  if (isSymbol) name = name.slice(7, -1) // Remove `Symbol(` and `)`
106
- return name.toLowerCase().replace(/[-_@$.]/g, '')
106
+ return name.toLowerCase().replaceAll(/[-_@$.]/g, '')
107
107
  }
108
108
 
109
109
  module.exports = {
@@ -9,6 +9,7 @@ let worker = null
9
9
  let configChannel = null
10
10
  let ackId = 0
11
11
 
12
+ // eslint-disable-next-line eslint-rules/eslint-process-env
12
13
  const { NODE_OPTIONS, ...env } = process.env
13
14
 
14
15
  module.exports = {