datadog-ci 0.2.0 → 0.4.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 +40 -1
- data/README.md +36 -36
- data/lib/datadog/ci/configuration/components.rb +51 -25
- data/lib/datadog/ci/context/local.rb +50 -0
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +23 -29
- data/lib/datadog/ci/contrib/minitest/hooks.rb +16 -25
- data/lib/datadog/ci/contrib/rspec/example.rb +14 -18
- data/lib/datadog/ci/ext/environment/extractor.rb +5 -10
- data/lib/datadog/ci/ext/environment/providers/appveyor.rb +4 -0
- data/lib/datadog/ci/ext/environment/providers/aws_code_pipeline.rb +39 -0
- data/lib/datadog/ci/ext/environment/providers/azure.rb +4 -0
- data/lib/datadog/ci/ext/environment/providers/base.rb +4 -0
- data/lib/datadog/ci/ext/environment/providers/bitbucket.rb +4 -0
- data/lib/datadog/ci/ext/environment/providers/bitrise.rb +4 -0
- data/lib/datadog/ci/ext/environment/providers/buddy.rb +4 -0
- data/lib/datadog/ci/ext/environment/providers/buildkite.rb +4 -0
- data/lib/datadog/ci/ext/environment/providers/circleci.rb +4 -0
- data/lib/datadog/ci/ext/environment/providers/codefresh.rb +4 -0
- data/lib/datadog/ci/ext/environment/providers/github_actions.rb +17 -4
- data/lib/datadog/ci/ext/environment/providers/gitlab.rb +4 -0
- data/lib/datadog/ci/ext/environment/providers/jenkins.rb +4 -0
- data/lib/datadog/ci/ext/environment/providers/teamcity.rb +4 -0
- data/lib/datadog/ci/ext/environment/providers/travis.rb +4 -0
- data/lib/datadog/ci/ext/environment/providers.rb +16 -14
- data/lib/datadog/ci/ext/transport.rb +5 -0
- data/lib/datadog/ci/recorder.rb +82 -46
- data/lib/datadog/ci/span.rb +107 -0
- data/lib/datadog/ci/test.rb +26 -0
- data/lib/datadog/ci/test_visibility/transport.rb +11 -29
- data/lib/datadog/ci/transport/api/base.rb +36 -0
- data/lib/datadog/ci/transport/api/builder.rb +46 -0
- data/lib/datadog/ci/transport/api/ci_test_cycle.rb +30 -0
- data/lib/datadog/ci/transport/api/evp_proxy.rb +44 -0
- data/lib/datadog/ci/transport/gzip.rb +4 -2
- data/lib/datadog/ci/transport/http.rb +25 -101
- data/lib/datadog/ci/utils/url.rb +15 -0
- data/lib/datadog/ci/version.rb +1 -1
- data/lib/datadog/ci.rb +193 -4
- data/sig/datadog/ci/configuration/components.rbs +7 -1
- data/sig/datadog/ci/context/local.rbs +21 -0
- data/sig/datadog/ci/ext/environment/extractor.rbs +0 -2
- data/sig/datadog/ci/ext/environment/providers/aws_code_pipeline.rbs +19 -0
- data/sig/datadog/ci/ext/environment/providers/base.rbs +2 -0
- data/sig/datadog/ci/ext/environment/providers/github_actions.rbs +5 -0
- data/sig/datadog/ci/ext/environment/providers.rbs +1 -1
- data/sig/datadog/ci/ext/transport.rbs +8 -0
- data/sig/datadog/ci/recorder.rbs +20 -8
- data/sig/datadog/ci/span.rbs +35 -0
- data/sig/datadog/ci/test.rbs +7 -0
- data/sig/datadog/ci/test_visibility/transport.rbs +7 -11
- data/sig/datadog/ci/transport/api/base.rbs +21 -0
- data/sig/datadog/ci/transport/api/builder.rbs +12 -0
- data/sig/datadog/ci/transport/api/ci_test_cycle.rbs +21 -0
- data/sig/datadog/ci/transport/api/evp_proxy.rbs +19 -0
- data/sig/datadog/ci/transport/http.rbs +12 -37
- data/sig/datadog/ci/utils/url.rbs +9 -0
- data/sig/datadog/ci.rbs +15 -3
- metadata +21 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60a81205d586462fc1e58ff85bcddd69bbab3dc597abe2a730ad393fe9261040
|
4
|
+
data.tar.gz: d44884f838dd3b50db30796d581017127ff6de63dc3121fc531ad54f786ae389
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e69a35a679697d2b142140f71f0704f2c9a4fcf28d2fc9ddff79dd4f514172711c50123c4294252b2e89188ce17ced36656f08290e4c86ee187c3b22965d56da
|
7
|
+
data.tar.gz: c12c56c96a6b31be3b931afdc441890ac88a59e7d12cf663b3fbbce7408ea8338b8d31fb4f49360fcaddfd425e36088bf638f960032cae6c1507d9c83fe36c7a
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,34 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.4.0] - 2023-11-21
|
4
|
+
|
5
|
+
### Added
|
6
|
+
|
7
|
+
* Public API for manual test instrumentation ([#64][]) ([#61][])
|
8
|
+
|
9
|
+
### Changed
|
10
|
+
|
11
|
+
* fix tracing instrumentation example in readme ([#60][])
|
12
|
+
|
13
|
+
### Fixed
|
14
|
+
|
15
|
+
* Remove user credentials from ssh URLs and from GITHUB_REPO_URL environment variable ([#66][])
|
16
|
+
|
17
|
+
### Removed
|
18
|
+
|
19
|
+
* Remove _dd.measured tag from spans ([#65][])
|
20
|
+
|
21
|
+
## [0.3.0] - 2023-10-25
|
22
|
+
|
23
|
+
### Added
|
24
|
+
|
25
|
+
* Add AWS CodePipeline support for automatic CI tags extraction ([#54][])
|
26
|
+
* Support test visibility protocol via Datadog Agent with EVP proxy ([#51][])
|
27
|
+
|
28
|
+
### Changed
|
29
|
+
|
30
|
+
* Migrate to Net::HTTP adapter from Core module of ddtrace gem ([#49][])
|
31
|
+
|
3
32
|
## [0.2.0] - 2023-10-05
|
4
33
|
|
5
34
|
### Added
|
@@ -36,7 +65,9 @@
|
|
36
65
|
|
37
66
|
* Ruby versions < 2.7 no longer supported ([#8][])
|
38
67
|
|
39
|
-
[Unreleased]: https://github.com/DataDog/datadog-ci-rb/compare/v0.
|
68
|
+
[Unreleased]: https://github.com/DataDog/datadog-ci-rb/compare/v0.4.0...main
|
69
|
+
[0.4.0]: https://github.com/DataDog/datadog-ci-rb/compare/v0.3.0...v0.4.0
|
70
|
+
[0.3.0]: https://github.com/DataDog/datadog-ci-rb/compare/v0.2.0...v0.3.0
|
40
71
|
[0.2.0]: https://github.com/DataDog/datadog-ci-rb/compare/v0.1.1...v0.2.0
|
41
72
|
[0.1.1]: https://github.com/DataDog/datadog-ci-rb/compare/v0.1.0...v0.1.1
|
42
73
|
|
@@ -51,3 +82,11 @@
|
|
51
82
|
[#31]: https://github.com/DataDog/datadog-ci-rb/issues/31
|
52
83
|
[#33]: https://github.com/DataDog/datadog-ci-rb/issues/33
|
53
84
|
[#40]: https://github.com/DataDog/datadog-ci-rb/issues/40
|
85
|
+
[#49]: https://github.com/DataDog/datadog-ci-rb/issues/49
|
86
|
+
[#51]: https://github.com/DataDog/datadog-ci-rb/issues/51
|
87
|
+
[#54]: https://github.com/DataDog/datadog-ci-rb/issues/54
|
88
|
+
[#60]: https://github.com/DataDog/datadog-ci-rb/issues/60
|
89
|
+
[#61]: https://github.com/DataDog/datadog-ci-rb/issues/61
|
90
|
+
[#64]: https://github.com/DataDog/datadog-ci-rb/issues/64
|
91
|
+
[#65]: https://github.com/DataDog/datadog-ci-rb/issues/65
|
92
|
+
[#66]: https://github.com/DataDog/datadog-ci-rb/issues/66
|
data/README.md
CHANGED
@@ -30,18 +30,18 @@ To activate `RSpec` integration, add this to the `spec_helper.rb` file:
|
|
30
30
|
require 'rspec'
|
31
31
|
require 'datadog/ci'
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
33
|
+
# Only activates test instrumentation on CI
|
34
|
+
if ENV["DD_ENV"] == "ci"
|
35
|
+
Datadog.configure do |c|
|
36
|
+
# Configures the tracer to ensure results delivery
|
37
|
+
c.ci.enabled = true
|
38
|
+
|
39
|
+
# The name of the service or library under test
|
40
|
+
c.service = 'my-ruby-app'
|
41
|
+
|
42
|
+
# Enables the RSpec instrumentation
|
43
|
+
c.ci.instrument :rspec, **options
|
44
|
+
end
|
45
45
|
end
|
46
46
|
```
|
47
47
|
|
@@ -51,7 +51,7 @@ end
|
|
51
51
|
| --- | ----------- | ------- |
|
52
52
|
| `enabled` | Defines whether RSpec tests should be traced. Useful for temporarily disabling tracing. `true` or `false` | `true` |
|
53
53
|
| `service_name` | Service name used for `rspec` instrumentation. | `'rspec'` |
|
54
|
-
| `operation_name` | Operation name used for `rspec` instrumentation.
|
54
|
+
| `operation_name` | Operation name used for `rspec` instrumentation. | `'rspec.example'` |
|
55
55
|
|
56
56
|
### Minitest
|
57
57
|
|
@@ -63,18 +63,18 @@ To activate your integration, use the `Datadog.configure` method:
|
|
63
63
|
require 'minitest'
|
64
64
|
require 'datadog/ci'
|
65
65
|
|
66
|
+
# Only activates test instrumentation on CI
|
67
|
+
if ENV["DD_ENV"] == "ci"
|
66
68
|
# Configure default Minitest integration
|
67
|
-
Datadog.configure do |c|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
# Configures the tracer to ensure results delivery
|
72
|
-
c.ci.enabled = true
|
69
|
+
Datadog.configure do |c|
|
70
|
+
# Configures the tracer to ensure results delivery
|
71
|
+
c.ci.enabled = true
|
73
72
|
|
74
|
-
|
75
|
-
|
73
|
+
# The name of the service or library under test
|
74
|
+
c.service = 'my-ruby-app'
|
76
75
|
|
77
|
-
|
76
|
+
c.ci.instrument :minitest, **options
|
77
|
+
end
|
78
78
|
end
|
79
79
|
```
|
80
80
|
|
@@ -84,7 +84,7 @@ end
|
|
84
84
|
| --- | ----------- | ------- |
|
85
85
|
| `enabled` | Defines whether Minitest tests should be traced. Useful for temporarily disabling tracing. `true` or `false` | `true` |
|
86
86
|
| `service_name` | Service name used for `minitest` instrumentation. | `'minitest'` |
|
87
|
-
| `operation_name` | Operation name used for `minitest` instrumentation.
|
87
|
+
| `operation_name` | Operation name used for `minitest` instrumentation. | `'minitest.test'` |
|
88
88
|
|
89
89
|
### Cucumber
|
90
90
|
|
@@ -94,18 +94,18 @@ Activate `Cucumber` integration with configuration
|
|
94
94
|
require 'cucumber'
|
95
95
|
require 'datadog/ci'
|
96
96
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
c.ci.enabled = true
|
97
|
+
# Only activates test instrumentation on CI
|
98
|
+
if ENV["DD_ENV"] == "ci"
|
99
|
+
Datadog.configure do |c|
|
100
|
+
# Configures the tracer to ensure results delivery
|
101
|
+
c.ci.enabled = true
|
103
102
|
|
104
|
-
|
105
|
-
|
103
|
+
# The name of the service or library under test
|
104
|
+
c.service = 'my-ruby-app'
|
106
105
|
|
107
|
-
|
108
|
-
|
106
|
+
# Enables the Cucumber instrumentation
|
107
|
+
c.ci.instrument :cucumber, **options
|
108
|
+
end
|
109
109
|
end
|
110
110
|
```
|
111
111
|
|
@@ -115,7 +115,7 @@ end
|
|
115
115
|
| --- | ----------- | ------- |
|
116
116
|
| `enabled` | Defines whether Cucumber tests should be traced. Useful for temporarily disabling tracing. `true` or `false` | `true` |
|
117
117
|
| `service_name` | Service name used for `cucumber` instrumentation. | `'cucumber'` |
|
118
|
-
| `operation_name` | Operation name used for `cucumber` instrumentation.
|
118
|
+
| `operation_name` | Operation name used for `cucumber` instrumentation. | `'cucumber.test'` |
|
119
119
|
|
120
120
|
## Agentless mode
|
121
121
|
|
@@ -145,8 +145,8 @@ In order to achieve this you can configure ddtrace instrumentations in your conf
|
|
145
145
|
```ruby
|
146
146
|
Datadog.configure do |c|
|
147
147
|
# ... ci configs and instrumentation here ...
|
148
|
-
c.instrument :redis
|
149
|
-
c.instrument :pg
|
148
|
+
c.tracing.instrument :redis
|
149
|
+
c.tracing.instrument :pg
|
150
150
|
end
|
151
151
|
```
|
152
152
|
|
@@ -1,13 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "datadog/core/configuration/agent_settings_resolver"
|
4
|
+
require "datadog/core/remote/negotiation"
|
5
|
+
|
6
|
+
require_relative "../ext/transport"
|
3
7
|
require_relative "../test_visibility/flush"
|
4
8
|
require_relative "../test_visibility/transport"
|
9
|
+
require_relative "../transport/api/builder"
|
10
|
+
require_relative "../recorder"
|
5
11
|
|
6
12
|
module Datadog
|
7
13
|
module CI
|
8
14
|
module Configuration
|
9
15
|
# Adds CI behavior to Datadog trace components
|
10
16
|
module Components
|
17
|
+
attr_reader :ci_recorder
|
18
|
+
|
11
19
|
def initialize(settings)
|
12
20
|
# Activate CI mode if enabled
|
13
21
|
activate_ci!(settings) if settings.ci.enabled
|
@@ -17,25 +25,13 @@ module Datadog
|
|
17
25
|
end
|
18
26
|
|
19
27
|
def activate_ci!(settings)
|
20
|
-
|
28
|
+
test_visibility_transport = nil
|
29
|
+
agent_settings = Datadog::Core::Configuration::AgentSettingsResolver.call(settings)
|
21
30
|
|
22
31
|
if settings.ci.agentless_mode_enabled
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
# Tests are running without CI visibility enabled
|
27
|
-
|
28
|
-
Datadog.logger.error(
|
29
|
-
"DATADOG CONFIGURATION - CI VISIBILITY - ATTENTION - " \
|
30
|
-
"Agentless mode was enabled but DD_API_KEY is not set: CI visibility is disabled. " \
|
31
|
-
"Please make sure to set valid api key in DD_API_KEY environment variable"
|
32
|
-
)
|
33
|
-
|
34
|
-
settings.ci.enabled = false
|
35
|
-
return
|
36
|
-
else
|
37
|
-
agentless_transport = build_agentless_transport(settings)
|
38
|
-
end
|
32
|
+
test_visibility_transport = build_agentless_transport(settings)
|
33
|
+
elsif can_use_evp_proxy?(settings, agent_settings)
|
34
|
+
test_visibility_transport = build_evp_proxy_transport(settings, agent_settings)
|
39
35
|
end
|
40
36
|
|
41
37
|
# Deactivate telemetry
|
@@ -51,25 +47,55 @@ module Datadog
|
|
51
47
|
settings.tracing.test_mode.trace_flush = settings.ci.trace_flush || CI::TestVisibility::Flush::Finished.new
|
52
48
|
|
53
49
|
writer_options = settings.ci.writer_options
|
54
|
-
if
|
55
|
-
writer_options[:transport] =
|
50
|
+
if test_visibility_transport
|
51
|
+
writer_options[:transport] = test_visibility_transport
|
56
52
|
writer_options[:shutdown_timeout] = 60
|
57
53
|
|
58
54
|
settings.tracing.test_mode.async = true
|
59
55
|
end
|
60
56
|
|
61
57
|
settings.tracing.test_mode.writer_options = writer_options
|
58
|
+
|
59
|
+
@ci_recorder = Recorder.new
|
60
|
+
end
|
61
|
+
|
62
|
+
def can_use_evp_proxy?(settings, agent_settings)
|
63
|
+
Datadog::Core::Remote::Negotiation.new(settings, agent_settings).endpoint?(
|
64
|
+
Ext::Transport::EVP_PROXY_PATH_PREFIX
|
65
|
+
)
|
62
66
|
end
|
63
67
|
|
64
68
|
def build_agentless_transport(settings)
|
65
|
-
|
66
|
-
|
67
|
-
|
69
|
+
if settings.api_key.nil?
|
70
|
+
# agentless mode is requested but no API key is provided -
|
71
|
+
# we cannot continue and log an error
|
72
|
+
# Tests are running without CI visibility enabled
|
73
|
+
|
74
|
+
Datadog.logger.error(
|
75
|
+
"DATADOG CONFIGURATION - CI VISIBILITY - ATTENTION - " \
|
76
|
+
"Agentless mode was enabled but DD_API_KEY is not set: CI visibility is disabled. " \
|
77
|
+
"Please make sure to set valid api key in DD_API_KEY environment variable"
|
78
|
+
)
|
79
|
+
|
80
|
+
settings.ci.enabled = false
|
81
|
+
|
82
|
+
nil
|
83
|
+
else
|
84
|
+
Datadog.logger.debug("CI visibility configured to use agentless transport")
|
85
|
+
|
86
|
+
Datadog::CI::TestVisibility::Transport.new(
|
87
|
+
api: Transport::Api::Builder.build_ci_test_cycle_api(settings),
|
88
|
+
dd_env: settings.env
|
89
|
+
)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def build_evp_proxy_transport(settings, agent_settings)
|
94
|
+
Datadog.logger.debug("CI visibility configured to use agent transport via EVP proxy")
|
68
95
|
|
69
96
|
Datadog::CI::TestVisibility::Transport.new(
|
70
|
-
|
71
|
-
|
72
|
-
env: settings.env
|
97
|
+
api: Transport::Api::Builder.build_evp_proxy_api(agent_settings),
|
98
|
+
dd_env: settings.env
|
73
99
|
)
|
74
100
|
end
|
75
101
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datadog
|
4
|
+
module CI
|
5
|
+
module Context
|
6
|
+
class Local
|
7
|
+
def initialize
|
8
|
+
@key = :datadog_ci_active_test
|
9
|
+
|
10
|
+
self.active_test = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def activate_test!(test)
|
14
|
+
raise "Nested tests are not supported. Currently active test: #{active_test}" unless active_test.nil?
|
15
|
+
|
16
|
+
if block_given?
|
17
|
+
begin
|
18
|
+
self.active_test = test
|
19
|
+
yield
|
20
|
+
ensure
|
21
|
+
self.active_test = nil
|
22
|
+
end
|
23
|
+
else
|
24
|
+
self.active_test = test
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def deactivate_test!(test)
|
29
|
+
return if active_test.nil?
|
30
|
+
|
31
|
+
if active_test == test
|
32
|
+
self.active_test = nil
|
33
|
+
else
|
34
|
+
raise "Trying to deactivate test #{test}, but currently active test is #{active_test}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def active_test
|
39
|
+
Thread.current[@key]
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def active_test=(test)
|
45
|
+
Thread.current[@key] = test
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../../recorder"
|
4
3
|
require_relative "../../ext/test"
|
5
4
|
require_relative "ext"
|
6
5
|
|
@@ -28,56 +27,51 @@ module Datadog
|
|
28
27
|
end
|
29
28
|
|
30
29
|
def on_test_case_started(event)
|
31
|
-
|
32
|
-
|
33
|
-
{
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
test_suite: event.test_case.location.file,
|
42
|
-
test_type: Ext::TEST_TYPE
|
43
|
-
}
|
30
|
+
CI.start_test(
|
31
|
+
event.test_case.name,
|
32
|
+
tags: {
|
33
|
+
CI::Ext::Test::TAG_FRAMEWORK => Ext::FRAMEWORK,
|
34
|
+
CI::Ext::Test::TAG_FRAMEWORK_VERSION => CI::Contrib::Cucumber::Integration.version.to_s,
|
35
|
+
CI::Ext::Test::TAG_TYPE => Ext::TEST_TYPE,
|
36
|
+
CI::Ext::Test::TAG_SUITE => event.test_case.location.file
|
37
|
+
},
|
38
|
+
service_name: configuration[:service_name],
|
39
|
+
operation_name: configuration[:operation_name]
|
44
40
|
)
|
45
41
|
end
|
46
42
|
|
47
43
|
def on_test_case_finished(event)
|
48
|
-
|
44
|
+
test_span = CI.active_test
|
45
|
+
return if test_span.nil?
|
49
46
|
|
50
47
|
if event.result.skipped?
|
51
|
-
|
48
|
+
test_span.skipped!
|
52
49
|
elsif event.result.ok?
|
53
|
-
|
50
|
+
test_span.passed!
|
54
51
|
elsif event.result.failed?
|
55
|
-
|
52
|
+
test_span.failed!
|
56
53
|
end
|
57
54
|
|
58
|
-
|
55
|
+
test_span.finish
|
59
56
|
end
|
60
57
|
|
61
58
|
def on_test_step_started(event)
|
62
|
-
|
63
|
-
resource: event.test_step.to_s,
|
64
|
-
span_type: Ext::STEP_SPAN_TYPE
|
65
|
-
}
|
66
|
-
@current_step_span = Tracing.trace(Ext::STEP_SPAN_TYPE, **trace_options)
|
59
|
+
CI.trace(Ext::STEP_SPAN_TYPE, event.test_step.to_s)
|
67
60
|
end
|
68
61
|
|
69
62
|
def on_test_step_finished(event)
|
70
|
-
|
63
|
+
current_step_span = CI.active_span(Ext::STEP_SPAN_TYPE)
|
64
|
+
return if current_step_span.nil?
|
71
65
|
|
72
66
|
if event.result.skipped?
|
73
|
-
|
67
|
+
current_step_span.skipped!
|
74
68
|
elsif event.result.ok?
|
75
|
-
|
69
|
+
current_step_span.passed!
|
76
70
|
elsif event.result.failed?
|
77
|
-
|
71
|
+
current_step_span.failed!(exception: event.result.exception)
|
78
72
|
end
|
79
73
|
|
80
|
-
|
74
|
+
current_step_span.finish
|
81
75
|
end
|
82
76
|
|
83
77
|
private
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../../recorder"
|
4
3
|
require_relative "../../ext/test"
|
5
4
|
require_relative "ext"
|
6
5
|
|
@@ -19,41 +18,33 @@ module Datadog
|
|
19
18
|
path, = method(name).source_location
|
20
19
|
test_suite = Pathname.new(path.to_s).relative_path_from(Pathname.pwd).to_s
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
{
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
test_suite: test_suite,
|
33
|
-
test_type: Ext::TEST_TYPE
|
34
|
-
}
|
21
|
+
CI.start_test(
|
22
|
+
test_name,
|
23
|
+
tags: {
|
24
|
+
CI::Ext::Test::TAG_FRAMEWORK => Ext::FRAMEWORK,
|
25
|
+
CI::Ext::Test::TAG_FRAMEWORK_VERSION => CI::Contrib::Minitest::Integration.version.to_s,
|
26
|
+
CI::Ext::Test::TAG_TYPE => Ext::TEST_TYPE,
|
27
|
+
CI::Ext::Test::TAG_SUITE => test_suite
|
28
|
+
},
|
29
|
+
service_name: configuration[:service_name],
|
30
|
+
operation_name: configuration[:operation_name]
|
35
31
|
)
|
36
|
-
|
37
|
-
Thread.current[:_datadog_test_span] = span
|
38
32
|
end
|
39
33
|
|
40
34
|
def after_teardown
|
41
|
-
|
42
|
-
return super unless
|
43
|
-
|
44
|
-
Thread.current[:_datadog_test_span] = nil
|
35
|
+
test_span = CI.active_test
|
36
|
+
return super unless test_span
|
45
37
|
|
46
38
|
case result_code
|
47
39
|
when "."
|
48
|
-
|
40
|
+
test_span.passed!
|
49
41
|
when "E", "F"
|
50
|
-
|
42
|
+
test_span.failed!(exception: failure)
|
51
43
|
when "S"
|
52
|
-
|
53
|
-
span.set_tag(CI::Ext::Test::TAG_SKIP_REASON, failure.message)
|
44
|
+
test_span.skipped!(reason: failure.message)
|
54
45
|
end
|
55
46
|
|
56
|
-
|
47
|
+
test_span.finish
|
57
48
|
|
58
49
|
super
|
59
50
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../../recorder"
|
4
3
|
require_relative "../../ext/test"
|
5
4
|
require_relative "ext"
|
6
5
|
|
@@ -25,29 +24,26 @@ module Datadog
|
|
25
24
|
test_name += " #{description}"
|
26
25
|
end
|
27
26
|
|
28
|
-
CI
|
29
|
-
|
30
|
-
{
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
test_type: Ext::TEST_TYPE
|
40
|
-
}
|
41
|
-
) do |span|
|
27
|
+
CI.trace_test(
|
28
|
+
test_name,
|
29
|
+
tags: {
|
30
|
+
CI::Ext::Test::TAG_FRAMEWORK => Ext::FRAMEWORK,
|
31
|
+
CI::Ext::Test::TAG_FRAMEWORK_VERSION => CI::Contrib::RSpec::Integration.version.to_s,
|
32
|
+
CI::Ext::Test::TAG_TYPE => Ext::TEST_TYPE,
|
33
|
+
CI::Ext::Test::TAG_SUITE => metadata[:example_group][:file_path]
|
34
|
+
},
|
35
|
+
service_name: configuration[:service_name],
|
36
|
+
operation_name: configuration[:operation_name]
|
37
|
+
) do |test_span|
|
42
38
|
result = super
|
43
39
|
|
44
40
|
case execution_result.status
|
45
41
|
when :passed
|
46
|
-
|
42
|
+
test_span.passed!
|
47
43
|
when :failed
|
48
|
-
|
44
|
+
test_span.failed!(exception: execution_result.exception)
|
49
45
|
else
|
50
|
-
|
46
|
+
test_span.skipped!(exception: execution_result.exception) if execution_result.example_skipped?
|
51
47
|
end
|
52
48
|
|
53
49
|
result
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative "../git"
|
4
4
|
require_relative "../../utils/git"
|
5
|
+
require_relative "../../utils/url"
|
5
6
|
require_relative "providers"
|
6
7
|
|
7
8
|
module Datadog
|
@@ -68,14 +69,14 @@ module Datadog
|
|
68
69
|
|
69
70
|
def normalize_git!
|
70
71
|
branch_ref = @tags[Git::TAG_BRANCH]
|
71
|
-
if
|
72
|
+
if Utils::Git.is_git_tag?(branch_ref)
|
72
73
|
@tags[Git::TAG_TAG] = branch_ref
|
73
74
|
@tags.delete(Git::TAG_BRANCH)
|
74
75
|
end
|
75
76
|
|
76
|
-
@tags[Git::TAG_TAG] =
|
77
|
-
@tags[Git::TAG_BRANCH] =
|
78
|
-
@tags[Git::TAG_REPOSITORY_URL] = filter_sensitive_info(
|
77
|
+
@tags[Git::TAG_TAG] = Utils::Git.normalize_ref(@tags[Git::TAG_TAG])
|
78
|
+
@tags[Git::TAG_BRANCH] = Utils::Git.normalize_ref(@tags[Git::TAG_BRANCH])
|
79
|
+
@tags[Git::TAG_REPOSITORY_URL] = Utils::Url.filter_sensitive_info(
|
79
80
|
@tags[Git::TAG_REPOSITORY_URL]
|
80
81
|
)
|
81
82
|
end
|
@@ -87,12 +88,6 @@ module Datadog
|
|
87
88
|
@tags[TAG_WORKSPACE_PATH] = File.expand_path(workspace_path)
|
88
89
|
end
|
89
90
|
end
|
90
|
-
|
91
|
-
def filter_sensitive_info(url)
|
92
|
-
return nil if url.nil?
|
93
|
-
|
94
|
-
url.gsub(%r{(https?://)[^/]*@}, '\1')
|
95
|
-
end
|
96
91
|
end
|
97
92
|
end
|
98
93
|
end
|
@@ -10,6 +10,10 @@ module Datadog
|
|
10
10
|
# Appveyor: https://www.appveyor.com/
|
11
11
|
# Environment variables docs: https://www.appveyor.com/docs/environment-variables/
|
12
12
|
class Appveyor < Base
|
13
|
+
def self.handles?(env)
|
14
|
+
env.key?("APPVEYOR")
|
15
|
+
end
|
16
|
+
|
13
17
|
def provider_name
|
14
18
|
"appveyor"
|
15
19
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "base"
|
4
|
+
|
5
|
+
module Datadog
|
6
|
+
module CI
|
7
|
+
module Ext
|
8
|
+
module Environment
|
9
|
+
module Providers
|
10
|
+
# AWS CodePipeline: https://aws.amazon.com/codepipeline/
|
11
|
+
# Environment variables docs: https://docs.aws.amazon.com/codepipeline/latest/userguide/actions-variables.html
|
12
|
+
# AWS CodeBuild: https://aws.amazon.com/codebuild/
|
13
|
+
# Environment variable docs: https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-env-vars.html
|
14
|
+
class AwsCodePipeline < Base
|
15
|
+
def self.handles?(env)
|
16
|
+
!env["CODEBUILD_INITIATOR"].nil? && env["CODEBUILD_INITIATOR"].start_with?("codepipeline")
|
17
|
+
end
|
18
|
+
|
19
|
+
def provider_name
|
20
|
+
"awscodepipeline"
|
21
|
+
end
|
22
|
+
|
23
|
+
def pipeline_id
|
24
|
+
env["DD_PIPELINE_EXECUTION_ID"]
|
25
|
+
end
|
26
|
+
|
27
|
+
def ci_env_vars
|
28
|
+
{
|
29
|
+
"CODEBUILD_BUILD_ARN" => env["CODEBUILD_BUILD_ARN"],
|
30
|
+
"DD_PIPELINE_EXECUTION_ID" => env["DD_PIPELINE_EXECUTION_ID"],
|
31
|
+
"DD_ACTION_EXECUTION_ID" => env["DD_ACTION_EXECUTION_ID"]
|
32
|
+
}.to_json
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -12,6 +12,10 @@ module Datadog
|
|
12
12
|
# Azure Pipelines: https://azure.microsoft.com/en-us/products/devops/pipelines
|
13
13
|
# Environment variables docs: https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml
|
14
14
|
class Azure < Base
|
15
|
+
def self.handles?(env)
|
16
|
+
env.key?("TF_BUILD")
|
17
|
+
end
|
18
|
+
|
15
19
|
def provider_name
|
16
20
|
"azurepipelines"
|
17
21
|
end
|