dd-trace 4.18.0 → 5.6.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 (209) hide show
  1. package/CONTRIBUTING.md +98 -0
  2. package/LICENSE-3rdparty.csv +4 -5
  3. package/MIGRATING.md +15 -0
  4. package/README.md +20 -140
  5. package/ci/cypress/after-run.js +1 -0
  6. package/ci/cypress/after-spec.js +1 -0
  7. package/ci/init.js +1 -4
  8. package/ext/kinds.d.ts +1 -0
  9. package/ext/kinds.js +2 -1
  10. package/ext/tags.d.ts +2 -1
  11. package/ext/tags.js +6 -1
  12. package/index.d.ts +1523 -1460
  13. package/package.json +19 -19
  14. package/packages/datadog-core/src/storage/async_resource.js +1 -1
  15. package/packages/datadog-core/src/utils/src/get.js +11 -0
  16. package/packages/datadog-core/src/utils/src/has.js +14 -0
  17. package/packages/datadog-core/src/utils/src/kebabcase.js +16 -0
  18. package/packages/datadog-core/src/utils/src/pick.js +11 -0
  19. package/packages/datadog-core/src/utils/src/set.js +16 -0
  20. package/packages/datadog-core/src/utils/src/uniq.js +5 -0
  21. package/packages/datadog-esbuild/index.js +1 -20
  22. package/packages/datadog-instrumentations/src/aerospike.js +47 -0
  23. package/packages/datadog-instrumentations/src/amqplib.js +2 -2
  24. package/packages/datadog-instrumentations/src/apollo-server-core.js +41 -0
  25. package/packages/datadog-instrumentations/src/apollo-server.js +83 -0
  26. package/packages/datadog-instrumentations/src/child_process.js +150 -0
  27. package/packages/datadog-instrumentations/src/couchbase.js +5 -4
  28. package/packages/datadog-instrumentations/src/crypto.js +2 -1
  29. package/packages/datadog-instrumentations/src/cucumber.js +163 -46
  30. package/packages/datadog-instrumentations/src/dns.js +2 -1
  31. package/packages/datadog-instrumentations/src/express.js +20 -0
  32. package/packages/datadog-instrumentations/src/graphql.js +18 -4
  33. package/packages/datadog-instrumentations/src/grpc/client.js +56 -36
  34. package/packages/datadog-instrumentations/src/grpc/server.js +3 -1
  35. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +1 -2
  36. package/packages/datadog-instrumentations/src/helpers/hooks.js +12 -3
  37. package/packages/datadog-instrumentations/src/helpers/instrument.js +9 -4
  38. package/packages/datadog-instrumentations/src/helpers/register.js +19 -3
  39. package/packages/datadog-instrumentations/src/http/client.js +12 -2
  40. package/packages/datadog-instrumentations/src/http/server.js +7 -4
  41. package/packages/datadog-instrumentations/src/http2/client.js +3 -1
  42. package/packages/datadog-instrumentations/src/http2/server.js +3 -1
  43. package/packages/datadog-instrumentations/src/jest.js +239 -52
  44. package/packages/datadog-instrumentations/src/kafkajs.js +27 -0
  45. package/packages/datadog-instrumentations/src/mocha.js +154 -18
  46. package/packages/datadog-instrumentations/src/mongodb-core.js +34 -3
  47. package/packages/datadog-instrumentations/src/mongoose.js +23 -10
  48. package/packages/datadog-instrumentations/src/mquery.js +65 -0
  49. package/packages/datadog-instrumentations/src/net.js +10 -2
  50. package/packages/datadog-instrumentations/src/next.js +35 -9
  51. package/packages/datadog-instrumentations/src/playwright.js +110 -16
  52. package/packages/datadog-instrumentations/src/restify.js +14 -1
  53. package/packages/datadog-instrumentations/src/rhea.js +15 -9
  54. package/packages/datadog-plugin-aerospike/src/index.js +113 -0
  55. package/packages/datadog-plugin-amqplib/src/consumer.js +14 -1
  56. package/packages/datadog-plugin-amqplib/src/producer.js +13 -1
  57. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -2
  58. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +163 -27
  59. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +46 -8
  60. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +129 -22
  61. package/packages/datadog-plugin-child_process/src/index.js +91 -0
  62. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +125 -0
  63. package/packages/datadog-plugin-cucumber/src/index.js +70 -13
  64. package/packages/datadog-plugin-cypress/src/after-run.js +3 -0
  65. package/packages/datadog-plugin-cypress/src/after-spec.js +3 -0
  66. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +625 -0
  67. package/packages/datadog-plugin-cypress/src/plugin.js +6 -454
  68. package/packages/datadog-plugin-cypress/src/support.js +50 -3
  69. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +2 -0
  70. package/packages/datadog-plugin-graphql/src/index.js +1 -6
  71. package/packages/datadog-plugin-graphql/src/resolve.js +28 -18
  72. package/packages/datadog-plugin-grpc/src/client.js +16 -2
  73. package/packages/datadog-plugin-grpc/src/util.js +1 -1
  74. package/packages/datadog-plugin-http/src/client.js +19 -2
  75. package/packages/datadog-plugin-jest/src/index.js +118 -12
  76. package/packages/datadog-plugin-jest/src/util.js +38 -16
  77. package/packages/datadog-plugin-kafkajs/src/consumer.js +76 -6
  78. package/packages/datadog-plugin-kafkajs/src/producer.js +64 -8
  79. package/packages/datadog-plugin-mocha/src/index.js +87 -17
  80. package/packages/datadog-plugin-next/src/index.js +40 -14
  81. package/packages/datadog-plugin-playwright/src/index.js +71 -8
  82. package/packages/datadog-plugin-rhea/src/consumer.js +16 -1
  83. package/packages/datadog-plugin-rhea/src/producer.js +10 -0
  84. package/packages/dd-trace/src/appsec/activation.js +29 -0
  85. package/packages/dd-trace/src/appsec/addresses.js +5 -1
  86. package/packages/dd-trace/src/appsec/api_security_sampler.js +61 -0
  87. package/packages/dd-trace/src/appsec/blocked_templates.js +4 -1
  88. package/packages/dd-trace/src/appsec/blocking.js +95 -43
  89. package/packages/dd-trace/src/appsec/channels.js +7 -3
  90. package/packages/dd-trace/src/appsec/graphql.js +146 -0
  91. package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +2 -0
  92. package/packages/dd-trace/src/appsec/iast/analyzers/command-injection-analyzer.js +1 -1
  93. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +105 -0
  94. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +22 -17
  95. package/packages/dd-trace/src/appsec/iast/analyzers/sql-injection-analyzer.js +7 -28
  96. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +10 -6
  97. package/packages/dd-trace/src/appsec/iast/analyzers/weak-randomness-analyzer.js +19 -0
  98. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +90 -0
  99. package/packages/dd-trace/src/appsec/iast/context/kafka-ctx-plugin.js +14 -0
  100. package/packages/dd-trace/src/appsec/iast/iast-log.js +1 -1
  101. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +13 -2
  102. package/packages/dd-trace/src/appsec/iast/index.js +15 -5
  103. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +1 -1
  104. package/packages/dd-trace/src/appsec/iast/path-line.js +1 -1
  105. package/packages/dd-trace/src/appsec/iast/taint-tracking/csi-methods.js +2 -0
  106. package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +10 -0
  107. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +53 -0
  108. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +10 -46
  109. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +13 -9
  110. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +47 -0
  111. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +19 -6
  112. package/packages/dd-trace/src/appsec/iast/taint-tracking/source-types.js +3 -1
  113. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +41 -3
  114. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/constants.js +7 -0
  115. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +12 -19
  116. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/header-sensitive-analyzer.js +20 -0
  117. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/json-sensitive-analyzer.js +6 -10
  118. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +18 -25
  119. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +79 -85
  120. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/url-sensitive-analyzer.js +27 -36
  121. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +14 -11
  122. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +1 -1
  123. package/packages/dd-trace/src/appsec/iast/vulnerabilities.js +2 -0
  124. package/packages/dd-trace/src/appsec/index.js +49 -33
  125. package/packages/dd-trace/src/appsec/recommended.json +1763 -106
  126. package/packages/dd-trace/src/appsec/remote_config/capabilities.js +7 -1
  127. package/packages/dd-trace/src/appsec/remote_config/index.js +42 -16
  128. package/packages/dd-trace/src/appsec/remote_config/manager.js +9 -8
  129. package/packages/dd-trace/src/appsec/reporter.js +51 -34
  130. package/packages/dd-trace/src/appsec/rule_manager.js +11 -8
  131. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +1 -1
  132. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +28 -13
  133. package/packages/dd-trace/src/appsec/waf/waf_manager.js +0 -1
  134. package/packages/dd-trace/src/ci-visibility/{intelligent-test-runner/get-itr-configuration.js → early-flake-detection/get-known-tests.js} +17 -22
  135. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +25 -6
  136. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +30 -1
  137. package/packages/dd-trace/src/ci-visibility/exporters/agentless/index.js +2 -0
  138. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +30 -1
  139. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +95 -37
  140. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +134 -61
  141. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +37 -4
  142. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +131 -0
  143. package/packages/dd-trace/src/ci-visibility/telemetry.js +130 -0
  144. package/packages/dd-trace/src/config.js +561 -470
  145. package/packages/dd-trace/src/data_streams_context.js +1 -1
  146. package/packages/dd-trace/src/datastreams/pathway.js +58 -1
  147. package/packages/dd-trace/src/datastreams/processor.js +196 -27
  148. package/packages/dd-trace/src/datastreams/writer.js +11 -5
  149. package/packages/dd-trace/src/dogstatsd.js +3 -5
  150. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +44 -6
  151. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +14 -0
  152. package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +4 -0
  153. package/packages/dd-trace/src/exporters/common/form-data.js +4 -0
  154. package/packages/dd-trace/src/exporters/common/request.js +21 -3
  155. package/packages/dd-trace/src/format.js +30 -2
  156. package/packages/dd-trace/src/id.js +12 -0
  157. package/packages/dd-trace/src/iitm.js +1 -1
  158. package/packages/dd-trace/src/log/channels.js +1 -1
  159. package/packages/dd-trace/src/noop/proxy.js +4 -0
  160. package/packages/dd-trace/src/noop/span.js +1 -0
  161. package/packages/dd-trace/src/opentelemetry/span.js +104 -4
  162. package/packages/dd-trace/src/opentelemetry/tracer.js +9 -10
  163. package/packages/dd-trace/src/opentracing/propagation/text_map.js +16 -7
  164. package/packages/dd-trace/src/opentracing/span.js +48 -4
  165. package/packages/dd-trace/src/opentracing/span_context.js +15 -6
  166. package/packages/dd-trace/src/opentracing/tracer.js +4 -3
  167. package/packages/dd-trace/src/plugin_manager.js +1 -1
  168. package/packages/dd-trace/src/plugins/ci_plugin.js +78 -19
  169. package/packages/dd-trace/src/plugins/database.js +1 -1
  170. package/packages/dd-trace/src/plugins/index.js +7 -0
  171. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  172. package/packages/dd-trace/src/plugins/util/ci.js +6 -19
  173. package/packages/dd-trace/src/plugins/util/git.js +104 -22
  174. package/packages/dd-trace/src/plugins/util/ip_extractor.js +7 -6
  175. package/packages/dd-trace/src/plugins/util/test.js +60 -10
  176. package/packages/dd-trace/src/plugins/util/url.js +26 -0
  177. package/packages/dd-trace/src/plugins/util/user-provided-git.js +4 -16
  178. package/packages/dd-trace/src/plugins/util/web.js +1 -1
  179. package/packages/dd-trace/src/priority_sampler.js +30 -38
  180. package/packages/dd-trace/src/profiler.js +5 -3
  181. package/packages/dd-trace/src/profiling/config.js +77 -24
  182. package/packages/dd-trace/src/profiling/exporters/agent.js +77 -31
  183. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  184. package/packages/dd-trace/src/profiling/profiler.js +33 -22
  185. package/packages/dd-trace/src/profiling/profilers/events.js +270 -0
  186. package/packages/dd-trace/src/profiling/profilers/shared.js +45 -0
  187. package/packages/dd-trace/src/profiling/profilers/space.js +18 -2
  188. package/packages/dd-trace/src/profiling/profilers/wall.js +146 -70
  189. package/packages/dd-trace/src/proxy.js +56 -24
  190. package/packages/dd-trace/src/ritm.js +1 -1
  191. package/packages/dd-trace/src/sampling_rule.js +130 -0
  192. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +5 -0
  193. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +4 -0
  194. package/packages/dd-trace/src/span_processor.js +9 -1
  195. package/packages/dd-trace/src/span_sampler.js +6 -64
  196. package/packages/dd-trace/src/spanleak.js +98 -0
  197. package/packages/dd-trace/src/startup-log.js +7 -1
  198. package/packages/dd-trace/src/telemetry/dependencies.js +56 -10
  199. package/packages/dd-trace/src/telemetry/index.js +182 -53
  200. package/packages/dd-trace/src/telemetry/logs/index.js +2 -2
  201. package/packages/dd-trace/src/telemetry/send-data.js +65 -7
  202. package/packages/dd-trace/src/tracer.js +12 -5
  203. package/register.js +4 -0
  204. package/scripts/install_plugin_modules.js +11 -3
  205. package/scripts/st.js +105 -0
  206. package/packages/datadog-instrumentations/src/child-process.js +0 -30
  207. package/packages/dd-trace/src/plugins/util/exec.js +0 -13
  208. package/packages/diagnostics_channel/index.js +0 -3
  209. package/packages/diagnostics_channel/src/index.js +0 -121
@@ -0,0 +1,125 @@
1
+ 'use strict'
2
+
3
+ const shellParser = require('shell-quote/parse')
4
+
5
+ const ALLOWED_ENV_VARIABLES = ['LD_PRELOAD', 'LD_LIBRARY_PATH', 'PATH']
6
+ const PROCESS_DENYLIST = ['md5']
7
+
8
+ const VARNAMES_REGEX = /\$([\w\d_]*)(?:[^\w\d_]|$)/gmi
9
+ // eslint-disable-next-line max-len
10
+ const PARAM_PATTERN = '^-{0,2}(?:p(?:ass(?:w(?:or)?d)?)?|api_?key|secret|a(?:ccess|uth)_token|mysql_pwd|credentials|(?:stripe)?token)$'
11
+ const regexParam = new RegExp(PARAM_PATTERN, 'i')
12
+ const ENV_PATTERN = '^(\\w+=\\w+;)*\\w+=\\w+;?$'
13
+ const envvarRegex = new RegExp(ENV_PATTERN)
14
+ const REDACTED = '?'
15
+
16
+ function extractVarNames (expression) {
17
+ const varNames = new Set()
18
+ let match
19
+
20
+ while ((match = VARNAMES_REGEX.exec(expression))) {
21
+ varNames.add(match[1])
22
+ }
23
+
24
+ const varNamesObject = {}
25
+ for (const varName of varNames.keys()) {
26
+ varNamesObject[varName] = `$${varName}`
27
+ }
28
+ return varNamesObject
29
+ }
30
+
31
+ function getTokensByExpression (expressionTokens) {
32
+ const expressionListTokens = []
33
+ let wipExpressionTokens = []
34
+ let isNewExpression = true
35
+
36
+ expressionTokens.forEach(token => {
37
+ if (isNewExpression) {
38
+ expressionListTokens.push(wipExpressionTokens)
39
+ isNewExpression = false
40
+ }
41
+
42
+ wipExpressionTokens.push(token)
43
+
44
+ if (token.op) {
45
+ wipExpressionTokens = []
46
+ isNewExpression = true
47
+ }
48
+ })
49
+ return expressionListTokens
50
+ }
51
+
52
+ function scrubChildProcessCmd (expression) {
53
+ const varNames = extractVarNames(expression)
54
+ const expressionTokens = shellParser(expression, varNames)
55
+
56
+ const expressionListTokens = getTokensByExpression(expressionTokens)
57
+
58
+ const result = []
59
+ expressionListTokens.forEach((expressionTokens) => {
60
+ let foundBinary = false
61
+ for (let index = 0; index < expressionTokens.length; index++) {
62
+ const token = expressionTokens[index]
63
+
64
+ if (typeof token === 'object') {
65
+ if (token.pattern) {
66
+ result.push(token.pattern)
67
+ } else if (token.op) {
68
+ result.push(token.op)
69
+ } else if (token.comment) {
70
+ result.push(`#${token.comment}`)
71
+ }
72
+ } else if (!foundBinary) {
73
+ if (envvarRegex.test(token)) {
74
+ const envSplit = token.split('=')
75
+
76
+ if (!ALLOWED_ENV_VARIABLES.includes(envSplit[0])) {
77
+ envSplit[1] = REDACTED
78
+
79
+ const newToken = envSplit.join('=')
80
+ expressionTokens[index] = newToken
81
+
82
+ result.push(newToken)
83
+ } else {
84
+ result.push(token)
85
+ }
86
+ } else {
87
+ foundBinary = true
88
+ result.push(token)
89
+
90
+ if (PROCESS_DENYLIST.includes(token)) {
91
+ for (index++; index < expressionTokens.length; index++) {
92
+ const token = expressionTokens[index]
93
+
94
+ if (token.op) {
95
+ result.push(token.op)
96
+ } else {
97
+ expressionTokens[index] = REDACTED
98
+ result.push(REDACTED)
99
+ }
100
+ }
101
+ break
102
+ }
103
+ }
104
+ } else {
105
+ const paramKeyValue = token.split('=')
106
+ const paramKey = paramKeyValue[0]
107
+
108
+ if (regexParam.test(paramKey)) {
109
+ if (paramKeyValue.length === 1) {
110
+ expressionTokens[index + 1] = REDACTED
111
+ result.push(token)
112
+ } else {
113
+ result.push(`${paramKey}=${REDACTED}`)
114
+ }
115
+ } else {
116
+ result.push(token)
117
+ }
118
+ }
119
+ }
120
+ })
121
+
122
+ return result
123
+ }
124
+
125
+ module.exports = scrubChildProcessCmd
@@ -12,10 +12,26 @@ const {
12
12
  getTestSuiteCommonTags,
13
13
  addIntelligentTestRunnerSpanTags,
14
14
  TEST_ITR_UNSKIPPABLE,
15
- TEST_ITR_FORCED_RUN
15
+ TEST_ITR_FORCED_RUN,
16
+ TEST_CODE_OWNERS,
17
+ ITR_CORRELATION_ID,
18
+ TEST_SOURCE_FILE,
19
+ TEST_EARLY_FLAKE_IS_ENABLED,
20
+ TEST_IS_NEW,
21
+ TEST_EARLY_FLAKE_IS_RETRY
16
22
  } = require('../../dd-trace/src/plugins/util/test')
17
23
  const { RESOURCE_NAME } = require('../../../ext/tags')
18
24
  const { COMPONENT, ERROR_MESSAGE } = require('../../dd-trace/src/constants')
25
+ const {
26
+ TELEMETRY_EVENT_CREATED,
27
+ TELEMETRY_EVENT_FINISHED,
28
+ TELEMETRY_CODE_COVERAGE_STARTED,
29
+ TELEMETRY_CODE_COVERAGE_FINISHED,
30
+ TELEMETRY_ITR_FORCED_TO_RUN,
31
+ TELEMETRY_CODE_COVERAGE_EMPTY,
32
+ TELEMETRY_ITR_UNSKIPPABLE,
33
+ TELEMETRY_CODE_COVERAGE_NUM_FILES
34
+ } = require('../../dd-trace/src/ci-visibility/telemetry')
19
35
 
20
36
  class CucumberPlugin extends CiPlugin {
21
37
  static get id () {
@@ -33,9 +49,10 @@ class CucumberPlugin extends CiPlugin {
33
49
  numSkippedSuites,
34
50
  testCodeCoverageLinesTotal,
35
51
  hasUnskippableSuites,
36
- hasForcedToRunSuites
52
+ hasForcedToRunSuites,
53
+ isEarlyFlakeDetectionEnabled
37
54
  }) => {
38
- const { isSuitesSkippingEnabled, isCodeCoverageEnabled } = this.itrConfig || {}
55
+ const { isSuitesSkippingEnabled, isCodeCoverageEnabled } = this.libraryConfig || {}
39
56
  addIntelligentTestRunnerSpanTags(
40
57
  this.testSessionSpan,
41
58
  this.testModuleSpan,
@@ -50,18 +67,23 @@ class CucumberPlugin extends CiPlugin {
50
67
  hasForcedToRunSuites
51
68
  }
52
69
  )
70
+ if (isEarlyFlakeDetectionEnabled) {
71
+ this.testSessionSpan.setTag(TEST_EARLY_FLAKE_IS_ENABLED, 'true')
72
+ }
53
73
 
54
74
  this.testSessionSpan.setTag(TEST_STATUS, status)
55
75
  this.testModuleSpan.setTag(TEST_STATUS, status)
56
76
  this.testModuleSpan.finish()
77
+ this.telemetry.ciVisEvent(TELEMETRY_EVENT_FINISHED, 'module')
57
78
  this.testSessionSpan.finish()
79
+ this.telemetry.ciVisEvent(TELEMETRY_EVENT_FINISHED, 'session')
58
80
  finishAllTraceSpans(this.testSessionSpan)
59
81
 
60
- this.itrConfig = null
82
+ this.libraryConfig = null
61
83
  this.tracer._exporter.flush()
62
84
  })
63
85
 
64
- this.addSub('ci:cucumber:test-suite:start', ({ testSuitePath, isUnskippable, isForcedToRun }) => {
86
+ this.addSub('ci:cucumber:test-suite:start', ({ testSuitePath, isUnskippable, isForcedToRun, itrCorrelationId }) => {
65
87
  const testSuiteMetadata = getTestSuiteCommonTags(
66
88
  this.command,
67
89
  this.frameworkVersion,
@@ -69,11 +91,16 @@ class CucumberPlugin extends CiPlugin {
69
91
  'cucumber'
70
92
  )
71
93
  if (isUnskippable) {
94
+ this.telemetry.count(TELEMETRY_ITR_UNSKIPPABLE, { testLevel: 'suite' })
72
95
  testSuiteMetadata[TEST_ITR_UNSKIPPABLE] = 'true'
73
96
  }
74
97
  if (isForcedToRun) {
98
+ this.telemetry.count(TELEMETRY_ITR_FORCED_TO_RUN, { testLevel: 'suite' })
75
99
  testSuiteMetadata[TEST_ITR_FORCED_RUN] = 'true'
76
100
  }
101
+ if (itrCorrelationId) {
102
+ testSuiteMetadata[ITR_CORRELATION_ID] = itrCorrelationId
103
+ }
77
104
  this.testSuiteSpan = this.tracer.startSpan('cucumber.test_suite', {
78
105
  childOf: this.testModuleSpan,
79
106
  tags: {
@@ -82,19 +109,30 @@ class CucumberPlugin extends CiPlugin {
82
109
  ...testSuiteMetadata
83
110
  }
84
111
  })
112
+ this.telemetry.ciVisEvent(TELEMETRY_EVENT_CREATED, 'suite')
113
+ if (this.libraryConfig?.isCodeCoverageEnabled) {
114
+ this.telemetry.ciVisEvent(TELEMETRY_CODE_COVERAGE_STARTED, 'suite', { library: 'istanbul' })
115
+ }
85
116
  })
86
117
 
87
118
  this.addSub('ci:cucumber:test-suite:finish', status => {
88
119
  this.testSuiteSpan.setTag(TEST_STATUS, status)
89
120
  this.testSuiteSpan.finish()
121
+ this.telemetry.ciVisEvent(TELEMETRY_EVENT_FINISHED, 'suite')
90
122
  })
91
123
 
92
124
  this.addSub('ci:cucumber:test-suite:code-coverage', ({ coverageFiles, suiteFile }) => {
93
- if (!this.itrConfig || !this.itrConfig.isCodeCoverageEnabled) {
125
+ if (!this.libraryConfig?.isCodeCoverageEnabled) {
94
126
  return
95
127
  }
128
+ if (!coverageFiles.length) {
129
+ this.telemetry.count(TELEMETRY_CODE_COVERAGE_EMPTY)
130
+ }
131
+
96
132
  const relativeCoverageFiles = [...coverageFiles, suiteFile]
97
- .map(filename => getTestSuitePath(filename, this.sourceRoot))
133
+ .map(filename => getTestSuitePath(filename, this.repositoryRoot))
134
+
135
+ this.telemetry.distribution(TELEMETRY_CODE_COVERAGE_NUM_FILES, {}, relativeCoverageFiles.length)
98
136
 
99
137
  const formattedCoverage = {
100
138
  sessionId: this.testSuiteSpan.context()._traceId,
@@ -103,12 +141,19 @@ class CucumberPlugin extends CiPlugin {
103
141
  }
104
142
 
105
143
  this.tracer._exporter.exportCoverage(formattedCoverage)
144
+ this.telemetry.ciVisEvent(TELEMETRY_CODE_COVERAGE_FINISHED, 'suite', { library: 'istanbul' })
106
145
  })
107
146
 
108
- this.addSub('ci:cucumber:test:start', ({ testName, fullTestSuite, testSourceLine }) => {
147
+ this.addSub('ci:cucumber:test:start', ({ testName, testFileAbsolutePath, testSourceLine }) => {
109
148
  const store = storage.getStore()
110
- const testSuite = getTestSuitePath(fullTestSuite, this.sourceRoot)
111
- const testSpan = this.startTestSpan(testName, testSuite, testSourceLine)
149
+ const testSuite = getTestSuitePath(testFileAbsolutePath, this.sourceRoot)
150
+ const testSourceFile = getTestSuitePath(testFileAbsolutePath, this.repositoryRoot)
151
+
152
+ const extraTags = {
153
+ [TEST_SOURCE_START]: testSourceLine,
154
+ [TEST_SOURCE_FILE]: testSourceFile
155
+ }
156
+ const testSpan = this.startTestSpan(testName, testSuite, extraTags)
112
157
 
113
158
  this.enter(testSpan, store)
114
159
  })
@@ -127,12 +172,19 @@ class CucumberPlugin extends CiPlugin {
127
172
  this.enter(span, store)
128
173
  })
129
174
 
130
- this.addSub('ci:cucumber:test:finish', ({ isStep, status, skipReason, errorMessage }) => {
175
+ this.addSub('ci:cucumber:test:finish', ({ isStep, status, skipReason, errorMessage, isNew, isEfdRetry }) => {
131
176
  const span = storage.getStore().span
132
177
  const statusTag = isStep ? 'step.status' : TEST_STATUS
133
178
 
134
179
  span.setTag(statusTag, status)
135
180
 
181
+ if (isNew) {
182
+ span.setTag(TEST_IS_NEW, 'true')
183
+ if (isEfdRetry) {
184
+ span.setTag(TEST_EARLY_FLAKE_IS_RETRY, 'true')
185
+ }
186
+ }
187
+
136
188
  if (skipReason) {
137
189
  span.setTag(TEST_SKIP_REASON, skipReason)
138
190
  }
@@ -143,6 +195,11 @@ class CucumberPlugin extends CiPlugin {
143
195
 
144
196
  span.finish()
145
197
  if (!isStep) {
198
+ this.telemetry.ciVisEvent(
199
+ TELEMETRY_EVENT_FINISHED,
200
+ 'test',
201
+ { hasCodeOwners: !!span.context()._tags[TEST_CODE_OWNERS] }
202
+ )
146
203
  finishAllTraceSpans(span)
147
204
  }
148
205
  })
@@ -155,12 +212,12 @@ class CucumberPlugin extends CiPlugin {
155
212
  })
156
213
  }
157
214
 
158
- startTestSpan (testName, testSuite, testSourceLine) {
215
+ startTestSpan (testName, testSuite, extraTags) {
159
216
  return super.startTestSpan(
160
217
  testName,
161
218
  testSuite,
162
219
  this.testSuiteSpan,
163
- { [TEST_SOURCE_START]: testSourceLine }
220
+ extraTags
164
221
  )
165
222
  }
166
223
  }
@@ -0,0 +1,3 @@
1
+ const cypressPlugin = require('./cypress-plugin')
2
+
3
+ module.exports = cypressPlugin.afterRun.bind(cypressPlugin)
@@ -0,0 +1,3 @@
1
+ const cypressPlugin = require('./cypress-plugin')
2
+
3
+ module.exports = cypressPlugin.afterSpec.bind(cypressPlugin)