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
@@ -27,11 +27,10 @@ class Sqs extends BaseAwsSdkPlugin {
27
27
  obj.needsFinish = true
28
28
  const options = {
29
29
  childOf: contextExtraction.datadogContext,
30
- tags: Object.assign(
31
- {},
32
- this.requestTags.get(request) || {},
33
- { 'span.kind': 'server' }
34
- )
30
+ tags: {
31
+ ...this.requestTags.get(request),
32
+ 'span.kind': 'server'
33
+ }
35
34
  }
36
35
  parsedMessageAttributes = contextExtraction.parsedAttributes
37
36
  span = this.tracer.startSpan('aws.response', options)
@@ -89,20 +88,18 @@ class Sqs extends BaseAwsSdkPlugin {
89
88
  }
90
89
 
91
90
  generateTags (params, operation, response) {
92
- const tags = {}
93
-
94
- if (!params || (!params.QueueName && !params.QueueUrl)) return tags
91
+ if (!params || (!params.QueueName && !params.QueueUrl)) return {}
95
92
  // 'https://sqs.us-east-1.amazonaws.com/123456789012/my-queue';
96
93
  let queueName = params.QueueName
97
94
  if (params.QueueUrl) {
98
95
  queueName = params.QueueUrl.split('/').at(-1)
99
96
  }
100
97
 
101
- Object.assign(tags, {
98
+ const tags = {
102
99
  'resource.name': `${operation} ${params.QueueName || params.QueueUrl}`,
103
100
  'aws.sqs.queue_name': params.QueueName || params.QueueUrl,
104
101
  queuename: queueName
105
- })
102
+ }
106
103
 
107
104
  switch (operation) {
108
105
  case 'receiveMessage':
@@ -2,6 +2,7 @@
2
2
 
3
3
  const CiPlugin = require('../../dd-trace/src/plugins/ci_plugin')
4
4
  const { storage } = require('../../datadog-core')
5
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
5
6
 
6
7
  const {
7
8
  TEST_SKIP_REASON,
@@ -58,7 +59,7 @@ const id = require('../../dd-trace/src/id')
58
59
 
59
60
  const BREAKPOINT_HIT_GRACE_PERIOD_MS = 200
60
61
  const BREAKPOINT_SET_GRACE_PERIOD_MS = 200
61
- const isCucumberWorker = !!process.env.CUCUMBER_WORKER_ID
62
+ const isCucumberWorker = !!getEnvironmentVariable('CUCUMBER_WORKER_ID')
62
63
 
63
64
  function getTestSuiteTags (testSuiteSpan) {
64
65
  const suiteTags = {
@@ -134,7 +135,7 @@ class CucumberPlugin extends CiPlugin {
134
135
  finishAllTraceSpans(this.testSessionSpan)
135
136
  this.telemetry.count(TELEMETRY_TEST_SESSION, {
136
137
  provider: this.ciProviderName,
137
- autoInjected: !!process.env.DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER
138
+ autoInjected: !!getEnvironmentVariable('DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER')
138
139
  })
139
140
 
140
141
  this.libraryConfig = null
@@ -49,6 +49,7 @@ const {
49
49
  } = require('../../dd-trace/src/plugins/util/test')
50
50
  const { isMarkedAsUnskippable } = require('../../datadog-plugin-jest/src/util')
51
51
  const { ORIGIN_KEY, COMPONENT } = require('../../dd-trace/src/constants')
52
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
52
53
  const { appClosing: appClosingTelemetry } = require('../../dd-trace/src/telemetry')
53
54
  const log = require('../../dd-trace/src/log')
54
55
 
@@ -615,7 +616,7 @@ class CypressPlugin {
615
616
  this.ciVisEvent(TELEMETRY_EVENT_FINISHED, 'session')
616
617
  incrementCountMetric(TELEMETRY_TEST_SESSION, {
617
618
  provider: this.ciProviderName,
618
- autoInjected: !!process.env.DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER
619
+ autoInjected: !!getEnvironmentVariable('DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER')
619
620
  })
620
621
 
621
622
  finishAllTraceSpans(this.testSessionSpan)
@@ -3,12 +3,13 @@
3
3
  const Plugin = require('../../dd-trace/src/plugins/plugin')
4
4
  const telemetryMetrics = require('../../dd-trace/src/telemetry/metrics')
5
5
  const apiMetrics = telemetryMetrics.manager.namespace('tracers')
6
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
6
7
 
7
8
  // api ==> here
8
9
  const objectMap = new WeakMap()
9
10
 
10
11
  const injectionEnabledTag =
11
- `injection_enabled:${process.env.DD_INJECTION_ENABLED ? 'yes' : 'no'}`
12
+ `injection_enabled:${getEnvironmentVariable('DD_INJECTION_ENABLED') ? 'yes' : 'no'}`
12
13
 
13
14
  module.exports = class DdTraceApiPlugin extends Plugin {
14
15
  static get id () {
@@ -35,7 +35,7 @@ function getBody (body) {
35
35
  }
36
36
 
37
37
  function quantizePath (path) {
38
- return path && path.replace(/[0-9]+/g, '?')
38
+ return path && path.replaceAll(/[0-9]+/g, '?')
39
39
  }
40
40
 
41
41
  module.exports = ElasticsearchPlugin
@@ -82,7 +82,7 @@ class GoogleCloudVertexAITracingPlugin extends TracingPlugin {
82
82
 
83
83
  const generationConfig = instance.generationConfig || {}
84
84
  for (const key of Object.keys(generationConfig)) {
85
- const transformedKey = key.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toLowerCase()
85
+ const transformedKey = key.replaceAll(/([a-z0-9])([A-Z])/g, '$1_$2').toLowerCase()
86
86
  tags[`vertexai.request.generation_config.${transformedKey}`] = JSON.stringify(generationConfig[key])
87
87
  }
88
88
 
@@ -27,12 +27,13 @@ class GraphQLPlugin extends CompositePlugin {
27
27
  // config validator helpers
28
28
 
29
29
  function validateConfig (config) {
30
- return Object.assign({}, config, {
30
+ return {
31
+ ...config,
31
32
  depth: getDepth(config),
32
33
  variables: getVariablesFilter(config),
33
34
  collapse: config.collapse === undefined || !!config.collapse,
34
35
  hooks: getHooks(config)
35
- })
36
+ }
36
37
  }
37
38
 
38
39
  function getDepth (config) {
@@ -16,13 +16,14 @@ class GraphQLResolvePlugin extends TracingPlugin {
16
16
  const computedPathString = path.join('.')
17
17
 
18
18
  if (this.config.collapse) {
19
+ if (context.fields[computedPathString]) return
20
+
19
21
  if (!context[collapsedPathSym]) {
20
22
  context[collapsedPathSym] = {}
23
+ } else if (context[collapsedPathSym][computedPathString]) {
24
+ return
21
25
  }
22
26
 
23
- if (context.fields[computedPathString]) return
24
- if (context[collapsedPathSym][computedPathString]) return
25
-
26
27
  context[collapsedPathSym][computedPathString] = true
27
28
  }
28
29
 
@@ -47,10 +48,9 @@ class GraphQLResolvePlugin extends TracingPlugin {
47
48
  const variables = this.config.variables(info.variableValues)
48
49
 
49
50
  fieldNode.arguments
50
- .filter(arg => arg.value && arg.value.kind === 'Variable')
51
- .filter(arg => arg.value.name && variables[arg.value.name.value])
52
- .map(arg => arg.value.name.value)
53
- .forEach(name => {
51
+ .filter(arg => arg.value?.name && arg.value.kind === 'Variable' && variables[arg.value.name.value])
52
+ .forEach(arg => {
53
+ const name = arg.value.name.value
54
54
  span.setTag(`graphql.variables.${name}`, variables[name])
55
55
  })
56
56
  }
@@ -89,7 +89,12 @@ class GraphQLResolvePlugin extends TracingPlugin {
89
89
  // helpers
90
90
 
91
91
  function shouldInstrument (config, path) {
92
- const depth = path.filter(item => typeof item === 'string').length
92
+ let depth = 0
93
+ for (const item of path) {
94
+ if (typeof item === 'string') {
95
+ depth += 1
96
+ }
97
+ }
93
98
 
94
99
  return config.depth < 0 || config.depth >= depth
95
100
  }
@@ -126,6 +131,7 @@ function getResolverInfo (info, args) {
126
131
  Object.assign(resolverVars, args)
127
132
  }
128
133
 
134
+ let hasResolvers = false
129
135
  const directives = info.fieldNodes?.[0]?.directives
130
136
  if (Array.isArray(directives)) {
131
137
  for (const directive of directives) {
@@ -134,13 +140,14 @@ function getResolverInfo (info, args) {
134
140
  argList[argument.name.value] = argument.value.value
135
141
  }
136
142
 
137
- if (Object.keys(argList).length) {
143
+ if (directive.arguments.length > 0) {
144
+ hasResolvers = true
138
145
  resolverVars[directive.name.value] = argList
139
146
  }
140
147
  }
141
148
  }
142
149
 
143
- if (Object.keys(resolverVars).length) {
150
+ if (hasResolvers || args && Object.keys(resolverVars).length) {
144
151
  resolverInfo = { [info.fieldName]: resolverVars }
145
152
  }
146
153
 
@@ -63,7 +63,7 @@ class HttpClientPlugin extends ClientPlugin {
63
63
  // Implemented due to aws-sdk issue where request signing is broken if we mutate the headers
64
64
  // Explained further in:
65
65
  // https://github.com/open-telemetry/opentelemetry-js-contrib/issues/1609#issuecomment-1826167348
66
- options.headers = Object.assign({}, options.headers)
66
+ options.headers = { ...options.headers }
67
67
  this.tracer.inject(span, HTTP_HEADERS, options.headers)
68
68
  }
69
69
 
@@ -173,13 +173,14 @@ function normalizeClientConfig (config) {
173
173
  const headers = getHeaders(config)
174
174
  const hooks = getHooks(config)
175
175
 
176
- return Object.assign({}, config, {
176
+ return {
177
+ ...config,
177
178
  validateStatus,
178
179
  filter,
179
180
  propagationFilter,
180
181
  headers,
181
182
  hooks
182
- })
183
+ }
183
184
  }
184
185
 
185
186
  function getStatusValidator (config) {
@@ -192,9 +193,7 @@ function getStatusValidator (config) {
192
193
  }
193
194
 
194
195
  function getFilter (config) {
195
- config = Object.assign({}, config, {
196
- blocklist: config.blocklist || []
197
- })
196
+ config = { ...config, blocklist: config.blocklist || [] }
198
197
 
199
198
  return urlFilter.getFilter(config)
200
199
  }
@@ -124,9 +124,9 @@ function extractSessionDetails (authority, options) {
124
124
  }
125
125
 
126
126
  const protocol = authority.protocol || options.protocol || 'https:'
127
- let port = '' + (authority.port === ''
128
- ? (authority.protocol === 'http:' ? 80 : 443)
129
- : authority.port)
127
+ let port = authority.port === ''
128
+ ? authority.protocol === 'http:' ? '80' : '443'
129
+ : String(authority.port)
130
130
  let host = authority.hostname || authority.host || 'localhost'
131
131
 
132
132
  if (protocol === 'https:' && options) {
@@ -174,17 +174,16 @@ function normalizeConfig (config) {
174
174
  const filter = getFilter(config)
175
175
  const headers = getHeaders(config)
176
176
 
177
- return Object.assign({}, config, {
177
+ return {
178
+ ...config,
178
179
  validateStatus,
179
180
  filter,
180
181
  headers
181
- })
182
+ }
182
183
  }
183
184
 
184
185
  function getFilter (config) {
185
- config = Object.assign({}, config, {
186
- blocklist: config.blocklist || []
187
- })
186
+ config = { ...config, blocklist: config.blocklist || [] }
188
187
 
189
188
  return urlFilter.getFilter(config)
190
189
  }
@@ -1,5 +1,6 @@
1
1
  const CiPlugin = require('../../dd-trace/src/plugins/ci_plugin')
2
2
  const { storage } = require('../../datadog-core')
3
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
3
4
 
4
5
  const {
5
6
  TEST_STATUS,
@@ -48,7 +49,7 @@ const {
48
49
  TELEMETRY_TEST_SESSION
49
50
  } = require('../../dd-trace/src/ci-visibility/telemetry')
50
51
 
51
- const isJestWorker = !!process.env.JEST_WORKER_ID
52
+ const isJestWorker = !!getEnvironmentVariable('JEST_WORKER_ID')
52
53
 
53
54
  // https://github.com/facebook/jest/blob/d6ad15b0f88a05816c2fe034dd6900d28315d570/packages/jest-worker/src/types.ts#L38
54
55
  const CHILD_MESSAGE_END = 2
@@ -158,7 +159,7 @@ class JestPlugin extends CiPlugin {
158
159
 
159
160
  this.telemetry.count(TELEMETRY_TEST_SESSION, {
160
161
  provider: this.ciProviderName,
161
- autoInjected: !!process.env.DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER
162
+ autoInjected: !!getEnvironmentVariable('DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER')
162
163
  })
163
164
 
164
165
  this.tracer._exporter.flush(() => {
@@ -2,6 +2,7 @@
2
2
 
3
3
  const CiPlugin = require('../../dd-trace/src/plugins/ci_plugin')
4
4
  const { storage } = require('../../datadog-core')
5
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
5
6
 
6
7
  const {
7
8
  TEST_STATUS,
@@ -429,7 +430,7 @@ class MochaPlugin extends CiPlugin {
429
430
  finishAllTraceSpans(this.testSessionSpan)
430
431
  this.telemetry.count(TELEMETRY_TEST_SESSION, {
431
432
  provider: this.ciProviderName,
432
- autoInjected: !!process.env.DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER
433
+ autoInjected: !!getEnvironmentVariable('DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER')
433
434
  })
434
435
  }
435
436
  this.libraryConfig = null
@@ -466,6 +467,10 @@ class MochaPlugin extends CiPlugin {
466
467
  this.tracer._exporter.export(trace)
467
468
  })
468
469
  })
470
+
471
+ this.addBind('ci:mocha:global:run', (ctx) => {
472
+ return ctx.currentStore
473
+ })
469
474
  }
470
475
 
471
476
  startTestSpan (testInfo) {
@@ -3,6 +3,7 @@
3
3
  const { isTrue } = require('../../dd-trace/src/util')
4
4
  const DatabasePlugin = require('../../dd-trace/src/plugins/database')
5
5
  const coalesce = require('koalas')
6
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
6
7
 
7
8
  class MongodbCorePlugin extends DatabasePlugin {
8
9
  static get id () { return 'mongodb-core' }
@@ -14,7 +15,7 @@ class MongodbCorePlugin extends DatabasePlugin {
14
15
  configure (config) {
15
16
  super.configure(config)
16
17
 
17
- const heartbeatFromEnv = process.env.DD_TRACE_MONGODB_HEARTBEAT_ENABLED
18
+ const heartbeatFromEnv = getEnvironmentVariable('DD_TRACE_MONGODB_HEARTBEAT_ENABLED')
18
19
 
19
20
  this.config.heartbeatEnabled = coalesce(
20
21
  config.heartbeatEnabled,
@@ -1,5 +1,6 @@
1
1
  'use strict'
2
2
 
3
+ const { storage } = require('../../datadog-core')
3
4
  const CLIENT_PORT_KEY = require('../../dd-trace/src/constants')
4
5
  const DatabasePlugin = require('../../dd-trace/src/plugins/database')
5
6
 
@@ -7,6 +8,16 @@ class MySQLPlugin extends DatabasePlugin {
7
8
  static get id () { return 'mysql' }
8
9
  static get system () { return 'mysql' }
9
10
 
11
+ constructor () {
12
+ super(...arguments)
13
+
14
+ this.addSub(`apm:${this.component}:connection:start`, ctx => {
15
+ ctx.parentStore = storage('legacy').getStore()
16
+ })
17
+
18
+ this.addBind(`apm:${this.component}:connection:finish`, ctx => ctx.parentStore)
19
+ }
20
+
10
21
  bindStart (ctx) {
11
22
  const service = this.serviceName({ pluginConfig: this.config, dbConfig: ctx.conf, system: this.system })
12
23
  const span = this.startSpan(this.operationName(), {
@@ -134,7 +134,7 @@ function normalizeConfig (config) {
134
134
  ? config.validateStatus
135
135
  : code => code < 500
136
136
 
137
- return Object.assign({}, config, { hooks, validateStatus })
137
+ return { ...config, hooks, validateStatus }
138
138
  }
139
139
 
140
140
  const noop = () => {}
@@ -766,19 +766,17 @@ function usageExtraction (tags, body, methodName, openaiStore) {
766
766
  } else if (body.model && ['chat.completions.create', 'completions.create'].includes(methodName)) {
767
767
  // estimate tokens based on method name for completions and chat completions
768
768
  const { model } = body
769
- let promptEstimated = false
770
- let completionEstimated = false
771
769
 
772
770
  // prompt tokens
773
771
  const payload = openaiStore
774
772
  const promptTokensCount = countPromptTokens(methodName, payload, model)
775
773
  promptTokens = promptTokensCount.promptTokens
776
- promptEstimated = promptTokensCount.promptEstimated
774
+ const promptEstimated = promptTokensCount.promptEstimated
777
775
 
778
776
  // completion tokens
779
777
  const completionTokensCount = countCompletionTokens(body, model)
780
778
  completionTokens = completionTokensCount.completionTokens
781
- completionEstimated = completionTokensCount.completionEstimated
779
+ const completionEstimated = completionTokensCount.completionEstimated
782
780
 
783
781
  // total tokens
784
782
  totalTokens = promptTokens + completionTokens
@@ -3,6 +3,7 @@
3
3
  const { storage } = require('../../datadog-core')
4
4
  const id = require('../../dd-trace/src/id')
5
5
  const CiPlugin = require('../../dd-trace/src/plugins/ci_plugin')
6
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
6
7
 
7
8
  const {
8
9
  TEST_STATUS,
@@ -102,7 +103,7 @@ class PlaywrightPlugin extends CiPlugin {
102
103
  finishAllTraceSpans(this.testSessionSpan)
103
104
  this.telemetry.count(TELEMETRY_TEST_SESSION, {
104
105
  provider: this.ciProviderName,
105
- autoInjected: !!process.env.DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER
106
+ autoInjected: !!getEnvironmentVariable('DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER')
106
107
  })
107
108
  appClosingTelemetry()
108
109
  this.tracer._exporter.flush(onDone)
@@ -384,7 +385,7 @@ class PlaywrightPlugin extends CiPlugin {
384
385
  span.finish()
385
386
 
386
387
  finishAllTraceSpans(span)
387
- if (process.env.DD_PLAYWRIGHT_WORKER) {
388
+ if (getEnvironmentVariable('DD_PLAYWRIGHT_WORKER')) {
388
389
  this.tracer._exporter.flush(onDone)
389
390
  }
390
391
  })
@@ -102,17 +102,16 @@ class SchemaExtractor {
102
102
  }
103
103
  }
104
104
  return true
105
- } else {
106
- if (!builder.shouldExtractSchema(schemaName, depth)) {
107
- return false
108
- }
109
- for (const field of schema.fieldsArray) {
110
- if (!this.extractProperty(field, schemaName, field.name, builder, depth)) {
111
- log.warn(`DSM: Unable to extract field with name: ${field.name} from Avro schema with name: ${schemaName}`)
112
- }
105
+ }
106
+ if (!builder.shouldExtractSchema(schemaName, depth)) {
107
+ return false
108
+ }
109
+ for (const field of schema.fieldsArray) {
110
+ if (!this.extractProperty(field, schemaName, field.name, builder, depth)) {
111
+ log.warn(`DSM: Unable to extract field with name: ${field.name} from Avro schema with name: ${schemaName}`)
113
112
  }
114
- return true
115
113
  }
114
+ return true
116
115
  }
117
116
 
118
117
  static extractSchemas (descriptor, dataStreamsProcessor) {
@@ -77,9 +77,7 @@ function normalizeConfig (config) {
77
77
 
78
78
  const filter = urlFilter.getFilter(config)
79
79
 
80
- return Object.assign({}, config, {
81
- filter
82
- })
80
+ return { ...config, filter }
83
81
  }
84
82
 
85
83
  function uppercaseAllEntries (entries) {
@@ -1,5 +1,6 @@
1
1
  const CiPlugin = require('../../dd-trace/src/plugins/ci_plugin')
2
2
  const { storage } = require('../../datadog-core')
3
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
3
4
 
4
5
  const {
5
6
  TEST_STATUS,
@@ -275,11 +276,11 @@ class VitestPlugin extends CiPlugin {
275
276
  this.addBind('ci:vitest:test-suite:start', (ctx) => {
276
277
  const { testSuiteAbsolutePath, frameworkVersion } = ctx
277
278
 
278
- this.command = process.env.DD_CIVISIBILITY_TEST_COMMAND
279
+ this.command = getEnvironmentVariable('DD_CIVISIBILITY_TEST_COMMAND')
279
280
  this.frameworkVersion = frameworkVersion
280
281
  const testSessionSpanContext = this.tracer.extract('text_map', {
281
- 'x-datadog-trace-id': process.env.DD_CIVISIBILITY_TEST_SESSION_ID,
282
- 'x-datadog-parent-id': process.env.DD_CIVISIBILITY_TEST_MODULE_ID
282
+ 'x-datadog-trace-id': getEnvironmentVariable('DD_CIVISIBILITY_TEST_SESSION_ID'),
283
+ 'x-datadog-parent-id': getEnvironmentVariable('DD_CIVISIBILITY_TEST_MODULE_ID')
283
284
  })
284
285
 
285
286
  const trimmedCommand = DD_MAJOR < 6 ? this.command : 'vitest run'
@@ -396,7 +397,7 @@ class VitestPlugin extends CiPlugin {
396
397
  finishAllTraceSpans(this.testSessionSpan)
397
398
  this.telemetry.count(TELEMETRY_TEST_SESSION, {
398
399
  provider: this.ciProviderName,
399
- autoInjected: !!process.env.DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER
400
+ autoInjected: !!getEnvironmentVariable('DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER')
400
401
  })
401
402
  this.tracer._exporter.flush(onFinish)
402
403
  })
@@ -5,7 +5,6 @@ module.exports = {
5
5
  COMMAND_INJECTION_ANALYZER: require('./command-injection-analyzer'),
6
6
  HARCODED_PASSWORD_ANALYZER: require('./hardcoded-password-analyzer'),
7
7
  HARCODED_SECRET_ANALYZER: require('./hardcoded-secret-analyzer'),
8
- HEADER_INJECTION_ANALYZER: require('./header-injection-analyzer'),
9
8
  HSTS_HEADER_MISSING_ANALYZER: require('./hsts-header-missing-analyzer'),
10
9
  INSECURE_COOKIE_ANALYZER: require('./insecure-cookie-analyzer'),
11
10
  LDAP_ANALYZER: require('./ldap-injection-analyzer'),
@@ -1,4 +1,3 @@
1
- /* eslint-disable @stylistic/max-len */
2
1
  'use strict'
3
2
 
4
3
  const { NameAndValue } = require('./hardcoded-rule-type')
@@ -1,4 +1,3 @@
1
- /* eslint-disable @stylistic/max-len */
2
1
  'use strict'
3
2
 
4
3
  const { ValueOnly, NameAndValue } = require('./hardcoded-rule-type')
@@ -1,4 +1,3 @@
1
- /* eslint-disable @stylistic/max-len */
2
1
  'use strict'
3
2
 
4
3
  const { ValueOnly, NameAndValue } = require('./hardcoded-rule-type')
@@ -32,9 +32,8 @@ class MissingHeaderAnalyzer extends Analyzer {
32
32
  const headerValue = res.getHeader(headerName)
33
33
  if (Array.isArray(headerValue)) {
34
34
  return headerValue
35
- } else {
36
- return headerValue ? [headerValue.toString()] : []
37
35
  }
36
+ return headerValue ? [headerValue.toString()] : []
38
37
  }
39
38
 
40
39
  _getLocation () {}
@@ -150,19 +150,18 @@ function addSecureMarks (value, secureMarks, createNewTainted = true) {
150
150
 
151
151
  if (typeof value === 'string') {
152
152
  return TaintTrackingOperations.addSecureMark(iastContext, value, secureMarks, createNewTainted)
153
- } else {
154
- iterateObjectStrings(value, (value, levelKeys, parent, lastKey) => {
155
- try {
156
- const securedTainted = TaintTrackingOperations.addSecureMark(iastContext, value, secureMarks, createNewTainted)
157
- if (createNewTainted) {
158
- parent[lastKey] = securedTainted
159
- }
160
- } catch {
161
- // if it is a readonly property, do nothing
162
- }
163
- })
164
- return value
165
153
  }
154
+ iterateObjectStrings(value, (value, levelKeys, parent, lastKey) => {
155
+ try {
156
+ const securedTainted = TaintTrackingOperations.addSecureMark(iastContext, value, secureMarks, createNewTainted)
157
+ if (createNewTainted) {
158
+ parent[lastKey] = securedTainted
159
+ }
160
+ } catch {
161
+ // if it is a readonly property, do nothing
162
+ }
163
+ })
164
+ return value
166
165
  }
167
166
 
168
167
  function disable () {
@@ -207,7 +207,7 @@ class TaintTrackingPlugin extends SourceIastPlugin {
207
207
 
208
208
  if (Array.isArray(result)) {
209
209
  for (let i = 0; i < result.length && i < this._rowsToTaint; i++) {
210
- const nextName = name ? `${name}.${i}` : '' + i
210
+ const nextName = name ? `${name}.${i}` : String(i)
211
211
  result[i] = this._taintDatabaseResult(result[i], dbOrigin, iastContext, nextName)
212
212
  }
213
213
  } else if (result && typeof result === 'object') {
@@ -14,6 +14,7 @@ const log = require('../../../log')
14
14
  const { isMainThread } = require('worker_threads')
15
15
  const { LOG_MESSAGE, REWRITTEN_MESSAGE } = require('./constants')
16
16
  const orchestrionConfig = require('../../../../../datadog-instrumentations/src/orchestrion-config')
17
+ const { getEnvironmentVariable } = require('../../../config-helper')
17
18
 
18
19
  let config
19
20
  const hardcodedSecretCh = dc.channel('datadog:secrets:result')
@@ -26,7 +27,7 @@ let kSymbolPrepareStackTrace
26
27
  function noop () {}
27
28
 
28
29
  function isFlagPresent (flag) {
29
- return process.env.NODE_OPTIONS?.includes(flag) ||
30
+ return getEnvironmentVariable('NODE_OPTIONS')?.includes(flag) ||
30
31
  process.execArgv?.some(arg => arg.includes(flag))
31
32
  }
32
33
 
@@ -45,7 +45,7 @@ function filterTags (tags) {
45
45
 
46
46
  function processTagValue (tags) {
47
47
  return tags.map(tag => tag.includes(':') ? tag.split(':')[1] : tag)
48
- .join('_').replace(/\./g, '_')
48
+ .join('_').replaceAll('.', '_')
49
49
  }
50
50
 
51
51
  module.exports = {
@@ -19,9 +19,8 @@ function getVerbosity (verbosity) {
19
19
  if (verbosity) {
20
20
  verbosity = verbosity.toUpperCase()
21
21
  return Verbosity[verbosity] === undefined ? Verbosity.INFORMATION : Verbosity[verbosity]
22
- } else {
23
- return Verbosity.INFORMATION
24
22
  }
23
+ return Verbosity.INFORMATION
25
24
  }
26
25
 
27
26
  function getName (verbosityValue) {
@@ -16,18 +16,17 @@ function remove (range, rangeToRemove) {
16
16
  return [range]
17
17
  } else if (contains(rangeToRemove, range)) {
18
18
  return []
19
- } else {
20
- const result = []
21
- if (rangeToRemove.start > range.start) {
22
- const offset = rangeToRemove.start - range.start
23
- result.push({ start: range.start, end: range.start + offset })
24
- }
25
- if (rangeToRemove.end < range.end) {
26
- const offset = range.end - rangeToRemove.end
27
- result.push({ start: rangeToRemove.end, end: rangeToRemove.end + offset })
28
- }
29
- return result
30
19
  }
20
+ const result = []
21
+ if (rangeToRemove.start > range.start) {
22
+ const offset = rangeToRemove.start - range.start
23
+ result.push({ start: range.start, end: range.start + offset })
24
+ }
25
+ if (rangeToRemove.end < range.end) {
26
+ const offset = range.end - rangeToRemove.end
27
+ result.push({ start: rangeToRemove.end, end: rangeToRemove.end + offset })
28
+ }
29
+ return result
31
30
  }
32
31
 
33
32
  module.exports = {