From 4e78d3d06c35545552ac9e2a1118b2c14e8ae226 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 24 Jul 2024 12:37:24 +0200 Subject: [PATCH] patch Core::Telemetry::Http::Adapters::Net to avoid WebMock automatically --- lib/datadog/ci/configuration/components.rb | 6 ++++ lib/datadog/ci/transport/adapters/net.rb | 11 ++------ .../ci/transport/adapters/net_http_client.rb | 17 +++++++++++ .../telemetry_webmock_safe_adapter.rb | 28 +++++++++++++++++++ sig/datadog/ci/transport/adapters/net.rbs | 4 --- .../ci/transport/adapters/net_http_client.rbs | 11 ++++++++ .../telemetry_webmock_safe_adapter.rbs | 15 ++++++++++ 7 files changed, 79 insertions(+), 13 deletions(-) create mode 100644 lib/datadog/ci/transport/adapters/net_http_client.rb create mode 100644 lib/datadog/ci/transport/adapters/telemetry_webmock_safe_adapter.rb create mode 100644 sig/datadog/ci/transport/adapters/net_http_client.rbs create mode 100644 sig/datadog/ci/transport/adapters/telemetry_webmock_safe_adapter.rbs diff --git a/lib/datadog/ci/configuration/components.rb b/lib/datadog/ci/configuration/components.rb index 381738a4..b0b8df78 100644 --- a/lib/datadog/ci/configuration/components.rb +++ b/lib/datadog/ci/configuration/components.rb @@ -2,6 +2,7 @@ require "datadog/core/environment/identity" require "datadog/core/telemetry/ext" +require "datadog/core/telemetry/http/adapters/net" require_relative "../ext/settings" require_relative "../git/tree_uploader" @@ -14,6 +15,7 @@ require_relative "../test_visibility/serializers/factories/test_level" require_relative "../test_visibility/serializers/factories/test_suite_level" require_relative "../test_visibility/transport" +require_relative "../transport/adapters/telemetry_webmock_safe_adapter" require_relative "../transport/api/builder" require_relative "../transport/remote_settings_api" require_relative "../utils/identity" @@ -262,8 +264,12 @@ def configure_telemetry(settings) # patch gem's identity to report datadog-ci library version instead of datadog gem version Core::Environment::Identity.include(CI::Utils::Identity) + # patch gem's telemetry transport layer to use Net::HTTP instead of WebMock's Net::HTTP + Core::Telemetry::Http::Adapters::Net.include(CI::Transport::Adapters::TelemetryWebmockSafeAdapter) + # REMOVE BEFORE SUBMITTING FOR REVIEW # settings.telemetry.agentless_enabled = true + # settings.telemetry.shutdown_timeout_seconds = 60 end def timecop? diff --git a/lib/datadog/ci/transport/adapters/net.rb b/lib/datadog/ci/transport/adapters/net.rb index 087a5c95..827fc5ae 100644 --- a/lib/datadog/ci/transport/adapters/net.rb +++ b/lib/datadog/ci/transport/adapters/net.rb @@ -3,6 +3,7 @@ require "datadog/core/transport/response" require "datadog/core/transport/ext" +require_relative "net_http_client" require_relative "../gzip" require_relative "../../ext/transport" @@ -26,7 +27,7 @@ def initialize(hostname:, port:, ssl:, timeout_seconds:) end def open(&block) - req = net_http_client.new(hostname, port) + req = NetHttpClient.original_net_http.new(hostname, port) req.use_ssl = ssl req.open_timeout = req.read_timeout = timeout @@ -123,14 +124,6 @@ def inspect "#{super}, http_response:#{http_response}" end end - - private - - def net_http_client - return ::Net::HTTP unless defined?(WebMock::HttpLibAdapters::NetHttpAdapter::OriginalNetHTTP) - - WebMock::HttpLibAdapters::NetHttpAdapter::OriginalNetHTTP - end end end end diff --git a/lib/datadog/ci/transport/adapters/net_http_client.rb b/lib/datadog/ci/transport/adapters/net_http_client.rb new file mode 100644 index 00000000..0b020807 --- /dev/null +++ b/lib/datadog/ci/transport/adapters/net_http_client.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module Datadog + module CI + module Transport + module Adapters + module NetHttpClient + def self.original_net_http + return ::Net::HTTP unless defined?(WebMock::HttpLibAdapters::NetHttpAdapter::OriginalNetHTTP) + + WebMock::HttpLibAdapters::NetHttpAdapter::OriginalNetHTTP + end + end + end + end + end +end diff --git a/lib/datadog/ci/transport/adapters/telemetry_webmock_safe_adapter.rb b/lib/datadog/ci/transport/adapters/telemetry_webmock_safe_adapter.rb new file mode 100644 index 00000000..02f2a64c --- /dev/null +++ b/lib/datadog/ci/transport/adapters/telemetry_webmock_safe_adapter.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +require_relative "net_http_client" + +module Datadog + module CI + module Transport + module Adapters + module TelemetryWebmockSafeAdapter + def self.included(base) + base.prepend(InstanceMethods) + end + + module InstanceMethods + def open(&block) + req = NetHttpClient.original_net_http.new(@hostname, @port) + + req.use_ssl = @ssl + req.open_timeout = req.read_timeout = @timeout + + req.start(&block) + end + end + end + end + end + end +end diff --git a/sig/datadog/ci/transport/adapters/net.rbs b/sig/datadog/ci/transport/adapters/net.rbs index de93ed99..608425b2 100644 --- a/sig/datadog/ci/transport/adapters/net.rbs +++ b/sig/datadog/ci/transport/adapters/net.rbs @@ -58,10 +58,6 @@ module Datadog def inspect: () -> ::String end - - private - - def net_http_client: () -> singleton(::Net::HTTP) end end end diff --git a/sig/datadog/ci/transport/adapters/net_http_client.rbs b/sig/datadog/ci/transport/adapters/net_http_client.rbs new file mode 100644 index 00000000..1ec06e96 --- /dev/null +++ b/sig/datadog/ci/transport/adapters/net_http_client.rbs @@ -0,0 +1,11 @@ +module Datadog + module CI + module Transport + module Adapters + module NetHttpClient + def self.original_net_http: () -> singleton(Net::HTTP) + end + end + end + end +end diff --git a/sig/datadog/ci/transport/adapters/telemetry_webmock_safe_adapter.rbs b/sig/datadog/ci/transport/adapters/telemetry_webmock_safe_adapter.rbs new file mode 100644 index 00000000..46f764df --- /dev/null +++ b/sig/datadog/ci/transport/adapters/telemetry_webmock_safe_adapter.rbs @@ -0,0 +1,15 @@ +module Datadog + module CI + module Transport + module Adapters + module TelemetryWebmockSafeAdapter + def self.included: (untyped base) -> untyped + + module InstanceMethods : Datadog::Core::Telemetry::Http::Adapters::Net + def open: () { (?) -> untyped } -> untyped + end + end + end + end + end +end