datadog-ci 0.5.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +60 -1
  3. data/README.md +1 -1
  4. data/lib/datadog/ci/codeowners/matcher.rb +102 -0
  5. data/lib/datadog/ci/codeowners/parser.rb +42 -0
  6. data/lib/datadog/ci/codeowners/rule.rb +33 -0
  7. data/lib/datadog/ci/concurrent_span.rb +2 -1
  8. data/lib/datadog/ci/configuration/components.rb +15 -11
  9. data/lib/datadog/ci/configuration/settings.rb +15 -0
  10. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +4 -1
  11. data/lib/datadog/ci/contrib/cucumber/ext.rb +7 -5
  12. data/lib/datadog/ci/contrib/cucumber/formatter.rb +138 -27
  13. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +2 -1
  14. data/lib/datadog/ci/contrib/minitest/configuration/settings.rb +4 -1
  15. data/lib/datadog/ci/contrib/minitest/ext.rb +6 -4
  16. data/lib/datadog/ci/contrib/minitest/helpers.rb +23 -0
  17. data/lib/datadog/ci/contrib/minitest/hooks.rb +34 -19
  18. data/lib/datadog/ci/contrib/minitest/patcher.rb +10 -0
  19. data/lib/datadog/ci/contrib/minitest/reporter.rb +50 -0
  20. data/lib/datadog/ci/contrib/minitest/runnable.rb +42 -0
  21. data/lib/datadog/ci/contrib/minitest/runner.rb +41 -0
  22. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +4 -1
  23. data/lib/datadog/ci/contrib/rspec/example.rb +55 -14
  24. data/lib/datadog/ci/contrib/rspec/example_group.rb +51 -0
  25. data/lib/datadog/ci/contrib/rspec/ext.rb +5 -4
  26. data/lib/datadog/ci/contrib/rspec/integration.rb +1 -1
  27. data/lib/datadog/ci/contrib/rspec/patcher.rb +14 -0
  28. data/lib/datadog/ci/contrib/rspec/runner.rb +57 -0
  29. data/lib/datadog/ci/contrib/settings.rb +1 -1
  30. data/lib/datadog/ci/ext/app_types.rb +2 -0
  31. data/lib/datadog/ci/ext/environment/providers/local_git.rb +8 -29
  32. data/lib/datadog/ci/ext/settings.rb +1 -0
  33. data/lib/datadog/ci/ext/test.rb +19 -6
  34. data/lib/datadog/ci/span.rb +33 -2
  35. data/lib/datadog/ci/test.rb +96 -1
  36. data/lib/datadog/ci/test_module.rb +1 -1
  37. data/lib/datadog/ci/test_session.rb +10 -2
  38. data/lib/datadog/ci/test_suite.rb +53 -2
  39. data/lib/datadog/ci/test_visibility/context/local.rb +3 -9
  40. data/lib/datadog/ci/test_visibility/null_recorder.rb +53 -0
  41. data/lib/datadog/ci/test_visibility/recorder.rb +52 -25
  42. data/lib/datadog/ci/test_visibility/serializers/base.rb +6 -5
  43. data/lib/datadog/ci/test_visibility/serializers/span.rb +1 -1
  44. data/lib/datadog/ci/test_visibility/serializers/test_module.rb +1 -1
  45. data/lib/datadog/ci/test_visibility/serializers/test_session.rb +1 -1
  46. data/lib/datadog/ci/test_visibility/serializers/test_suite.rb +1 -1
  47. data/lib/datadog/ci/test_visibility/serializers/test_v1.rb +1 -1
  48. data/lib/datadog/ci/utils/configuration.rb +15 -0
  49. data/lib/datadog/ci/utils/git.rb +70 -0
  50. data/lib/datadog/ci/version.rb +2 -2
  51. data/lib/datadog/ci.rb +40 -56
  52. metadata +14 -82
  53. data/lib/datadog/ci/null_span.rb +0 -63
  54. data/sig/datadog/ci/concurrent_span.rbs +0 -23
  55. data/sig/datadog/ci/configuration/components.rbs +0 -21
  56. data/sig/datadog/ci/configuration/extensions.rbs +0 -9
  57. data/sig/datadog/ci/configuration/settings.rbs +0 -16
  58. data/sig/datadog/ci/contrib/cucumber/configuration/settings.rbs +0 -12
  59. data/sig/datadog/ci/contrib/cucumber/ext.rbs +0 -25
  60. data/sig/datadog/ci/contrib/cucumber/formatter.rbs +0 -35
  61. data/sig/datadog/ci/contrib/cucumber/instrumentation.rbs +0 -16
  62. data/sig/datadog/ci/contrib/cucumber/integration.rbs +0 -26
  63. data/sig/datadog/ci/contrib/cucumber/patcher.rbs +0 -15
  64. data/sig/datadog/ci/contrib/integration.rbs +0 -44
  65. data/sig/datadog/ci/contrib/minitest/configuration/settings.rbs +0 -12
  66. data/sig/datadog/ci/contrib/minitest/ext.rbs +0 -23
  67. data/sig/datadog/ci/contrib/minitest/hooks.rbs +0 -19
  68. data/sig/datadog/ci/contrib/minitest/integration.rbs +0 -26
  69. data/sig/datadog/ci/contrib/minitest/patcher.rbs +0 -15
  70. data/sig/datadog/ci/contrib/rspec/configuration/settings.rbs +0 -12
  71. data/sig/datadog/ci/contrib/rspec/example.rbs +0 -20
  72. data/sig/datadog/ci/contrib/rspec/ext.rbs +0 -23
  73. data/sig/datadog/ci/contrib/rspec/integration.rbs +0 -26
  74. data/sig/datadog/ci/contrib/rspec/patcher.rbs +0 -15
  75. data/sig/datadog/ci/contrib/settings.rbs +0 -25
  76. data/sig/datadog/ci/ext/app_types.rbs +0 -14
  77. data/sig/datadog/ci/ext/environment/extractor.rbs +0 -25
  78. data/sig/datadog/ci/ext/environment/providers/appveyor.rbs +0 -48
  79. data/sig/datadog/ci/ext/environment/providers/aws_code_pipeline.rbs +0 -19
  80. data/sig/datadog/ci/ext/environment/providers/azure.rbs +0 -56
  81. data/sig/datadog/ci/ext/environment/providers/base.rbs +0 -71
  82. data/sig/datadog/ci/ext/environment/providers/bitbucket.rbs +0 -37
  83. data/sig/datadog/ci/ext/environment/providers/bitrise.rbs +0 -41
  84. data/sig/datadog/ci/ext/environment/providers/buddy.rbs +0 -37
  85. data/sig/datadog/ci/ext/environment/providers/buildkite.rbs +0 -45
  86. data/sig/datadog/ci/ext/environment/providers/circleci.rbs +0 -41
  87. data/sig/datadog/ci/ext/environment/providers/codefresh.rbs +0 -25
  88. data/sig/datadog/ci/ext/environment/providers/github_actions.rbs +0 -42
  89. data/sig/datadog/ci/ext/environment/providers/gitlab.rbs +0 -57
  90. data/sig/datadog/ci/ext/environment/providers/jenkins.rbs +0 -35
  91. data/sig/datadog/ci/ext/environment/providers/local_git.rbs +0 -66
  92. data/sig/datadog/ci/ext/environment/providers/teamcity.rbs +0 -17
  93. data/sig/datadog/ci/ext/environment/providers/travis.rbs +0 -35
  94. data/sig/datadog/ci/ext/environment/providers/user_defined_tags.rbs +0 -33
  95. data/sig/datadog/ci/ext/environment/providers.rbs +0 -13
  96. data/sig/datadog/ci/ext/environment.rbs +0 -44
  97. data/sig/datadog/ci/ext/git.rbs +0 -53
  98. data/sig/datadog/ci/ext/settings.rbs +0 -14
  99. data/sig/datadog/ci/ext/test.rbs +0 -58
  100. data/sig/datadog/ci/ext/transport.rbs +0 -29
  101. data/sig/datadog/ci/null_span.rbs +0 -37
  102. data/sig/datadog/ci/span.rbs +0 -39
  103. data/sig/datadog/ci/test.rbs +0 -7
  104. data/sig/datadog/ci/test_module.rbs +0 -6
  105. data/sig/datadog/ci/test_session.rbs +0 -9
  106. data/sig/datadog/ci/test_suite.rbs +0 -6
  107. data/sig/datadog/ci/test_visibility/context/global.rbs +0 -39
  108. data/sig/datadog/ci/test_visibility/context/local.rbs +0 -23
  109. data/sig/datadog/ci/test_visibility/flush.rbs +0 -17
  110. data/sig/datadog/ci/test_visibility/recorder.rbs +0 -85
  111. data/sig/datadog/ci/test_visibility/serializers/base.rbs +0 -94
  112. data/sig/datadog/ci/test_visibility/serializers/factories/test_level.rbs +0 -13
  113. data/sig/datadog/ci/test_visibility/serializers/factories/test_suite_level.rbs +0 -13
  114. data/sig/datadog/ci/test_visibility/serializers/span.rbs +0 -18
  115. data/sig/datadog/ci/test_visibility/serializers/test_module.rbs +0 -26
  116. data/sig/datadog/ci/test_visibility/serializers/test_session.rbs +0 -26
  117. data/sig/datadog/ci/test_visibility/serializers/test_suite.rbs +0 -26
  118. data/sig/datadog/ci/test_visibility/serializers/test_v1.rbs +0 -23
  119. data/sig/datadog/ci/test_visibility/serializers/test_v2.rbs +0 -25
  120. data/sig/datadog/ci/test_visibility/transport.rbs +0 -35
  121. data/sig/datadog/ci/transport/api/base.rbs +0 -21
  122. data/sig/datadog/ci/transport/api/builder.rbs +0 -12
  123. data/sig/datadog/ci/transport/api/ci_test_cycle.rbs +0 -21
  124. data/sig/datadog/ci/transport/api/evp_proxy.rbs +0 -19
  125. data/sig/datadog/ci/transport/gzip.rbs +0 -9
  126. data/sig/datadog/ci/transport/http.rbs +0 -36
  127. data/sig/datadog/ci/utils/git.rbs +0 -11
  128. data/sig/datadog/ci/utils/test_run.rbs +0 -11
  129. data/sig/datadog/ci/utils/url.rbs +0 -9
  130. data/sig/datadog/ci/version.rbs +0 -16
  131. data/sig/datadog/ci.rbs +0 -35
@@ -34,7 +34,7 @@ module Datadog
34
34
  @trace = trace
35
35
  @span = span
36
36
 
37
- @meta = @span.meta.reject { |key, _| Ext::Test::SPECIAL_TAGS.include?(key) }
37
+ @meta = @span.meta.reject { |key, _| Ext::Test::TRANSIENT_TAGS.include?(key) }
38
38
 
39
39
  @errors = {}
40
40
  @validated = false
@@ -45,7 +45,7 @@ module Datadog
45
45
 
46
46
  packer.write_map_header(3)
47
47
 
48
- write_field(packer, "type")
48
+ write_field(packer, "type", "event_type")
49
49
  write_field(packer, "version")
50
50
 
51
51
  packer.write("content")
@@ -119,9 +119,6 @@ module Datadog
119
119
  to_integer(@span.get_tag(Ext::Test::TAG_TEST_SUITE_ID))
120
120
  end
121
121
 
122
- def type
123
- end
124
-
125
122
  def version
126
123
  1
127
124
  end
@@ -130,6 +127,10 @@ module Datadog
130
127
  @span.type
131
128
  end
132
129
 
130
+ def event_type
131
+ "span"
132
+ end
133
+
133
134
  def name
134
135
  @span.name
135
136
  end
@@ -21,7 +21,7 @@ module Datadog
21
21
  CONTENT_MAP_SIZE
22
22
  end
23
23
 
24
- def type
24
+ def event_type
25
25
  "span"
26
26
  end
27
27
 
@@ -22,7 +22,7 @@ module Datadog
22
22
  CONTENT_MAP_SIZE
23
23
  end
24
24
 
25
- def type
25
+ def event_type
26
26
  Ext::AppTypes::TYPE_TEST_MODULE
27
27
  end
28
28
 
@@ -22,7 +22,7 @@ module Datadog
22
22
  CONTENT_MAP_SIZE
23
23
  end
24
24
 
25
- def type
25
+ def event_type
26
26
  Ext::AppTypes::TYPE_TEST_SESSION
27
27
  end
28
28
 
@@ -22,7 +22,7 @@ module Datadog
22
22
  CONTENT_MAP_SIZE
23
23
  end
24
24
 
25
- def type
25
+ def event_type
26
26
  Ext::AppTypes::TYPE_TEST_SUITE
27
27
  end
28
28
 
@@ -22,7 +22,7 @@ module Datadog
22
22
  CONTENT_MAP_SIZE
23
23
  end
24
24
 
25
- def type
25
+ def event_type
26
26
  Ext::AppTypes::TYPE_TEST
27
27
  end
28
28
 
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "git"
4
+
5
+ module Datadog
6
+ module CI
7
+ module Utils
8
+ module Configuration
9
+ def self.fetch_service_name(default)
10
+ Datadog.configuration.service_without_fallback || Git.repository_name || default
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "open3"
4
+ require "pathname"
5
+
3
6
  module Datadog
4
7
  module CI
5
8
  module Utils
@@ -16,6 +19,73 @@ module Datadog
16
19
  def self.is_git_tag?(ref)
17
20
  !ref.nil? && ref.include?("tags/")
18
21
  end
22
+
23
+ def self.root
24
+ return @root if defined?(@root)
25
+
26
+ @root = exec_git_command("git rev-parse --show-toplevel")
27
+ rescue => e
28
+ Datadog.logger.debug(
29
+ "Unable to read git root: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
30
+ )
31
+ @root = nil
32
+ end
33
+
34
+ def self.relative_to_root(path)
35
+ return nil if path.nil?
36
+
37
+ git_root = root
38
+ return path if git_root.nil?
39
+
40
+ path = Pathname.new(File.expand_path(path))
41
+ git_root = Pathname.new(git_root)
42
+
43
+ path.relative_path_from(git_root).to_s
44
+ end
45
+
46
+ def self.repository_name
47
+ return @repository_name if defined?(@repository_name)
48
+
49
+ git_remote_url = exec_git_command("git ls-remote --get-url origin")
50
+
51
+ # return git repository name from remote url without .git extension
52
+ last_path_segment = git_remote_url.split("/").last if git_remote_url
53
+ @repository_name = last_path_segment.gsub(".git", "") if last_path_segment
54
+ @repository_name ||= current_folder_name
55
+ rescue => e
56
+ Datadog.logger.debug(
57
+ "Unable to get git remote: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
58
+ )
59
+ @repository_name = current_folder_name
60
+ end
61
+
62
+ def self.current_folder_name
63
+ root_folder = root
64
+ if root_folder.nil?
65
+ File.basename(Dir.pwd)
66
+ else
67
+ File.basename(root_folder)
68
+ end
69
+ end
70
+
71
+ def self.exec_git_command(cmd)
72
+ out, status = Open3.capture2e(cmd)
73
+
74
+ raise "Failed to run git command #{cmd}: #{out}" unless status.success?
75
+
76
+ # Sometimes Encoding.default_external is somehow set to US-ASCII which breaks
77
+ # commit messages with UTF-8 characters like emojis
78
+ # We force output's encoding to be UTF-8 in this case
79
+ # This is safe to do as UTF-8 is compatible with US-ASCII
80
+ if Encoding.default_external == Encoding::US_ASCII
81
+ out = out.force_encoding(Encoding::UTF_8)
82
+ end
83
+ out.strip! # There's always a "\n" at the end of the command output
84
+
85
+ return nil if out.empty?
86
+
87
+ out
88
+ end
19
89
  end
20
90
  end
21
91
  end
@@ -4,8 +4,8 @@ module Datadog
4
4
  module CI
5
5
  module VERSION
6
6
  MAJOR = "0"
7
- MINOR = "5"
8
- PATCH = "1"
7
+ MINOR = "7"
8
+ PATCH = "0"
9
9
  PRE = nil
10
10
  BUILD = nil
11
11
  # PRE and BUILD above are modified for dev gems during gem build GHA workflow
data/lib/datadog/ci.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "ci/version"
4
+ require_relative "ci/utils/configuration"
5
+ require_relative "ci/ext/app_types"
4
6
 
5
7
  require "datadog/core"
6
8
 
@@ -9,6 +11,8 @@ module Datadog
9
11
  #
10
12
  # @public_api
11
13
  module CI
14
+ class ReservedTypeError < StandardError; end
15
+
12
16
  class << self
13
17
  # Starts a {Datadog::CI::TestSession ci_test_session} that represents the whole test session run.
14
18
  #
@@ -30,13 +34,11 @@ module Datadog
30
34
  #
31
35
  # Remember that calling {Datadog::CI::TestSession#finish} is mandatory.
32
36
  #
33
- # @param [String] service the service name for this session (optional, defaults to DD_SERVICE)
37
+ # @param [String] service the service name for this session (optional, defaults to DD_SERVICE or repository name)
34
38
  # @param [Hash<String,String>] tags extra tags which should be added to the test session.
35
- # @return [Datadog::CI::TestSession] returns the active, running {Datadog::CI::TestSession}.
36
- # @return [Datadog::CI::NullSpan] ci_span null object if CI visibility is disabled or if old Datadog agent is
37
- # detected and test suite level visibility cannot be supported.
38
- def start_test_session(service: nil, tags: {})
39
- service ||= Datadog.configuration.service
39
+ # @return [Datadog::CI::TestSession] the active, running {Datadog::CI::TestSession}.
40
+ # @return [nil] if test suite level visibility is disabled or CI mode is disabled.
41
+ def start_test_session(service: Utils::Configuration.fetch_service_name("test"), tags: {})
40
42
  recorder.start_test_session(service: service, tags: tags)
41
43
  end
42
44
 
@@ -88,9 +90,8 @@ module Datadog
88
90
  # @param [String] test_module_name the name for this module
89
91
  # @param [String] service the service name for this session (optional, inherited from test session if not provided)
90
92
  # @param [Hash<String,String>] tags extra tags which should be added to the test module (optional, some tags are inherited from test session).
91
- # @return [Datadog::CI::TestModule] returns the active, running {Datadog::CI::TestModule}.
92
- # @return [Datadog::CI::NullSpan] ci_span null object if CI visibility is disabled or if old Datadog agent is
93
- # detected and test suite level visibility cannot be supported.
93
+ # @return [Datadog::CI::TestModule] the active, running {Datadog::CI::TestModule}.
94
+ # @return [nil] if test suite level visibility is disabled or CI mode is disabled.
94
95
  def start_test_module(test_module_name, service: nil, tags: {})
95
96
  recorder.start_test_module(test_module_name, service: service, tags: tags)
96
97
  end
@@ -141,9 +142,8 @@ module Datadog
141
142
  # @param [String] test_suite_name the name of the test suite
142
143
  # @param [String] service the service name for this test suite (optional, inherited from test session if not provided)
143
144
  # @param [Hash<String,String>] tags extra tags which should be added to the test module (optional, some tags are inherited from test session)
144
- # @return [Datadog::CI::TestSuite] returns the active, running {Datadog::CI::TestSuite}.
145
- # @return [Datadog::CI::NullSpan] ci_span null object if CI visibility is disabled or if old Datadog agent is
146
- # detected and test suite level visibility cannot be supported.
145
+ # @return [Datadog::CI::TestSuite] the active, running {Datadog::CI::TestSuite}.
146
+ # @return [nil] if test suite level visibility is disabled or CI mode is disabled.
147
147
  def start_test_suite(test_suite_name, service: nil, tags: {})
148
148
  recorder.start_test_suite(test_suite_name, service: service, tags: tags)
149
149
  end
@@ -217,10 +217,10 @@ module Datadog
217
217
  # @return [Object] If a block is provided, returns the result of the block execution.
218
218
  # @return [Datadog::CI::Test] If no block is provided, returns the active,
219
219
  # unfinished {Datadog::CI::Test}.
220
- # @return [Datadog::CI::NullSpan] ci_span null object if CI visibility is disabled
220
+ # @return [nil] if no block is provided and CI mode is disabled.
221
221
  # @yield Optional block where newly created {Datadog::CI::Test} captures the execution.
222
222
  # @yieldparam [Datadog::CI::Test] ci_test the newly created and active [Datadog::CI::Test]
223
- # @yieldparam [Datadog::CI::NullSpan] ci_span null object if CI visibility is disabled
223
+ # @yieldparam [nil] if CI mode is disabled
224
224
  def trace_test(test_name, test_suite_name, service: nil, tags: {}, &block)
225
225
  recorder.trace_test(test_name, test_suite_name, service: service, tags: tags, &block)
226
226
  end
@@ -245,8 +245,8 @@ module Datadog
245
245
  # @param [String] test_suite_name name of test suite this test belongs to (example: "CalculatorTest").
246
246
  # @param [String] service the service name for this span (optional, inherited from test session if not provided)
247
247
  # @param [Hash<String,String>] tags extra tags which should be added to the test.
248
- # @return [Datadog::CI::Test] Returns the active, unfinished {Datadog::CI::Test}.
249
- # @return [Datadog::CI::NullSpan] ci_span null object if CI visibility is disabled
248
+ # @return [Datadog::CI::Test] the active, unfinished {Datadog::CI::Test}.
249
+ # @return [nil] if CI mode is disabled.
250
250
  def start_test(test_name, test_suite_name, service: nil, tags: {})
251
251
  recorder.trace_test(test_name, test_suite_name, service: service, tags: tags)
252
252
  end
@@ -260,8 +260,8 @@ module Datadog
260
260
  #
261
261
  # ```
262
262
  # Datadog::CI.trace(
263
- # "step",
264
263
  # "Given I have 42 cucumbers",
264
+ # type: "step",
265
265
  # tags: {}
266
266
  # ) do
267
267
  # run_operation
@@ -271,8 +271,8 @@ module Datadog
271
271
  # The {.trace} method can also be used without a block in this way:
272
272
  # ```
273
273
  # ci_span = Datadog::CI.trace(
274
- # "step",
275
274
  # "Given I have 42 cucumbers",
275
+ # type: "step",
276
276
  # tags: {}
277
277
  # )
278
278
  # # ... run test here ...
@@ -280,22 +280,31 @@ module Datadog
280
280
  # ```
281
281
  # Remember that in this case, calling {Datadog::CI::Span#finish} is mandatory.
282
282
  #
283
- # @param [String] span_type custom, user-defined span type (for example "step" or "query").
284
283
  # @param [String] span_name the resource this span refers, or `test` if it's missing
284
+ # @param [String] type custom, user-defined span type (for example "step" or "query").
285
285
  # @param [Hash<String,String>] tags extra tags which should be added to the span.
286
286
  # @return [Object] If a block is provided, returns the result of the block execution.
287
287
  # @return [Datadog::CI::Span] If no block is provided, returns the active,
288
288
  # unfinished {Datadog::CI::Span}.
289
- # @return [Datadog::CI::NullSpan] ci_span null object if CI visibility is disabled
289
+ # @return [nil] if CI visibility is disabled
290
+ # @raise [ReservedTypeError] if provided type is reserved for Datadog CI visibility
290
291
  # @yield Optional block where newly created {Datadog::CI::Span} captures the execution.
291
292
  # @yieldparam [Datadog::CI::Span] ci_span the newly created and active [Datadog::CI::Span]
292
- # @yieldparam [Datadog::CI::NullSpan] ci_span null object if CI visibility is disabled
293
- def trace(span_type, span_name, tags: {}, &block)
294
- recorder.trace(span_type, span_name, tags: tags, &block)
293
+ # @yieldparam [nil] ci_span if CI visibility is disabled
294
+ def trace(span_name, type: "span", tags: {}, &block)
295
+ if Ext::AppTypes::CI_SPAN_TYPES.include?(type)
296
+ raise(
297
+ ReservedTypeError,
298
+ "Span type #{type} is reserved for Datadog CI visibility. " \
299
+ "Reserved types are: #{Ext::AppTypes::CI_SPAN_TYPES}"
300
+ )
301
+ end
302
+
303
+ recorder.trace(span_name, type: type, tags: tags, &block)
295
304
  end
296
305
 
297
- # The active, unfinished custom span if it matches given type.
298
- # If no span is active, or if the active span is not a custom span with given type, returns nil.
306
+ # The active, unfinished custom (i.e. not test/suite/module/session) span.
307
+ # If no span is active, or if the active span is not a custom span, returns nil.
299
308
  #
300
309
  # The active span belongs to an {.active_test}.
301
310
  #
@@ -304,22 +313,21 @@ module Datadog
304
313
  # ```
305
314
  # # start span
306
315
  # Datadog::CI.trace(
307
- # "step",
308
316
  # "Given I have 42 cucumbers",
317
+ # type: "step",
309
318
  # tags: {}
310
319
  # )
311
320
  #
312
- # # somewhere else, access the active "step" span
313
- # step_span = Datadog::CI.active_span("step")
321
+ # # somewhere else, access the active step span
322
+ # step_span = Datadog::CI.active_span
314
323
  # step_span.finish()
315
324
  # ```
316
325
  #
317
- # @param [String] span_type type of the span to retrieve (for example "step" or "query") that was provided to {.trace}
318
326
  # @return [Datadog::CI::Span] the active span
319
- # @return [nil] if no span is active, or if the active span is not a custom span with given type
320
- def active_span(span_type)
327
+ # @return [nil] if no span is active, or if the active span is not a custom span
328
+ def active_span
321
329
  span = recorder.active_span
322
- span if span && span.span_type == span_type
330
+ span if span && !Ext::AppTypes::CI_SPAN_TYPES.include?(span.type)
323
331
  end
324
332
 
325
333
  # The active, unfinished test span.
@@ -347,30 +355,6 @@ module Datadog
347
355
  recorder.active_test
348
356
  end
349
357
 
350
- # Internal only, to finish a test use {Datadog::CI::Test#finish}
351
- # @private
352
- def deactivate_test(test)
353
- recorder.deactivate_test(test)
354
- end
355
-
356
- # Internal only, to finish a test session use {Datadog::CI::TestSession#finish}
357
- # @private
358
- def deactivate_test_session
359
- recorder.deactivate_test_session
360
- end
361
-
362
- # Internal only, to finish a test module use {Datadog::CI::TestModule#finish}
363
- # @private
364
- def deactivate_test_module
365
- recorder.deactivate_test_module
366
- end
367
-
368
- # Internal only, to finish a test suite use {Datadog::CI::TestSuite#finish}
369
- # @private
370
- def deactivate_test_suite(test_suite_name)
371
- recorder.deactivate_test_suite(test_suite_name)
372
- end
373
-
374
358
  private
375
359
 
376
360
  def components
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datadog-ci
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-11 00:00:00.000000000 Z
11
+ date: 2024-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -42,6 +42,9 @@ files:
42
42
  - NOTICE
43
43
  - README.md
44
44
  - lib/datadog/ci.rb
45
+ - lib/datadog/ci/codeowners/matcher.rb
46
+ - lib/datadog/ci/codeowners/parser.rb
47
+ - lib/datadog/ci/codeowners/rule.rb
45
48
  - lib/datadog/ci/concurrent_span.rb
46
49
  - lib/datadog/ci/configuration/components.rb
47
50
  - lib/datadog/ci/configuration/extensions.rb
@@ -55,14 +58,20 @@ files:
55
58
  - lib/datadog/ci/contrib/integration.rb
56
59
  - lib/datadog/ci/contrib/minitest/configuration/settings.rb
57
60
  - lib/datadog/ci/contrib/minitest/ext.rb
61
+ - lib/datadog/ci/contrib/minitest/helpers.rb
58
62
  - lib/datadog/ci/contrib/minitest/hooks.rb
59
63
  - lib/datadog/ci/contrib/minitest/integration.rb
60
64
  - lib/datadog/ci/contrib/minitest/patcher.rb
65
+ - lib/datadog/ci/contrib/minitest/reporter.rb
66
+ - lib/datadog/ci/contrib/minitest/runnable.rb
67
+ - lib/datadog/ci/contrib/minitest/runner.rb
61
68
  - lib/datadog/ci/contrib/rspec/configuration/settings.rb
62
69
  - lib/datadog/ci/contrib/rspec/example.rb
70
+ - lib/datadog/ci/contrib/rspec/example_group.rb
63
71
  - lib/datadog/ci/contrib/rspec/ext.rb
64
72
  - lib/datadog/ci/contrib/rspec/integration.rb
65
73
  - lib/datadog/ci/contrib/rspec/patcher.rb
74
+ - lib/datadog/ci/contrib/rspec/runner.rb
66
75
  - lib/datadog/ci/contrib/settings.rb
67
76
  - lib/datadog/ci/ext/app_types.rb
68
77
  - lib/datadog/ci/ext/environment.rb
@@ -89,7 +98,6 @@ files:
89
98
  - lib/datadog/ci/ext/settings.rb
90
99
  - lib/datadog/ci/ext/test.rb
91
100
  - lib/datadog/ci/ext/transport.rb
92
- - lib/datadog/ci/null_span.rb
93
101
  - lib/datadog/ci/span.rb
94
102
  - lib/datadog/ci/test.rb
95
103
  - lib/datadog/ci/test_module.rb
@@ -98,6 +106,7 @@ files:
98
106
  - lib/datadog/ci/test_visibility/context/global.rb
99
107
  - lib/datadog/ci/test_visibility/context/local.rb
100
108
  - lib/datadog/ci/test_visibility/flush.rb
109
+ - lib/datadog/ci/test_visibility/null_recorder.rb
101
110
  - lib/datadog/ci/test_visibility/recorder.rb
102
111
  - lib/datadog/ci/test_visibility/serializers/base.rb
103
112
  - lib/datadog/ci/test_visibility/serializers/factories/test_level.rb
@@ -115,88 +124,11 @@ files:
115
124
  - lib/datadog/ci/transport/api/evp_proxy.rb
116
125
  - lib/datadog/ci/transport/gzip.rb
117
126
  - lib/datadog/ci/transport/http.rb
127
+ - lib/datadog/ci/utils/configuration.rb
118
128
  - lib/datadog/ci/utils/git.rb
119
129
  - lib/datadog/ci/utils/test_run.rb
120
130
  - lib/datadog/ci/utils/url.rb
121
131
  - lib/datadog/ci/version.rb
122
- - sig/datadog/ci.rbs
123
- - sig/datadog/ci/concurrent_span.rbs
124
- - sig/datadog/ci/configuration/components.rbs
125
- - sig/datadog/ci/configuration/extensions.rbs
126
- - sig/datadog/ci/configuration/settings.rbs
127
- - sig/datadog/ci/contrib/cucumber/configuration/settings.rbs
128
- - sig/datadog/ci/contrib/cucumber/ext.rbs
129
- - sig/datadog/ci/contrib/cucumber/formatter.rbs
130
- - sig/datadog/ci/contrib/cucumber/instrumentation.rbs
131
- - sig/datadog/ci/contrib/cucumber/integration.rbs
132
- - sig/datadog/ci/contrib/cucumber/patcher.rbs
133
- - sig/datadog/ci/contrib/integration.rbs
134
- - sig/datadog/ci/contrib/minitest/configuration/settings.rbs
135
- - sig/datadog/ci/contrib/minitest/ext.rbs
136
- - sig/datadog/ci/contrib/minitest/hooks.rbs
137
- - sig/datadog/ci/contrib/minitest/integration.rbs
138
- - sig/datadog/ci/contrib/minitest/patcher.rbs
139
- - sig/datadog/ci/contrib/rspec/configuration/settings.rbs
140
- - sig/datadog/ci/contrib/rspec/example.rbs
141
- - sig/datadog/ci/contrib/rspec/ext.rbs
142
- - sig/datadog/ci/contrib/rspec/integration.rbs
143
- - sig/datadog/ci/contrib/rspec/patcher.rbs
144
- - sig/datadog/ci/contrib/settings.rbs
145
- - sig/datadog/ci/ext/app_types.rbs
146
- - sig/datadog/ci/ext/environment.rbs
147
- - sig/datadog/ci/ext/environment/extractor.rbs
148
- - sig/datadog/ci/ext/environment/providers.rbs
149
- - sig/datadog/ci/ext/environment/providers/appveyor.rbs
150
- - sig/datadog/ci/ext/environment/providers/aws_code_pipeline.rbs
151
- - sig/datadog/ci/ext/environment/providers/azure.rbs
152
- - sig/datadog/ci/ext/environment/providers/base.rbs
153
- - sig/datadog/ci/ext/environment/providers/bitbucket.rbs
154
- - sig/datadog/ci/ext/environment/providers/bitrise.rbs
155
- - sig/datadog/ci/ext/environment/providers/buddy.rbs
156
- - sig/datadog/ci/ext/environment/providers/buildkite.rbs
157
- - sig/datadog/ci/ext/environment/providers/circleci.rbs
158
- - sig/datadog/ci/ext/environment/providers/codefresh.rbs
159
- - sig/datadog/ci/ext/environment/providers/github_actions.rbs
160
- - sig/datadog/ci/ext/environment/providers/gitlab.rbs
161
- - sig/datadog/ci/ext/environment/providers/jenkins.rbs
162
- - sig/datadog/ci/ext/environment/providers/local_git.rbs
163
- - sig/datadog/ci/ext/environment/providers/teamcity.rbs
164
- - sig/datadog/ci/ext/environment/providers/travis.rbs
165
- - sig/datadog/ci/ext/environment/providers/user_defined_tags.rbs
166
- - sig/datadog/ci/ext/git.rbs
167
- - sig/datadog/ci/ext/settings.rbs
168
- - sig/datadog/ci/ext/test.rbs
169
- - sig/datadog/ci/ext/transport.rbs
170
- - sig/datadog/ci/null_span.rbs
171
- - sig/datadog/ci/span.rbs
172
- - sig/datadog/ci/test.rbs
173
- - sig/datadog/ci/test_module.rbs
174
- - sig/datadog/ci/test_session.rbs
175
- - sig/datadog/ci/test_suite.rbs
176
- - sig/datadog/ci/test_visibility/context/global.rbs
177
- - sig/datadog/ci/test_visibility/context/local.rbs
178
- - sig/datadog/ci/test_visibility/flush.rbs
179
- - sig/datadog/ci/test_visibility/recorder.rbs
180
- - sig/datadog/ci/test_visibility/serializers/base.rbs
181
- - sig/datadog/ci/test_visibility/serializers/factories/test_level.rbs
182
- - sig/datadog/ci/test_visibility/serializers/factories/test_suite_level.rbs
183
- - sig/datadog/ci/test_visibility/serializers/span.rbs
184
- - sig/datadog/ci/test_visibility/serializers/test_module.rbs
185
- - sig/datadog/ci/test_visibility/serializers/test_session.rbs
186
- - sig/datadog/ci/test_visibility/serializers/test_suite.rbs
187
- - sig/datadog/ci/test_visibility/serializers/test_v1.rbs
188
- - sig/datadog/ci/test_visibility/serializers/test_v2.rbs
189
- - sig/datadog/ci/test_visibility/transport.rbs
190
- - sig/datadog/ci/transport/api/base.rbs
191
- - sig/datadog/ci/transport/api/builder.rbs
192
- - sig/datadog/ci/transport/api/ci_test_cycle.rbs
193
- - sig/datadog/ci/transport/api/evp_proxy.rbs
194
- - sig/datadog/ci/transport/gzip.rbs
195
- - sig/datadog/ci/transport/http.rbs
196
- - sig/datadog/ci/utils/git.rbs
197
- - sig/datadog/ci/utils/test_run.rbs
198
- - sig/datadog/ci/utils/url.rbs
199
- - sig/datadog/ci/version.rbs
200
132
  homepage: https://github.com/DataDog/datadog-ci-rb
201
133
  licenses:
202
134
  - BSD-3-Clause
@@ -223,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
223
155
  - !ruby/object:Gem::Version
224
156
  version: 2.0.0
225
157
  requirements: []
226
- rubygems_version: 3.4.21
158
+ rubygems_version: 3.5.3
227
159
  signing_key:
228
160
  specification_version: 4
229
161
  summary: Datadog CI visibility for your ruby application
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "datadog/tracing/span_operation"
4
-
5
- module Datadog
6
- module CI
7
- # Represents an ignored span when CI visibility is disabled.
8
- # Replaces all methods with no-op.
9
- #
10
- # @public_api
11
- class NullSpan < Span
12
- def initialize
13
- super(Datadog::Tracing::SpanOperation.new("null.span"))
14
- end
15
-
16
- def id
17
- end
18
-
19
- def name
20
- end
21
-
22
- def service
23
- end
24
-
25
- def span_type
26
- end
27
-
28
- def passed!
29
- end
30
-
31
- def failed!(exception: nil)
32
- end
33
-
34
- def skipped!(exception: nil, reason: nil)
35
- end
36
-
37
- def get_tag(key)
38
- end
39
-
40
- def set_tag(key, value)
41
- end
42
-
43
- def set_metric(key, value)
44
- end
45
-
46
- def finish
47
- end
48
-
49
- def set_tags(tags)
50
- end
51
-
52
- def set_environment_runtime_tags
53
- end
54
-
55
- def set_default_tags
56
- end
57
-
58
- def to_s
59
- self.class.to_s
60
- end
61
- end
62
- end
63
- end
@@ -1,23 +0,0 @@
1
- module Datadog
2
- module CI
3
- class ConcurrentSpan < Span
4
- @mutex: Thread::Mutex
5
-
6
- def initialize: (Datadog::Tracing::SpanOperation tracer_span) -> void
7
- def passed!: () -> void
8
- def failed!: (?exception: untyped?) -> void
9
- def skipped!: (?exception: untyped?, ?reason: String?) -> void
10
- def get_tag: (String key) -> untyped?
11
- def set_tag: (String key, untyped? value) -> void
12
- def set_metric: (String key, untyped value) -> void
13
- def finish: () -> void
14
- def set_tags: (Hash[untyped, untyped] tags) -> void
15
-
16
- def set_environment_runtime_tags: () -> void
17
-
18
- def set_default_tags: () -> void
19
-
20
- def synchronize: () { () -> untyped } -> untyped
21
- end
22
- end
23
- end
@@ -1,21 +0,0 @@
1
- module Datadog
2
- module CI
3
- module Configuration
4
- module Components : Datadog::Core::Configuration::Components
5
- @ci_recorder: Datadog::CI::TestVisibility::Recorder
6
-
7
- attr_reader ci_recorder: Datadog::CI::TestVisibility::Recorder
8
-
9
- def initialize: (untyped settings) -> void
10
-
11
- def activate_ci!: (untyped settings) -> untyped
12
-
13
- def build_agentless_transport: (untyped settings) -> Datadog::CI::TestVisibility::Transport?
14
- def build_evp_proxy_transport: (untyped settings, untyped agent_settings) -> Datadog::CI::TestVisibility::Transport
15
- def can_use_evp_proxy?: (untyped settings, untyped agent_settings) -> bool
16
- def serializers_factory: (untyped settings) -> (singleton(Datadog::CI::TestVisibility::Serializers::Factories::TestSuiteLevel) | singleton(Datadog::CI::TestVisibility::Serializers::Factories::TestLevel))
17
- def check_dd_site: (untyped settings) -> void
18
- end
19
- end
20
- end
21
- end