diff --git a/lib/datadog/ci/contrib/cucumber/formatter.rb b/lib/datadog/ci/contrib/cucumber/formatter.rb index 0efe4153..81a21273 100644 --- a/lib/datadog/ci/contrib/cucumber/formatter.rb +++ b/lib/datadog/ci/contrib/cucumber/formatter.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require "json" - require_relative "../../ext/test" require_relative "../../utils/git" require_relative "ext" @@ -66,18 +64,18 @@ def on_test_case_started(event) CI::Ext::Test::TAG_SOURCE_START => event.test_case.location.line.to_s } - if (parameters = extract_parameters_hash(event.test_case)) - tags[CI::Ext::Test::TAG_PARAMETERS] = JSON.generate(parameters) - end - start_test_suite(test_suite_name) unless same_test_suite_as_current?(test_suite_name) - CI.start_test( + test_span = CI.start_test( event.test_case.name, test_suite_name, tags: tags, service: configuration[:service_name] ) + + if (parameters = extract_parameters_hash(event.test_case)) + test_span.set_parameters(parameters) + end end def on_test_case_finished(event) diff --git a/lib/datadog/ci/contrib/cucumber/instrumentation.rb b/lib/datadog/ci/contrib/cucumber/instrumentation.rb index 9e98cc58..7b4a402d 100644 --- a/lib/datadog/ci/contrib/cucumber/instrumentation.rb +++ b/lib/datadog/ci/contrib/cucumber/instrumentation.rb @@ -17,8 +17,9 @@ module InstanceMethods attr_reader :datadog_formatter def formatters + existing_formatters = super @datadog_formatter ||= CI::Contrib::Cucumber::Formatter.new(@configuration) - [@datadog_formatter] + super + [@datadog_formatter] + existing_formatters end end end diff --git a/lib/datadog/ci/null_span.rb b/lib/datadog/ci/null_span.rb index e010af77..348d4ccf 100644 --- a/lib/datadog/ci/null_span.rb +++ b/lib/datadog/ci/null_span.rb @@ -55,6 +55,9 @@ def set_environment_runtime_tags def set_default_tags end + def set_parameters(arguments, metadata = {}) + end + def to_s self.class.to_s end diff --git a/lib/datadog/ci/span.rb b/lib/datadog/ci/span.rb index b038611e..6bf9dd3f 100644 --- a/lib/datadog/ci/span.rb +++ b/lib/datadog/ci/span.rb @@ -133,6 +133,25 @@ def set_default_tags tracer_span.set_tag(Ext::Test::TAG_SPAN_KIND, Ext::AppTypes::TYPE_TEST) end + # Sets the parameters for this span for parametrized tests (e.g. Cucumber examples or RSpec shared specs). + # Parameters are needed to compute test fingerprint to distinguish between different tests having same names. + # @param [Hash] arguments the arguments that test accepts as key-value hash + # @param [Hash] metadata optional metadata + # @return [void] + def set_parameters(arguments, metadata = {}) + return if arguments.nil? || arguments.empty? + + set_tag( + Ext::Test::TAG_PARAMETERS, + JSON.generate( + { + arguments: arguments, + metadata: metadata + } + ) + ) + end + def to_s "#{self.class}(name:#{name},tracer_span:#{@tracer_span})" end diff --git a/lib/datadog/ci/test.rb b/lib/datadog/ci/test.rb index de34c4db..8b9a3f99 100644 --- a/lib/datadog/ci/test.rb +++ b/lib/datadog/ci/test.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require "json" + require_relative "span" module Datadog diff --git a/sig/datadog/ci/span.rbs b/sig/datadog/ci/span.rbs index b3a7a5a0..da6e8346 100644 --- a/sig/datadog/ci/span.rbs +++ b/sig/datadog/ci/span.rbs @@ -42,6 +42,8 @@ module Datadog def set_environment_runtime_tags: () -> void def set_default_tags: () -> void + + def set_parameters: (Hash[String, Object] arguments, ?Hash[String, Object] metadata) -> void end end end diff --git a/spec/datadog/ci/contrib/cucumber/instrumentation_spec.rb b/spec/datadog/ci/contrib/cucumber/instrumentation_spec.rb index c72b32bb..1161ecb1 100644 --- a/spec/datadog/ci/contrib/cucumber/instrumentation_spec.rb +++ b/spec/datadog/ci/contrib/cucumber/instrumentation_spec.rb @@ -216,7 +216,7 @@ expect(span.get_tag(Datadog::CI::Ext::Test::TAG_NAME)).to eq("scenario with examples") expect(span.get_tag(Datadog::CI::Ext::Test::TAG_PARAMETERS)).to eq( - "{\"num1\":\"#{index}\",\"num2\":\"#{index + 1}\",\"total\":\"#{index + index + 1}\"}" + "{\"arguments\":{\"num1\":\"#{index}\",\"num2\":\"#{index + 1}\",\"total\":\"#{index + index + 1}\"},\"metadata\":{}}" ) else expect(span.get_tag(Datadog::CI::Ext::Test::TAG_NAME)).to eq( diff --git a/spec/datadog/ci/span_spec.rb b/spec/datadog/ci/span_spec.rb index 5b12e575..d8745fa5 100644 --- a/spec/datadog/ci/span_spec.rb +++ b/spec/datadog/ci/span_spec.rb @@ -228,4 +228,16 @@ expect(span.span_type).to eq("test") end end + + describe "#set_parameters" do + let(:parameters) { {"foo" => "bar", "baz" => "qux"} } + + it "sets the parameters" do + expect(tracer_span).to receive(:set_tag).with( + "test.parameters", JSON.generate({arguments: parameters, metadata: {}}) + ) + + span.set_parameters(parameters) + end + end end