Skip to content

Commit

Permalink
the concept of test visibility API builder is being born
Browse files Browse the repository at this point in the history
  • Loading branch information
anmarchenko committed Feb 14, 2024
1 parent be2a61a commit 547ea48
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 32 deletions.
73 changes: 43 additions & 30 deletions lib/datadog/ci/configuration/components.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,18 +32,7 @@ def initialize(settings)
end

def activate_ci!(settings)
test_visibility_transport = nil
agent_settings = Datadog::Core::Configuration::AgentSettingsResolver.call(settings)

if settings.ci.agentless_mode_enabled
check_dd_site(settings)
test_visibility_transport = build_agentless_transport(settings)
elsif can_use_evp_proxy?(settings, agent_settings)
test_visibility_transport = build_evp_proxy_transport(settings, agent_settings)
else
settings.ci.force_test_level_visibility = true
end

# Configure ddtrace library for CI visibility mode
# Deactivate telemetry
settings.telemetry.enabled = false

Expand All @@ -60,9 +49,18 @@ def activate_ci!(settings)
# Choose user defined TraceFlush or default to CI TraceFlush
settings.tracing.test_mode.trace_flush = settings.ci.trace_flush || CI::TestVisibility::Flush::Partial.new

# transport creation

test_visibility_api = build_test_visibility_api(settings)

writer_options = settings.ci.writer_options
if test_visibility_transport
writer_options[:transport] = test_visibility_transport

if test_visibility_api
writer_options[:transport] = Datadog::CI::TestVisibility::Transport.new(
api: test_visibility_api,
serializers_factory: serializers_factory(settings),
dd_env: settings.env
)
writer_options[:shutdown_timeout] = 60
writer_options[:buffer_size] = 10_000

Expand All @@ -71,18 +69,41 @@ def activate_ci!(settings)

settings.tracing.test_mode.writer_options = writer_options

# CI visibility recorder global instance
@ci_recorder = TestVisibility::Recorder.new(
test_suite_level_visibility_enabled: !settings.ci.force_test_level_visibility
)
end

def can_use_evp_proxy?(settings, agent_settings)
Datadog::Core::Remote::Negotiation.new(settings, agent_settings).endpoint?(
Ext::Transport::EVP_PROXY_PATH_PREFIX
)
def build_test_visibility_api(settings)
if settings.ci.agentless_mode_enabled
check_dd_site(settings)

build_agentless_api(settings)
else
agent_settings = Datadog::Core::Configuration::AgentSettingsResolver.call(settings)
negotiation = Datadog::Core::Remote::Negotiation.new(settings)

if can_use_evp_proxy_v4?(negotiation)
build_evp_proxy_v2_api(agent_settings)
elsif can_use_evp_proxy_v2?(negotiation)
build_evp_proxy_v2_api(agent_settings)
else
settings.ci.force_test_level_visibility = true
nil
end
end
end

def can_use_evp_proxy_v4?(negotiation)
negotiation.endpoint?(Ext::Transport::EVP_PROXY_V4_PATH_PREFIX)
end

def build_agentless_transport(settings)
def can_use_evp_proxy_v2?(negotiation)
negotiation.endpoint?(Ext::Transport::EVP_PROXY_V2_PATH_PREFIX)
end

def build_agentless_api(settings)
if settings.api_key.nil?
# agentless mode is requested but no API key is provided -
# we cannot continue and log an error
Expand All @@ -100,22 +121,14 @@ def build_agentless_transport(settings)
else
Datadog.logger.debug("CI visibility configured to use agentless transport")

Datadog::CI::TestVisibility::Transport.new(
api: Transport::Api::Builder.build_ci_test_cycle_api(settings),
serializers_factory: serializers_factory(settings),
dd_env: settings.env
)
Transport::Api::Builder.build_ci_test_cycle_api(settings)
end
end

def build_evp_proxy_transport(settings, agent_settings)
def build_evp_proxy_v2_api(agent_settings)
Datadog.logger.debug("CI visibility configured to use agent transport via EVP proxy")

Datadog::CI::TestVisibility::Transport.new(
api: Transport::Api::Builder.build_evp_proxy_api(agent_settings),
serializers_factory: serializers_factory(settings),
dd_env: settings.env
)
Transport::Api::Builder.build_evp_proxy_api(agent_settings)
end

def serializers_factory(settings)
Expand Down
3 changes: 2 additions & 1 deletion lib/datadog/ci/ext/transport.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ module Transport
HEADER_EVP_SUBDOMAIN = "X-Datadog-EVP-Subdomain"
HEADER_CONTAINER_ID = "Datadog-Container-ID"

EVP_PROXY_PATH_PREFIX = "/evp_proxy/v2/"
EVP_PROXY_V2_PATH_PREFIX = "/evp_proxy/v2/"
EVP_PROXY_V4_PATH_PREFIX = "/evp_proxy/v4/"
TEST_VISIBILITY_INTAKE_HOST_PREFIX = "citestcycle-intake"
TEST_VISIBILITY_INTAKE_PATH = "/api/v2/citestcycle"

Expand Down
4 changes: 3 additions & 1 deletion sig/datadog/ci/ext/transport.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ module Datadog

HEADER_CONTAINER_ID: "Datadog-Container-ID"

EVP_PROXY_PATH_PREFIX: "/evp_proxy/v2/"
EVP_PROXY_V2_PATH_PREFIX: "/evp_proxy/v2/"

EVP_PROXY_V4_PATH_PREFIX: "/evp_proxy/v4/"

TEST_VISIBILITY_INTAKE_HOST_PREFIX: "citestcycle-intake"

Expand Down

0 comments on commit 547ea48

Please sign in to comment.