datadog-ci 0.2.0 → 0.4.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 +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
@@ -10,6 +10,10 @@ module Datadog
|
|
10
10
|
# Bitbucket Pipelines: https://bitbucket.org/product/features/pipelines
|
11
11
|
# Environment variables docs: https://support.atlassian.com/bitbucket-cloud/docs/variables-and-secrets/
|
12
12
|
class Bitbucket < Base
|
13
|
+
def self.handles?(env)
|
14
|
+
env.key?("BITBUCKET_COMMIT")
|
15
|
+
end
|
16
|
+
|
13
17
|
# overridden methods
|
14
18
|
def provider_name
|
15
19
|
"bitbucket"
|
@@ -10,6 +10,10 @@ module Datadog
|
|
10
10
|
# Bitrise: https://bitrise.io/
|
11
11
|
# Environment variables docs: https://devcenter.bitrise.io/en/references/available-environment-variables.html
|
12
12
|
class Bitrise < Base
|
13
|
+
def self.handles?(env)
|
14
|
+
env.key?("BITRISE_BUILD_SLUG")
|
15
|
+
end
|
16
|
+
|
13
17
|
def provider_name
|
14
18
|
"bitrise"
|
15
19
|
end
|
@@ -10,6 +10,10 @@ module Datadog
|
|
10
10
|
# Buddy: https://buddy.works/
|
11
11
|
# Environment variables docs: https://buddy.works/docs/pipelines/environment-variables
|
12
12
|
class Buddy < Base
|
13
|
+
def self.handles?(env)
|
14
|
+
env.key?("BUDDY")
|
15
|
+
end
|
16
|
+
|
13
17
|
def provider_name
|
14
18
|
"buddy"
|
15
19
|
end
|
@@ -12,6 +12,10 @@ module Datadog
|
|
12
12
|
# Buildkite: https://buildkite.com/
|
13
13
|
# Environment variables docs: https://buildkite.com/docs/pipelines/environment-variables
|
14
14
|
class Buildkite < Base
|
15
|
+
def self.handles?(env)
|
16
|
+
env.key?("BUILDKITE")
|
17
|
+
end
|
18
|
+
|
15
19
|
def provider_name
|
16
20
|
"buildkite"
|
17
21
|
end
|
@@ -12,6 +12,10 @@ module Datadog
|
|
12
12
|
# Circle CI: https://circleci.com/
|
13
13
|
# Environment variables docs: https://circleci.com/docs/variables/#built-in-environment-variables
|
14
14
|
class Circleci < Base
|
15
|
+
def self.handles?(env)
|
16
|
+
env.key?("CIRCLECI")
|
17
|
+
end
|
18
|
+
|
15
19
|
def provider_name
|
16
20
|
"circleci"
|
17
21
|
end
|
@@ -12,6 +12,10 @@ module Datadog
|
|
12
12
|
# Codefresh: https://codefresh.io/
|
13
13
|
# Environment variables docs: https://codefresh.io/docs/docs/pipelines/variables/#export-variables-to-all-steps-with-cf_export
|
14
14
|
class Codefresh < Base
|
15
|
+
def self.handles?(env)
|
16
|
+
env.key?("CF_BUILD_ID")
|
17
|
+
end
|
18
|
+
|
15
19
|
def provider_name
|
16
20
|
"codefresh"
|
17
21
|
end
|
@@ -3,6 +3,7 @@
|
|
3
3
|
require "json"
|
4
4
|
|
5
5
|
require_relative "base"
|
6
|
+
require_relative "../../../utils/url"
|
6
7
|
|
7
8
|
module Datadog
|
8
9
|
module CI
|
@@ -12,6 +13,10 @@ module Datadog
|
|
12
13
|
# Github Actions: https://github.com/features/actions
|
13
14
|
# Environment variables docs: https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables
|
14
15
|
class GithubActions < Base
|
16
|
+
def self.handles?(env)
|
17
|
+
env.key?("GITHUB_SHA")
|
18
|
+
end
|
19
|
+
|
15
20
|
def provider_name
|
16
21
|
"github"
|
17
22
|
end
|
@@ -21,7 +26,7 @@ module Datadog
|
|
21
26
|
end
|
22
27
|
|
23
28
|
def job_url
|
24
|
-
"#{
|
29
|
+
"#{github_server_url}/#{env["GITHUB_REPOSITORY"]}/commit/#{env["GITHUB_SHA"]}/checks"
|
25
30
|
end
|
26
31
|
|
27
32
|
def pipeline_id
|
@@ -37,7 +42,7 @@ module Datadog
|
|
37
42
|
end
|
38
43
|
|
39
44
|
def pipeline_url
|
40
|
-
res = "#{
|
45
|
+
res = "#{github_server_url}/#{env["GITHUB_REPOSITORY"]}/actions/runs/#{env["GITHUB_RUN_ID"]}"
|
41
46
|
res = "#{res}/attempts/#{env["GITHUB_RUN_ATTEMPT"]}" if env["GITHUB_RUN_ATTEMPT"]
|
42
47
|
res
|
43
48
|
end
|
@@ -47,7 +52,7 @@ module Datadog
|
|
47
52
|
end
|
48
53
|
|
49
54
|
def git_repository_url
|
50
|
-
"#{
|
55
|
+
"#{github_server_url}/#{env["GITHUB_REPOSITORY"]}.git"
|
51
56
|
end
|
52
57
|
|
53
58
|
def git_commit_sha
|
@@ -62,12 +67,20 @@ module Datadog
|
|
62
67
|
|
63
68
|
def ci_env_vars
|
64
69
|
{
|
65
|
-
"GITHUB_SERVER_URL" =>
|
70
|
+
"GITHUB_SERVER_URL" => github_server_url,
|
66
71
|
"GITHUB_REPOSITORY" => env["GITHUB_REPOSITORY"],
|
67
72
|
"GITHUB_RUN_ID" => env["GITHUB_RUN_ID"],
|
68
73
|
"GITHUB_RUN_ATTEMPT" => env["GITHUB_RUN_ATTEMPT"]
|
69
74
|
}.reject { |_, v| v.nil? }.to_json
|
70
75
|
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def github_server_url
|
80
|
+
return @github_server_url if defined?(@github_server_url)
|
81
|
+
|
82
|
+
@github_server_url ||= Utils::Url.filter_sensitive_info(env["GITHUB_SERVER_URL"])
|
83
|
+
end
|
71
84
|
end
|
72
85
|
end
|
73
86
|
end
|
@@ -10,6 +10,10 @@ module Datadog
|
|
10
10
|
# Gitlab CI: https://docs.gitlab.com/ee/ci/
|
11
11
|
# Environment variables docs: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
|
12
12
|
class Gitlab < Base
|
13
|
+
def self.handles?(env)
|
14
|
+
env.key?("GITLAB_CI")
|
15
|
+
end
|
16
|
+
|
13
17
|
def provider_name
|
14
18
|
"gitlab"
|
15
19
|
end
|
@@ -13,6 +13,10 @@ module Datadog
|
|
13
13
|
# Jenkins: https://www.jenkins.io/
|
14
14
|
# Environment variables docs: https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#using-environment-variables
|
15
15
|
class Jenkins < Base
|
16
|
+
def self.handles?(env)
|
17
|
+
env.key?("JENKINS_URL")
|
18
|
+
end
|
19
|
+
|
16
20
|
def provider_name
|
17
21
|
"jenkins"
|
18
22
|
end
|
@@ -10,6 +10,10 @@ module Datadog
|
|
10
10
|
# Teamcity: https://www.jetbrains.com/teamcity/
|
11
11
|
# Environment variables docs: https://www.jetbrains.com/help/teamcity/predefined-build-parameters.html
|
12
12
|
class Teamcity < Base
|
13
|
+
def self.handles?(env)
|
14
|
+
env.key?("TEAMCITY_VERSION")
|
15
|
+
end
|
16
|
+
|
13
17
|
def provider_name
|
14
18
|
"teamcity"
|
15
19
|
end
|
@@ -10,6 +10,10 @@ module Datadog
|
|
10
10
|
# Travis CI: https://www.travis-ci.com/
|
11
11
|
# Environment variables docs: https://docs.travis-ci.com/user/environment-variables#default-environment-variables
|
12
12
|
class Travis < Base
|
13
|
+
def self.handles?(env)
|
14
|
+
env.key?("TRAVIS")
|
15
|
+
end
|
16
|
+
|
13
17
|
def provider_name
|
14
18
|
"travisci"
|
15
19
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative "providers/base"
|
4
4
|
require_relative "providers/appveyor"
|
5
|
+
require_relative "providers/aws_code_pipeline"
|
5
6
|
require_relative "providers/azure"
|
6
7
|
require_relative "providers/bitbucket"
|
7
8
|
require_relative "providers/bitrise"
|
@@ -24,23 +25,24 @@ module Datadog
|
|
24
25
|
module Environment
|
25
26
|
module Providers
|
26
27
|
PROVIDERS = [
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
28
|
+
Providers::Appveyor,
|
29
|
+
Providers::AwsCodePipeline,
|
30
|
+
Providers::Azure,
|
31
|
+
Providers::Bitbucket,
|
32
|
+
Providers::Bitrise,
|
33
|
+
Providers::Buddy,
|
34
|
+
Providers::Buildkite,
|
35
|
+
Providers::Circleci,
|
36
|
+
Providers::Codefresh,
|
37
|
+
Providers::GithubActions,
|
38
|
+
Providers::Gitlab,
|
39
|
+
Providers::Jenkins,
|
40
|
+
Providers::Teamcity,
|
41
|
+
Providers::Travis
|
40
42
|
]
|
41
43
|
|
42
44
|
def self.for_environment(env)
|
43
|
-
|
45
|
+
provider_klass = PROVIDERS.find { |klass| klass.handles?(env) }
|
44
46
|
provider_klass = Providers::Base if provider_klass.nil?
|
45
47
|
|
46
48
|
provider_klass.new(env)
|
@@ -4,10 +4,15 @@ module Datadog
|
|
4
4
|
module CI
|
5
5
|
module Ext
|
6
6
|
module Transport
|
7
|
+
DEFAULT_DD_SITE = "datadoghq.com"
|
8
|
+
|
7
9
|
HEADER_DD_API_KEY = "DD-API-KEY"
|
8
10
|
HEADER_CONTENT_TYPE = "Content-Type"
|
9
11
|
HEADER_CONTENT_ENCODING = "Content-Encoding"
|
12
|
+
HEADER_EVP_SUBDOMAIN = "X-Datadog-EVP-Subdomain"
|
13
|
+
HEADER_CONTAINER_ID = "Datadog-Container-ID"
|
10
14
|
|
15
|
+
EVP_PROXY_PATH_PREFIX = "/evp_proxy/v2/"
|
11
16
|
TEST_VISIBILITY_INTAKE_HOST_PREFIX = "citestcycle-intake"
|
12
17
|
TEST_VISIBILITY_INTAKE_PATH = "/api/v2/citestcycle"
|
13
18
|
|
data/lib/datadog/ci/recorder.rb
CHANGED
@@ -1,82 +1,118 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "datadog/tracing"
|
4
|
-
|
4
|
+
|
5
|
+
require "rbconfig"
|
5
6
|
|
6
7
|
require_relative "ext/app_types"
|
7
8
|
require_relative "ext/test"
|
8
9
|
require_relative "ext/environment"
|
9
10
|
|
10
|
-
|
11
|
+
require_relative "context/local"
|
12
|
+
|
13
|
+
require_relative "span"
|
14
|
+
require_relative "test"
|
11
15
|
|
12
16
|
module Datadog
|
13
17
|
module CI
|
14
18
|
# Common behavior for CI tests
|
15
|
-
|
19
|
+
class Recorder
|
20
|
+
attr_reader :environment_tags
|
21
|
+
|
22
|
+
def initialize
|
23
|
+
@environment_tags = Ext::Environment.tags(ENV).freeze
|
24
|
+
@local_context = Context::Local.new
|
25
|
+
end
|
26
|
+
|
16
27
|
# Creates a new span for a CI test
|
17
|
-
def
|
28
|
+
def trace_test(test_name, service_name: nil, operation_name: "test", tags: {}, &block)
|
18
29
|
span_options = {
|
30
|
+
resource: test_name,
|
31
|
+
service: service_name,
|
19
32
|
span_type: Ext::AppTypes::TYPE_TEST
|
20
|
-
}
|
33
|
+
}
|
34
|
+
|
35
|
+
tags[Ext::Test::TAG_NAME] = test_name
|
21
36
|
|
22
|
-
if
|
23
|
-
|
24
|
-
|
25
|
-
|
37
|
+
if block
|
38
|
+
Datadog::Tracing.trace(operation_name, **span_options) do |tracer_span, trace|
|
39
|
+
set_trace_origin(trace)
|
40
|
+
|
41
|
+
test = build_test(tracer_span, tags)
|
42
|
+
|
43
|
+
@local_context.activate_test!(test) do
|
44
|
+
block.call(test)
|
45
|
+
end
|
26
46
|
end
|
27
47
|
else
|
28
|
-
|
29
|
-
trace =
|
30
|
-
|
31
|
-
|
48
|
+
tracer_span = Datadog::Tracing.trace(operation_name, **span_options)
|
49
|
+
trace = Datadog::Tracing.active_trace
|
50
|
+
|
51
|
+
set_trace_origin(trace)
|
52
|
+
|
53
|
+
test = build_test(tracer_span, tags)
|
54
|
+
@local_context.activate_test!(test)
|
55
|
+
test
|
32
56
|
end
|
33
57
|
end
|
34
58
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
trace.origin = Ext::Test::CONTEXT_ORIGIN if trace
|
41
|
-
::Datadog::Tracing::Contrib::Analytics.set_measured(span)
|
42
|
-
span.set_tag(Ext::Test::TAG_SPAN_KIND, Ext::AppTypes::TYPE_TEST)
|
59
|
+
def trace(span_type, span_name, tags: {}, &block)
|
60
|
+
span_options = {
|
61
|
+
resource: span_name,
|
62
|
+
span_type: span_type
|
63
|
+
}
|
43
64
|
|
44
|
-
|
45
|
-
|
46
|
-
|
65
|
+
if block
|
66
|
+
Datadog::Tracing.trace(span_name, **span_options) do |tracer_span, trace|
|
67
|
+
block.call(build_span(tracer_span, tags))
|
68
|
+
end
|
69
|
+
else
|
70
|
+
tracer_span = Datadog::Tracing.trace(span_name, **span_options)
|
47
71
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
span.set_tag(Ext::Test::TAG_NAME, tags[:test_name]) if tags[:test_name]
|
52
|
-
span.set_tag(Ext::Test::TAG_SUITE, tags[:test_suite]) if tags[:test_suite]
|
53
|
-
span.set_tag(Ext::Test::TAG_TYPE, tags[:test_type]) if tags[:test_type]
|
72
|
+
build_span(tracer_span, tags)
|
73
|
+
end
|
74
|
+
end
|
54
75
|
|
55
|
-
|
76
|
+
def active_test
|
77
|
+
@local_context.active_test
|
78
|
+
end
|
56
79
|
|
57
|
-
|
80
|
+
def deactivate_test(test)
|
81
|
+
@local_context.deactivate_test!(test)
|
58
82
|
end
|
59
83
|
|
60
|
-
def
|
61
|
-
|
84
|
+
def active_span
|
85
|
+
tracer_span = Datadog::Tracing.active_span
|
86
|
+
Span.new(tracer_span) if tracer_span
|
62
87
|
end
|
63
88
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
89
|
+
private
|
90
|
+
|
91
|
+
# Sets trace's origin to ciapp-test
|
92
|
+
def set_trace_origin(trace)
|
93
|
+
trace.origin = Ext::Test::CONTEXT_ORIGIN if trace
|
68
94
|
end
|
69
95
|
|
70
|
-
def
|
71
|
-
|
72
|
-
|
96
|
+
def build_test(tracer_span, tags)
|
97
|
+
test = Test.new(tracer_span)
|
98
|
+
|
99
|
+
test.set_default_tags
|
100
|
+
test.set_environment_runtime_tags
|
101
|
+
|
102
|
+
test.set_tags(tags)
|
103
|
+
test.set_tags(environment_tags)
|
104
|
+
|
105
|
+
test
|
73
106
|
end
|
74
107
|
|
75
|
-
|
76
|
-
span.
|
77
|
-
|
78
|
-
span.
|
79
|
-
span.
|
108
|
+
def build_span(tracer_span, tags)
|
109
|
+
span = Span.new(tracer_span)
|
110
|
+
|
111
|
+
span.set_default_tags
|
112
|
+
span.set_environment_runtime_tags
|
113
|
+
span.set_tags(tags)
|
114
|
+
|
115
|
+
span
|
80
116
|
end
|
81
117
|
end
|
82
118
|
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "ext/test"
|
4
|
+
|
5
|
+
module Datadog
|
6
|
+
module CI
|
7
|
+
# Represents a single part of a test run.
|
8
|
+
# Could be a session, suite, test, or any custom span.
|
9
|
+
#
|
10
|
+
# @public_api
|
11
|
+
class Span
|
12
|
+
attr_reader :tracer_span
|
13
|
+
|
14
|
+
def initialize(tracer_span)
|
15
|
+
@tracer_span = tracer_span
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [String] the name of the span.
|
19
|
+
def name
|
20
|
+
tracer_span.name
|
21
|
+
end
|
22
|
+
|
23
|
+
# @return [String] the type of the span (for example "test" or type that was provided to [Datadog::CI.trace]).
|
24
|
+
def span_type
|
25
|
+
tracer_span.type
|
26
|
+
end
|
27
|
+
|
28
|
+
# Sets the status of the span to "pass".
|
29
|
+
# @return [void]
|
30
|
+
def passed!
|
31
|
+
tracer_span.set_tag(Ext::Test::TAG_STATUS, Ext::Test::Status::PASS)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Sets the status of the span to "fail".
|
35
|
+
# @param [Exception] exception the exception that caused the test to fail.
|
36
|
+
# @return [void]
|
37
|
+
def failed!(exception: nil)
|
38
|
+
tracer_span.status = 1
|
39
|
+
tracer_span.set_tag(Ext::Test::TAG_STATUS, Ext::Test::Status::FAIL)
|
40
|
+
tracer_span.set_error(exception) unless exception.nil?
|
41
|
+
end
|
42
|
+
|
43
|
+
# Sets the status of the span to "skip".
|
44
|
+
# @param [Exception] exception the exception that caused the test to fail.
|
45
|
+
# @param [String] reason the reason why the test was skipped.
|
46
|
+
# @return [void]
|
47
|
+
def skipped!(exception: nil, reason: nil)
|
48
|
+
tracer_span.set_tag(Ext::Test::TAG_STATUS, Ext::Test::Status::SKIP)
|
49
|
+
tracer_span.set_error(exception) unless exception.nil?
|
50
|
+
tracer_span.set_tag(Ext::Test::TAG_SKIP_REASON, reason) unless reason.nil?
|
51
|
+
end
|
52
|
+
|
53
|
+
# Gets tag value by key.
|
54
|
+
# @param [String] key the key of the tag.
|
55
|
+
# @return [String] the value of the tag.
|
56
|
+
def get_tag(key)
|
57
|
+
tracer_span.get_tag(key)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Sets tag value by key.
|
61
|
+
# @param [String] key the key of the tag.
|
62
|
+
# @param [String] value the value of the tag.
|
63
|
+
# @return [void]
|
64
|
+
def set_tag(key, value)
|
65
|
+
tracer_span.set_tag(key, value)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Sets metric value by key.
|
69
|
+
# @param [String] key the key of the metric.
|
70
|
+
# @param [Numeric] value the value of the metric.
|
71
|
+
# @return [void]
|
72
|
+
def set_metric(key, value)
|
73
|
+
tracer_span.set_metric(key, value)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Finishes the span.
|
77
|
+
# @return [void]
|
78
|
+
def finish
|
79
|
+
tracer_span.finish
|
80
|
+
end
|
81
|
+
|
82
|
+
# Sets multiple tags at once.
|
83
|
+
# @param [Hash[String, String]] tags the tags to set.
|
84
|
+
# @return [void]
|
85
|
+
def set_tags(tags)
|
86
|
+
tags.each do |key, value|
|
87
|
+
tracer_span.set_tag(key, value)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def set_environment_runtime_tags
|
92
|
+
tracer_span.set_tag(Ext::Test::TAG_OS_ARCHITECTURE, ::RbConfig::CONFIG["host_cpu"])
|
93
|
+
tracer_span.set_tag(Ext::Test::TAG_OS_PLATFORM, ::RbConfig::CONFIG["host_os"])
|
94
|
+
tracer_span.set_tag(Ext::Test::TAG_RUNTIME_NAME, Core::Environment::Ext::LANG_ENGINE)
|
95
|
+
tracer_span.set_tag(Ext::Test::TAG_RUNTIME_VERSION, Core::Environment::Ext::ENGINE_VERSION)
|
96
|
+
end
|
97
|
+
|
98
|
+
def set_default_tags
|
99
|
+
tracer_span.set_tag(Ext::Test::TAG_SPAN_KIND, Ext::AppTypes::TYPE_TEST)
|
100
|
+
end
|
101
|
+
|
102
|
+
def to_s
|
103
|
+
"#{self.class}(name:#{name},tracer_span:#{@tracer_span})"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "span"
|
4
|
+
|
5
|
+
module Datadog
|
6
|
+
module CI
|
7
|
+
# Represents a single part of a test run.
|
8
|
+
# Could be a session, suite, test, or any custom span.
|
9
|
+
#
|
10
|
+
# @public_api
|
11
|
+
class Test < Span
|
12
|
+
# @return [String] the name of the test.
|
13
|
+
def name
|
14
|
+
get_tag(Ext::Test::TAG_NAME)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Finishes the current test.
|
18
|
+
# @return [void]
|
19
|
+
def finish
|
20
|
+
super
|
21
|
+
|
22
|
+
CI.deactivate_test(self)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -9,7 +9,6 @@ require "datadog/core/chunker"
|
|
9
9
|
|
10
10
|
require_relative "serializers/factories/test_level"
|
11
11
|
require_relative "../ext/transport"
|
12
|
-
require_relative "../transport/http"
|
13
12
|
|
14
13
|
module Datadog
|
15
14
|
module CI
|
@@ -20,33 +19,20 @@ module Datadog
|
|
20
19
|
DEFAULT_MAX_PAYLOAD_SIZE = 5 * 1024 * 1024
|
21
20
|
|
22
21
|
attr_reader :serializers_factory,
|
23
|
-
:
|
22
|
+
:api,
|
24
23
|
:max_payload_size,
|
25
|
-
:
|
26
|
-
:env
|
24
|
+
:dd_env
|
27
25
|
|
28
26
|
def initialize(
|
29
|
-
|
30
|
-
|
31
|
-
env: nil,
|
27
|
+
api:,
|
28
|
+
dd_env: nil,
|
32
29
|
serializers_factory: Datadog::CI::TestVisibility::Serializers::Factories::TestLevel,
|
33
30
|
max_payload_size: DEFAULT_MAX_PAYLOAD_SIZE
|
34
31
|
)
|
35
32
|
@serializers_factory = serializers_factory
|
36
|
-
@api_key = api_key
|
37
33
|
@max_payload_size = max_payload_size
|
38
|
-
@
|
39
|
-
|
40
|
-
uri = URI.parse(url)
|
41
|
-
|
42
|
-
raise "Invalid agentless mode URL: #{url}" if uri.host.nil?
|
43
|
-
|
44
|
-
@http = Datadog::CI::Transport::HTTP.new(
|
45
|
-
host: uri.host,
|
46
|
-
port: uri.port,
|
47
|
-
ssl: uri.scheme == "https" || uri.port == 443,
|
48
|
-
compress: true
|
49
|
-
)
|
34
|
+
@dd_env = dd_env
|
35
|
+
@api = api
|
50
36
|
end
|
51
37
|
|
52
38
|
def send_traces(traces)
|
@@ -82,13 +68,9 @@ module Datadog
|
|
82
68
|
private
|
83
69
|
|
84
70
|
def send_payload(encoded_payload)
|
85
|
-
|
71
|
+
api.request(
|
86
72
|
path: Datadog::CI::Ext::Transport::TEST_VISIBILITY_INTAKE_PATH,
|
87
|
-
payload: encoded_payload
|
88
|
-
headers: {
|
89
|
-
Ext::Transport::HEADER_DD_API_KEY => api_key,
|
90
|
-
Ext::Transport::HEADER_CONTENT_TYPE => Ext::Transport::CONTENT_TYPE_MESSAGEPACK
|
91
|
-
}
|
73
|
+
payload: encoded_payload
|
92
74
|
)
|
93
75
|
end
|
94
76
|
|
@@ -141,12 +123,12 @@ module Datadog
|
|
141
123
|
packer.write_map_header(1)
|
142
124
|
|
143
125
|
packer.write("*")
|
144
|
-
metadata_fields_count =
|
126
|
+
metadata_fields_count = dd_env ? 4 : 3
|
145
127
|
packer.write_map_header(metadata_fields_count)
|
146
128
|
|
147
|
-
if
|
129
|
+
if dd_env
|
148
130
|
packer.write("env")
|
149
|
-
packer.write(
|
131
|
+
packer.write(dd_env)
|
150
132
|
end
|
151
133
|
|
152
134
|
packer.write("runtime-id")
|