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.
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")