From 1ab459cdca052848fbcb93ec98179dd37547f53b Mon Sep 17 00:00:00 2001 From: Andrey Marchenko Date: Tue, 21 Nov 2023 13:35:32 +0100 Subject: [PATCH] wip test session to squash --- lib/datadog/ci/context/global.rb | 34 +++++++++++++++++++ lib/datadog/ci/ext/app_types.rb | 1 + lib/datadog/ci/recorder.rb | 31 +++++++++++++++++ lib/datadog/ci/test.rb | 1 - lib/datadog/ci/test_session.rb | 19 +++++++++++ .../ci/test_visibility/serializers/test_v1.rb | 2 +- sig/datadog/ci/ext/app_types.rbs | 3 +- sig/datadog/ci/test_session.rbs | 6 ++++ .../test_visibility/serializers/test_v1.rbs | 2 +- 9 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 lib/datadog/ci/context/global.rb create mode 100644 lib/datadog/ci/test_session.rb create mode 100644 sig/datadog/ci/test_session.rbs diff --git a/lib/datadog/ci/context/global.rb b/lib/datadog/ci/context/global.rb new file mode 100644 index 000000000..76cb57bf2 --- /dev/null +++ b/lib/datadog/ci/context/global.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module Datadog + module CI + module Context + class Global + def initialize + @mutex = Mutex.new + @test_session = nil + end + + def activate_test_session!(test_session) + @mutex.synchronize do + raise "Nested test sessions are not supported. Currently active test session: #{@test_session}" unless @test_session.nil? + + @test_session = test_session + end + end + + def deactivate_test_session!(test_session) + @mutex.synchronize do + return if @test_session.nil? + + if @test_session == test_session + @test_session = nil + else + raise "Trying to deactivate test session #{test_session}, but currently active test session is #{@test_session}" + end + end + end + end + end + end +end diff --git a/lib/datadog/ci/ext/app_types.rb b/lib/datadog/ci/ext/app_types.rb index e83ad3c3c..f28230a76 100644 --- a/lib/datadog/ci/ext/app_types.rb +++ b/lib/datadog/ci/ext/app_types.rb @@ -5,6 +5,7 @@ module CI module Ext module AppTypes TYPE_TEST = "test" + TYPE_TEST_SESSION = "test_session_end" end end end diff --git a/lib/datadog/ci/recorder.rb b/lib/datadog/ci/recorder.rb index 0d41bd9a0..2493d715f 100644 --- a/lib/datadog/ci/recorder.rb +++ b/lib/datadog/ci/recorder.rb @@ -12,6 +12,7 @@ require_relative "span" require_relative "test" +require_relative "test_session" module Datadog module CI @@ -22,6 +23,24 @@ class Recorder def initialize @environment_tags = Ext::Environment.tags(ENV).freeze @local_context = Context::Local.new + @global_context = Context::Global.new + end + + def start_test_session(service_name: nil, tags: {}) + span_options = { + service: service_name, + span_type: Ext::AppTypes::TYPE_TEST_SESSION + } + + tracer_span = Datadog::Tracing.trace("test.session", **span_options) + trace = Datadog::Tracing.active_trace + + set_trace_origin(trace) + + test_session = build_test_session(tracer_span, tags) + @global_context.activate_test_session!(test_session) + + test_session end # Creates a new span for a CI test @@ -93,6 +112,18 @@ def set_trace_origin(trace) trace.origin = Ext::Test::CONTEXT_ORIGIN if trace end + def build_test_session(tracer_span, tags) + test_session = TestSession.new(tracer_span) + + test_session.set_default_tags + test_session.set_environment_runtime_tags + + test_session.set_tags(tags) + test_session.set_tags(environment_tags) + + test_session + end + def build_test(tracer_span, tags) test = Test.new(tracer_span) diff --git a/lib/datadog/ci/test.rb b/lib/datadog/ci/test.rb index 6cf43de22..d0cc51871 100644 --- a/lib/datadog/ci/test.rb +++ b/lib/datadog/ci/test.rb @@ -5,7 +5,6 @@ module Datadog module CI # Represents a single part of a test run. - # Could be a session, suite, test, or any custom span. # # @public_api class Test < Span diff --git a/lib/datadog/ci/test_session.rb b/lib/datadog/ci/test_session.rb new file mode 100644 index 000000000..56c220eaa --- /dev/null +++ b/lib/datadog/ci/test_session.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +require_relative "span" + +module Datadog + module CI + # Represents the whole test command process. + # This object can be shared between multiple threads. + # + # @public_api + class TestSession < Span + def initialize(tracer_span) + super + + @mutex = Mutex.new + end + end + end +end diff --git a/lib/datadog/ci/test_visibility/serializers/test_v1.rb b/lib/datadog/ci/test_visibility/serializers/test_v1.rb index c25472347..ed9fb7401 100644 --- a/lib/datadog/ci/test_visibility/serializers/test_v1.rb +++ b/lib/datadog/ci/test_visibility/serializers/test_v1.rb @@ -37,7 +37,7 @@ def content_map_size end def type - "test" + Ext::AppTypes::TYPE_TEST end def name diff --git a/sig/datadog/ci/ext/app_types.rbs b/sig/datadog/ci/ext/app_types.rbs index 8188d06c3..83cd3e79d 100644 --- a/sig/datadog/ci/ext/app_types.rbs +++ b/sig/datadog/ci/ext/app_types.rbs @@ -2,7 +2,8 @@ module Datadog module CI module Ext module AppTypes - TYPE_TEST: String + TYPE_TEST: "test" + TYPE_TEST_SESSION: "test_session_end" end end end diff --git a/sig/datadog/ci/test_session.rbs b/sig/datadog/ci/test_session.rbs new file mode 100644 index 000000000..a0d12f567 --- /dev/null +++ b/sig/datadog/ci/test_session.rbs @@ -0,0 +1,6 @@ +module Datadog + module CI + class TestSession < Span + end + end +end diff --git a/sig/datadog/ci/test_visibility/serializers/test_v1.rbs b/sig/datadog/ci/test_visibility/serializers/test_v1.rbs index a590d687c..3c3658857 100644 --- a/sig/datadog/ci/test_visibility/serializers/test_v1.rbs +++ b/sig/datadog/ci/test_visibility/serializers/test_v1.rbs @@ -11,7 +11,7 @@ module Datadog def content_fields: () -> Array[String | Hash[String, String]] def content_map_size: () -> Integer - def type: () -> "test" + def type: () -> ::String def name: () -> ::String