dd-trace 5.56.0 → 5.57.1

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 (134) hide show
  1. package/index.d.ts +44 -2
  2. package/init.js +4 -1
  3. package/package.json +20 -20
  4. package/packages/datadog-esbuild/index.js +22 -0
  5. package/packages/datadog-instrumentations/src/cassandra-driver.js +43 -60
  6. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +12 -12
  7. package/packages/datadog-instrumentations/src/cucumber.js +4 -6
  8. package/packages/datadog-instrumentations/src/elasticsearch.js +16 -19
  9. package/packages/datadog-instrumentations/src/fastify.js +91 -9
  10. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +20 -5
  11. package/packages/datadog-instrumentations/src/helpers/check-require-cache.js +2 -2
  12. package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -0
  13. package/packages/datadog-instrumentations/src/helpers/register.js +17 -5
  14. package/packages/datadog-instrumentations/src/ioredis.js +8 -13
  15. package/packages/datadog-instrumentations/src/iovalkey.js +10 -14
  16. package/packages/datadog-instrumentations/src/jest.js +28 -6
  17. package/packages/datadog-instrumentations/src/memcached.js +17 -24
  18. package/packages/datadog-instrumentations/src/mocha/main.js +7 -6
  19. package/packages/datadog-instrumentations/src/moleculer/client.js +9 -10
  20. package/packages/datadog-instrumentations/src/moleculer/server.js +12 -13
  21. package/packages/datadog-instrumentations/src/openai.js +30 -2
  22. package/packages/datadog-instrumentations/src/playwright.js +4 -1
  23. package/packages/datadog-instrumentations/src/prisma.js +116 -0
  24. package/packages/datadog-instrumentations/src/redis.js +32 -43
  25. package/packages/datadog-instrumentations/src/router.js +1 -1
  26. package/packages/datadog-instrumentations/src/sharedb.js +10 -16
  27. package/packages/datadog-instrumentations/src/vitest.js +4 -4
  28. package/packages/datadog-plugin-aws-sdk/src/base.js +6 -1
  29. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +9 -4
  30. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +3 -2
  31. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +2 -1
  32. package/packages/datadog-plugin-aws-sdk/src/util.js +2 -2
  33. package/packages/datadog-plugin-bunyan/src/index.js +2 -2
  34. package/packages/datadog-plugin-cassandra-driver/src/index.js +6 -2
  35. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/batch-consumer.js +1 -1
  36. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/consumer.js +1 -1
  37. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/index.js +1 -1
  38. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/producer.js +1 -1
  39. package/packages/datadog-plugin-cucumber/src/index.js +4 -2
  40. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +9 -5
  41. package/packages/datadog-plugin-elasticsearch/src/index.js +12 -4
  42. package/packages/datadog-plugin-http/src/client.js +1 -0
  43. package/packages/datadog-plugin-http/src/server.js +2 -1
  44. package/packages/datadog-plugin-http2/src/client.js +1 -0
  45. package/packages/datadog-plugin-http2/src/server.js +1 -0
  46. package/packages/datadog-plugin-jest/src/index.js +4 -3
  47. package/packages/datadog-plugin-memcached/src/index.js +6 -2
  48. package/packages/datadog-plugin-mocha/src/index.js +3 -2
  49. package/packages/datadog-plugin-moleculer/src/client.js +15 -9
  50. package/packages/datadog-plugin-moleculer/src/server.js +9 -5
  51. package/packages/datadog-plugin-next/src/index.js +2 -1
  52. package/packages/datadog-plugin-openai/src/tracing.js +127 -80
  53. package/packages/datadog-plugin-pino/src/index.js +2 -2
  54. package/packages/datadog-plugin-prisma/src/client.js +62 -0
  55. package/packages/datadog-plugin-prisma/src/engine.js +81 -0
  56. package/packages/datadog-plugin-prisma/src/index.js +22 -0
  57. package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +1 -1
  58. package/packages/datadog-plugin-redis/src/index.js +9 -3
  59. package/packages/datadog-plugin-router/src/index.js +1 -0
  60. package/packages/datadog-plugin-sharedb/src/index.js +13 -5
  61. package/packages/datadog-plugin-winston/src/index.js +2 -2
  62. package/packages/dd-trace/src/appsec/channels.js +26 -21
  63. package/packages/dd-trace/src/appsec/iast/analyzers/unvalidated-redirect-analyzer.js +13 -20
  64. package/packages/dd-trace/src/appsec/iast/taint-tracking/source-types.js +0 -1
  65. package/packages/dd-trace/src/appsec/index.js +16 -1
  66. package/packages/dd-trace/src/appsec/rasp/utils.js +0 -5
  67. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +3 -3
  68. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
  69. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
  70. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
  71. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +2 -2
  72. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +6 -6
  73. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -3
  74. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +3 -3
  75. package/packages/dd-trace/src/config.js +286 -270
  76. package/packages/dd-trace/src/constants.js +2 -1
  77. package/packages/dd-trace/src/crashtracking/crashtracker.js +12 -14
  78. package/packages/dd-trace/src/datastreams/context.js +1 -1
  79. package/packages/dd-trace/src/datastreams/processor.js +1 -1
  80. package/packages/dd-trace/src/datastreams/writer.js +3 -3
  81. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +6 -3
  82. package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -1
  83. package/packages/dd-trace/src/debugger/devtools_client/index.js +2 -3
  84. package/packages/dd-trace/src/debugger/devtools_client/state.js +7 -4
  85. package/packages/dd-trace/src/dogstatsd.js +3 -3
  86. package/packages/dd-trace/src/exporters/agent/index.js +10 -5
  87. package/packages/dd-trace/src/exporters/agent/writer.js +1 -1
  88. package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +2 -2
  89. package/packages/dd-trace/src/exporters/log/index.js +1 -1
  90. package/packages/dd-trace/src/exporters/span-stats/writer.js +2 -2
  91. package/packages/dd-trace/src/guardrails/index.js +3 -1
  92. package/packages/dd-trace/src/guardrails/telemetry.js +1 -1
  93. package/packages/dd-trace/src/llmobs/index.js +11 -5
  94. package/packages/dd-trace/src/llmobs/plugins/base.js +2 -2
  95. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +1 -1
  96. package/packages/dd-trace/src/llmobs/tagger.js +13 -13
  97. package/packages/dd-trace/src/llmobs/writers/base.js +2 -2
  98. package/packages/dd-trace/src/llmobs/writers/spans.js +2 -2
  99. package/packages/dd-trace/src/opentelemetry/tracer.js +1 -1
  100. package/packages/dd-trace/src/opentracing/propagation/text_map.js +4 -4
  101. package/packages/dd-trace/src/opentracing/span.js +1 -0
  102. package/packages/dd-trace/src/plugin_manager.js +3 -3
  103. package/packages/dd-trace/src/plugins/cache.js +2 -2
  104. package/packages/dd-trace/src/plugins/ci_plugin.js +11 -7
  105. package/packages/dd-trace/src/plugins/database.js +3 -1
  106. package/packages/dd-trace/src/plugins/index.js +1 -0
  107. package/packages/dd-trace/src/plugins/log_plugin.js +5 -1
  108. package/packages/dd-trace/src/plugins/outbound.js +8 -6
  109. package/packages/dd-trace/src/plugins/structured_log_plugin.js +9 -0
  110. package/packages/dd-trace/src/plugins/tracing.js +1 -1
  111. package/packages/dd-trace/src/plugins/util/ci.js +83 -30
  112. package/packages/dd-trace/src/plugins/util/git.js +1 -0
  113. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +3 -2
  114. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -0
  115. package/packages/dd-trace/src/plugins/util/tags.js +4 -1
  116. package/packages/dd-trace/src/plugins/util/test.js +80 -10
  117. package/packages/dd-trace/src/plugins/util/web.js +1 -0
  118. package/packages/dd-trace/src/profiler.js +0 -2
  119. package/packages/dd-trace/src/profiling/exporter_cli.js +1 -3
  120. package/packages/dd-trace/src/profiling/ssi-heuristics.js +18 -126
  121. package/packages/dd-trace/src/proxy.js +12 -27
  122. package/packages/dd-trace/src/runtime_metrics/index.js +1 -1
  123. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +14 -45
  124. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +2 -2
  125. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +4 -0
  126. package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +2 -2
  127. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +4 -0
  128. package/packages/dd-trace/src/supported-configurations.json +12 -3
  129. package/packages/dd-trace/src/telemetry/telemetry.js +5 -1
  130. package/packages/dd-trace/src/tracer.js +11 -0
  131. package/packages/dd-trace/src/tracer_metadata.js +25 -0
  132. package/packages/dd-trace/src/util.js +11 -4
  133. package/version.js +3 -1
  134. package/packages/dd-trace/src/profiling/ssi-telemetry-mock-profiler.js +0 -30
@@ -75,7 +75,7 @@ module.exports = class CiPlugin extends Plugin {
75
75
  this.rootDir = process.cwd() // fallback in case :session:start events are not emitted
76
76
 
77
77
  this.addSub(`ci:${this.constructor.id}:library-configuration`, (ctx) => {
78
- const { onDone, isParallel } = ctx
78
+ const { onDone, isParallel, frameworkVersion } = ctx
79
79
  ctx.currentStore = storage('legacy').getStore()
80
80
 
81
81
  if (!this.tracer._exporter || !this.tracer._exporter.getLibraryConfiguration) {
@@ -88,7 +88,7 @@ module.exports = class CiPlugin extends Plugin {
88
88
  this.libraryConfig = libraryConfig
89
89
  }
90
90
 
91
- const libraryCapabilitiesTags = getLibraryCapabilitiesTags(this.constructor.id, isParallel)
91
+ const libraryCapabilitiesTags = getLibraryCapabilitiesTags(this.constructor.id, isParallel, frameworkVersion)
92
92
  const metadataTags = {
93
93
  test: {
94
94
  ...libraryCapabilitiesTags
@@ -150,7 +150,8 @@ module.exports = class CiPlugin extends Plugin {
150
150
  [COMPONENT]: this.constructor.id,
151
151
  ...this.testEnvironmentMetadata,
152
152
  ...testSessionSpanMetadata
153
- }
153
+ },
154
+ integrationName: this.constructor.id
154
155
  })
155
156
  // TODO: add telemetry tag when we can add `is_agentless_log_submission_enabled` for agentless log submission
156
157
  this.telemetry.ciVisEvent(TELEMETRY_EVENT_CREATED, 'session')
@@ -161,7 +162,8 @@ module.exports = class CiPlugin extends Plugin {
161
162
  [COMPONENT]: this.constructor.id,
162
163
  ...this.testEnvironmentMetadata,
163
164
  ...testModuleSpanMetadata
164
- }
165
+ },
166
+ integrationName: this.constructor.id
165
167
  })
166
168
  // only for vitest
167
169
  // These are added for the worker threads to use
@@ -194,7 +196,8 @@ module.exports = class CiPlugin extends Plugin {
194
196
  ...testSuiteMetadata,
195
197
  [TEST_STATUS]: 'skip',
196
198
  [TEST_SKIPPED_BY_ITR]: 'true'
197
- }
199
+ },
200
+ integrationName: this.constructor.id
198
201
  }).finish()
199
202
  })
200
203
  this.telemetry.count(TELEMETRY_ITR_SKIPPED, { testLevel: 'suite' }, skippedSuites.length)
@@ -396,7 +399,8 @@ module.exports = class CiPlugin extends Plugin {
396
399
  tags: {
397
400
  ...this.testEnvironmentMetadata,
398
401
  ...testTags
399
- }
402
+ },
403
+ integrationName: this.constructor.id
400
404
  })
401
405
 
402
406
  testSpan.context()._trace.origin = CI_APP_ORIGIN
@@ -453,7 +457,7 @@ module.exports = class CiPlugin extends Plugin {
453
457
 
454
458
  removeDiProbe ({ file, line }) {
455
459
  const probeId = this.fileLineToProbeId.get(`${file}:${line}`)
456
- log.warn(`Removing probe from ${file}:${line}, with id: ${probeId}`)
460
+ log.warn('Removing probe from %s:%s, with id: %s', file, line, probeId)
457
461
  this.fileLineToProbeId.delete(probeId)
458
462
  return this.di.removeProbe(probeId)
459
463
  }
@@ -89,7 +89,9 @@ class DatabasePlugin extends StoragePlugin {
89
89
  return query
90
90
  }
91
91
 
92
- return `/*${dbmTraceComment}*/ ${query}`
92
+ return this.config.appendComment
93
+ ? `${query} /*${dbmTraceComment}*/`
94
+ : `/*${dbmTraceComment}*/ ${query}`
93
95
  }
94
96
 
95
97
  maybeTruncate (query) {
@@ -20,6 +20,7 @@ module.exports = {
20
20
  get '@langchain/openai' () { return require('../../../datadog-plugin-langchain/src') },
21
21
  get '@node-redis/client' () { return require('../../../datadog-plugin-redis/src') },
22
22
  get '@opensearch-project/opensearch' () { return require('../../../datadog-plugin-opensearch/src') },
23
+ get '@prisma/client' () { return require('../../../datadog-plugin-prisma/src') },
23
24
  get '@redis/client' () { return require('../../../datadog-plugin-redis/src') },
24
25
  get '@smithy/smithy-client' () { return require('../../../datadog-plugin-aws-sdk/src') },
25
26
  get '@vitest/runner' () { return require('../../../datadog-plugin-vitest/src') },
@@ -45,10 +45,14 @@ module.exports = class LogPlugin extends Plugin {
45
45
  })
46
46
  }
47
47
 
48
+ _isEnabled (config) {
49
+ return config.enabled && (config.logInjection === true || config.ciVisAgentlessLogSubmissionEnabled)
50
+ }
51
+
48
52
  configure (config) {
49
53
  return super.configure({
50
54
  ...config,
51
- enabled: config.enabled && (config.logInjection || config.ciVisAgentlessLogSubmissionEnabled)
55
+ enabled: this._isEnabled(config)
52
56
  })
53
57
  }
54
58
  }
@@ -21,8 +21,8 @@ class OutboundPlugin extends TracingPlugin {
21
21
  constructor (...args) {
22
22
  super(...args)
23
23
 
24
- this.addTraceSub('connect', message => {
25
- this.connect(message)
24
+ this.addTraceSub('connect', ctx => {
25
+ this.connect(ctx)
26
26
  })
27
27
  }
28
28
 
@@ -105,12 +105,14 @@ class OutboundPlugin extends TracingPlugin {
105
105
  }
106
106
  }
107
107
 
108
- connect (url) {
109
- this.addHost(url.hostname, url.port)
108
+ connect (ctx) {
109
+ this.addHost(ctx)
110
110
  }
111
111
 
112
- addHost (hostname, port) {
113
- const span = this.activeSpan
112
+ addHost (ctx) {
113
+ const { hostname, port } = ctx
114
+
115
+ const span = ctx?.currentStore?.span || this.activeSpan
114
116
 
115
117
  if (!span) return
116
118
 
@@ -0,0 +1,9 @@
1
+ 'use strict'
2
+
3
+ const LogPlugin = require('./log_plugin')
4
+
5
+ module.exports = class StructuredLogPlugin extends LogPlugin {
6
+ _isEnabled (config) {
7
+ return super._isEnabled(config) || (config.enabled && config.logInjection === 'structured')
8
+ }
9
+ }
@@ -119,7 +119,7 @@ class TracingPlugin extends Plugin {
119
119
  ...meta,
120
120
  ...metrics
121
121
  },
122
- integrationName: type,
122
+ integrationName: this.component,
123
123
  links: childOf?._links
124
124
  })
125
125
 
@@ -24,10 +24,11 @@ const {
24
24
  GIT_COMMIT_COMMITTER_NAME,
25
25
  GIT_COMMIT_COMMITTER_EMAIL,
26
26
  CI_NODE_LABELS,
27
- CI_NODE_NAME
27
+ CI_NODE_NAME,
28
+ PR_NUMBER
28
29
  } = require('./tags')
29
30
  const { filterSensitiveInfoFromRepository } = require('./url')
30
- const { getEnvironmentVariable } = require('../../config-helper')
31
+ const { getEnvironmentVariable, getEnvironmentVariables } = require('../../config-helper')
31
32
 
32
33
  // Receives a string with the form 'John Doe <john.doe@gmail.com>'
33
34
  // and returns { name: 'John Doe', email: 'john.doe@gmail.com' }
@@ -92,7 +93,7 @@ function getGitHubEventPayload () {
92
93
  module.exports = {
93
94
  normalizeRef,
94
95
  getCIMetadata () {
95
- const { env } = process
96
+ const env = getEnvironmentVariables()
96
97
 
97
98
  let tags = {}
98
99
 
@@ -109,7 +110,9 @@ module.exports = {
109
110
  GIT_URL_1: JENKINS_GIT_REPOSITORY_URL_1,
110
111
  DD_CUSTOM_TRACE_ID,
111
112
  NODE_NAME,
112
- NODE_LABELS
113
+ NODE_LABELS,
114
+ CHANGE_ID,
115
+ CHANGE_TARGET
113
116
  } = env
114
117
 
115
118
  tags = {
@@ -121,7 +124,9 @@ module.exports = {
121
124
  [GIT_REPOSITORY_URL]: JENKINS_GIT_REPOSITORY_URL || JENKINS_GIT_REPOSITORY_URL_1,
122
125
  [CI_WORKSPACE_PATH]: WORKSPACE,
123
126
  [CI_ENV_VARS]: JSON.stringify({ DD_CUSTOM_TRACE_ID }),
124
- [CI_NODE_NAME]: NODE_NAME
127
+ [CI_NODE_NAME]: NODE_NAME,
128
+ [PR_NUMBER]: CHANGE_ID,
129
+ [GIT_PULL_REQUEST_BASE_BRANCH]: CHANGE_TARGET
125
130
  }
126
131
 
127
132
  if (NODE_LABELS) {
@@ -172,7 +177,7 @@ module.exports = {
172
177
  CI_RUNNER_ID,
173
178
  CI_RUNNER_TAGS,
174
179
  CI_MERGE_REQUEST_TARGET_BRANCH_NAME,
175
- CI_MERGE_REQUEST_TARGET_BRANCH_SHA
180
+ CI_MERGE_REQUEST_IID
176
181
  } = env
177
182
 
178
183
  const { name, email } = parseEmailAndName(CI_COMMIT_AUTHOR)
@@ -203,7 +208,7 @@ module.exports = {
203
208
  [CI_NODE_LABELS]: CI_RUNNER_TAGS,
204
209
  [CI_NODE_NAME]: CI_RUNNER_ID,
205
210
  [GIT_PULL_REQUEST_BASE_BRANCH]: CI_MERGE_REQUEST_TARGET_BRANCH_NAME,
206
- [GIT_PULL_REQUEST_BASE_BRANCH_SHA]: CI_MERGE_REQUEST_TARGET_BRANCH_SHA
211
+ [PR_NUMBER]: CI_MERGE_REQUEST_IID
207
212
  }
208
213
  }
209
214
 
@@ -218,7 +223,8 @@ module.exports = {
218
223
  CIRCLE_SHA1,
219
224
  CIRCLE_REPOSITORY_URL,
220
225
  CIRCLE_JOB,
221
- CIRCLE_BUILD_NUM
226
+ CIRCLE_BUILD_NUM,
227
+ CIRCLE_PR_NUMBER
222
228
  } = env
223
229
 
224
230
  const pipelineUrl = `https://app.circleci.com/pipelines/workflows/${CIRCLE_WORKFLOW_ID}`
@@ -237,8 +243,9 @@ module.exports = {
237
243
  [GIT_BRANCH]: CIRCLE_BRANCH,
238
244
  [CI_ENV_VARS]: JSON.stringify({
239
245
  CIRCLE_WORKFLOW_ID,
240
- CIRCLE_BUILD_NUM
241
- })
246
+ CIRCLE_BUILD_NUM,
247
+ }),
248
+ [PR_NUMBER]: CIRCLE_PR_NUMBER
242
249
  }
243
250
  }
244
251
 
@@ -317,7 +324,9 @@ module.exports = {
317
324
  APPVEYOR_REPO_COMMIT_AUTHOR,
318
325
  APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL,
319
326
  APPVEYOR_REPO_COMMIT_MESSAGE,
320
- APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED
327
+ APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED,
328
+ APPVEYOR_PULL_REQUEST_HEAD_COMMIT,
329
+ APPVEYOR_PULL_REQUEST_NUMBER
321
330
  } = env
322
331
 
323
332
  const pipelineUrl = `https://ci.appveyor.com/project/${APPVEYOR_REPO_NAME}/builds/${APPVEYOR_BUILD_ID}`
@@ -333,7 +342,12 @@ module.exports = {
333
342
  [GIT_COMMIT_AUTHOR_NAME]: APPVEYOR_REPO_COMMIT_AUTHOR,
334
343
  [GIT_COMMIT_AUTHOR_EMAIL]: APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL,
335
344
  [GIT_COMMIT_MESSAGE]: APPVEYOR_REPO_COMMIT_MESSAGE + '\n' + APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED,
336
- [GIT_PULL_REQUEST_BASE_BRANCH]: APPVEYOR_REPO_BRANCH
345
+ [GIT_COMMIT_HEAD_SHA]: APPVEYOR_PULL_REQUEST_HEAD_COMMIT,
346
+ [PR_NUMBER]: APPVEYOR_PULL_REQUEST_NUMBER
347
+ }
348
+
349
+ if (APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH) {
350
+ tags[GIT_PULL_REQUEST_BASE_BRANCH] = APPVEYOR_REPO_BRANCH
337
351
  }
338
352
 
339
353
  if (APPVEYOR_REPO_PROVIDER === 'github') {
@@ -367,7 +381,9 @@ module.exports = {
367
381
  BUILD_REQUESTEDFOREMAIL,
368
382
  BUILD_SOURCEVERSIONMESSAGE,
369
383
  SYSTEM_STAGEDISPLAYNAME,
370
- SYSTEM_JOBDISPLAYNAME
384
+ SYSTEM_JOBDISPLAYNAME,
385
+ SYSTEM_PULLREQUEST_PULLREQUESTNUMBER,
386
+ SYSTEM_PULLREQUEST_TARGETBRANCH
371
387
  } = env
372
388
 
373
389
  const ref = SYSTEM_PULLREQUEST_SOURCEBRANCH || BUILD_SOURCEBRANCH || BUILD_SOURCEBRANCHNAME
@@ -387,7 +403,9 @@ module.exports = {
387
403
  [GIT_COMMIT_MESSAGE]: BUILD_SOURCEVERSIONMESSAGE,
388
404
  [CI_STAGE_NAME]: SYSTEM_STAGEDISPLAYNAME,
389
405
  [CI_JOB_NAME]: SYSTEM_JOBDISPLAYNAME,
390
- [CI_ENV_VARS]: JSON.stringify({ SYSTEM_TEAMPROJECTID, BUILD_BUILDID, SYSTEM_JOBID })
406
+ [CI_ENV_VARS]: JSON.stringify({ SYSTEM_TEAMPROJECTID, BUILD_BUILDID, SYSTEM_JOBID }),
407
+ [PR_NUMBER]: SYSTEM_PULLREQUEST_PULLREQUESTNUMBER,
408
+ [GIT_PULL_REQUEST_BASE_BRANCH]: SYSTEM_PULLREQUEST_TARGETBRANCH
391
409
  }
392
410
 
393
411
  if (SYSTEM_TEAMFOUNDATIONSERVERURI && SYSTEM_TEAMPROJECTID && BUILD_BUILDID) {
@@ -415,7 +433,8 @@ module.exports = {
415
433
  BITBUCKET_TAG,
416
434
  BITBUCKET_PIPELINE_UUID,
417
435
  BITBUCKET_CLONE_DIR,
418
- BITBUCKET_PR_DESTINATION_BRANCH
436
+ BITBUCKET_PR_DESTINATION_BRANCH,
437
+ BITBUCKET_PR_ID
419
438
  } = env
420
439
 
421
440
  const url =
@@ -433,7 +452,8 @@ module.exports = {
433
452
  [GIT_REPOSITORY_URL]: BITBUCKET_GIT_SSH_ORIGIN || BITBUCKET_GIT_HTTP_ORIGIN,
434
453
  [CI_WORKSPACE_PATH]: BITBUCKET_CLONE_DIR,
435
454
  [CI_PIPELINE_ID]: BITBUCKET_PIPELINE_UUID && BITBUCKET_PIPELINE_UUID.replaceAll(/{|}/gm, ''),
436
- [GIT_PULL_REQUEST_BASE_BRANCH]: BITBUCKET_PR_DESTINATION_BRANCH
455
+ [GIT_PULL_REQUEST_BASE_BRANCH]: BITBUCKET_PR_DESTINATION_BRANCH,
456
+ [PR_NUMBER]: BITBUCKET_PR_ID
437
457
  }
438
458
  }
439
459
 
@@ -450,7 +470,8 @@ module.exports = {
450
470
  BITRISE_SOURCE_DIR,
451
471
  GIT_REPOSITORY_URL: BITRISE_GIT_REPOSITORY_URL,
452
472
  BITRISE_GIT_TAG,
453
- BITRISE_GIT_MESSAGE
473
+ BITRISE_GIT_MESSAGE,
474
+ BITRISE_PULL_REQUEST
454
475
  } = env
455
476
 
456
477
  tags = {
@@ -465,7 +486,8 @@ module.exports = {
465
486
  [GIT_TAG]: BITRISE_GIT_TAG,
466
487
  [GIT_BRANCH]: BITRISEIO_GIT_BRANCH_DEST || BITRISE_GIT_BRANCH,
467
488
  [GIT_COMMIT_MESSAGE]: BITRISE_GIT_MESSAGE,
468
- [GIT_PULL_REQUEST_BASE_BRANCH]: BITRISEIO_GIT_BRANCH_DEST
489
+ [GIT_PULL_REQUEST_BASE_BRANCH]: BITRISEIO_GIT_BRANCH_DEST,
490
+ [PR_NUMBER]: BITRISE_PULL_REQUEST
469
491
  }
470
492
  }
471
493
 
@@ -484,7 +506,9 @@ module.exports = {
484
506
  BUILDKITE_BUILD_AUTHOR,
485
507
  BUILDKITE_BUILD_AUTHOR_EMAIL,
486
508
  BUILDKITE_MESSAGE,
487
- BUILDKITE_AGENT_ID
509
+ BUILDKITE_AGENT_ID,
510
+ BUILDKITE_PULL_REQUEST,
511
+ BUILDKITE_PULL_REQUEST_BASE_BRANCH
488
512
  } = env
489
513
 
490
514
  const extraTags = Object.keys(env).filter(envVar =>
@@ -514,7 +538,12 @@ module.exports = {
514
538
  BUILDKITE_JOB_ID
515
539
  }),
516
540
  [CI_NODE_NAME]: BUILDKITE_AGENT_ID,
517
- [CI_NODE_LABELS]: JSON.stringify(extraTags)
541
+ [CI_NODE_LABELS]: JSON.stringify(extraTags),
542
+ [PR_NUMBER]: BUILDKITE_PULL_REQUEST,
543
+ }
544
+
545
+ if (BUILDKITE_PULL_REQUEST) {
546
+ tags[GIT_PULL_REQUEST_BASE_BRANCH] = BUILDKITE_PULL_REQUEST_BASE_BRANCH
518
547
  }
519
548
  }
520
549
 
@@ -530,7 +559,9 @@ module.exports = {
530
559
  TRAVIS_BUILD_NUMBER,
531
560
  TRAVIS_BUILD_WEB_URL,
532
561
  TRAVIS_BUILD_DIR,
533
- TRAVIS_COMMIT_MESSAGE
562
+ TRAVIS_COMMIT_MESSAGE,
563
+ TRAVIS_PULL_REQUEST,
564
+ TRAVIS_PULL_REQUEST_SHA
534
565
  } = env
535
566
 
536
567
  tags = {
@@ -545,7 +576,10 @@ module.exports = {
545
576
  [CI_WORKSPACE_PATH]: TRAVIS_BUILD_DIR,
546
577
  [GIT_TAG]: TRAVIS_TAG,
547
578
  [GIT_BRANCH]: TRAVIS_PULL_REQUEST_BRANCH || TRAVIS_BRANCH,
548
- [GIT_COMMIT_MESSAGE]: TRAVIS_COMMIT_MESSAGE
579
+ [GIT_COMMIT_MESSAGE]: TRAVIS_COMMIT_MESSAGE,
580
+ [GIT_COMMIT_HEAD_SHA]: TRAVIS_PULL_REQUEST_SHA,
581
+ [GIT_PULL_REQUEST_BASE_BRANCH]: TRAVIS_BRANCH,
582
+ [PR_NUMBER]: TRAVIS_PULL_REQUEST
549
583
  }
550
584
  }
551
585
 
@@ -562,7 +596,8 @@ module.exports = {
562
596
  BUDDY_PIPELINE_ID,
563
597
  BUDDY_PIPELINE_NAME,
564
598
  BUDDY_SCM_URL,
565
- BUDDY_RUN_PR_BASE_BRANCH
599
+ BUDDY_RUN_PR_BASE_BRANCH,
600
+ BUDDY_RUN_PR_NO
566
601
  } = env
567
602
  tags = {
568
603
  [CI_PROVIDER_NAME]: 'buddy',
@@ -577,19 +612,28 @@ module.exports = {
577
612
  [GIT_COMMIT_MESSAGE]: BUDDY_EXECUTION_REVISION_MESSAGE,
578
613
  [GIT_COMMIT_COMMITTER_NAME]: BUDDY_EXECUTION_REVISION_COMMITTER_NAME,
579
614
  [GIT_COMMIT_COMMITTER_EMAIL]: BUDDY_EXECUTION_REVISION_COMMITTER_EMAIL,
580
- [GIT_PULL_REQUEST_BASE_BRANCH]: BUDDY_RUN_PR_BASE_BRANCH
615
+ [GIT_PULL_REQUEST_BASE_BRANCH]: BUDDY_RUN_PR_BASE_BRANCH,
616
+ [PR_NUMBER]: BUDDY_RUN_PR_NO
581
617
  }
582
618
  }
583
619
 
584
620
  if (env.TEAMCITY_VERSION) {
585
- const { BUILD_URL, TEAMCITY_BUILDCONF_NAME, DATADOG_BUILD_ID } = env
621
+ const {
622
+ BUILD_URL,
623
+ TEAMCITY_BUILDCONF_NAME,
624
+ DATADOG_BUILD_ID,
625
+ TEAMCITY_PULLREQUEST_NUMBER,
626
+ TEAMCITY_PULLREQUEST_TARGET_BRANCH
627
+ } = env
586
628
  tags = {
587
629
  [CI_PROVIDER_NAME]: 'teamcity',
588
630
  [CI_JOB_URL]: BUILD_URL,
589
631
  [CI_JOB_NAME]: TEAMCITY_BUILDCONF_NAME,
590
632
  [CI_ENV_VARS]: JSON.stringify({
591
633
  DATADOG_BUILD_ID
592
- })
634
+ }),
635
+ [PR_NUMBER]: TEAMCITY_PULLREQUEST_NUMBER,
636
+ [GIT_PULL_REQUEST_BASE_BRANCH]: TEAMCITY_PULLREQUEST_TARGET_BRANCH
593
637
  }
594
638
  }
595
639
 
@@ -599,7 +643,9 @@ module.exports = {
599
643
  CF_PIPELINE_NAME,
600
644
  CF_BUILD_URL,
601
645
  CF_STEP_NAME,
602
- CF_BRANCH
646
+ CF_BRANCH,
647
+ CF_PULL_REQUEST_NUMBER,
648
+ CF_PULL_REQUEST_TARGET
603
649
  } = env
604
650
  tags = {
605
651
  [CI_PROVIDER_NAME]: 'codefresh',
@@ -609,7 +655,9 @@ module.exports = {
609
655
  [CI_JOB_NAME]: CF_STEP_NAME,
610
656
  [CI_ENV_VARS]: JSON.stringify({
611
657
  CF_BUILD_ID
612
- })
658
+ }),
659
+ [PR_NUMBER]: CF_PULL_REQUEST_NUMBER,
660
+ [GIT_PULL_REQUEST_BASE_BRANCH]: CF_PULL_REQUEST_TARGET
613
661
  }
614
662
 
615
663
  const isTag = CF_BRANCH && CF_BRANCH.includes('tags/')
@@ -649,7 +697,9 @@ module.exports = {
649
697
  DRONE_TAG,
650
698
  DRONE_COMMIT_AUTHOR_NAME,
651
699
  DRONE_COMMIT_AUTHOR_EMAIL,
652
- DRONE_COMMIT_MESSAGE
700
+ DRONE_COMMIT_MESSAGE,
701
+ DRONE_PULL_REQUEST,
702
+ DRONE_TARGET_BRANCH
653
703
  } = env
654
704
  tags = {
655
705
  [CI_PROVIDER_NAME]: 'drone',
@@ -664,7 +714,9 @@ module.exports = {
664
714
  [GIT_TAG]: DRONE_TAG,
665
715
  [GIT_COMMIT_AUTHOR_NAME]: DRONE_COMMIT_AUTHOR_NAME,
666
716
  [GIT_COMMIT_AUTHOR_EMAIL]: DRONE_COMMIT_AUTHOR_EMAIL,
667
- [GIT_COMMIT_MESSAGE]: DRONE_COMMIT_MESSAGE
717
+ [GIT_COMMIT_MESSAGE]: DRONE_COMMIT_MESSAGE,
718
+ [PR_NUMBER]: DRONE_PULL_REQUEST,
719
+ [GIT_PULL_REQUEST_BASE_BRANCH]: DRONE_TARGET_BRANCH
668
720
  }
669
721
  }
670
722
 
@@ -672,6 +724,7 @@ module.exports = {
672
724
  normalizeTag(tags, GIT_REPOSITORY_URL, filterSensitiveInfoFromRepository)
673
725
  normalizeTag(tags, GIT_BRANCH, normalizeRef)
674
726
  normalizeTag(tags, GIT_TAG, normalizeRef)
727
+ normalizeTag(tags, GIT_PULL_REQUEST_BASE_BRANCH, normalizeRef)
675
728
 
676
729
  return removeEmptyValues(tags)
677
730
  }
@@ -380,6 +380,7 @@ function generatePackFilesForCommits (commitsToUpload) {
380
380
  const tmpFolder = os.tmpdir()
381
381
 
382
382
  if (!isDirectory(tmpFolder)) {
383
+ // TODO: Do we need the stack trace for this error? If not, just log the string
383
384
  log.error(new Error('Provided path to generate packfiles is not a directory'))
384
385
  return []
385
386
  }
@@ -37,7 +37,7 @@ function createInferredProxySpan (headers, childOf, tracer, context) {
37
37
 
38
38
  const proxySpanInfo = supportedProxies[proxyContext.proxySystemName]
39
39
 
40
- log.debug(`Successfully extracted inferred span info ${proxyContext} for proxy: ${proxyContext.proxySystemName}`)
40
+ log.debug('Successfully extracted inferred span info %s for proxy:', proxyContext, proxyContext.proxySystemName)
41
41
 
42
42
  const span = tracer.startSpan(
43
43
  proxySpanInfo.spanName,
@@ -45,6 +45,7 @@ function createInferredProxySpan (headers, childOf, tracer, context) {
45
45
  childOf,
46
46
  type: 'web',
47
47
  startTime: proxyContext.requestTime,
48
+ integrationName: proxySpanInfo.component,
48
49
  tags: {
49
50
  service: proxyContext.domainName || tracer._config.service,
50
51
  component: proxySpanInfo.component,
@@ -79,7 +80,7 @@ function extractInferredProxyContext (headers) {
79
80
  }
80
81
 
81
82
  if (!(PROXY_HEADER_SYSTEM in headers && headers[PROXY_HEADER_SYSTEM] in supportedProxies)) {
82
- log.debug(`Received headers to create inferred proxy span but headers include an unsupported proxy type ${headers}`)
83
+ log.debug('Received headers to create inferred proxy span but headers include an unsupported proxy type', headers)
83
84
  return null
84
85
  }
85
86
 
@@ -21,6 +21,7 @@ const privateCIDRs = [
21
21
  '172.16.0.0/12',
22
22
  '192.168.0.0/16',
23
23
  '169.254.0.0/16',
24
+ '100.65.0.0/10',
24
25
  '::1/128',
25
26
  'fec0::/10',
26
27
  'fe80::/10',
@@ -28,6 +28,8 @@ const CI_NODE_LABELS = 'ci.node.labels'
28
28
 
29
29
  const CI_ENV_VARS = '_dd.ci.env_vars'
30
30
 
31
+ const PR_NUMBER = 'pr.number'
32
+
31
33
  module.exports = {
32
34
  GIT_COMMIT_SHA,
33
35
  GIT_BRANCH,
@@ -54,5 +56,6 @@ module.exports = {
54
56
  CI_STAGE_NAME,
55
57
  CI_ENV_VARS,
56
58
  CI_NODE_NAME,
57
- CI_NODE_LABELS
59
+ CI_NODE_LABELS,
60
+ PR_NUMBER
58
61
  }
@@ -3,6 +3,7 @@ const fs = require('fs')
3
3
  const { URL } = require('url')
4
4
  const log = require('../../log')
5
5
  const { getEnvironmentVariable } = require('../../config-helper')
6
+ const satisfies = require('semifies')
6
7
 
7
8
  const istanbul = require('istanbul-lib-coverage')
8
9
  const ignore = require('ignore')
@@ -127,8 +128,28 @@ const DD_CAPABILITIES_IMPACTED_TESTS = '_dd.library_capabilities.impacted_tests'
127
128
  const DD_CAPABILITIES_TEST_MANAGEMENT_QUARANTINE = '_dd.library_capabilities.test_management.quarantine'
128
129
  const DD_CAPABILITIES_TEST_MANAGEMENT_DISABLE = '_dd.library_capabilities.test_management.disable'
129
130
  const DD_CAPABILITIES_TEST_MANAGEMENT_ATTEMPT_TO_FIX = '_dd.library_capabilities.test_management.attempt_to_fix'
131
+ const DD_CAPABILITIES_FAILED_TEST_REPLAY = '_dd.library_capabilities.failed_test_replay'
130
132
  const UNSUPPORTED_TIA_FRAMEWORKS = new Set(['playwright', 'vitest'])
131
133
  const UNSUPPORTED_TIA_FRAMEWORKS_PARALLEL_MODE = new Set(['cucumber', 'mocha'])
134
+ const MINIMUM_FRAMEWORK_VERSION_FOR_EFD = {
135
+ playwright: '>=1.38.0'
136
+ }
137
+ const MINIMUM_FRAMEWORK_VERSION_FOR_IMPACTED_TESTS = {
138
+ playwright: '>=1.38.0'
139
+ }
140
+ const MINIMUM_FRAMEWORK_VERSION_FOR_QUARANTINE = {
141
+ playwright: '>=1.38.0'
142
+ }
143
+ const MINIMUM_FRAMEWORK_VERSION_FOR_DISABLE = {
144
+ playwright: '>=1.38.0'
145
+ }
146
+ const MINIMUM_FRAMEWORK_VERSION_FOR_ATTEMPT_TO_FIX = {
147
+ playwright: '>=1.38.0'
148
+ }
149
+ const MINIMUM_FRAMEWORK_VERSION_FOR_FAILED_TEST_REPLAY = {
150
+ playwright: '>=1.38.0'
151
+ }
152
+
132
153
  const UNSUPPORTED_ATTEMPT_TO_FIX_FRAMEWORKS_PARALLEL_MODE = new Set(['mocha'])
133
154
  const NOT_SUPPORTED_GRANULARITY_IMPACTED_TESTS_FRAMEWORKS = new Set(['mocha', 'playwright', 'vitest'])
134
155
 
@@ -257,6 +278,7 @@ module.exports = {
257
278
  DD_CAPABILITIES_TEST_MANAGEMENT_QUARANTINE,
258
279
  DD_CAPABILITIES_TEST_MANAGEMENT_DISABLE,
259
280
  DD_CAPABILITIES_TEST_MANAGEMENT_ATTEMPT_TO_FIX,
281
+ DD_CAPABILITIES_FAILED_TEST_REPLAY,
260
282
  TEST_LEVEL_EVENT_TYPES,
261
283
  TEST_RETRY_REASON_TYPES,
262
284
  getNumFromKnownTests,
@@ -409,7 +431,7 @@ function checkShaDiscrepancies (ciMetadata, userProvidedGitMetadata) {
409
431
 
410
432
  incrementCountMetric(
411
433
  TELEMETRY_GIT_SHA_MATCH,
412
- { match: gitCommitShaMatch }
434
+ { matched: gitCommitShaMatch }
413
435
  )
414
436
  }
415
437
 
@@ -895,20 +917,68 @@ function isTiaSupported (testFramework, isParallel) {
895
917
  (isParallel && UNSUPPORTED_TIA_FRAMEWORKS_PARALLEL_MODE.has(testFramework)))
896
918
  }
897
919
 
898
- function isAttemptToFixSupported (testFramework, isParallel) {
920
+ function isEarlyFlakeDetectionSupported (testFramework, frameworkVersion) {
921
+ return testFramework === 'playwright'
922
+ ? satisfies(frameworkVersion, MINIMUM_FRAMEWORK_VERSION_FOR_EFD[testFramework])
923
+ : true
924
+ }
925
+
926
+ function isImpactedTestsSupported (testFramework, frameworkVersion) {
927
+ return testFramework === 'playwright'
928
+ ? satisfies(frameworkVersion, MINIMUM_FRAMEWORK_VERSION_FOR_IMPACTED_TESTS[testFramework])
929
+ : true
930
+ }
931
+
932
+ function isQuarantineSupported (testFramework, frameworkVersion) {
933
+ return testFramework === 'playwright'
934
+ ? satisfies(frameworkVersion, MINIMUM_FRAMEWORK_VERSION_FOR_QUARANTINE[testFramework])
935
+ : true
936
+ }
937
+
938
+ function isDisableSupported (testFramework, frameworkVersion) {
939
+ return testFramework === 'playwright'
940
+ ? satisfies(frameworkVersion, MINIMUM_FRAMEWORK_VERSION_FOR_DISABLE[testFramework])
941
+ : true
942
+ }
943
+
944
+ function isAttemptToFixSupported (testFramework, isParallel, frameworkVersion) {
945
+ if (testFramework === 'playwright') {
946
+ return satisfies(frameworkVersion, MINIMUM_FRAMEWORK_VERSION_FOR_ATTEMPT_TO_FIX[testFramework])
947
+ }
948
+
899
949
  return !(isParallel && UNSUPPORTED_ATTEMPT_TO_FIX_FRAMEWORKS_PARALLEL_MODE.has(testFramework))
900
950
  }
901
951
 
902
- function getLibraryCapabilitiesTags (testFramework, isParallel) {
952
+ function isFailedTestReplaySupported (testFramework, frameworkVersion) {
953
+ return testFramework === 'playwright'
954
+ ? satisfies(frameworkVersion, MINIMUM_FRAMEWORK_VERSION_FOR_FAILED_TEST_REPLAY[testFramework])
955
+ : true
956
+ }
957
+
958
+ function getLibraryCapabilitiesTags (testFramework, isParallel, frameworkVersion) {
903
959
  return {
904
- [DD_CAPABILITIES_TEST_IMPACT_ANALYSIS]: isTiaSupported(testFramework, isParallel) ? '1' : undefined,
905
- [DD_CAPABILITIES_EARLY_FLAKE_DETECTION]: '1',
960
+ [DD_CAPABILITIES_TEST_IMPACT_ANALYSIS]: isTiaSupported(testFramework, isParallel)
961
+ ? '1'
962
+ : undefined,
963
+ [DD_CAPABILITIES_EARLY_FLAKE_DETECTION]: isEarlyFlakeDetectionSupported(testFramework, frameworkVersion)
964
+ ? '1'
965
+ : undefined,
906
966
  [DD_CAPABILITIES_AUTO_TEST_RETRIES]: '1',
907
- [DD_CAPABILITIES_IMPACTED_TESTS]: '1',
908
- [DD_CAPABILITIES_TEST_MANAGEMENT_QUARANTINE]: '1',
909
- [DD_CAPABILITIES_TEST_MANAGEMENT_DISABLE]: '1',
910
- [DD_CAPABILITIES_TEST_MANAGEMENT_ATTEMPT_TO_FIX]: isAttemptToFixSupported(testFramework, isParallel)
911
- ? '4'
967
+ [DD_CAPABILITIES_IMPACTED_TESTS]: isImpactedTestsSupported(testFramework, frameworkVersion)
968
+ ? '1'
969
+ : undefined,
970
+ [DD_CAPABILITIES_TEST_MANAGEMENT_QUARANTINE]: isQuarantineSupported(testFramework, frameworkVersion)
971
+ ? '1'
972
+ : undefined,
973
+ [DD_CAPABILITIES_TEST_MANAGEMENT_DISABLE]: isDisableSupported(testFramework, frameworkVersion)
974
+ ? '1'
975
+ : undefined,
976
+ [DD_CAPABILITIES_TEST_MANAGEMENT_ATTEMPT_TO_FIX]:
977
+ isAttemptToFixSupported(testFramework, isParallel, frameworkVersion)
978
+ ? '4'
979
+ : undefined,
980
+ [DD_CAPABILITIES_FAILED_TEST_REPLAY]: isFailedTestReplaySupported(testFramework, frameworkVersion)
981
+ ? '1'
912
982
  : undefined
913
983
  }
914
984
  }
@@ -70,6 +70,7 @@ const web = {
70
70
 
71
71
  span.context()._name = `${name}.request`
72
72
  span.context()._tags.component = name
73
+ span._integrationName = name
73
74
 
74
75
  web.setConfig(req, config)
75
76
  },
@@ -23,8 +23,6 @@ module.exports = {
23
23
  activation = 'auto'
24
24
  } else if (enabled === 'true') {
25
25
  activation = 'manual'
26
- } else if (injectionEnabled.includes('profiler')) {
27
- activation = 'injection'
28
26
  } // else activation = undefined
29
27
 
30
28
  return profiler.start({