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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +40 -1
  3. data/README.md +36 -36
  4. data/lib/datadog/ci/configuration/components.rb +51 -25
  5. data/lib/datadog/ci/context/local.rb +50 -0
  6. data/lib/datadog/ci/contrib/cucumber/formatter.rb +23 -29
  7. data/lib/datadog/ci/contrib/minitest/hooks.rb +16 -25
  8. data/lib/datadog/ci/contrib/rspec/example.rb +14 -18
  9. data/lib/datadog/ci/ext/environment/extractor.rb +5 -10
  10. data/lib/datadog/ci/ext/environment/providers/appveyor.rb +4 -0
  11. data/lib/datadog/ci/ext/environment/providers/aws_code_pipeline.rb +39 -0
  12. data/lib/datadog/ci/ext/environment/providers/azure.rb +4 -0
  13. data/lib/datadog/ci/ext/environment/providers/base.rb +4 -0
  14. data/lib/datadog/ci/ext/environment/providers/bitbucket.rb +4 -0
  15. data/lib/datadog/ci/ext/environment/providers/bitrise.rb +4 -0
  16. data/lib/datadog/ci/ext/environment/providers/buddy.rb +4 -0
  17. data/lib/datadog/ci/ext/environment/providers/buildkite.rb +4 -0
  18. data/lib/datadog/ci/ext/environment/providers/circleci.rb +4 -0
  19. data/lib/datadog/ci/ext/environment/providers/codefresh.rb +4 -0
  20. data/lib/datadog/ci/ext/environment/providers/github_actions.rb +17 -4
  21. data/lib/datadog/ci/ext/environment/providers/gitlab.rb +4 -0
  22. data/lib/datadog/ci/ext/environment/providers/jenkins.rb +4 -0
  23. data/lib/datadog/ci/ext/environment/providers/teamcity.rb +4 -0
  24. data/lib/datadog/ci/ext/environment/providers/travis.rb +4 -0
  25. data/lib/datadog/ci/ext/environment/providers.rb +16 -14
  26. data/lib/datadog/ci/ext/transport.rb +5 -0
  27. data/lib/datadog/ci/recorder.rb +82 -46
  28. data/lib/datadog/ci/span.rb +107 -0
  29. data/lib/datadog/ci/test.rb +26 -0
  30. data/lib/datadog/ci/test_visibility/transport.rb +11 -29
  31. data/lib/datadog/ci/transport/api/base.rb +36 -0
  32. data/lib/datadog/ci/transport/api/builder.rb +46 -0
  33. data/lib/datadog/ci/transport/api/ci_test_cycle.rb +30 -0
  34. data/lib/datadog/ci/transport/api/evp_proxy.rb +44 -0
  35. data/lib/datadog/ci/transport/gzip.rb +4 -2
  36. data/lib/datadog/ci/transport/http.rb +25 -101
  37. data/lib/datadog/ci/utils/url.rb +15 -0
  38. data/lib/datadog/ci/version.rb +1 -1
  39. data/lib/datadog/ci.rb +193 -4
  40. data/sig/datadog/ci/configuration/components.rbs +7 -1
  41. data/sig/datadog/ci/context/local.rbs +21 -0
  42. data/sig/datadog/ci/ext/environment/extractor.rbs +0 -2
  43. data/sig/datadog/ci/ext/environment/providers/aws_code_pipeline.rbs +19 -0
  44. data/sig/datadog/ci/ext/environment/providers/base.rbs +2 -0
  45. data/sig/datadog/ci/ext/environment/providers/github_actions.rbs +5 -0
  46. data/sig/datadog/ci/ext/environment/providers.rbs +1 -1
  47. data/sig/datadog/ci/ext/transport.rbs +8 -0
  48. data/sig/datadog/ci/recorder.rbs +20 -8
  49. data/sig/datadog/ci/span.rbs +35 -0
  50. data/sig/datadog/ci/test.rbs +7 -0
  51. data/sig/datadog/ci/test_visibility/transport.rbs +7 -11
  52. data/sig/datadog/ci/transport/api/base.rbs +21 -0
  53. data/sig/datadog/ci/transport/api/builder.rbs +12 -0
  54. data/sig/datadog/ci/transport/api/ci_test_cycle.rbs +21 -0
  55. data/sig/datadog/ci/transport/api/evp_proxy.rbs +19 -0
  56. data/sig/datadog/ci/transport/http.rbs +12 -37
  57. data/sig/datadog/ci/utils/url.rbs +9 -0
  58. data/sig/datadog/ci.rbs +15 -3
  59. metadata +21 -3
@@ -8,6 +8,10 @@ module Datadog
8
8
  class Base
9
9
  attr_reader :env
10
10
 
11
+ def self.handles?(_env)
12
+ false
13
+ end
14
+
11
15
  def initialize(env)
12
16
  @env = env
13
17
  end
@@ -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
- "#{env["GITHUB_SERVER_URL"]}/#{env["GITHUB_REPOSITORY"]}/commit/#{env["GITHUB_SHA"]}/checks"
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 = "#{env["GITHUB_SERVER_URL"]}/#{env["GITHUB_REPOSITORY"]}/actions/runs/#{env["GITHUB_RUN_ID"]}"
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
- "#{env["GITHUB_SERVER_URL"]}/#{env["GITHUB_REPOSITORY"]}.git"
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" => env["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
- ["APPVEYOR", Providers::Appveyor],
28
- ["TF_BUILD", Providers::Azure],
29
- ["BITBUCKET_COMMIT", Providers::Bitbucket],
30
- ["BITRISE_BUILD_SLUG", Providers::Bitrise],
31
- ["BUDDY", Providers::Buddy],
32
- ["BUILDKITE", Providers::Buildkite],
33
- ["CIRCLECI", Providers::Circleci],
34
- ["CF_BUILD_ID", Providers::Codefresh],
35
- ["GITHUB_SHA", Providers::GithubActions],
36
- ["GITLAB_CI", Providers::Gitlab],
37
- ["JENKINS_URL", Providers::Jenkins],
38
- ["TEAMCITY_VERSION", Providers::Teamcity],
39
- ["TRAVIS", Providers::Travis]
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
- _, provider_klass = PROVIDERS.find { |provider_env_var, _| env.key?(provider_env_var) }
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
 
@@ -1,82 +1,118 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "datadog/tracing"
4
- require "datadog/tracing/contrib/analytics"
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
- require "rbconfig"
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
- module Recorder
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 self.trace(span_name, options = {})
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
- }.merge(options[:span_options] || {})
33
+ }
34
+
35
+ tags[Ext::Test::TAG_NAME] = test_name
21
36
 
22
- if block_given?
23
- ::Datadog::Tracing.trace(span_name, **span_options) do |span, trace|
24
- set_tags!(trace, span, options)
25
- yield(span, trace)
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
- span = ::Datadog::Tracing.trace(span_name, **span_options)
29
- trace = ::Datadog::Tracing.active_trace
30
- set_tags!(trace, span, options)
31
- span
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
- # Adds tags to a CI test span.
36
- def self.set_tags!(trace, span, tags = {})
37
- tags ||= {}
38
-
39
- # Set default tags
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
- # Set environment tags
45
- @environment_tags ||= Ext::Environment.tags(ENV)
46
- @environment_tags.each { |k, v| span.set_tag(k, v) }
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
- # Set contextual tags
49
- span.set_tag(Ext::Test::TAG_FRAMEWORK, tags[:framework]) if tags[:framework]
50
- span.set_tag(Ext::Test::TAG_FRAMEWORK_VERSION, tags[:framework_version]) if tags[:framework_version]
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
- set_environment_runtime_tags!(span)
76
+ def active_test
77
+ @local_context.active_test
78
+ end
56
79
 
57
- span
80
+ def deactivate_test(test)
81
+ @local_context.deactivate_test!(test)
58
82
  end
59
83
 
60
- def self.passed!(span)
61
- span.set_tag(Ext::Test::TAG_STATUS, Ext::Test::Status::PASS)
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
- def self.failed!(span, exception = nil)
65
- span.status = 1
66
- span.set_tag(Ext::Test::TAG_STATUS, Ext::Test::Status::FAIL)
67
- span.set_error(exception) unless exception.nil?
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 self.skipped!(span, exception = nil)
71
- span.set_tag(Ext::Test::TAG_STATUS, Ext::Test::Status::SKIP)
72
- span.set_error(exception) unless exception.nil?
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
- private_class_method def self.set_environment_runtime_tags!(span)
76
- span.set_tag(Ext::Test::TAG_OS_ARCHITECTURE, ::RbConfig::CONFIG["host_cpu"])
77
- span.set_tag(Ext::Test::TAG_OS_PLATFORM, ::RbConfig::CONFIG["host_os"])
78
- span.set_tag(Ext::Test::TAG_RUNTIME_NAME, Core::Environment::Ext::LANG_ENGINE)
79
- span.set_tag(Ext::Test::TAG_RUNTIME_VERSION, Core::Environment::Ext::ENGINE_VERSION)
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
- :api_key,
22
+ :api,
24
23
  :max_payload_size,
25
- :http,
26
- :env
24
+ :dd_env
27
25
 
28
26
  def initialize(
29
- api_key:,
30
- url:,
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
- @env = env
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
- http.request(
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 = env ? 4 : 3
126
+ metadata_fields_count = dd_env ? 4 : 3
145
127
  packer.write_map_header(metadata_fields_count)
146
128
 
147
- if env
129
+ if dd_env
148
130
  packer.write("env")
149
- packer.write(env)
131
+ packer.write(dd_env)
150
132
  end
151
133
 
152
134
  packer.write("runtime-id")