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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +31 -2
- data/ext/datadog_cov/datadog_cov.c +259 -67
- data/lib/datadog/ci/configuration/components.rb +149 -80
- data/lib/datadog/ci/configuration/settings.rb +6 -0
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +13 -9
- data/lib/datadog/ci/contrib/minitest/runnable.rb +5 -1
- data/lib/datadog/ci/contrib/minitest/runner.rb +6 -2
- data/lib/datadog/ci/contrib/minitest/test.rb +7 -3
- data/lib/datadog/ci/contrib/rspec/example.rb +6 -2
- data/lib/datadog/ci/contrib/rspec/example_group.rb +5 -1
- data/lib/datadog/ci/contrib/rspec/knapsack_pro/runner.rb +6 -2
- data/lib/datadog/ci/contrib/rspec/runner.rb +6 -2
- data/lib/datadog/ci/ext/environment/providers/appveyor.rb +1 -1
- data/lib/datadog/ci/ext/environment/providers/aws_code_pipeline.rb +1 -1
- data/lib/datadog/ci/ext/environment/providers/azure.rb +1 -1
- data/lib/datadog/ci/ext/environment/providers/bitbucket.rb +1 -1
- data/lib/datadog/ci/ext/environment/providers/bitrise.rb +1 -1
- data/lib/datadog/ci/ext/environment/providers/buddy.rb +1 -1
- data/lib/datadog/ci/ext/environment/providers/buildkite.rb +1 -1
- data/lib/datadog/ci/ext/environment/providers/circleci.rb +1 -1
- data/lib/datadog/ci/ext/environment/providers/codefresh.rb +1 -1
- data/lib/datadog/ci/ext/environment/providers/github_actions.rb +1 -1
- data/lib/datadog/ci/ext/environment/providers/gitlab.rb +1 -1
- data/lib/datadog/ci/ext/environment/providers/jenkins.rb +1 -1
- data/lib/datadog/ci/ext/environment/providers/teamcity.rb +1 -1
- data/lib/datadog/ci/ext/environment/providers/travis.rb +1 -1
- data/lib/datadog/ci/ext/environment.rb +17 -0
- data/lib/datadog/ci/ext/settings.rb +1 -0
- data/lib/datadog/ci/ext/telemetry.rb +120 -0
- data/lib/datadog/ci/git/local_repository.rb +116 -25
- data/lib/datadog/ci/git/search_commits.rb +20 -1
- data/lib/datadog/ci/git/telemetry.rb +37 -0
- data/lib/datadog/ci/git/tree_uploader.rb +7 -0
- data/lib/datadog/ci/git/upload_packfile.rb +22 -1
- data/lib/datadog/ci/span.rb +3 -3
- data/lib/datadog/ci/test.rb +6 -1
- data/lib/datadog/ci/test_module.rb +1 -1
- data/lib/datadog/ci/{itr/runner.rb → test_optimisation/component.rb} +29 -12
- data/lib/datadog/ci/{itr → test_optimisation}/coverage/ddcov.rb +1 -1
- data/lib/datadog/ci/{itr → test_optimisation}/coverage/event.rb +1 -1
- data/lib/datadog/ci/{itr → test_optimisation}/coverage/transport.rb +11 -2
- data/lib/datadog/ci/{itr → test_optimisation}/coverage/writer.rb +1 -1
- data/lib/datadog/ci/{itr → test_optimisation}/skippable.rb +25 -1
- data/lib/datadog/ci/test_optimisation/telemetry.rb +56 -0
- data/lib/datadog/ci/test_session.rb +1 -1
- data/lib/datadog/ci/test_suite.rb +1 -1
- data/lib/datadog/ci/test_visibility/component.rb +282 -0
- data/lib/datadog/ci/test_visibility/{recorder.rb → context.rb} +39 -187
- data/lib/datadog/ci/test_visibility/{null_recorder.rb → null_component.rb} +6 -4
- data/lib/datadog/ci/test_visibility/{context → store}/global.rb +1 -1
- data/lib/datadog/ci/test_visibility/{context → store}/local.rb +1 -1
- data/lib/datadog/ci/test_visibility/telemetry.rb +69 -0
- data/lib/datadog/ci/test_visibility/transport.rb +9 -10
- data/lib/datadog/ci/transport/adapters/net.rb +42 -11
- data/lib/datadog/ci/transport/adapters/net_http_client.rb +17 -0
- data/lib/datadog/ci/transport/adapters/telemetry_webmock_safe_adapter.rb +28 -0
- data/lib/datadog/ci/transport/event_platform_transport.rb +42 -5
- data/lib/datadog/ci/transport/http.rb +49 -21
- data/lib/datadog/ci/transport/remote_settings_api.rb +39 -1
- data/lib/datadog/ci/transport/telemetry.rb +93 -0
- data/lib/datadog/ci/utils/identity.rb +20 -0
- data/lib/datadog/ci/utils/parsing.rb +2 -1
- data/lib/datadog/ci/utils/telemetry.rb +23 -0
- data/lib/datadog/ci/version.rb +1 -1
- data/lib/datadog/ci.rb +45 -15
- 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 =
|
28
|
-
|
29
|
-
|
30
|
-
|
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(
|
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
|
-
|
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
|
-
|
48
|
-
|
49
|
-
|
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
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
52
|
+
if accept_compressed_response
|
53
|
+
headers[Ext::Transport::HEADER_ACCEPT_ENCODING] = Ext::Transport::CONTENT_ENCODING_GZIP
|
54
|
+
end
|
55
55
|
|
56
|
-
|
57
|
-
|
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
|
-
|
61
|
-
|
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
|
-
|
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
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
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
|
-
|
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
|
@@ -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
|
data/lib/datadog/ci/version.rb
CHANGED
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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 =
|
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
|
-
|
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
|
365
|
-
components.
|
394
|
+
def test_visibility
|
395
|
+
components.test_visibility
|
366
396
|
end
|
367
397
|
|
368
|
-
def
|
369
|
-
components.
|
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.
|
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-
|
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.
|
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.
|
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/
|
149
|
-
- lib/datadog/ci/test_visibility/context
|
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/
|
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
|