datadog-ci 1.5.0 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -2
- data/README.md +1 -0
- data/lib/datadog/ci/configuration/components.rb +2 -1
- data/lib/datadog/ci/configuration/settings.rb +5 -0
- data/lib/datadog/ci/ext/settings.rb +1 -0
- data/lib/datadog/ci/ext/test.rb +6 -0
- data/lib/datadog/ci/span.rb +7 -0
- data/lib/datadog/ci/test_session.rb +18 -0
- data/lib/datadog/ci/test_visibility/component.rb +15 -2
- data/lib/datadog/ci/test_visibility/context.rb +4 -0
- data/lib/datadog/ci/test_visibility/null_component.rb +7 -0
- data/lib/datadog/ci/test_visibility/telemetry.rb +1 -3
- data/lib/datadog/ci/test_visibility/transport.rb +21 -3
- data/lib/datadog/ci/utils/test_run.rb +8 -0
- data/lib/datadog/ci/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f38fbb3ab8e2c8c1b058d7cbefb3ac30c59cd138fb2a69929d2c7309763b0c6e
|
4
|
+
data.tar.gz: 862f8c10065b47fb8763701399de65cf0da652f36f0d301ba3b0cd4e1c12080c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4be4dec3f2b5a11d0a822a3cd17d422eedab4262445dd42ba4d4efa96d4ee3f92049e5b37e1b6497928cf1fe980a847e4749538275092ca9fecd24700db3c62f
|
7
|
+
data.tar.gz: 2ebcae9e728ffd517d2c4f583808ade0170cb705967b59710213633bc73d1cd5d529c2b22323f8f70d45f657a8d848e856560aacc53c3ec7aea6e3aff45110af
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [1.6.0] - 2024-09-20
|
4
|
+
|
5
|
+
|
6
|
+
### Added
|
7
|
+
* support logical names for test sessions ([#235][])
|
8
|
+
* Send internal vCPU count metric ([#236][])
|
9
|
+
|
3
10
|
## [1.5.0] - 2024-09-18
|
4
11
|
|
5
12
|
### Added
|
@@ -325,7 +332,8 @@ Currently test suite level visibility is not used by our instrumentation: it wil
|
|
325
332
|
|
326
333
|
- Ruby versions < 2.7 no longer supported ([#8][])
|
327
334
|
|
328
|
-
[Unreleased]: https://github.com/DataDog/datadog-ci-rb/compare/v1.
|
335
|
+
[Unreleased]: https://github.com/DataDog/datadog-ci-rb/compare/v1.6.0...main
|
336
|
+
[1.6.0]: https://github.com/DataDog/datadog-ci-rb/compare/v1.5.0...v1.6.0
|
329
337
|
[1.5.0]: https://github.com/DataDog/datadog-ci-rb/compare/v1.4.1...v1.5.0
|
330
338
|
[1.4.1]: https://github.com/DataDog/datadog-ci-rb/compare/v1.4.0...v1.4.1
|
331
339
|
[1.4.0]: https://github.com/DataDog/datadog-ci-rb/compare/v1.3.0...v1.4.0
|
@@ -467,4 +475,6 @@ Currently test suite level visibility is not used by our instrumentation: it wil
|
|
467
475
|
[#226]: https://github.com/DataDog/datadog-ci-rb/issues/226
|
468
476
|
[#227]: https://github.com/DataDog/datadog-ci-rb/issues/227
|
469
477
|
[#229]: https://github.com/DataDog/datadog-ci-rb/issues/229
|
470
|
-
[#231]: https://github.com/DataDog/datadog-ci-rb/issues/231
|
478
|
+
[#231]: https://github.com/DataDog/datadog-ci-rb/issues/231
|
479
|
+
[#235]: https://github.com/DataDog/datadog-ci-rb/issues/235
|
480
|
+
[#236]: https://github.com/DataDog/datadog-ci-rb/issues/236
|
data/README.md
CHANGED
@@ -13,6 +13,7 @@ Learn more on our [official website](https://docs.datadoghq.com/tests/) and chec
|
|
13
13
|
- [Test Visibility](https://docs.datadoghq.com/tests/) - collect metrics and results for your tests
|
14
14
|
- [Intelligent test runner](https://docs.datadoghq.com/intelligent_test_runner/) - save time by selectively running only tests affected by code changes
|
15
15
|
- [Auto test retries](https://docs.datadoghq.com/tests/auto_test_retries/?tab=ruby) - retrying failing tests up to N times to avoid failing your build due to flaky tests
|
16
|
+
- [Early flake detection](https://docs.datadoghq.com/tests/early_flake_detection?tab=ruby) - Datadog’s test flakiness solution that identifies flakes early by running newly added tests multiple times
|
16
17
|
- [Search and manage CI tests](https://docs.datadoghq.com/tests/search/)
|
17
18
|
- [Enhance developer workflows](https://docs.datadoghq.com/tests/developer_workflows)
|
18
19
|
- [Flaky test management](https://docs.datadoghq.com/tests/guides/flaky_test_management/)
|
@@ -123,7 +123,8 @@ module Datadog
|
|
123
123
|
# @type ivar @test_optimisation: Datadog::CI::TestOptimisation::Component
|
124
124
|
@test_optimisation = build_test_optimisation(settings, test_visibility_api)
|
125
125
|
@test_visibility = TestVisibility::Component.new(
|
126
|
-
test_suite_level_visibility_enabled: !settings.ci.force_test_level_visibility
|
126
|
+
test_suite_level_visibility_enabled: !settings.ci.force_test_level_visibility,
|
127
|
+
logical_test_session_name: settings.ci.test_session_name
|
127
128
|
)
|
128
129
|
end
|
129
130
|
|
@@ -24,6 +24,11 @@ module Datadog
|
|
24
24
|
o.default false
|
25
25
|
end
|
26
26
|
|
27
|
+
option :test_session_name do |o|
|
28
|
+
o.type :string, nilable: true
|
29
|
+
o.env CI::Ext::Settings::ENV_TEST_SESSION_NAME
|
30
|
+
end
|
31
|
+
|
27
32
|
option :agentless_mode_enabled do |o|
|
28
33
|
o.type :bool
|
29
34
|
o.env CI::Ext::Settings::ENV_AGENTLESS_MODE_ENABLED
|
@@ -19,6 +19,7 @@ module Datadog
|
|
19
19
|
ENV_RETRY_FAILED_TESTS_MAX_ATTEMPTS = "DD_CIVISIBILITY_FLAKY_RETRY_COUNT"
|
20
20
|
ENV_RETRY_FAILED_TESTS_TOTAL_LIMIT = "DD_CIVISIBILITY_TOTAL_FLAKY_RETRY_COUNT"
|
21
21
|
ENV_RETRY_NEW_TESTS_ENABLED = "DD_CIVISIBILITY_EARLY_FLAKE_DETECTION_ENABLED"
|
22
|
+
ENV_TEST_SESSION_NAME = "DD_TEST_SESSION_NAME"
|
22
23
|
|
23
24
|
# Source: https://docs.datadoghq.com/getting_started/site/
|
24
25
|
DD_SITE_ALLOWLIST = %w[
|
data/lib/datadog/ci/ext/test.rb
CHANGED
@@ -68,6 +68,12 @@ module Datadog
|
|
68
68
|
TAG_SPAN_KIND = "span.kind"
|
69
69
|
SPAN_KIND_TEST = "test"
|
70
70
|
|
71
|
+
# common tags that are serialized directly in msgpack header in metadata field
|
72
|
+
METADATA_TAG_TEST_SESSION_NAME = "test_session.name"
|
73
|
+
|
74
|
+
# internal metric with the number of virtual CPUs
|
75
|
+
METRIC_CPU_COUNT = "_dd.host.vcpu_count"
|
76
|
+
|
71
77
|
# tags that are common for the whole session and can be inherited from the test session
|
72
78
|
INHERITABLE_TAGS = [TAG_FRAMEWORK, TAG_FRAMEWORK_VERSION].freeze
|
73
79
|
|
data/lib/datadog/ci/span.rb
CHANGED
@@ -114,6 +114,13 @@ module Datadog
|
|
114
114
|
tracer_span.clear_tag(key)
|
115
115
|
end
|
116
116
|
|
117
|
+
# Gets metric value by key.
|
118
|
+
# @param [String] key the key of the metric.
|
119
|
+
# @return [Numeric] value the value of the metric.
|
120
|
+
def get_metric(key)
|
121
|
+
tracer_span.get_metric(key)
|
122
|
+
end
|
123
|
+
|
117
124
|
# Sets metric value by key.
|
118
125
|
# @param [String] key the key of the metric.
|
119
126
|
# @param [Numeric] value the value of the metric.
|
@@ -28,6 +28,24 @@ module Datadog
|
|
28
28
|
get_tag(Ext::Test::TAG_COMMAND)
|
29
29
|
end
|
30
30
|
|
31
|
+
# Return the test session's command used to run the tests
|
32
|
+
# @return [String] the command for this test session.
|
33
|
+
def test_command
|
34
|
+
get_tag(Ext::Test::TAG_COMMAND)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Return the test session's CI provider name (e.g. "travis", "circleci", etc.)
|
38
|
+
# @return [String] the provider name for this test session.
|
39
|
+
def ci_provider
|
40
|
+
get_tag(Ext::Environment::TAG_PROVIDER_NAME)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Return the test session's CI job name (e.g. "build", "test", etc.)
|
44
|
+
# @return [String] the job name for this test session.
|
45
|
+
def ci_job_name
|
46
|
+
get_tag(Ext::Environment::TAG_JOB_NAME)
|
47
|
+
end
|
48
|
+
|
31
49
|
def skipping_tests?
|
32
50
|
get_tag(Ext::Test::TAG_ITR_TEST_SKIPPING_ENABLED) == "true"
|
33
51
|
end
|
@@ -17,15 +17,17 @@ module Datadog
|
|
17
17
|
module TestVisibility
|
18
18
|
# Common behavior for CI tests
|
19
19
|
class Component
|
20
|
-
attr_reader :test_suite_level_visibility_enabled
|
20
|
+
attr_reader :test_suite_level_visibility_enabled, :logical_test_session_name
|
21
21
|
|
22
22
|
def initialize(
|
23
23
|
test_suite_level_visibility_enabled: false,
|
24
|
-
codeowners: Codeowners::Parser.new(Git::LocalRepository.root).parse
|
24
|
+
codeowners: Codeowners::Parser.new(Git::LocalRepository.root).parse,
|
25
|
+
logical_test_session_name: nil
|
25
26
|
)
|
26
27
|
@test_suite_level_visibility_enabled = test_suite_level_visibility_enabled
|
27
28
|
@context = Context.new
|
28
29
|
@codeowners = codeowners
|
30
|
+
@logical_test_session_name = logical_test_session_name
|
29
31
|
end
|
30
32
|
|
31
33
|
def start_test_session(service: nil, tags: {}, total_tests_count: 0)
|
@@ -152,6 +154,9 @@ module Datadog
|
|
152
154
|
Telemetry.test_session_started(test_session)
|
153
155
|
Telemetry.event_created(test_session)
|
154
156
|
|
157
|
+
# sets logical test session name if none provided by the user
|
158
|
+
override_logical_test_session_name!(test_session) if logical_test_session_name.nil?
|
159
|
+
|
155
160
|
# signal Remote::Component to configure the library
|
156
161
|
remote.configure(test_session)
|
157
162
|
end
|
@@ -269,6 +274,14 @@ module Datadog
|
|
269
274
|
end
|
270
275
|
end
|
271
276
|
|
277
|
+
def override_logical_test_session_name!(test_session)
|
278
|
+
@logical_test_session_name = test_session.test_command
|
279
|
+
ci_job_name = test_session.ci_job_name
|
280
|
+
if ci_job_name
|
281
|
+
@logical_test_session_name = "#{ci_job_name}-#{@logical_test_session_name}"
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
272
285
|
def test_optimisation
|
273
286
|
Datadog.send(:components).test_optimisation
|
274
287
|
end
|
@@ -11,6 +11,8 @@ require_relative "../ext/app_types"
|
|
11
11
|
require_relative "../ext/environment"
|
12
12
|
require_relative "../ext/test"
|
13
13
|
|
14
|
+
require_relative "../utils/test_run"
|
15
|
+
|
14
16
|
require_relative "../span"
|
15
17
|
require_relative "../test"
|
16
18
|
require_relative "../test_session"
|
@@ -203,6 +205,8 @@ module Datadog
|
|
203
205
|
|
204
206
|
ci_span.set_tags(tags)
|
205
207
|
ci_span.set_tags(@environment_tags)
|
208
|
+
|
209
|
+
ci_span.set_metric(Ext::Test::METRIC_CPU_COUNT, Utils::TestRun.virtual_cpu_count)
|
206
210
|
end
|
207
211
|
|
208
212
|
# PROPAGATING CONTEXT FROM TOP-LEVEL TO THE LOWER LEVELS
|
@@ -34,9 +34,7 @@ module Datadog
|
|
34
34
|
1,
|
35
35
|
{
|
36
36
|
Ext::Telemetry::TAG_AUTO_INJECTED => "false", # ruby doesn't support auto injection yet
|
37
|
-
Ext::Telemetry::TAG_PROVIDER =>
|
38
|
-
test_session.get_tag(Ext::Environment::TAG_PROVIDER_NAME) ||
|
39
|
-
Ext::Telemetry::Provider::UNSUPPORTED
|
37
|
+
Ext::Telemetry::TAG_PROVIDER => test_session.ci_provider || Ext::Telemetry::Provider::UNSUPPORTED
|
40
38
|
}
|
41
39
|
)
|
42
40
|
end
|
@@ -3,6 +3,7 @@
|
|
3
3
|
require "datadog/core/environment/identity"
|
4
4
|
|
5
5
|
require_relative "serializers/factories/test_level"
|
6
|
+
require_relative "../ext/app_types"
|
6
7
|
require_relative "../ext/telemetry"
|
7
8
|
require_relative "../ext/transport"
|
8
9
|
require_relative "../transport/event_platform_transport"
|
@@ -51,7 +52,12 @@ module Datadog
|
|
51
52
|
end
|
52
53
|
|
53
54
|
def encode_span(trace, span)
|
54
|
-
serializer = serializers_factory.serializer(
|
55
|
+
serializer = serializers_factory.serializer(
|
56
|
+
trace,
|
57
|
+
span,
|
58
|
+
options: {itr_correlation_id: test_optimisation&.correlation_id}
|
59
|
+
)
|
60
|
+
|
55
61
|
if serializer.valid?
|
56
62
|
encoded = encoder.encode(serializer)
|
57
63
|
return nil if event_too_large?(span, encoded)
|
@@ -75,7 +81,7 @@ module Datadog
|
|
75
81
|
packer.write(1)
|
76
82
|
|
77
83
|
packer.write("metadata")
|
78
|
-
packer.write_map_header(1)
|
84
|
+
packer.write_map_header(1 + Ext::AppTypes::CI_SPAN_TYPES.size)
|
79
85
|
|
80
86
|
packer.write("*")
|
81
87
|
metadata_fields_count = dd_env ? 4 : 3
|
@@ -95,12 +101,24 @@ module Datadog
|
|
95
101
|
packer.write("library_version")
|
96
102
|
packer.write(Datadog::CI::VERSION::STRING)
|
97
103
|
|
104
|
+
Ext::AppTypes::CI_SPAN_TYPES.each do |ci_span_type|
|
105
|
+
packer.write(ci_span_type)
|
106
|
+
packer.write_map_header(1)
|
107
|
+
|
108
|
+
packer.write(Ext::Test::METADATA_TAG_TEST_SESSION_NAME)
|
109
|
+
packer.write(test_visibility&.logical_test_session_name)
|
110
|
+
end
|
111
|
+
|
98
112
|
packer.write("events")
|
99
113
|
end
|
100
114
|
|
101
|
-
def
|
115
|
+
def test_optimisation
|
102
116
|
@test_optimisation ||= Datadog::CI.send(:test_optimisation)
|
103
117
|
end
|
118
|
+
|
119
|
+
def test_visibility
|
120
|
+
@test_visibility ||= Datadog::CI.send(:test_visibility)
|
121
|
+
end
|
104
122
|
end
|
105
123
|
end
|
106
124
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "etc"
|
4
|
+
|
3
5
|
module Datadog
|
4
6
|
module CI
|
5
7
|
module Utils
|
@@ -34,6 +36,12 @@ module Datadog
|
|
34
36
|
end
|
35
37
|
res
|
36
38
|
end
|
39
|
+
|
40
|
+
def self.virtual_cpu_count
|
41
|
+
return @virtual_cpu_count if defined?(@virtual_cpu_count)
|
42
|
+
|
43
|
+
@virtual_cpu_count = ::Etc.nprocessors
|
44
|
+
end
|
37
45
|
end
|
38
46
|
end
|
39
47
|
end
|
data/lib/datadog/ci/version.rb
CHANGED
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.6.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-09-
|
11
|
+
date: 2024-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: datadog
|