dd-trace 5.67.0 → 5.69.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 (132) hide show
  1. package/LICENSE-3rdparty.csv +6 -4
  2. package/README.md +0 -2
  3. package/ci/init.js +52 -54
  4. package/ext/exporters.d.ts +2 -1
  5. package/ext/exporters.js +2 -1
  6. package/index.d.ts +240 -3
  7. package/initialize.mjs +1 -1
  8. package/package.json +17 -11
  9. package/packages/datadog-core/src/storage.js +14 -13
  10. package/packages/datadog-esbuild/index.js +118 -26
  11. package/packages/datadog-instrumentations/src/aws-sdk.js +42 -4
  12. package/packages/datadog-instrumentations/src/azure-functions.js +1 -1
  13. package/packages/datadog-instrumentations/src/azure-service-bus.js +1 -1
  14. package/packages/datadog-instrumentations/src/cassandra-driver.js +2 -2
  15. package/packages/datadog-instrumentations/src/connect.js +6 -2
  16. package/packages/datadog-instrumentations/src/cucumber.js +31 -6
  17. package/packages/datadog-instrumentations/src/express.js +5 -6
  18. package/packages/datadog-instrumentations/src/fastify.js +3 -3
  19. package/packages/datadog-instrumentations/src/helpers/hook.js +28 -15
  20. package/packages/datadog-instrumentations/src/helpers/hooks.js +2 -0
  21. package/packages/datadog-instrumentations/src/helpers/instrument.js +15 -5
  22. package/packages/datadog-instrumentations/src/helpers/register.js +10 -3
  23. package/packages/datadog-instrumentations/src/http2/client.js +1 -0
  24. package/packages/datadog-instrumentations/src/http2/server.js +0 -1
  25. package/packages/datadog-instrumentations/src/ioredis.js +12 -1
  26. package/packages/datadog-instrumentations/src/jest.js +48 -36
  27. package/packages/datadog-instrumentations/src/limitd-client.js +2 -1
  28. package/packages/datadog-instrumentations/src/mocha/main.js +15 -7
  29. package/packages/datadog-instrumentations/src/mocha/utils.js +3 -0
  30. package/packages/datadog-instrumentations/src/mongoose.js +2 -1
  31. package/packages/datadog-instrumentations/src/oracledb.js +19 -13
  32. package/packages/datadog-instrumentations/src/pg.js +9 -5
  33. package/packages/datadog-instrumentations/src/pino.js +18 -6
  34. package/packages/datadog-instrumentations/src/playwright.js +15 -1
  35. package/packages/datadog-instrumentations/src/sequelize.js +1 -1
  36. package/packages/datadog-instrumentations/src/vitest.js +155 -62
  37. package/packages/datadog-plugin-ai/src/tracing.js +3 -3
  38. package/packages/datadog-plugin-aws-sdk/src/base.js +23 -8
  39. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  40. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +101 -2
  41. package/packages/datadog-plugin-aws-sdk/src/util.js +1 -1
  42. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/index.js +6 -0
  43. package/packages/datadog-plugin-cucumber/src/index.js +4 -56
  44. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +6 -3
  45. package/packages/datadog-plugin-cypress/src/support.js +4 -0
  46. package/packages/datadog-plugin-express/src/code_origin.js +2 -2
  47. package/packages/datadog-plugin-fastify/src/code_origin.js +1 -2
  48. package/packages/datadog-plugin-jest/src/index.js +0 -21
  49. package/packages/datadog-plugin-mocha/src/index.js +3 -57
  50. package/packages/datadog-plugin-mongodb-core/src/index.js +38 -12
  51. package/packages/datadog-plugin-playwright/src/index.js +11 -5
  52. package/packages/datadog-plugin-vitest/src/index.js +5 -1
  53. package/packages/datadog-plugin-ws/src/close.js +1 -1
  54. package/packages/datadog-plugin-ws/src/producer.js +6 -1
  55. package/packages/datadog-plugin-ws/src/receiver.js +6 -1
  56. package/packages/dd-trace/src/aiguard/client.js +25 -0
  57. package/packages/dd-trace/src/aiguard/noop.js +9 -0
  58. package/packages/dd-trace/src/aiguard/sdk.js +173 -0
  59. package/packages/dd-trace/src/aiguard/tags.js +11 -0
  60. package/packages/dd-trace/src/appsec/iast/path-line.js +21 -4
  61. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +1 -1
  62. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +6 -3
  63. package/packages/dd-trace/src/appsec/stack_trace.js +20 -1
  64. package/packages/dd-trace/src/appsec/telemetry/waf.js +2 -2
  65. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +4 -4
  66. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +11 -3
  67. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +10 -1
  68. package/packages/dd-trace/src/config-helper.js +8 -1
  69. package/packages/dd-trace/src/config.js +92 -304
  70. package/packages/dd-trace/src/config_defaults.js +191 -0
  71. package/packages/dd-trace/src/crashtracking/crashtracker.js +2 -1
  72. package/packages/dd-trace/src/datastreams/fnv.js +2 -2
  73. package/packages/dd-trace/src/datastreams/index.js +23 -1
  74. package/packages/dd-trace/src/datastreams/writer.js +3 -2
  75. package/packages/dd-trace/src/debugger/devtools_client/config.js +2 -1
  76. package/packages/dd-trace/src/dogstatsd.js +4 -3
  77. package/packages/dd-trace/src/encode/0.4.js +1 -5
  78. package/packages/dd-trace/src/exporter.js +1 -0
  79. package/packages/dd-trace/src/exporters/agent/index.js +3 -2
  80. package/packages/dd-trace/src/exporters/agent/writer.js +1 -1
  81. package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +3 -2
  82. package/packages/dd-trace/src/exporters/common/request.js +2 -1
  83. package/packages/dd-trace/src/exporters/span-stats/index.js +3 -2
  84. package/packages/dd-trace/src/llmobs/constants/tags.js +2 -0
  85. package/packages/dd-trace/src/llmobs/plugins/ai/index.js +15 -4
  86. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +20 -7
  87. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +40 -13
  88. package/packages/dd-trace/src/llmobs/plugins/openai.js +7 -1
  89. package/packages/dd-trace/src/llmobs/tagger.js +8 -0
  90. package/packages/dd-trace/src/llmobs/telemetry.js +2 -1
  91. package/packages/dd-trace/src/log/index.js +27 -16
  92. package/packages/dd-trace/src/log/log.js +29 -5
  93. package/packages/dd-trace/src/log/writer.js +5 -5
  94. package/packages/dd-trace/src/noop/proxy.js +4 -0
  95. package/packages/dd-trace/src/noop/span.js +1 -0
  96. package/packages/dd-trace/src/opentelemetry/span.js +14 -3
  97. package/packages/dd-trace/src/opentracing/span.js +19 -5
  98. package/packages/dd-trace/src/payload-tagging/config/index.js +16 -0
  99. package/packages/dd-trace/src/payload-tagging/index.js +26 -15
  100. package/packages/dd-trace/src/payload-tagging/tagging.js +17 -8
  101. package/packages/dd-trace/src/pkg.js +3 -1
  102. package/packages/dd-trace/src/plugin_manager.js +20 -2
  103. package/packages/dd-trace/src/plugins/ci_plugin.js +97 -3
  104. package/packages/dd-trace/src/plugins/composite.js +3 -0
  105. package/packages/dd-trace/src/plugins/index.js +2 -0
  106. package/packages/dd-trace/src/plugins/plugin.js +67 -0
  107. package/packages/dd-trace/src/plugins/util/git-cache.js +129 -0
  108. package/packages/dd-trace/src/plugins/util/git.js +41 -27
  109. package/packages/dd-trace/src/plugins/util/test.js +56 -27
  110. package/packages/dd-trace/src/plugins/util/web.js +1 -1
  111. package/packages/dd-trace/src/priority_sampler.js +70 -46
  112. package/packages/dd-trace/src/profiler.js +4 -1
  113. package/packages/dd-trace/src/profiling/config.js +73 -42
  114. package/packages/dd-trace/src/profiling/profiler.js +3 -1
  115. package/packages/dd-trace/src/profiling/profilers/events.js +3 -8
  116. package/packages/dd-trace/src/profiling/profilers/space.js +1 -0
  117. package/packages/dd-trace/src/profiling/profilers/wall.js +196 -117
  118. package/packages/dd-trace/src/proxy.js +15 -0
  119. package/packages/dd-trace/src/rate_limiter.js +26 -1
  120. package/packages/dd-trace/src/remote_config/capabilities.js +5 -0
  121. package/packages/dd-trace/src/remote_config/manager.js +3 -2
  122. package/packages/dd-trace/src/sampling_rule.js +124 -2
  123. package/packages/dd-trace/src/span_sampler.js +19 -0
  124. package/packages/dd-trace/src/standalone/product.js +9 -0
  125. package/packages/dd-trace/src/standalone/tracesource.js +16 -1
  126. package/packages/dd-trace/src/standalone/tracesource_priority_sampler.js +13 -0
  127. package/packages/dd-trace/src/startup-log.js +21 -2
  128. package/packages/dd-trace/src/supported-configurations.json +9 -0
  129. package/packages/dd-trace/src/telemetry/logs/index.js +2 -2
  130. package/packages/dd-trace/src/util.js +1 -1
  131. package/register.js +1 -1
  132. package/version.js +4 -2
@@ -3,6 +3,7 @@
3
3
  const path = require('path')
4
4
  const process = require('process')
5
5
  const { ddBasePath } = require('../../util')
6
+ const { getOriginalPathAndLineFromSourceMap } = require('./taint-tracking/rewriter')
6
7
  const pathLine = {
7
8
  getNodeModulesPaths,
8
9
  getRelativePath,
@@ -30,8 +31,24 @@ function getNonDDCallSiteFrames (callSiteFrames, externallyExcludedPaths) {
30
31
  const result = []
31
32
 
32
33
  for (const callsite of callSiteFrames) {
33
- const filepath = callsite.file
34
- if (!isExcluded(callsite, externallyExcludedPaths) && !filepath.includes(pathLine.ddBasePath)) {
34
+ let filepath = callsite.file
35
+
36
+ if (globalThis.__DD_ESBUILD_IAST_WITH_SM) {
37
+ const callsiteLocation = {
38
+ path: getRelativePath(filepath),
39
+ line: callsite.line,
40
+ column: callsite.column
41
+ }
42
+ const { path: originalPath, line, column } = getOriginalPathAndLineFromSourceMap(callsiteLocation)
43
+ callsite.path = filepath = originalPath
44
+ callsite.line = line
45
+ callsite.column = column
46
+ }
47
+
48
+ if (
49
+ !isExcluded(callsite, externallyExcludedPaths) &&
50
+ (!filepath.includes(pathLine.ddBasePath) || globalThis.__DD_ESBUILD_IAST_WITH_NO_SM)
51
+ ) {
35
52
  callsite.path = getRelativePath(filepath)
36
53
  callsite.isInternal = !path.isAbsolute(filepath)
37
54
 
@@ -43,12 +60,12 @@ function getNonDDCallSiteFrames (callSiteFrames, externallyExcludedPaths) {
43
60
  }
44
61
 
45
62
  function getRelativePath (filepath) {
46
- return path.relative(process.cwd(), filepath)
63
+ return filepath && path.relative(process.cwd(), filepath)
47
64
  }
48
65
 
49
66
  function isExcluded (callsite, externallyExcludedPaths) {
50
67
  if (callsite.isNative) return true
51
- const filename = callsite.file
68
+ const filename = globalThis.__DD_ESBUILD_IAST_WITH_SM ? callsite.path : callsite.file
52
69
  if (!filename) {
53
70
  return true
54
71
  }
@@ -15,7 +15,7 @@ const validTypes = new Set([INPUT_VALIDATOR_TYPE, SANITIZER_TYPE])
15
15
  function parse (securityControlsConfiguration) {
16
16
  const controls = new Map()
17
17
 
18
- securityControlsConfiguration?.replace(/[\r\n\t\v\f]*/g, '')
18
+ securityControlsConfiguration?.replaceAll(/[\r\n\t\v\f]*/g, '')
19
19
  .split(SECURITY_CONTROL_DELIMITER)
20
20
  .map(parseControl)
21
21
  .filter(control => !!control)
@@ -44,7 +44,7 @@ function setGetOriginalPathAndLineFromSourceMapFunction (chainSourceMap, { getOr
44
44
  ? (path, line, column) => {
45
45
  // if --enable-source-maps is present stacktraces of the rewritten files contain the original path, file and
46
46
  // column because the sourcemap chaining is done during the rewriting process so we can skip it
47
- return isPrivateModule(path) && !isDdTrace(path)
47
+ return !globalThis.__DD_ESBUILD_IAST_WITH_SM && isPrivateModule(path) && !isDdTrace(path)
48
48
  ? { path, line, column }
49
49
  : getOriginalPathAndLineFromSourceMap(path, line, column)
50
50
  }
@@ -170,7 +170,10 @@ function enableRewriter (telemetryVerbosity) {
170
170
  const rewriter = getRewriter(telemetryVerbosity)
171
171
  if (rewriter) {
172
172
  shimPrepareStackTrace()
173
- shimmer.wrap(Module.prototype, '_compile', compileMethod => getCompileMethodFn(compileMethod))
173
+ if (!globalThis.__DD_ESBUILD_IAST_WITH_SM && !globalThis.__DD_ESBUILD_IAST_WITH_NO_SM) {
174
+ // Avoid rewriting twice when application has been bundled
175
+ shimmer.wrap(Module.prototype, '_compile', compileMethod => getCompileMethodFn(compileMethod))
176
+ }
174
177
  }
175
178
  }
176
179
 
@@ -264,5 +267,5 @@ function enable (configArg) {
264
267
  }
265
268
 
266
269
  module.exports = {
267
- enable, disable, getOriginalPathAndLineFromSourceMap
270
+ enable, disable, getOriginalPathAndLineFromSourceMap, getRewriter
268
271
  }
@@ -1,6 +1,7 @@
1
1
  'use strict'
2
2
 
3
3
  const { ddBasePath } = require('../util')
4
+ const { getOriginalPathAndLineFromSourceMap } = require('./iast/taint-tracking/rewriter')
4
5
 
5
6
  const LIBRARY_FRAMES_BUFFER = 20
6
7
 
@@ -32,7 +33,25 @@ function getCallSiteList (maxDepth = 100, constructorOpt) {
32
33
  }
33
34
 
34
35
  function filterOutFramesFromLibrary (callSiteList) {
35
- return callSiteList.filter(callSite => !callSite.getFileName()?.startsWith(ddBasePath))
36
+ return callSiteList.filter(callSite => {
37
+ if (globalThis.__DD_ESBUILD_IAST_WITH_NO_SM) {
38
+ // bundled and no SourceMap, not possible to discriminate if the frame comes from dd-trace code or not
39
+ return true
40
+ }
41
+
42
+ if (globalThis.__DD_ESBUILD_IAST_WITH_SM) {
43
+ // bundled with SourceMap, get original file and line to discriminate if comes from dd-trace or not
44
+ const callSiteLocation = {
45
+ path: callSite.getFileName(),
46
+ line: callSite.getLineNumber(),
47
+ column: callSite.getColumnNumber()
48
+ }
49
+ const { path } = getOriginalPathAndLineFromSourceMap(callSiteLocation)
50
+ return !path?.startsWith(ddBasePath)
51
+ }
52
+
53
+ return !callSite.getFileName()?.startsWith(ddBasePath)
54
+ })
36
55
  }
37
56
 
38
57
  function getCallsiteFrames (maxDepth = 32, constructorOpt = getCallsiteFrames, callSiteListGetter = getCallSiteList) {
@@ -96,7 +96,7 @@ function incrementWafInit (wafVersion, rulesVersion, success) {
96
96
  appsecMetrics.count('waf.init', { ...versionsTags, success }).inc()
97
97
 
98
98
  if (!success) {
99
- appsecMetrics.count('waf.config_errors', versionsTags).inc()
99
+ appsecMetrics.count('waf.config_errors', { ...versionsTags, action: 'init' }).inc()
100
100
  }
101
101
  }
102
102
 
@@ -107,7 +107,7 @@ function incrementWafUpdates (wafVersion, rulesVersion, success) {
107
107
 
108
108
  function incrementWafConfigErrors (wafVersion, rulesVersion) {
109
109
  const versionsTags = getVersionsTags(wafVersion, rulesVersion)
110
- appsecMetrics.count('waf.config_errors', versionsTags).inc()
110
+ appsecMetrics.count('waf.config_errors', { ...versionsTags, action: 'update' }).inc()
111
111
  }
112
112
 
113
113
  function incrementWafRequests (store) {
@@ -287,11 +287,11 @@ class CiVisibilityExporter extends AgentInfoExporter {
287
287
  this._export(formattedCoverage, this._coverageWriter, '_coverageTimer')
288
288
  }
289
289
 
290
- formatLogMessage (testConfiguration, logMessage) {
290
+ formatLogMessage (testEnvironmentMetadata, logMessage) {
291
291
  const {
292
292
  [GIT_REPOSITORY_URL]: gitRepositoryUrl,
293
293
  [GIT_COMMIT_SHA]: gitCommitSha
294
- } = testConfiguration
294
+ } = testEnvironmentMetadata
295
295
 
296
296
  const { service, env, version } = this._config
297
297
 
@@ -315,14 +315,14 @@ class CiVisibilityExporter extends AgentInfoExporter {
315
315
  }
316
316
 
317
317
  // DI logs
318
- exportDiLogs (testConfiguration, logMessage) {
318
+ exportDiLogs (testEnvironmentMetadata, logMessage) {
319
319
  // TODO: could we lose logs if it's not initialized?
320
320
  if (!this._config.isTestDynamicInstrumentationEnabled || !this._isInitialized || !this._canForwardLogs) {
321
321
  return
322
322
  }
323
323
 
324
324
  this._export(
325
- this.formatLogMessage(testConfiguration, logMessage),
325
+ this.formatLogMessage(testEnvironmentMetadata, logMessage),
326
326
  this._logsWriter,
327
327
  '_logsTimer'
328
328
  )
@@ -7,7 +7,9 @@ const {
7
7
  CUCUMBER_WORKER_TRACE_PAYLOAD_CODE,
8
8
  MOCHA_WORKER_TRACE_PAYLOAD_CODE,
9
9
  JEST_WORKER_LOGS_PAYLOAD_CODE,
10
- PLAYWRIGHT_WORKER_TRACE_PAYLOAD_CODE
10
+ PLAYWRIGHT_WORKER_TRACE_PAYLOAD_CODE,
11
+ VITEST_WORKER_TRACE_PAYLOAD_CODE,
12
+ VITEST_WORKER_LOGS_PAYLOAD_CODE
11
13
  } = require('../../../plugins/util/test')
12
14
  const { getEnvironmentVariable } = require('../../../config-helper')
13
15
 
@@ -24,6 +26,9 @@ function getInterprocessTraceCode () {
24
26
  if (getEnvironmentVariable('DD_PLAYWRIGHT_WORKER')) {
25
27
  return PLAYWRIGHT_WORKER_TRACE_PAYLOAD_CODE
26
28
  }
29
+ if (getEnvironmentVariable('TINYPOOL_WORKER_ID')) {
30
+ return VITEST_WORKER_TRACE_PAYLOAD_CODE
31
+ }
27
32
  return null
28
33
  }
29
34
 
@@ -39,6 +44,9 @@ function getInterprocessLogsCode () {
39
44
  if (getEnvironmentVariable('JEST_WORKER_ID')) {
40
45
  return JEST_WORKER_LOGS_PAYLOAD_CODE
41
46
  }
47
+ if (getEnvironmentVariable('TINYPOOL_WORKER_ID')) {
48
+ return VITEST_WORKER_LOGS_PAYLOAD_CODE
49
+ }
42
50
  return null
43
51
  }
44
52
 
@@ -66,8 +74,8 @@ class TestWorkerCiVisibilityExporter {
66
74
  this._coverageWriter.append(formattedCoverage)
67
75
  }
68
76
 
69
- exportDiLogs (testConfiguration, logMessage) {
70
- this._logsWriter.append({ testConfiguration, logMessage })
77
+ exportDiLogs (testEnvironmentMetadata, logMessage) {
78
+ this._logsWriter.append({ testEnvironmentMetadata, logMessage })
71
79
  }
72
80
 
73
81
  // TODO: add to other writers
@@ -1,5 +1,6 @@
1
1
  'use strict'
2
2
  const { JSONEncoder } = require('../../encode/json-encoder')
3
+ const { getEnvironmentVariable } = require('../../../config-helper')
3
4
 
4
5
  class Writer {
5
6
  constructor (interprocessCode) {
@@ -34,9 +35,17 @@ class Writer {
34
35
  // See cucumber code:
35
36
  // https://github.com/cucumber/cucumber-js/blob/5ce371870b677fe3d1a14915dc535688946f734c/src/runtime/parallel/run_worker.ts#L13
36
37
  if (process.send) { // it only works if process.send is available
37
- process.send([this._interprocessCode, data], () => {
38
+ const isVitestWorker = !!getEnvironmentVariable('TINYPOOL_WORKER_ID')
39
+
40
+ const payload = isVitestWorker
41
+ ? { __tinypool_worker_message__: true, interprocessCode: this._interprocessCode, data }
42
+ : [this._interprocessCode, data]
43
+
44
+ process.send(payload, () => {
38
45
  onDone()
39
46
  })
47
+ } else {
48
+ onDone()
40
49
  }
41
50
  }
42
51
  }
@@ -5,6 +5,13 @@
5
5
  const { deprecate } = require('util')
6
6
  const { supportedConfigurations, aliases, deprecations } = require('./supported-configurations.json')
7
7
 
8
+ /**
9
+ * Types for environment variable handling.
10
+ *
11
+ * @typedef {keyof typeof supportedConfigurations} SupportedEnvKey
12
+ * @typedef {Partial<typeof process.env> & Partial<Record<SupportedEnvKey, string|undefined>>} TracerEnv
13
+ */
14
+
8
15
  const aliasToCanonical = {}
9
16
  for (const canonical of Object.keys(aliases)) {
10
17
  for (const alias of aliases[canonical]) {
@@ -32,7 +39,7 @@ module.exports = {
32
39
  * Returns the environment variables that are supported by the tracer
33
40
  * (including all non-Datadog/OTEL specific environment variables)
34
41
  *
35
- * @returns {Partial<process.env>} The environment variables
42
+ * @returns {TracerEnv} The environment variables
36
43
  */
37
44
  getEnvironmentVariables () {
38
45
  const configs = {}