dd-trace 5.67.0 → 5.68.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 (104) hide show
  1. package/LICENSE-3rdparty.csv +0 -3
  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 +47 -2
  7. package/initialize.mjs +1 -1
  8. package/package.json +8 -11
  9. package/packages/datadog-esbuild/index.js +56 -0
  10. package/packages/datadog-instrumentations/src/aws-sdk.js +42 -4
  11. package/packages/datadog-instrumentations/src/azure-functions.js +1 -1
  12. package/packages/datadog-instrumentations/src/azure-service-bus.js +1 -1
  13. package/packages/datadog-instrumentations/src/cassandra-driver.js +2 -2
  14. package/packages/datadog-instrumentations/src/connect.js +6 -2
  15. package/packages/datadog-instrumentations/src/cucumber.js +31 -6
  16. package/packages/datadog-instrumentations/src/express.js +5 -6
  17. package/packages/datadog-instrumentations/src/fastify.js +3 -3
  18. package/packages/datadog-instrumentations/src/helpers/hook.js +28 -15
  19. package/packages/datadog-instrumentations/src/helpers/hooks.js +2 -0
  20. package/packages/datadog-instrumentations/src/helpers/instrument.js +11 -2
  21. package/packages/datadog-instrumentations/src/helpers/register.js +10 -3
  22. package/packages/datadog-instrumentations/src/http2/client.js +1 -0
  23. package/packages/datadog-instrumentations/src/http2/server.js +0 -1
  24. package/packages/datadog-instrumentations/src/ioredis.js +12 -1
  25. package/packages/datadog-instrumentations/src/jest.js +48 -36
  26. package/packages/datadog-instrumentations/src/limitd-client.js +2 -1
  27. package/packages/datadog-instrumentations/src/mocha/main.js +15 -7
  28. package/packages/datadog-instrumentations/src/mocha/utils.js +3 -0
  29. package/packages/datadog-instrumentations/src/mongoose.js +2 -1
  30. package/packages/datadog-instrumentations/src/oracledb.js +19 -13
  31. package/packages/datadog-instrumentations/src/pg.js +9 -5
  32. package/packages/datadog-instrumentations/src/pino.js +18 -6
  33. package/packages/datadog-instrumentations/src/playwright.js +15 -1
  34. package/packages/datadog-instrumentations/src/sequelize.js +1 -1
  35. package/packages/datadog-instrumentations/src/vitest.js +155 -62
  36. package/packages/datadog-plugin-ai/src/tracing.js +3 -3
  37. package/packages/datadog-plugin-aws-sdk/src/base.js +23 -8
  38. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  39. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +101 -2
  40. package/packages/datadog-plugin-aws-sdk/src/util.js +1 -1
  41. package/packages/datadog-plugin-cucumber/src/index.js +4 -56
  42. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +6 -2
  43. package/packages/datadog-plugin-cypress/src/support.js +4 -0
  44. package/packages/datadog-plugin-express/src/code_origin.js +2 -2
  45. package/packages/datadog-plugin-fastify/src/code_origin.js +1 -2
  46. package/packages/datadog-plugin-jest/src/index.js +0 -21
  47. package/packages/datadog-plugin-mocha/src/index.js +3 -57
  48. package/packages/datadog-plugin-mongodb-core/src/index.js +20 -7
  49. package/packages/datadog-plugin-playwright/src/index.js +11 -5
  50. package/packages/datadog-plugin-vitest/src/index.js +5 -1
  51. package/packages/datadog-plugin-ws/src/close.js +1 -1
  52. package/packages/datadog-plugin-ws/src/producer.js +6 -1
  53. package/packages/datadog-plugin-ws/src/receiver.js +6 -1
  54. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +1 -1
  55. package/packages/dd-trace/src/appsec/telemetry/waf.js +2 -2
  56. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +4 -4
  57. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +11 -3
  58. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +10 -1
  59. package/packages/dd-trace/src/config.js +69 -304
  60. package/packages/dd-trace/src/config_defaults.js +186 -0
  61. package/packages/dd-trace/src/crashtracking/crashtracker.js +2 -1
  62. package/packages/dd-trace/src/datastreams/fnv.js +2 -2
  63. package/packages/dd-trace/src/datastreams/writer.js +3 -2
  64. package/packages/dd-trace/src/debugger/devtools_client/config.js +2 -1
  65. package/packages/dd-trace/src/dogstatsd.js +4 -3
  66. package/packages/dd-trace/src/encode/0.4.js +1 -5
  67. package/packages/dd-trace/src/exporter.js +1 -0
  68. package/packages/dd-trace/src/exporters/agent/index.js +3 -2
  69. package/packages/dd-trace/src/exporters/agent/writer.js +1 -1
  70. package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +3 -2
  71. package/packages/dd-trace/src/exporters/common/request.js +2 -1
  72. package/packages/dd-trace/src/exporters/span-stats/index.js +3 -2
  73. package/packages/dd-trace/src/llmobs/constants/tags.js +2 -0
  74. package/packages/dd-trace/src/llmobs/plugins/ai/index.js +4 -3
  75. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +12 -1
  76. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +40 -13
  77. package/packages/dd-trace/src/llmobs/plugins/openai.js +7 -1
  78. package/packages/dd-trace/src/llmobs/tagger.js +8 -0
  79. package/packages/dd-trace/src/llmobs/telemetry.js +2 -1
  80. package/packages/dd-trace/src/log/index.js +28 -17
  81. package/packages/dd-trace/src/log/log.js +29 -5
  82. package/packages/dd-trace/src/log/writer.js +5 -5
  83. package/packages/dd-trace/src/noop/span.js +1 -0
  84. package/packages/dd-trace/src/opentelemetry/span.js +14 -3
  85. package/packages/dd-trace/src/opentracing/span.js +18 -4
  86. package/packages/dd-trace/src/plugin_manager.js +20 -2
  87. package/packages/dd-trace/src/plugins/ci_plugin.js +97 -3
  88. package/packages/dd-trace/src/plugins/index.js +2 -0
  89. package/packages/dd-trace/src/plugins/util/git-cache.js +129 -0
  90. package/packages/dd-trace/src/plugins/util/git.js +40 -26
  91. package/packages/dd-trace/src/plugins/util/test.js +37 -27
  92. package/packages/dd-trace/src/plugins/util/web.js +1 -1
  93. package/packages/dd-trace/src/profiler.js +4 -1
  94. package/packages/dd-trace/src/profiling/config.js +73 -42
  95. package/packages/dd-trace/src/profiling/profiler.js +3 -1
  96. package/packages/dd-trace/src/profiling/profilers/events.js +3 -8
  97. package/packages/dd-trace/src/profiling/profilers/space.js +1 -0
  98. package/packages/dd-trace/src/profiling/profilers/wall.js +196 -117
  99. package/packages/dd-trace/src/remote_config/capabilities.js +5 -0
  100. package/packages/dd-trace/src/remote_config/manager.js +3 -2
  101. package/packages/dd-trace/src/startup-log.js +2 -1
  102. package/packages/dd-trace/src/supported-configurations.json +3 -0
  103. package/packages/dd-trace/src/telemetry/logs/index.js +2 -2
  104. package/register.js +1 -1
@@ -482,8 +482,12 @@ class CypressPlugin {
482
482
  this.isEarlyFlakeDetectionEnabled = false
483
483
  this.isKnownTestsEnabled = false
484
484
  } else {
485
- // We use TEST_FRAMEWORK_NAME for the name of the module
486
- this.knownTestsByTestSuite = knownTestsResponse.knownTests[TEST_FRAMEWORK_NAME]
485
+ if (knownTestsResponse.knownTests[TEST_FRAMEWORK_NAME]) {
486
+ this.knownTestsByTestSuite = knownTestsResponse.knownTests[TEST_FRAMEWORK_NAME]
487
+ } else {
488
+ this.isEarlyFlakeDetectionEnabled = false
489
+ this.isKnownTestsEnabled = false
490
+ }
487
491
  }
488
492
  }
489
493
 
@@ -26,6 +26,10 @@ function safeGetRum (window) {
26
26
  }
27
27
 
28
28
  function isNewTest (test) {
29
+ // If for whatever reason the worker does not receive valid known tests, we don't consider it as new
30
+ if (!Array.isArray(knownTestsForSuite)) {
31
+ return false
32
+ }
29
33
  return !knownTestsForSuite.includes(test.fullTitle())
30
34
  }
31
35
 
@@ -15,7 +15,7 @@ class ExpressCodeOriginForSpansPlugin extends Plugin {
15
15
  this.addSub('apm:express:middleware:enter', ({ req, layer }) => {
16
16
  const tags = layerTags.get(layer)
17
17
  if (!tags) return
18
- web.getContext(req).span?.addTags(tags)
18
+ web.getContext(req)?.span?.addTags(tags)
19
19
  })
20
20
 
21
21
  this.addSub('apm:express:route:added', ({ topOfStackFunc, layer }) => {
@@ -26,7 +26,7 @@ class ExpressCodeOriginForSpansPlugin extends Plugin {
26
26
  this.addSub('apm:router:middleware:enter', ({ req, layer }) => {
27
27
  const tags = layerTags.get(layer)
28
28
  if (!tags) return
29
- web.getContext(req).span?.addTags(tags)
29
+ web.getContext(req)?.span?.addTags(tags)
30
30
  })
31
31
 
32
32
  this.addSub('apm:router:route:added', ({ topOfStackFunc, layer }) => {
@@ -15,8 +15,7 @@ class FastifyCodeOriginForSpansPlugin extends Plugin {
15
15
  this.addSub('apm:fastify:request:handle', ({ req, routeConfig }) => {
16
16
  const tags = routeConfig?.[kCodeOriginForSpansTagsSym]
17
17
  if (!tags) return
18
- const context = web.getContext(req)
19
- context.span?.addTags(tags)
18
+ web.getContext(req)?.span?.addTags(tags)
20
19
  })
21
20
 
22
21
  this.addSub('apm:fastify:route:added', ({ routeOptions, onRoute }) => {
@@ -261,21 +261,6 @@ class JestPlugin extends CiPlugin {
261
261
  }
262
262
  })
263
263
 
264
- this.addSub('ci:jest:worker-report:trace', traces => {
265
- const formattedTraces = JSON.parse(traces).map(trace =>
266
- trace.map(span => ({
267
- ...span,
268
- span_id: id(span.span_id),
269
- trace_id: id(span.trace_id),
270
- parent_id: id(span.parent_id)
271
- }))
272
- )
273
-
274
- formattedTraces.forEach(trace => {
275
- this.tracer._exporter.export(trace)
276
- })
277
- })
278
-
279
264
  this.addSub('ci:jest:worker-report:coverage', data => {
280
265
  const formattedCoverages = JSON.parse(data).map(coverage => ({
281
266
  sessionId: id(coverage.sessionId),
@@ -287,12 +272,6 @@ class JestPlugin extends CiPlugin {
287
272
  })
288
273
  })
289
274
 
290
- this.addSub('ci:jest:worker-report:logs', (logsPayloads) => {
291
- JSON.parse(logsPayloads).forEach(({ testConfiguration, logMessage }) => {
292
- this.tracer._exporter.exportDiLogs(testConfiguration, logMessage)
293
- })
294
- })
295
-
296
275
  this.addSub('ci:jest:test-suite:finish', ({ status, errorMessage, error }) => {
297
276
  this.testSuiteSpan.setTag(TEST_STATUS, status)
298
277
  if (error) {
@@ -22,12 +22,6 @@ const {
22
22
  TEST_IS_RETRY,
23
23
  TEST_EARLY_FLAKE_ENABLED,
24
24
  TEST_EARLY_FLAKE_ABORT_REASON,
25
- TEST_SESSION_ID,
26
- TEST_MODULE_ID,
27
- TEST_MODULE,
28
- TEST_SUITE_ID,
29
- TEST_COMMAND,
30
- TEST_SUITE,
31
25
  MOCHA_IS_PARALLEL,
32
26
  TEST_IS_RUM_ACTIVE,
33
27
  TEST_BROWSER_DRIVER,
@@ -54,32 +48,15 @@ const {
54
48
  TELEMETRY_CODE_COVERAGE_NUM_FILES,
55
49
  TELEMETRY_TEST_SESSION
56
50
  } = require('../../dd-trace/src/ci-visibility/telemetry')
57
- const id = require('../../dd-trace/src/id')
58
- const log = require('../../dd-trace/src/log')
59
51
 
60
52
  const BREAKPOINT_SET_GRACE_PERIOD_MS = 200
61
53
 
62
- function getTestSuiteLevelVisibilityTags (testSuiteSpan) {
63
- const testSuiteSpanContext = testSuiteSpan.context()
64
- const suiteTags = {
65
- [TEST_SUITE_ID]: testSuiteSpanContext.toSpanId(),
66
- [TEST_SESSION_ID]: testSuiteSpanContext.toTraceId(),
67
- [TEST_COMMAND]: testSuiteSpanContext._tags[TEST_COMMAND],
68
- [TEST_MODULE]: 'mocha'
69
- }
70
- if (testSuiteSpanContext._parentId) {
71
- suiteTags[TEST_MODULE_ID] = testSuiteSpanContext._parentId.toString(10)
72
- }
73
- return suiteTags
74
- }
75
-
76
54
  class MochaPlugin extends CiPlugin {
77
55
  static id = 'mocha'
78
56
 
79
57
  constructor (...args) {
80
58
  super(...args)
81
59
 
82
- this._testSuites = new Map()
83
60
  this._testTitleToParams = {}
84
61
  this.sourceRoot = process.cwd()
85
62
 
@@ -88,7 +65,7 @@ class MochaPlugin extends CiPlugin {
88
65
  return
89
66
  }
90
67
  const testSuite = getTestSuitePath(suiteFile, this.sourceRoot)
91
- const testSuiteSpan = this._testSuites.get(testSuite)
68
+ const testSuiteSpan = this._testSuiteSpansByTestSuite.get(testSuite)
92
69
 
93
70
  if (!coverageFiles.length) {
94
71
  this.telemetry.count(TELEMETRY_CODE_COVERAGE_EMPTY)
@@ -163,7 +140,7 @@ class MochaPlugin extends CiPlugin {
163
140
  const store = storage('legacy').getStore()
164
141
  ctx.parentStore = store
165
142
  ctx.currentStore = { ...store, testSuiteSpan }
166
- this._testSuites.set(testSuite, testSuiteSpan)
143
+ this._testSuiteSpansByTestSuite.set(testSuite, testSuiteSpan)
167
144
  })
168
145
 
169
146
  this.addSub('ci:mocha:test-suite:finish', ({ testSuiteSpan, status }) => {
@@ -436,37 +413,6 @@ class MochaPlugin extends CiPlugin {
436
413
  this.tracer._exporter.flush()
437
414
  })
438
415
 
439
- this.addSub('ci:mocha:worker-report:trace', (traces) => {
440
- const formattedTraces = JSON.parse(traces).map(trace =>
441
- trace.map(span => {
442
- const formattedSpan = {
443
- ...span,
444
- span_id: id(span.span_id),
445
- trace_id: id(span.trace_id),
446
- parent_id: id(span.parent_id)
447
- }
448
- if (formattedSpan.name === 'mocha.test') {
449
- const testSuite = span.meta[TEST_SUITE]
450
- const testSuiteSpan = this._testSuites.get(testSuite)
451
- if (!testSuiteSpan) {
452
- log.warn('Test suite span not found for test span with test suite', testSuite)
453
- return formattedSpan
454
- }
455
- const suiteTags = getTestSuiteLevelVisibilityTags(testSuiteSpan)
456
- formattedSpan.meta = {
457
- ...formattedSpan.meta,
458
- ...suiteTags
459
- }
460
- }
461
- return formattedSpan
462
- })
463
- )
464
-
465
- formattedTraces.forEach(trace => {
466
- this.tracer._exporter.export(trace)
467
- })
468
- })
469
-
470
416
  this.addBind('ci:mocha:global:run', (ctx) => {
471
417
  return ctx.currentStore
472
418
  })
@@ -522,7 +468,7 @@ class MochaPlugin extends CiPlugin {
522
468
  }
523
469
 
524
470
  const testSuite = getTestSuitePath(testSuiteAbsolutePath, this.sourceRoot)
525
- const testSuiteSpan = this._testSuites.get(testSuite)
471
+ const testSuiteSpan = this._testSuiteSpansByTestSuite.get(testSuite)
526
472
 
527
473
  extraTags[TEST_SOURCE_FILE] = this.repositoryRoot !== this.sourceRoot && !!this.repositoryRoot
528
474
  ? getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
@@ -2,7 +2,6 @@
2
2
 
3
3
  const { isTrue } = require('../../dd-trace/src/util')
4
4
  const DatabasePlugin = require('../../dd-trace/src/plugins/database')
5
- const coalesce = require('koalas')
6
5
  const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
7
6
 
8
7
  class MongodbCorePlugin extends DatabasePlugin {
@@ -17,16 +16,13 @@ class MongodbCorePlugin extends DatabasePlugin {
17
16
 
18
17
  const heartbeatFromEnv = getEnvironmentVariable('DD_TRACE_MONGODB_HEARTBEAT_ENABLED')
19
18
 
20
- this.config.heartbeatEnabled = coalesce(
21
- config.heartbeatEnabled,
22
- heartbeatFromEnv && isTrue(heartbeatFromEnv),
19
+ this.config.heartbeatEnabled = config.heartbeatEnabled ??
20
+ (heartbeatFromEnv && isTrue(heartbeatFromEnv)) ??
23
21
  true
24
- )
25
22
  }
26
23
 
27
24
  bindStart (ctx) {
28
25
  const { ns, ops, options = {}, name } = ctx
29
-
30
26
  // heartbeat commands can be disabled if this.config.heartbeatEnabled is false
31
27
  if (!this.config.heartbeatEnabled && isHeartbeat(ops, this.config)) {
32
28
  return
@@ -90,11 +86,28 @@ function sanitizeBigInt (data) {
90
86
  return JSON.stringify(data, (_key, value) => typeof value === 'bigint' ? value.toString() : value)
91
87
  }
92
88
 
89
+ function extractQuery (statements) {
90
+ if (statements.length === 1 && statements[0].q) return statements[0].q
91
+
92
+ const extractedQueries = []
93
+ for (let i = 0; i < statements.length; i++) {
94
+ if (statements[i].q) {
95
+ extractedQueries.push(limitDepth(statements[i].q))
96
+ }
97
+ }
98
+
99
+ return extractedQueries
100
+ }
101
+
93
102
  function getQuery (cmd) {
94
- if (!cmd || typeof cmd !== 'object' || Array.isArray(cmd)) return
103
+ if (!cmd || (typeof cmd !== 'object' && !Array.isArray(cmd))) return
104
+
105
+ if (Array.isArray(cmd)) return sanitizeBigInt(extractQuery(cmd))
95
106
  if (cmd.query) return sanitizeBigInt(limitDepth(cmd.query))
96
107
  if (cmd.filter) return sanitizeBigInt(limitDepth(cmd.filter))
97
108
  if (cmd.pipeline) return sanitizeBigInt(limitDepth(cmd.pipeline))
109
+ if (cmd.deletes) return sanitizeBigInt(extractQuery(cmd.deletes))
110
+ if (cmd.updates) return sanitizeBigInt(extractQuery(cmd.updates))
98
111
  }
99
112
 
100
113
  function getResource (plugin, ns, query, operationName) {
@@ -17,6 +17,7 @@ const {
17
17
  TEST_IS_NEW,
18
18
  TEST_IS_RETRY,
19
19
  TEST_EARLY_FLAKE_ENABLED,
20
+ TEST_EARLY_FLAKE_ABORT_REASON,
20
21
  TELEMETRY_TEST_SESSION,
21
22
  TEST_RETRY_REASON,
22
23
  TEST_MANAGEMENT_IS_QUARANTINED,
@@ -53,7 +54,7 @@ class PlaywrightPlugin extends CiPlugin {
53
54
  constructor (...args) {
54
55
  super(...args)
55
56
 
56
- this._testSuites = new Map()
57
+ this._testSuiteSpansByTestSuiteAbsolutePath = new Map()
57
58
  this.numFailedTests = 0
58
59
  this.numFailedSuites = 0
59
60
 
@@ -70,6 +71,7 @@ class PlaywrightPlugin extends CiPlugin {
70
71
  this.addSub('ci:playwright:session:finish', ({
71
72
  status,
72
73
  isEarlyFlakeDetectionEnabled,
74
+ isEarlyFlakeDetectionFaulty,
73
75
  isTestManagementTestsEnabled,
74
76
  onDone
75
77
  }) => {
@@ -79,7 +81,9 @@ class PlaywrightPlugin extends CiPlugin {
79
81
  if (isEarlyFlakeDetectionEnabled) {
80
82
  this.testSessionSpan.setTag(TEST_EARLY_FLAKE_ENABLED, 'true')
81
83
  }
82
-
84
+ if (isEarlyFlakeDetectionFaulty) {
85
+ this.testSessionSpan.setTag(TEST_EARLY_FLAKE_ABORT_REASON, 'faulty')
86
+ }
83
87
  if (this.numFailedSuites > 0) {
84
88
  let errorMessage = `Test suites failed: ${this.numFailedSuites}.`
85
89
  if (this.numFailedTests > 0) {
@@ -142,7 +146,7 @@ class PlaywrightPlugin extends CiPlugin {
142
146
  ctx.parentStore = store
143
147
  ctx.currentStore = { ...store, testSuiteSpan }
144
148
 
145
- this._testSuites.set(testSuiteAbsolutePath, testSuiteSpan)
149
+ this._testSuiteSpansByTestSuiteAbsolutePath.set(testSuiteAbsolutePath, testSuiteSpan)
146
150
 
147
151
  return ctx.currentStore
148
152
  })
@@ -247,7 +251,9 @@ class PlaywrightPlugin extends CiPlugin {
247
251
  formattedSpan.meta[TEST_COMMAND] = this.command
248
252
  formattedSpan.meta[TEST_MODULE] = this.constructor.id
249
253
  // MISSING _trace.startTime and _trace.ticks - because by now the suite is already serialized
250
- const testSuite = this._testSuites.get(formattedSpan.meta.test_suite_absolute_path)
254
+ const testSuite = this._testSuiteSpansByTestSuiteAbsolutePath.get(
255
+ formattedSpan.meta.test_suite_absolute_path
256
+ )
251
257
  if (testSuite) {
252
258
  formattedSpan.meta[TEST_SUITE_ID] = testSuite.context().toSpanId()
253
259
  }
@@ -391,7 +397,7 @@ class PlaywrightPlugin extends CiPlugin {
391
397
 
392
398
  // TODO: this runs both in worker and main process (main process: skipped tests that do not go through _runTest)
393
399
  startTestSpan (testName, testSuiteAbsolutePath, testSuite, testSourceFile, testSourceLine, browserName) {
394
- const testSuiteSpan = this._testSuites.get(testSuiteAbsolutePath)
400
+ const testSuiteSpan = this._testSuiteSpansByTestSuiteAbsolutePath.get(testSuiteAbsolutePath)
395
401
 
396
402
  const extraTags = {
397
403
  [TEST_SOURCE_START]: testSourceLine
@@ -55,8 +55,12 @@ class VitestPlugin extends CiPlugin {
55
55
  this.taskToFinishTime = new WeakMap()
56
56
 
57
57
  this.addSub('ci:vitest:test:is-new', ({ knownTests, testSuiteAbsolutePath, testName, onDone }) => {
58
+ // if for whatever reason the worker does not receive valid known tests, we don't consider it as new
59
+ if (!knownTests.vitest) {
60
+ return onDone(false)
61
+ }
58
62
  const testSuite = getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
59
- const testsForThisTestSuite = knownTests[testSuite] || []
63
+ const testsForThisTestSuite = knownTests.vitest[testSuite] || []
60
64
  onDone(!testsForThisTestSuite.includes(testName))
61
65
  })
62
66
 
@@ -60,7 +60,7 @@ class WSClosePlugin extends TracingPlugin {
60
60
  end (ctx) {
61
61
  if (!Object.hasOwn(ctx, 'result')) return
62
62
 
63
- if (ctx.socket.spanContext) ctx.span.addLink(ctx.socket.spanContext)
63
+ if (ctx.socket.spanContext) ctx.span.addLink({ context: ctx.socket.spanContext })
64
64
 
65
65
  ctx.span.finish()
66
66
  }
@@ -50,7 +50,12 @@ class WSProducerPlugin extends TracingPlugin {
50
50
  end (ctx) {
51
51
  if (!Object.hasOwn(ctx, 'result')) return
52
52
 
53
- if (ctx.socket.spanContext) ctx.span.addLink(ctx.socket.spanContext, { 'dd.kind': 'resuming' })
53
+ if (ctx.socket.spanContext) {
54
+ ctx.span.addLink({
55
+ context: ctx.socket.spanContext,
56
+ attributes: { 'dd.kind': 'resuming' },
57
+ })
58
+ }
54
59
 
55
60
  ctx.span.finish()
56
61
  return ctx.parentStore
@@ -60,7 +60,12 @@ class WSReceiverPlugin extends TracingPlugin {
60
60
  end (ctx) {
61
61
  if (!Object.hasOwn(ctx, 'result')) return
62
62
 
63
- if (ctx.socket.spanContext) ctx.span.addLink(ctx.socket.spanContext, { 'dd.kind': 'executed_by' })
63
+ if (ctx.socket.spanContext) {
64
+ ctx.span.addLink({
65
+ context: ctx.socket.spanContext,
66
+ attributes: { 'dd.kind': 'executed_by' },
67
+ })
68
+ }
64
69
 
65
70
  ctx.span.finish()
66
71
  return ctx.parentStore
@@ -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)
@@ -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
  }