datadog-ci 1.1.0 → 1.3.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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -2
  3. data/ext/datadog_cov/datadog_cov.c +259 -67
  4. data/lib/datadog/ci/configuration/components.rb +149 -80
  5. data/lib/datadog/ci/configuration/settings.rb +6 -0
  6. data/lib/datadog/ci/contrib/cucumber/formatter.rb +13 -9
  7. data/lib/datadog/ci/contrib/minitest/runnable.rb +5 -1
  8. data/lib/datadog/ci/contrib/minitest/runner.rb +6 -2
  9. data/lib/datadog/ci/contrib/minitest/test.rb +7 -3
  10. data/lib/datadog/ci/contrib/rspec/example.rb +6 -2
  11. data/lib/datadog/ci/contrib/rspec/example_group.rb +5 -1
  12. data/lib/datadog/ci/contrib/rspec/knapsack_pro/runner.rb +6 -2
  13. data/lib/datadog/ci/contrib/rspec/runner.rb +6 -2
  14. data/lib/datadog/ci/ext/environment/providers/appveyor.rb +1 -1
  15. data/lib/datadog/ci/ext/environment/providers/aws_code_pipeline.rb +1 -1
  16. data/lib/datadog/ci/ext/environment/providers/azure.rb +1 -1
  17. data/lib/datadog/ci/ext/environment/providers/bitbucket.rb +1 -1
  18. data/lib/datadog/ci/ext/environment/providers/bitrise.rb +1 -1
  19. data/lib/datadog/ci/ext/environment/providers/buddy.rb +1 -1
  20. data/lib/datadog/ci/ext/environment/providers/buildkite.rb +1 -1
  21. data/lib/datadog/ci/ext/environment/providers/circleci.rb +1 -1
  22. data/lib/datadog/ci/ext/environment/providers/codefresh.rb +1 -1
  23. data/lib/datadog/ci/ext/environment/providers/github_actions.rb +1 -1
  24. data/lib/datadog/ci/ext/environment/providers/gitlab.rb +1 -1
  25. data/lib/datadog/ci/ext/environment/providers/jenkins.rb +1 -1
  26. data/lib/datadog/ci/ext/environment/providers/teamcity.rb +1 -1
  27. data/lib/datadog/ci/ext/environment/providers/travis.rb +1 -1
  28. data/lib/datadog/ci/ext/environment.rb +17 -0
  29. data/lib/datadog/ci/ext/settings.rb +1 -0
  30. data/lib/datadog/ci/ext/telemetry.rb +120 -0
  31. data/lib/datadog/ci/git/local_repository.rb +116 -25
  32. data/lib/datadog/ci/git/search_commits.rb +20 -1
  33. data/lib/datadog/ci/git/telemetry.rb +37 -0
  34. data/lib/datadog/ci/git/tree_uploader.rb +7 -0
  35. data/lib/datadog/ci/git/upload_packfile.rb +22 -1
  36. data/lib/datadog/ci/span.rb +3 -3
  37. data/lib/datadog/ci/test.rb +6 -1
  38. data/lib/datadog/ci/test_module.rb +1 -1
  39. data/lib/datadog/ci/{itr/runner.rb → test_optimisation/component.rb} +29 -12
  40. data/lib/datadog/ci/{itr → test_optimisation}/coverage/ddcov.rb +1 -1
  41. data/lib/datadog/ci/{itr → test_optimisation}/coverage/event.rb +1 -1
  42. data/lib/datadog/ci/{itr → test_optimisation}/coverage/transport.rb +11 -2
  43. data/lib/datadog/ci/{itr → test_optimisation}/coverage/writer.rb +1 -1
  44. data/lib/datadog/ci/{itr → test_optimisation}/skippable.rb +25 -1
  45. data/lib/datadog/ci/test_optimisation/telemetry.rb +56 -0
  46. data/lib/datadog/ci/test_session.rb +1 -1
  47. data/lib/datadog/ci/test_suite.rb +1 -1
  48. data/lib/datadog/ci/test_visibility/component.rb +282 -0
  49. data/lib/datadog/ci/test_visibility/{recorder.rb → context.rb} +39 -187
  50. data/lib/datadog/ci/test_visibility/{null_recorder.rb → null_component.rb} +6 -4
  51. data/lib/datadog/ci/test_visibility/{context → store}/global.rb +1 -1
  52. data/lib/datadog/ci/test_visibility/{context → store}/local.rb +1 -1
  53. data/lib/datadog/ci/test_visibility/telemetry.rb +69 -0
  54. data/lib/datadog/ci/test_visibility/transport.rb +9 -10
  55. data/lib/datadog/ci/transport/adapters/net.rb +42 -11
  56. data/lib/datadog/ci/transport/adapters/net_http_client.rb +17 -0
  57. data/lib/datadog/ci/transport/adapters/telemetry_webmock_safe_adapter.rb +28 -0
  58. data/lib/datadog/ci/transport/event_platform_transport.rb +42 -5
  59. data/lib/datadog/ci/transport/http.rb +49 -21
  60. data/lib/datadog/ci/transport/remote_settings_api.rb +39 -1
  61. data/lib/datadog/ci/transport/telemetry.rb +93 -0
  62. data/lib/datadog/ci/utils/identity.rb +20 -0
  63. data/lib/datadog/ci/utils/parsing.rb +2 -1
  64. data/lib/datadog/ci/utils/telemetry.rb +23 -0
  65. data/lib/datadog/ci/version.rb +1 -1
  66. data/lib/datadog/ci.rb +45 -15
  67. metadata +24 -14
@@ -5,6 +5,8 @@ require "msgpack"
5
5
  require "datadog/core/encoding"
6
6
  require "datadog/core/chunker"
7
7
 
8
+ require_relative "telemetry"
9
+
8
10
  module Datadog
9
11
  module CI
10
12
  module Transport
@@ -24,12 +26,19 @@ module Datadog
24
26
 
25
27
  Datadog.logger.debug { "[#{self.class.name}] Sending #{events.count} events..." }
26
28
 
27
- encoded_events = encode_events(events)
28
- if encoded_events.empty?
29
- Datadog.logger.debug { "[#{self.class.name}] Empty encoded events list, skipping send" }
30
- return []
29
+ encoded_events = []
30
+ # @type var serialization_duration_ms: Float
31
+ serialization_duration_ms = Core::Utils::Time.measure(:float_millisecond) do
32
+ encoded_events = encode_events(events)
33
+ if encoded_events.empty?
34
+ Datadog.logger.debug { "[#{self.class.name}] Empty encoded events list, skipping send" }
35
+ return []
36
+ end
31
37
  end
32
38
 
39
+ Telemetry.events_enqueued_for_serialization(encoded_events.count)
40
+ Telemetry.endpoint_payload_serialization_ms(serialization_duration_ms, endpoint: telemetry_endpoint_tag)
41
+
33
42
  responses = []
34
43
 
35
44
  Datadog::Core::Chunker.chunk_by_size(encoded_events, max_payload_size).map do |chunk|
@@ -37,9 +46,28 @@ module Datadog
37
46
  Datadog.logger.debug do
38
47
  "[#{self.class.name}] Send chunk of #{chunk.count} events; payload size #{encoded_payload.size}"
39
48
  end
49
+ Telemetry.endpoint_payload_events_count(chunk.count, endpoint: telemetry_endpoint_tag)
40
50
 
41
51
  response = send_payload(encoded_payload)
42
52
 
53
+ Telemetry.endpoint_payload_requests(
54
+ 1,
55
+ endpoint: telemetry_endpoint_tag, compressed: response.request_compressed
56
+ )
57
+ Telemetry.endpoint_payload_requests_ms(response.duration_ms, endpoint: telemetry_endpoint_tag)
58
+ Telemetry.endpoint_payload_bytes(response.request_size, endpoint: telemetry_endpoint_tag)
59
+
60
+ # HTTP layer could send events and exhausted retries (if any)
61
+ unless response.ok?
62
+ Telemetry.endpoint_payload_dropped(chunk.count, endpoint: telemetry_endpoint_tag)
63
+ Telemetry.endpoint_payload_requests_errors(
64
+ 1,
65
+ endpoint: telemetry_endpoint_tag,
66
+ error_type: response.telemetry_error_type,
67
+ status_code: response.code
68
+ )
69
+ end
70
+
43
71
  responses << response
44
72
  end
45
73
 
@@ -48,6 +76,10 @@ module Datadog
48
76
 
49
77
  private
50
78
 
79
+ def telemetry_endpoint_tag
80
+ raise NotImplementedError, "must be implemented by the subclass"
81
+ end
82
+
51
83
  def encoder
52
84
  Datadog::Core::Encoding::MsgpackEncoder
53
85
  end
@@ -65,9 +97,14 @@ module Datadog
65
97
  return false unless encoded_event.size > max_payload_size
66
98
 
67
99
  # This single event is too large, we can't flush it
68
- Datadog.logger.warn("[#{self.class.name}] Dropping coverage event. Payload too large: '#{event.inspect}'")
100
+ Datadog.logger.warn(
101
+ "[#{self.class.name}] Dropping test visibility event for endpoint [#{telemetry_endpoint_tag}]. " \
102
+ "Payload too large: '#{event.inspect}'"
103
+ )
69
104
  Datadog.logger.warn(encoded_event)
70
105
 
106
+ Telemetry.endpoint_payload_dropped(1, endpoint: telemetry_endpoint_tag)
107
+
71
108
  true
72
109
  end
73
110
 
@@ -3,6 +3,8 @@
3
3
  require "delegate"
4
4
  require "socket"
5
5
 
6
+ require "datadog/core/utils/time"
7
+
6
8
  require_relative "gzip"
7
9
  require_relative "adapters/net"
8
10
  require_relative "../ext/transport"
@@ -39,27 +41,36 @@ module Datadog
39
41
  backoff: INITIAL_BACKOFF,
40
42
  accept_compressed_response: false
41
43
  )
42
- if compress
43
- headers[Ext::Transport::HEADER_CONTENT_ENCODING] = Ext::Transport::CONTENT_ENCODING_GZIP
44
- payload = Gzip.compress(payload)
45
- end
44
+ response = nil
46
45
 
47
- if accept_compressed_response
48
- headers[Ext::Transport::HEADER_ACCEPT_ENCODING] = Ext::Transport::CONTENT_ENCODING_GZIP
49
- end
46
+ duration_ms = Core::Utils::Time.measure(:float_millisecond) do
47
+ if compress
48
+ headers[Ext::Transport::HEADER_CONTENT_ENCODING] = Ext::Transport::CONTENT_ENCODING_GZIP
49
+ payload = Gzip.compress(payload)
50
+ end
50
51
 
51
- Datadog.logger.debug do
52
- "Sending #{verb} request: host=#{host}; port=#{port}; ssl_enabled=#{ssl}; " \
53
- "compression_enabled=#{compress}; path=#{path}; payload_size=#{payload.size}"
54
- end
52
+ if accept_compressed_response
53
+ headers[Ext::Transport::HEADER_ACCEPT_ENCODING] = Ext::Transport::CONTENT_ENCODING_GZIP
54
+ end
55
55
 
56
- response = ResponseDecorator.new(
57
- perform_http_call(path: path, payload: payload, headers: headers, verb: verb, retries: retries, backoff: backoff)
58
- )
56
+ Datadog.logger.debug do
57
+ "Sending #{verb} request: host=#{host}; port=#{port}; ssl_enabled=#{ssl}; " \
58
+ "compression_enabled=#{compress}; path=#{path}; payload_size=#{payload.size}"
59
+ end
60
+
61
+ response = perform_http_call(path: path, payload: payload, headers: headers, verb: verb, retries: retries, backoff: backoff)
59
62
 
60
- Datadog.logger.debug do
61
- "Received server response: #{response.inspect}"
63
+ Datadog.logger.debug do
64
+ "Received server response: #{response.inspect}"
65
+ end
62
66
  end
67
+ # @type var response: Datadog::CI::Transport::Adapters::Net::Response
68
+ # @type var duration_ms: Float
69
+
70
+ # set some stats about the request
71
+ response.request_compressed = compress
72
+ response.request_size = payload.bytesize
73
+ response.duration_ms = duration_ms
63
74
 
64
75
  response
65
76
  end
@@ -81,7 +92,7 @@ module Datadog
81
92
  )
82
93
  else
83
94
  Datadog.logger.error("Failed to send request after #{MAX_RETRIES} retries")
84
- raise e
95
+ ErrorResponse.new(e)
85
96
  end
86
97
  end
87
98
 
@@ -91,10 +102,27 @@ module Datadog
91
102
  )
92
103
  end
93
104
 
94
- # adds compatibility with Datadog::Tracing transport
95
- class ResponseDecorator < ::SimpleDelegator
96
- def trace_count
97
- 0
105
+ class ErrorResponse < Adapters::Net::Response
106
+ def initialize(error)
107
+ @error = error
108
+ end
109
+
110
+ attr_reader :error
111
+
112
+ def payload
113
+ ""
114
+ end
115
+
116
+ def header(name)
117
+ nil
118
+ end
119
+
120
+ def code
121
+ nil
122
+ end
123
+
124
+ def inspect
125
+ "ErrorResponse error:#{error}"
98
126
  end
99
127
  end
100
128
  end
@@ -4,8 +4,11 @@ require "json"
4
4
 
5
5
  require "datadog/core/environment/identity"
6
6
 
7
+ require_relative "../ext/telemetry"
7
8
  require_relative "../ext/transport"
9
+ require_relative "../transport/telemetry"
8
10
  require_relative "../utils/parsing"
11
+ require_relative "../utils/telemetry"
9
12
 
10
13
  module Datadog
11
14
  module CI
@@ -36,6 +39,14 @@ module Datadog
36
39
  default_payload
37
40
  rescue JSON::ParserError => e
38
41
  Datadog.logger.error("Failed to parse settings response payload: #{e}. Payload was: #{resp.payload}")
42
+
43
+ Transport::Telemetry.api_requests_errors(
44
+ Ext::Telemetry::METRIC_GIT_REQUESTS_SETTINGS_ERRORS,
45
+ 1,
46
+ error_type: "invalid_json",
47
+ status_code: nil
48
+ )
49
+
39
50
  @json = default_payload
40
51
  end
41
52
  end
@@ -69,7 +80,34 @@ module Datadog
69
80
  payload: request_payload
70
81
  )
71
82
 
72
- Response.new(http_response)
83
+ Transport::Telemetry.api_requests(
84
+ Ext::Telemetry::METRIC_GIT_REQUESTS_SETTINGS,
85
+ 1,
86
+ compressed: http_response.request_compressed
87
+ )
88
+ Utils::Telemetry.distribution(Ext::Telemetry::METRIC_GIT_REQUESTS_SETTINGS_MS, http_response.duration_ms)
89
+
90
+ unless http_response.ok?
91
+ Transport::Telemetry.api_requests_errors(
92
+ Ext::Telemetry::METRIC_GIT_REQUESTS_SETTINGS_ERRORS,
93
+ 1,
94
+ error_type: http_response.telemetry_error_type,
95
+ status_code: http_response.code
96
+ )
97
+ end
98
+
99
+ response = Response.new(http_response)
100
+
101
+ Utils::Telemetry.inc(
102
+ Ext::Telemetry::METRIC_GIT_REQUESTS_SETTINGS_RESPONSE,
103
+ 1,
104
+ {
105
+ Ext::Telemetry::TAG_COVERAGE_ENABLED => response.payload[Ext::Transport::DD_API_SETTINGS_RESPONSE_CODE_COVERAGE_KEY],
106
+ Ext::Telemetry::TAG_ITR_SKIP_ENABLED => response.payload[Ext::Transport::DD_API_SETTINGS_RESPONSE_TESTS_SKIPPING_KEY]
107
+ }
108
+ )
109
+
110
+ response
73
111
  end
74
112
 
75
113
  private
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../ext/telemetry"
4
+ require_relative "../utils/telemetry"
5
+
6
+ module Datadog
7
+ module CI
8
+ module Transport
9
+ module Telemetry
10
+ def self.events_enqueued_for_serialization(count)
11
+ Utils::Telemetry.inc(Ext::Telemetry::METRIC_EVENTS_ENQUEUED, count)
12
+ end
13
+
14
+ def self.endpoint_payload_events_count(count, endpoint:)
15
+ Utils::Telemetry.distribution(
16
+ Ext::Telemetry::METRIC_ENDPOINT_PAYLOAD_EVENTS_COUNT,
17
+ count.to_f,
18
+ tags(endpoint: endpoint)
19
+ )
20
+ end
21
+
22
+ def self.endpoint_payload_serialization_ms(duration_ms, endpoint:)
23
+ Utils::Telemetry.distribution(
24
+ Ext::Telemetry::METRIC_ENDPOINT_PAYLOAD_EVENTS_SERIALIZATION_MS,
25
+ duration_ms,
26
+ tags(endpoint: endpoint)
27
+ )
28
+ end
29
+
30
+ def self.endpoint_payload_dropped(count, endpoint:)
31
+ Utils::Telemetry.inc(
32
+ Ext::Telemetry::METRIC_ENDPOINT_PAYLOAD_DROPPED,
33
+ count,
34
+ tags(endpoint: endpoint)
35
+ )
36
+ end
37
+
38
+ def self.endpoint_payload_requests(count, endpoint:, compressed:)
39
+ tags = tags(endpoint: endpoint)
40
+ tags[Ext::Telemetry::TAG_REQUEST_COMPRESSED] = "true" if compressed
41
+
42
+ Utils::Telemetry.inc(Ext::Telemetry::METRIC_ENDPOINT_PAYLOAD_REQUESTS, count, tags)
43
+ end
44
+
45
+ def self.endpoint_payload_requests_ms(duration_ms, endpoint:)
46
+ Utils::Telemetry.distribution(
47
+ Ext::Telemetry::METRIC_ENDPOINT_PAYLOAD_REQUESTS_MS,
48
+ duration_ms,
49
+ tags(endpoint: endpoint)
50
+ )
51
+ end
52
+
53
+ def self.endpoint_payload_bytes(bytesize, endpoint:)
54
+ Utils::Telemetry.distribution(
55
+ Ext::Telemetry::METRIC_ENDPOINT_PAYLOAD_BYTES,
56
+ bytesize.to_f,
57
+ tags(endpoint: endpoint)
58
+ )
59
+ end
60
+
61
+ def self.endpoint_payload_requests_errors(count, endpoint:, error_type:, status_code:)
62
+ tags = tags(endpoint: endpoint)
63
+ set_error_tags(tags, error_type: error_type, status_code: status_code)
64
+
65
+ Utils::Telemetry.inc(Ext::Telemetry::METRIC_ENDPOINT_PAYLOAD_REQUESTS_ERRORS, count, tags)
66
+ end
67
+
68
+ def self.api_requests(metric_name, count, compressed:)
69
+ tags = {}
70
+ tags[Ext::Telemetry::TAG_REQUEST_COMPRESSED] = "true" if compressed
71
+
72
+ Utils::Telemetry.inc(metric_name, count, tags)
73
+ end
74
+
75
+ def self.api_requests_errors(metric_name, count, error_type:, status_code:)
76
+ tags = {}
77
+ set_error_tags(tags, error_type: error_type, status_code: status_code)
78
+
79
+ Utils::Telemetry.inc(metric_name, count, tags)
80
+ end
81
+
82
+ def self.tags(endpoint:)
83
+ {Ext::Telemetry::TAG_ENDPOINT => endpoint}
84
+ end
85
+
86
+ def self.set_error_tags(tags, error_type:, status_code:)
87
+ tags[Ext::Telemetry::TAG_ERROR_TYPE] = error_type if error_type
88
+ tags[Ext::Telemetry::TAG_STATUS_CODE] = status_code.to_s if status_code
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module CI
5
+ module Utils
6
+ module Identity
7
+ def self.included(base)
8
+ base.singleton_class.prepend(ClassMethods)
9
+ end
10
+
11
+ module ClassMethods
12
+ # return datadog-ci gem version instead of datadog gem version
13
+ def gem_datadog_version
14
+ Datadog::CI::VERSION::STRING
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -8,7 +8,8 @@ module Datadog
8
8
  module Utils
9
9
  module Parsing
10
10
  def self.convert_to_bool(value)
11
- value.to_s.downcase == "true"
11
+ normalized_value = value.to_s.downcase
12
+ normalized_value == "true" || normalized_value == "1"
12
13
  end
13
14
  end
14
15
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../ext/telemetry"
4
+
5
+ module Datadog
6
+ module CI
7
+ module Utils
8
+ module Telemetry
9
+ def self.inc(metric_name, count, tags = {})
10
+ telemetry.inc(Ext::Telemetry::NAMESPACE, metric_name, count, tags: tags)
11
+ end
12
+
13
+ def self.distribution(metric_name, value, tags = {})
14
+ telemetry.distribution(Ext::Telemetry::NAMESPACE, metric_name, value, tags: tags)
15
+ end
16
+
17
+ def self.telemetry
18
+ Datadog.send(:components).telemetry
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -4,7 +4,7 @@ module Datadog
4
4
  module CI
5
5
  module VERSION
6
6
  MAJOR = 1
7
- MINOR = 1
7
+ MINOR = 3
8
8
  PATCH = 0
9
9
  PRE = nil
10
10
  BUILD = nil
data/lib/datadog/ci.rb CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  require_relative "ci/version"
4
4
  require_relative "ci/utils/configuration"
5
+ require_relative "ci/utils/telemetry"
5
6
  require_relative "ci/ext/app_types"
7
+ require_relative "ci/ext/telemetry"
6
8
 
7
9
  require "datadog/core"
8
10
 
@@ -39,7 +41,12 @@ module Datadog
39
41
  # @return [Datadog::CI::TestSession] the active, running {Datadog::CI::TestSession}.
40
42
  # @return [nil] if test suite level visibility is disabled or CI mode is disabled.
41
43
  def start_test_session(service: Utils::Configuration.fetch_service_name("test"), tags: {})
42
- recorder.start_test_session(service: service, tags: tags)
44
+ Utils::Telemetry.inc(
45
+ Ext::Telemetry::METRIC_MANUAL_API_EVENTS,
46
+ 1,
47
+ {Ext::Telemetry::TAG_EVENT_TYPE => Ext::Telemetry::EventType::SESSION}
48
+ )
49
+ test_visibility.start_test_session(service: service, tags: tags)
43
50
  end
44
51
 
45
52
  # The active, unfinished test session.
@@ -61,7 +68,7 @@ module Datadog
61
68
  # @return [Datadog::CI::TestSession] the active test session
62
69
  # @return [nil] if no test session is active
63
70
  def active_test_session
64
- recorder.active_test_session
71
+ test_visibility.active_test_session
65
72
  end
66
73
 
67
74
  # Starts a {Datadog::CI::TestModule ci_test_module} that represents a single test module (for most Ruby test frameworks
@@ -93,7 +100,13 @@ module Datadog
93
100
  # @return [Datadog::CI::TestModule] the active, running {Datadog::CI::TestModule}.
94
101
  # @return [nil] if test suite level visibility is disabled or CI mode is disabled.
95
102
  def start_test_module(test_module_name, service: nil, tags: {})
96
- recorder.start_test_module(test_module_name, service: service, tags: tags)
103
+ Utils::Telemetry.inc(
104
+ Ext::Telemetry::METRIC_MANUAL_API_EVENTS,
105
+ 1,
106
+ {Ext::Telemetry::TAG_EVENT_TYPE => Ext::Telemetry::EventType::MODULE}
107
+ )
108
+
109
+ test_visibility.start_test_module(test_module_name, service: service, tags: tags)
97
110
  end
98
111
 
99
112
  # The active, unfinished test module.
@@ -116,7 +129,7 @@ module Datadog
116
129
  # @return [Datadog::CI::TestModule] the active test module
117
130
  # @return [nil] if no test module is active
118
131
  def active_test_module
119
- recorder.active_test_module
132
+ test_visibility.active_test_module
120
133
  end
121
134
 
122
135
  # Starts a {Datadog::CI::TestSuite ci_test_suite} that represents a single test suite.
@@ -145,7 +158,13 @@ module Datadog
145
158
  # @return [Datadog::CI::TestSuite] the active, running {Datadog::CI::TestSuite}.
146
159
  # @return [nil] if test suite level visibility is disabled or CI mode is disabled.
147
160
  def start_test_suite(test_suite_name, service: nil, tags: {})
148
- recorder.start_test_suite(test_suite_name, service: service, tags: tags)
161
+ Utils::Telemetry.inc(
162
+ Ext::Telemetry::METRIC_MANUAL_API_EVENTS,
163
+ 1,
164
+ {Ext::Telemetry::TAG_EVENT_TYPE => Ext::Telemetry::EventType::SUITE}
165
+ )
166
+
167
+ test_visibility.start_test_suite(test_suite_name, service: service, tags: tags)
149
168
  end
150
169
 
151
170
  # The active, unfinished test suite.
@@ -168,7 +187,7 @@ module Datadog
168
187
  # @return [Datadog::CI::TestSuite] the active test suite
169
188
  # @return [nil] if no test suite with given name is active
170
189
  def active_test_suite(test_suite_name)
171
- recorder.active_test_suite(test_suite_name)
190
+ test_visibility.active_test_suite(test_suite_name)
172
191
  end
173
192
 
174
193
  # Return a {Datadog::CI::Test ci_test} that will trace a test called `test_name`.
@@ -222,7 +241,13 @@ module Datadog
222
241
  # @yieldparam [Datadog::CI::Test] ci_test the newly created and active [Datadog::CI::Test]
223
242
  # @yieldparam [nil] if CI mode is disabled
224
243
  def trace_test(test_name, test_suite_name, service: nil, tags: {}, &block)
225
- recorder.trace_test(test_name, test_suite_name, service: service, tags: tags, &block)
244
+ Utils::Telemetry.inc(
245
+ Ext::Telemetry::METRIC_MANUAL_API_EVENTS,
246
+ 1,
247
+ {Ext::Telemetry::TAG_EVENT_TYPE => Ext::Telemetry::EventType::TEST}
248
+ )
249
+
250
+ test_visibility.trace_test(test_name, test_suite_name, service: service, tags: tags, &block)
226
251
  end
227
252
 
228
253
  # Same as {.trace_test} but it does not accept a block.
@@ -248,7 +273,12 @@ module Datadog
248
273
  # @return [Datadog::CI::Test] the active, unfinished {Datadog::CI::Test}.
249
274
  # @return [nil] if CI mode is disabled.
250
275
  def start_test(test_name, test_suite_name, service: nil, tags: {})
251
- recorder.trace_test(test_name, test_suite_name, service: service, tags: tags)
276
+ Utils::Telemetry.inc(
277
+ Ext::Telemetry::METRIC_MANUAL_API_EVENTS,
278
+ 1,
279
+ {Ext::Telemetry::TAG_EVENT_TYPE => Ext::Telemetry::EventType::TEST}
280
+ )
281
+ test_visibility.trace_test(test_name, test_suite_name, service: service, tags: tags)
252
282
  end
253
283
 
254
284
  # Trace any custom span inside a test. For example, you could trace:
@@ -300,7 +330,7 @@ module Datadog
300
330
  )
301
331
  end
302
332
 
303
- recorder.trace(span_name, type: type, tags: tags, &block)
333
+ test_visibility.trace(span_name, type: type, tags: tags, &block)
304
334
  end
305
335
 
306
336
  # The active, unfinished custom (i.e. not test/suite/module/session) span.
@@ -326,7 +356,7 @@ module Datadog
326
356
  # @return [Datadog::CI::Span] the active span
327
357
  # @return [nil] if no span is active, or if the active span is not a custom span
328
358
  def active_span
329
- span = recorder.active_span
359
+ span = test_visibility.active_span
330
360
  span if span && !Ext::AppTypes::CI_SPAN_TYPES.include?(span.type)
331
361
  end
332
362
 
@@ -352,7 +382,7 @@ module Datadog
352
382
  # @return [Datadog::CI::Test] the active test
353
383
  # @return [nil] if no test is active
354
384
  def active_test
355
- recorder.active_test
385
+ test_visibility.active_test
356
386
  end
357
387
 
358
388
  private
@@ -361,12 +391,12 @@ module Datadog
361
391
  Datadog.send(:components)
362
392
  end
363
393
 
364
- def recorder
365
- components.ci_recorder
394
+ def test_visibility
395
+ components.test_visibility
366
396
  end
367
397
 
368
- def itr_runner
369
- components.itr
398
+ def test_optimisation
399
+ components.test_optimisation
370
400
  end
371
401
  end
372
402
  end
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: 1.1.0
4
+ version: 1.3.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: 2024-07-01 00:00:00.000000000 Z
11
+ date: 2024-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: datadog
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: '2.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.0'
26
+ version: '2.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: msgpack
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -126,30 +126,32 @@ files:
126
126
  - lib/datadog/ci/ext/environment/providers/user_defined_tags.rb
127
127
  - lib/datadog/ci/ext/git.rb
128
128
  - lib/datadog/ci/ext/settings.rb
129
+ - lib/datadog/ci/ext/telemetry.rb
129
130
  - lib/datadog/ci/ext/test.rb
130
131
  - lib/datadog/ci/ext/transport.rb
131
132
  - lib/datadog/ci/git/local_repository.rb
132
133
  - lib/datadog/ci/git/packfiles.rb
133
134
  - lib/datadog/ci/git/search_commits.rb
135
+ - lib/datadog/ci/git/telemetry.rb
134
136
  - lib/datadog/ci/git/tree_uploader.rb
135
137
  - lib/datadog/ci/git/upload_packfile.rb
136
138
  - lib/datadog/ci/git/user.rb
137
- - lib/datadog/ci/itr/coverage/ddcov.rb
138
- - lib/datadog/ci/itr/coverage/event.rb
139
- - lib/datadog/ci/itr/coverage/transport.rb
140
- - lib/datadog/ci/itr/coverage/writer.rb
141
- - lib/datadog/ci/itr/runner.rb
142
- - lib/datadog/ci/itr/skippable.rb
143
139
  - lib/datadog/ci/span.rb
144
140
  - lib/datadog/ci/test.rb
145
141
  - lib/datadog/ci/test_module.rb
142
+ - lib/datadog/ci/test_optimisation/component.rb
143
+ - lib/datadog/ci/test_optimisation/coverage/ddcov.rb
144
+ - lib/datadog/ci/test_optimisation/coverage/event.rb
145
+ - lib/datadog/ci/test_optimisation/coverage/transport.rb
146
+ - lib/datadog/ci/test_optimisation/coverage/writer.rb
147
+ - lib/datadog/ci/test_optimisation/skippable.rb
148
+ - lib/datadog/ci/test_optimisation/telemetry.rb
146
149
  - lib/datadog/ci/test_session.rb
147
150
  - lib/datadog/ci/test_suite.rb
148
- - lib/datadog/ci/test_visibility/context/global.rb
149
- - lib/datadog/ci/test_visibility/context/local.rb
151
+ - lib/datadog/ci/test_visibility/component.rb
152
+ - lib/datadog/ci/test_visibility/context.rb
150
153
  - lib/datadog/ci/test_visibility/flush.rb
151
- - lib/datadog/ci/test_visibility/null_recorder.rb
152
- - lib/datadog/ci/test_visibility/recorder.rb
154
+ - lib/datadog/ci/test_visibility/null_component.rb
153
155
  - lib/datadog/ci/test_visibility/serializers/base.rb
154
156
  - lib/datadog/ci/test_visibility/serializers/factories/test_level.rb
155
157
  - lib/datadog/ci/test_visibility/serializers/factories/test_suite_level.rb
@@ -159,8 +161,13 @@ files:
159
161
  - lib/datadog/ci/test_visibility/serializers/test_suite.rb
160
162
  - lib/datadog/ci/test_visibility/serializers/test_v1.rb
161
163
  - lib/datadog/ci/test_visibility/serializers/test_v2.rb
164
+ - lib/datadog/ci/test_visibility/store/global.rb
165
+ - lib/datadog/ci/test_visibility/store/local.rb
166
+ - lib/datadog/ci/test_visibility/telemetry.rb
162
167
  - lib/datadog/ci/test_visibility/transport.rb
163
168
  - lib/datadog/ci/transport/adapters/net.rb
169
+ - lib/datadog/ci/transport/adapters/net_http_client.rb
170
+ - lib/datadog/ci/transport/adapters/telemetry_webmock_safe_adapter.rb
164
171
  - lib/datadog/ci/transport/api/agentless.rb
165
172
  - lib/datadog/ci/transport/api/base.rb
166
173
  - lib/datadog/ci/transport/api/builder.rb
@@ -169,10 +176,13 @@ files:
169
176
  - lib/datadog/ci/transport/gzip.rb
170
177
  - lib/datadog/ci/transport/http.rb
171
178
  - lib/datadog/ci/transport/remote_settings_api.rb
179
+ - lib/datadog/ci/transport/telemetry.rb
172
180
  - lib/datadog/ci/utils/bundle.rb
173
181
  - lib/datadog/ci/utils/configuration.rb
174
182
  - lib/datadog/ci/utils/git.rb
183
+ - lib/datadog/ci/utils/identity.rb
175
184
  - lib/datadog/ci/utils/parsing.rb
185
+ - lib/datadog/ci/utils/telemetry.rb
176
186
  - lib/datadog/ci/utils/test_run.rb
177
187
  - lib/datadog/ci/version.rb
178
188
  - lib/datadog/ci/worker.rb