dd-trace 5.8.0 → 5.9.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 (106) hide show
  1. package/LICENSE-3rdparty.csv +0 -1
  2. package/ci/init.js +3 -3
  3. package/package.json +4 -5
  4. package/packages/datadog-esbuild/index.js +2 -2
  5. package/packages/datadog-instrumentations/src/apollo-server.js +1 -1
  6. package/packages/datadog-instrumentations/src/apollo.js +5 -3
  7. package/packages/datadog-instrumentations/src/aws-sdk.js +4 -1
  8. package/packages/datadog-instrumentations/src/cassandra-driver.js +1 -1
  9. package/packages/datadog-instrumentations/src/cucumber.js +6 -2
  10. package/packages/datadog-instrumentations/src/fs.js +0 -1
  11. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +1 -1
  12. package/packages/datadog-instrumentations/src/helpers/hooks.js +56 -56
  13. package/packages/datadog-instrumentations/src/helpers/instrument.js +2 -2
  14. package/packages/datadog-instrumentations/src/http/client.js +1 -0
  15. package/packages/datadog-instrumentations/src/jest.js +12 -13
  16. package/packages/datadog-instrumentations/src/kafkajs.js +2 -1
  17. package/packages/datadog-instrumentations/src/ldapjs.js +2 -1
  18. package/packages/datadog-instrumentations/src/mocha.js +1 -1
  19. package/packages/datadog-instrumentations/src/mongodb-core.js +3 -3
  20. package/packages/datadog-instrumentations/src/net.js +1 -1
  21. package/packages/datadog-instrumentations/src/passport-utils.js +1 -0
  22. package/packages/datadog-instrumentations/src/playwright.js +8 -2
  23. package/packages/datadog-instrumentations/src/rhea.js +5 -2
  24. package/packages/datadog-instrumentations/src/tedious.js +1 -1
  25. package/packages/datadog-plugin-apollo/src/gateway/fetch.js +1 -1
  26. package/packages/datadog-plugin-apollo/src/gateway/plan.js +0 -1
  27. package/packages/datadog-plugin-apollo/src/gateway/request.js +2 -17
  28. package/packages/datadog-plugin-apollo/src/gateway/validate.js +6 -2
  29. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -3
  30. package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +1 -1
  31. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +2 -2
  32. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +1 -1
  33. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +1 -1
  34. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
  35. package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +1 -1
  36. package/packages/datadog-plugin-aws-sdk/src/services/s3.js +1 -1
  37. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -1
  38. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +2 -2
  39. package/packages/datadog-plugin-child_process/src/index.js +1 -1
  40. package/packages/datadog-plugin-couchbase/src/index.js +2 -1
  41. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +1 -0
  42. package/packages/datadog-plugin-fetch/src/index.js +1 -1
  43. package/packages/datadog-plugin-graphql/src/resolve.js +1 -1
  44. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  45. package/packages/datadog-plugin-grpc/src/server.js +2 -2
  46. package/packages/datadog-plugin-http/src/client.js +2 -2
  47. package/packages/datadog-plugin-http2/src/client.js +4 -3
  48. package/packages/datadog-plugin-jest/src/index.js +1 -0
  49. package/packages/datadog-plugin-kafkajs/src/consumer.js +1 -1
  50. package/packages/datadog-plugin-kafkajs/src/producer.js +1 -1
  51. package/packages/datadog-plugin-next/src/index.js +1 -1
  52. package/packages/datadog-plugin-openai/src/index.js +4 -4
  53. package/packages/datadog-plugin-playwright/src/index.js +7 -2
  54. package/packages/datadog-plugin-rhea/src/consumer.js +1 -1
  55. package/packages/datadog-plugin-rhea/src/producer.js +1 -1
  56. package/packages/datadog-plugin-router/src/index.js +1 -1
  57. package/packages/datadog-plugin-tedious/src/index.js +1 -1
  58. package/packages/dd-trace/src/appsec/blocking.js +1 -1
  59. package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +17 -17
  60. package/packages/dd-trace/src/appsec/iast/analyzers/cookie-analyzer.js +1 -0
  61. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +132 -132
  62. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +1 -0
  63. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +1 -1
  64. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +2 -1
  65. package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +3 -3
  66. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +4 -4
  67. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +1 -1
  68. package/packages/dd-trace/src/appsec/iast/telemetry/namespaces.js +27 -18
  69. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +1 -1
  70. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +1 -1
  71. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +7 -4
  72. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +2 -2
  73. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +0 -1
  74. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -1
  75. package/packages/dd-trace/src/ci-visibility/test-api-manual/test-api-manual-plugin.js +1 -0
  76. package/packages/dd-trace/src/config.js +13 -13
  77. package/packages/dd-trace/src/datastreams/pathway.js +1 -1
  78. package/packages/dd-trace/src/datastreams/processor.js +15 -15
  79. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +2 -2
  80. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  81. package/packages/dd-trace/src/exporters/common/request.js +1 -0
  82. package/packages/dd-trace/src/exporters/span-stats/writer.js +0 -1
  83. package/packages/dd-trace/src/external-logger/src/index.js +5 -5
  84. package/packages/dd-trace/src/opentelemetry/span.js +2 -0
  85. package/packages/dd-trace/src/opentracing/propagation/text_map.js +1 -1
  86. package/packages/dd-trace/src/opentracing/span.js +1 -1
  87. package/packages/dd-trace/src/plugins/apollo.js +3 -1
  88. package/packages/dd-trace/src/plugins/ci_plugin.js +2 -1
  89. package/packages/dd-trace/src/plugins/composite.js +3 -4
  90. package/packages/dd-trace/src/plugins/database.js +1 -0
  91. package/packages/dd-trace/src/plugins/index.js +43 -43
  92. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  93. package/packages/dd-trace/src/plugins/tracing.js +1 -1
  94. package/packages/dd-trace/src/plugins/util/test.js +2 -1
  95. package/packages/dd-trace/src/plugins/util/web.js +4 -4
  96. package/packages/dd-trace/src/profiling/config.js +1 -1
  97. package/packages/dd-trace/src/profiling/loggers/console.js +1 -1
  98. package/packages/dd-trace/src/runtime_metrics.js +8 -5
  99. package/packages/dd-trace/src/serverless.js +3 -2
  100. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +0 -1
  101. package/packages/dd-trace/src/span_processor.js +2 -2
  102. package/packages/dd-trace/src/span_stats.js +1 -1
  103. package/packages/dd-trace/src/telemetry/dependencies.js +4 -5
  104. package/packages/dd-trace/src/telemetry/index.js +12 -13
  105. package/packages/dd-trace/src/telemetry/send-data.js +0 -1
  106. package/packages/dd-trace/src/util.js +7 -7
@@ -10,11 +10,15 @@ class ApolloGatewayValidatePlugin extends ApolloBasePlugin {
10
10
 
11
11
  end (ctx) {
12
12
  const result = ctx.result
13
+ const span = ctx.currentStore?.span
14
+
15
+ if (!span) return
16
+
13
17
  if (result instanceof Array &&
14
18
  result[result.length - 1] && result[result.length - 1].stack && result[result.length - 1].message) {
15
- ctx.currentStore.span.setTag('error', result[result.length - 1])
19
+ span.setTag('error', result[result.length - 1])
16
20
  }
17
- ctx.currentStore.span.finish()
21
+ span.finish()
18
22
  }
19
23
  }
20
24
 
@@ -37,10 +37,10 @@ class BaseAwsSdkPlugin extends ClientPlugin {
37
37
  'service.name': this.serviceName(),
38
38
  'aws.operation': operation,
39
39
  'aws.region': awsRegion,
40
- 'region': awsRegion,
41
- 'aws_service': awsService,
40
+ region: awsRegion,
41
+ aws_service: awsService,
42
42
  'aws.service': awsService,
43
- 'component': 'aws-sdk'
43
+ component: 'aws-sdk'
44
44
  }
45
45
  if (this.requestTags) this.requestTags.set(request, tags)
46
46
 
@@ -13,7 +13,7 @@ class CloudwatchLogs extends BaseAwsSdkPlugin {
13
13
  return Object.assign(tags, {
14
14
  'resource.name': `${operation} ${params.logGroupName}`,
15
15
  'aws.cloudwatch.logs.log_group_name': params.logGroupName,
16
- 'loggroupname': params.logGroupName
16
+ loggroupname: params.logGroupName
17
17
  })
18
18
  }
19
19
  }
@@ -14,7 +14,7 @@ class DynamoDb extends BaseAwsSdkPlugin {
14
14
  Object.assign(tags, {
15
15
  'resource.name': `${operation} ${params.TableName}`,
16
16
  'aws.dynamodb.table_name': params.TableName,
17
- 'tablename': params.TableName
17
+ tablename: params.TableName
18
18
  })
19
19
  }
20
20
 
@@ -30,7 +30,7 @@ class DynamoDb extends BaseAwsSdkPlugin {
30
30
  Object.assign(tags, {
31
31
  'resource.name': `${operation} ${tableName}`,
32
32
  'aws.dynamodb.table_name': tableName,
33
- 'tablename': tableName
33
+ tablename: tableName
34
34
  })
35
35
  }
36
36
  }
@@ -11,7 +11,7 @@ class EventBridge extends BaseAwsSdkPlugin {
11
11
  return {
12
12
  'resource.name': operation ? `${operation} ${params.source}` : params.source,
13
13
  'aws.eventbridge.source': `${params.source}`,
14
- 'rulename': `${rulename}`
14
+ rulename: `${rulename}`
15
15
  }
16
16
  }
17
17
 
@@ -69,7 +69,7 @@ class Kinesis extends BaseAwsSdkPlugin {
69
69
  return {
70
70
  'resource.name': `${operation} ${params.StreamName}`,
71
71
  'aws.kinesis.stream_name': params.StreamName,
72
- 'streamname': params.StreamName
72
+ streamname: params.StreamName
73
73
  }
74
74
  }
75
75
 
@@ -13,7 +13,7 @@ class Lambda extends BaseAwsSdkPlugin {
13
13
 
14
14
  return Object.assign(tags, {
15
15
  'resource.name': `${operation} ${params.FunctionName}`,
16
- 'functionname': params.FunctionName,
16
+ functionname: params.FunctionName,
17
17
  'aws.lambda': params.FunctionName
18
18
  })
19
19
  }
@@ -13,7 +13,7 @@ class Redshift extends BaseAwsSdkPlugin {
13
13
  return Object.assign(tags, {
14
14
  'resource.name': `${operation} ${params.ClusterIdentifier}`,
15
15
  'aws.redshift.cluster_identifier': params.ClusterIdentifier,
16
- 'clusteridentifier': params.ClusterIdentifier
16
+ clusteridentifier: params.ClusterIdentifier
17
17
  })
18
18
  }
19
19
  }
@@ -14,7 +14,7 @@ class S3 extends BaseAwsSdkPlugin {
14
14
  return Object.assign(tags, {
15
15
  'resource.name': `${operation} ${params.Bucket}`,
16
16
  'aws.s3.bucket_name': params.Bucket,
17
- 'bucketname': params.Bucket
17
+ bucketname: params.Bucket
18
18
  })
19
19
  }
20
20
  }
@@ -23,7 +23,7 @@ class Sns extends BaseAwsSdkPlugin {
23
23
  return {
24
24
  'resource.name': `${operation} ${params.TopicArn || response.data.TopicArn}`,
25
25
  'aws.sns.topic_arn': TopicArn,
26
- 'topicname': topicName
26
+ topicname: topicName
27
27
  }
28
28
 
29
29
  // TODO: should arn be sanitized or quantized in some way here,
@@ -101,7 +101,7 @@ class Sqs extends BaseAwsSdkPlugin {
101
101
  Object.assign(tags, {
102
102
  'resource.name': `${operation} ${params.QueueName || params.QueueUrl}`,
103
103
  'aws.sqs.queue_name': params.QueueName || params.QueueUrl,
104
- 'queuename': queueName
104
+ queuename: queueName
105
105
  })
106
106
 
107
107
  switch (operation) {
@@ -146,7 +146,7 @@ class Sqs extends BaseAwsSdkPlugin {
146
146
  if (parsedAttributes) {
147
147
  return {
148
148
  datadogContext: this.tracer.extract('text_map', parsedAttributes),
149
- parsedAttributes: parsedAttributes
149
+ parsedAttributes
150
150
  }
151
151
  }
152
152
  }
@@ -45,7 +45,7 @@ class ChildProcessPlugin extends TracingPlugin {
45
45
  const property = (shell === true) ? 'cmd.shell' : 'cmd.exec'
46
46
 
47
47
  const meta = {
48
- 'component': 'subprocess',
48
+ component: 'subprocess',
49
49
  [property]: (shell === true) ? cmdFields.join(' ') : JSON.stringify(cmdFields)
50
50
  }
51
51
 
@@ -16,7 +16,7 @@ class CouchBasePlugin extends StoragePlugin {
16
16
  startSpan (operation, customTags, store, { bucket, collection, seedNodes }) {
17
17
  const tags = {
18
18
  'db.type': 'couchbase',
19
- 'component': 'couchbase',
19
+ component: 'couchbase',
20
20
  'resource.name': `couchbase.${operation}`,
21
21
  'span.kind': this.constructor.kind,
22
22
  'db.couchbase.seed.nodes': seedNodes
@@ -61,6 +61,7 @@ class CouchBasePlugin extends StoragePlugin {
61
61
  this._addCommandSubs('append')
62
62
  this._addCommandSubs('prepend')
63
63
  }
64
+
64
65
  _addCommandSubs (name) {
65
66
  this.addSubs(name, ({ bucket, collection, seedNodes }) => {
66
67
  const store = storage.getStore()
@@ -327,6 +327,7 @@ class CypressPlugin {
327
327
  )
328
328
  if (knownTestsResponse.err) {
329
329
  log.error(knownTestsResponse.err)
330
+ this.isEarlyFlakeDetectionEnabled = false
330
331
  } else {
331
332
  // We use TEST_FRAMEWORK_NAME for the name of the module
332
333
  this.knownTestsByTestSuite = knownTestsResponse.knownTests[TEST_FRAMEWORK_NAME]
@@ -4,7 +4,7 @@ const HttpClientPlugin = require('../../datadog-plugin-http/src/client')
4
4
 
5
5
  class FetchPlugin extends HttpClientPlugin {
6
6
  static get id () { return 'fetch' }
7
- static get prefix () { return `apm:fetch:request` }
7
+ static get prefix () { return 'apm:fetch:request' }
8
8
 
9
9
  addTraceSub (eventName, handler) {
10
10
  this.addSub(`apm:${this.constructor.id}:${this.operation}:${eventName}`, handler)
@@ -126,7 +126,7 @@ function getResolverInfo (info, args) {
126
126
  if (Array.isArray(directives)) {
127
127
  for (const directive of directives) {
128
128
  const argList = {}
129
- for (const argument of directive['arguments']) {
129
+ for (const argument of directive.arguments) {
130
130
  argList[argument.name.value] = argument.value.value
131
131
  }
132
132
 
@@ -8,7 +8,7 @@ const { addMetadataTags, getFilter, getMethodMetadata } = require('./util')
8
8
  class GrpcClientPlugin extends ClientPlugin {
9
9
  static get id () { return 'grpc' }
10
10
  static get operation () { return 'client:request' }
11
- static get prefix () { return `apm:grpc:client:request` }
11
+ static get prefix () { return 'apm:grpc:client:request' }
12
12
  static get peerServicePrecursors () { return ['rpc.service'] }
13
13
 
14
14
  constructor (...args) {
@@ -30,7 +30,7 @@ class GrpcClientPlugin extends ClientPlugin {
30
30
  kind: 'client',
31
31
  type: 'http',
32
32
  meta: {
33
- 'component': 'grpc',
33
+ component: 'grpc',
34
34
  'grpc.method.kind': method.kind,
35
35
  'grpc.method.path': method.path,
36
36
  'grpc.method.name': method.name,
@@ -8,7 +8,7 @@ const { addMetadataTags, getFilter, getMethodMetadata } = require('./util')
8
8
  class GrpcServerPlugin extends ServerPlugin {
9
9
  static get id () { return 'grpc' }
10
10
  static get operation () { return 'server:request' }
11
- static get prefix () { return `apm:grpc:server:request` }
11
+ static get prefix () { return 'apm:grpc:server:request' }
12
12
 
13
13
  constructor (...args) {
14
14
  super(...args)
@@ -39,7 +39,7 @@ class GrpcServerPlugin extends ServerPlugin {
39
39
  kind: 'server',
40
40
  type: 'web',
41
41
  meta: {
42
- 'component': 'grpc',
42
+ component: 'grpc',
43
43
  'grpc.method.kind': method.kind,
44
44
  'grpc.method.path': method.path,
45
45
  'grpc.method.name': method.name,
@@ -17,7 +17,7 @@ const HTTP_RESPONSE_HEADERS = tags.HTTP_RESPONSE_HEADERS
17
17
 
18
18
  class HttpClientPlugin extends ClientPlugin {
19
19
  static get id () { return 'http' }
20
- static get prefix () { return `apm:http:client:request` }
20
+ static get prefix () { return 'apm:http:client:request' }
21
21
 
22
22
  bindStart (message) {
23
23
  const { args, http = {} } = message
@@ -227,7 +227,7 @@ function hasAmazonSignature (options) {
227
227
  return true
228
228
  }
229
229
 
230
- if ([].concat(headers['authorization']).some(startsWith('AWS4-HMAC-SHA256'))) {
230
+ if ([].concat(headers.authorization).some(startsWith('AWS4-HMAC-SHA256'))) {
231
231
  return true
232
232
  }
233
233
  }
@@ -25,7 +25,7 @@ const HTTP2_METHOD_GET = 'GET'
25
25
 
26
26
  class Http2ClientPlugin extends ClientPlugin {
27
27
  static get id () { return 'http2' }
28
- static get prefix () { return `apm:http2:client:request` }
28
+ static get prefix () { return 'apm:http2:client:request' }
29
29
 
30
30
  bindStart (message) {
31
31
  const { authority, options, headers = {} } = message
@@ -122,7 +122,8 @@ function extractSessionDetails (authority, options) {
122
122
 
123
123
  const protocol = authority.protocol || options.protocol || 'https:'
124
124
  let port = '' + (authority.port !== ''
125
- ? authority.port : (authority.protocol === 'http:' ? 80 : 443))
125
+ ? authority.port
126
+ : (authority.protocol === 'http:' ? 80 : 443))
126
127
  let host = authority.hostname || authority.host || 'localhost'
127
128
 
128
129
  if (protocol === 'https:' && options) {
@@ -144,7 +145,7 @@ function hasAmazonSignature (headers, path) {
144
145
  return true
145
146
  }
146
147
 
147
- if ([].concat(headers['authorization']).some(startsWith('AWS4-HMAC-SHA256'))) {
148
+ if ([].concat(headers.authorization).some(startsWith('AWS4-HMAC-SHA256'))) {
148
149
  return true
149
150
  }
150
151
  }
@@ -51,6 +51,7 @@ class JestPlugin extends CiPlugin {
51
51
  }
52
52
  return this.unskippableSuites
53
53
  }
54
+
54
55
  getForcedToRunSuites (forcedToRunSuitesList) {
55
56
  if (!this.forcedToRunSuites) {
56
57
  this.forcedToRunSuites = JSON.parse(forcedToRunSuitesList)
@@ -70,7 +70,7 @@ class KafkajsConsumerPlugin extends ConsumerPlugin {
70
70
  resource: topic,
71
71
  type: 'worker',
72
72
  meta: {
73
- 'component': 'kafkajs',
73
+ component: 'kafkajs',
74
74
  'kafka.topic': topic,
75
75
  'kafka.message.offset': message.offset
76
76
  },
@@ -70,7 +70,7 @@ class KafkajsProducerPlugin extends ProducerPlugin {
70
70
  const span = this.startSpan({
71
71
  resource: topic,
72
72
  meta: {
73
- 'component': 'kafkajs',
73
+ component: 'kafkajs',
74
74
  'kafka.topic': topic
75
75
  },
76
76
  metrics: {
@@ -58,7 +58,7 @@ class NextPlugin extends ServerPlugin {
58
58
  if (!store) return
59
59
 
60
60
  const span = store.span
61
- const error = span.context()._tags['error']
61
+ const error = span.context()._tags.error
62
62
  const requestError = req.error || nextRequest.error
63
63
 
64
64
  if (requestError) {
@@ -89,7 +89,7 @@ class OpenApiPlugin extends TracingPlugin {
89
89
  store.prompt = prompt
90
90
  if (typeof prompt === 'string' || (Array.isArray(prompt) && typeof prompt[0] === 'number')) {
91
91
  // This is a single prompt, either String or [Number]
92
- tags[`openai.request.prompt`] = normalizeStringOrTokenArray(prompt, true)
92
+ tags['openai.request.prompt'] = normalizeStringOrTokenArray(prompt, true)
93
93
  } else if (Array.isArray(prompt)) {
94
94
  // This is multiple prompts, either [String] or [[Number]]
95
95
  for (let i = 0; i < prompt.length; i++) {
@@ -101,7 +101,7 @@ class OpenApiPlugin extends TracingPlugin {
101
101
  // createEdit, createEmbedding, createModeration
102
102
  if ('input' in payload) {
103
103
  const normalized = normalizeStringOrTokenArray(payload.input, false)
104
- tags[`openai.request.input`] = truncateText(normalized)
104
+ tags['openai.request.input'] = truncateText(normalized)
105
105
  store.input = normalized
106
106
  }
107
107
 
@@ -203,7 +203,7 @@ class OpenApiPlugin extends TracingPlugin {
203
203
 
204
204
  // We don't know most information about the request when it fails
205
205
 
206
- const tags = [`error:1`]
206
+ const tags = ['error:1']
207
207
  this.metrics.distribution('openai.request.duration', span._duration * 1000, tags)
208
208
  this.metrics.increment('openai.request.error', 1, tags)
209
209
 
@@ -215,7 +215,7 @@ class OpenApiPlugin extends TracingPlugin {
215
215
  `org:${headers['openai-organization']}`,
216
216
  `endpoint:${endpoint}`, // just "/v1/models", no method
217
217
  `model:${headers['openai-model']}`,
218
- `error:0`
218
+ 'error:0'
219
219
  ]
220
220
 
221
221
  this.metrics.distribution('openai.request.duration', duration * 1000, tags)
@@ -13,7 +13,8 @@ const {
13
13
  TEST_SOURCE_FILE,
14
14
  TEST_CONFIGURATION_BROWSER_NAME,
15
15
  TEST_IS_NEW,
16
- TEST_IS_RETRY
16
+ TEST_IS_RETRY,
17
+ TEST_EARLY_FLAKE_IS_ENABLED
17
18
  } = require('../../dd-trace/src/plugins/util/test')
18
19
  const { RESOURCE_NAME } = require('../../../ext/tags')
19
20
  const { COMPONENT } = require('../../dd-trace/src/constants')
@@ -35,10 +36,14 @@ class PlaywrightPlugin extends CiPlugin {
35
36
  this.numFailedTests = 0
36
37
  this.numFailedSuites = 0
37
38
 
38
- this.addSub('ci:playwright:session:finish', ({ status, onDone }) => {
39
+ this.addSub('ci:playwright:session:finish', ({ status, isEarlyFlakeDetectionEnabled, onDone }) => {
39
40
  this.testModuleSpan.setTag(TEST_STATUS, status)
40
41
  this.testSessionSpan.setTag(TEST_STATUS, status)
41
42
 
43
+ if (isEarlyFlakeDetectionEnabled) {
44
+ this.testSessionSpan.setTag(TEST_EARLY_FLAKE_IS_ENABLED, 'true')
45
+ }
46
+
42
47
  if (this.numFailedSuites > 0) {
43
48
  let errorMessage = `Test suites failed: ${this.numFailedSuites}.`
44
49
  if (this.numFailedTests > 0) {
@@ -26,7 +26,7 @@ class RheaConsumerPlugin extends ConsumerPlugin {
26
26
  resource: name,
27
27
  type: 'worker',
28
28
  meta: {
29
- 'component': 'rhea',
29
+ component: 'rhea',
30
30
  'amqp.link.source.address': name,
31
31
  'amqp.link.role': 'receiver'
32
32
  }
@@ -19,7 +19,7 @@ class RheaProducerPlugin extends ProducerPlugin {
19
19
  this.startSpan({
20
20
  resource: name,
21
21
  meta: {
22
- 'component': 'rhea',
22
+ component: 'rhea',
23
23
  'amqp.link.target.address': name,
24
24
  'amqp.link.role': 'sender',
25
25
  'out.host': host,
@@ -71,7 +71,7 @@ class RouterPlugin extends WebPlugin {
71
71
  span.setTag('error', error)
72
72
  })
73
73
 
74
- this.addSub(`apm:http:server:request:finish`, ({ req }) => {
74
+ this.addSub('apm:http:server:request:finish', ({ req }) => {
75
75
  const context = this._contexts.get(req)
76
76
 
77
77
  if (!context) return
@@ -16,7 +16,7 @@ class TediousPlugin extends DatabasePlugin {
16
16
  kind: 'client',
17
17
  meta: {
18
18
  'db.type': 'mssql',
19
- 'component': 'tedious',
19
+ component: 'tedious',
20
20
  'out.host': connectionConfig.server,
21
21
  [CLIENT_PORT_KEY]: connectionConfig.options.port,
22
22
  'db.user': connectionConfig.userName || connectionConfig.authentication.options.userName,
@@ -28,7 +28,7 @@ function getBlockWithRedirectData (rootSpan) {
28
28
  statusCode = 303
29
29
  }
30
30
  const headers = {
31
- 'Location': blockingConfiguration.parameters.location
31
+ Location: blockingConfiguration.parameters.location
32
32
  }
33
33
 
34
34
  rootSpan.addTags({
@@ -1,21 +1,21 @@
1
1
  'use strict'
2
2
 
3
3
  module.exports = {
4
- 'COMMAND_INJECTION_ANALYZER': require('./command-injection-analyzer'),
5
- 'HARCODED_SECRET_ANALYZER': require('./hardcoded-secret-analyzer'),
6
- 'HEADER_INJECTION_ANALYZER': require('./header-injection-analyzer'),
7
- 'HSTS_HEADER_MISSING_ANALYZER': require('./hsts-header-missing-analyzer'),
8
- 'INSECURE_COOKIE_ANALYZER': require('./insecure-cookie-analyzer'),
9
- 'LDAP_ANALYZER': require('./ldap-injection-analyzer'),
10
- 'NO_HTTPONLY_COOKIE_ANALYZER': require('./no-httponly-cookie-analyzer'),
11
- 'NO_SAMESITE_COOKIE_ANALYZER': require('./no-samesite-cookie-analyzer'),
12
- 'NOSQL_MONGODB_INJECTION': require('./nosql-injection-mongodb-analyzer'),
13
- 'PATH_TRAVERSAL_ANALYZER': require('./path-traversal-analyzer'),
14
- 'SQL_INJECTION_ANALYZER': require('./sql-injection-analyzer'),
15
- 'SSRF': require('./ssrf-analyzer'),
16
- 'UNVALIDATED_REDIRECT_ANALYZER': require('./unvalidated-redirect-analyzer'),
17
- 'WEAK_CIPHER_ANALYZER': require('./weak-cipher-analyzer'),
18
- 'WEAK_HASH_ANALYZER': require('./weak-hash-analyzer'),
19
- 'WEAK_RANDOMNESS_ANALYZER': require('./weak-randomness-analyzer'),
20
- 'XCONTENTTYPE_HEADER_MISSING_ANALYZER': require('./xcontenttype-header-missing-analyzer')
4
+ COMMAND_INJECTION_ANALYZER: require('./command-injection-analyzer'),
5
+ HARCODED_SECRET_ANALYZER: require('./hardcoded-secret-analyzer'),
6
+ HEADER_INJECTION_ANALYZER: require('./header-injection-analyzer'),
7
+ HSTS_HEADER_MISSING_ANALYZER: require('./hsts-header-missing-analyzer'),
8
+ INSECURE_COOKIE_ANALYZER: require('./insecure-cookie-analyzer'),
9
+ LDAP_ANALYZER: require('./ldap-injection-analyzer'),
10
+ NO_HTTPONLY_COOKIE_ANALYZER: require('./no-httponly-cookie-analyzer'),
11
+ NO_SAMESITE_COOKIE_ANALYZER: require('./no-samesite-cookie-analyzer'),
12
+ NOSQL_MONGODB_INJECTION: require('./nosql-injection-mongodb-analyzer'),
13
+ PATH_TRAVERSAL_ANALYZER: require('./path-traversal-analyzer'),
14
+ SQL_INJECTION_ANALYZER: require('./sql-injection-analyzer'),
15
+ SSRF: require('./ssrf-analyzer'),
16
+ UNVALIDATED_REDIRECT_ANALYZER: require('./unvalidated-redirect-analyzer'),
17
+ WEAK_CIPHER_ANALYZER: require('./weak-cipher-analyzer'),
18
+ WEAK_HASH_ANALYZER: require('./weak-hash-analyzer'),
19
+ WEAK_RANDOMNESS_ANALYZER: require('./weak-randomness-analyzer'),
20
+ XCONTENTTYPE_HEADER_MISSING_ANALYZER: require('./xcontenttype-header-missing-analyzer')
21
21
  }
@@ -34,6 +34,7 @@ class CookieAnalyzer extends Analyzer {
34
34
  _getExcludedPaths () {
35
35
  return EXCLUDED_PATHS
36
36
  }
37
+
37
38
  _checkOCE (context, value) {
38
39
  if (value && value.location) {
39
40
  return true