diff --git a/lib/datadog/core.rb b/lib/datadog/core.rb index f3903a7eaea..d50e5ac66b2 100644 --- a/lib/datadog/core.rb +++ b/lib/datadog/core.rb @@ -20,6 +20,10 @@ module Core rescue LoadError => e e.message end + + def self.ddsketch_supported? + LIBDATADOG_API_FAILURE.nil? + end end DATADOG_ENV = Core::Configuration::ConfigHelper.new diff --git a/lib/datadog/core/ddsketch.rb b/lib/datadog/core/ddsketch.rb index 834d2b61b85..610060387a0 100644 --- a/lib/datadog/core/ddsketch.rb +++ b/lib/datadog/core/ddsketch.rb @@ -2,18 +2,16 @@ module Datadog module Core - # Used to access ddsketch APIs. - # APIs in this class are implemented as native code. - class DDSketch - def self.supported? - Datadog::Core::LIBDATADOG_API_FAILURE.nil? - end - - def initialize - unless self.class.supported? - raise(ArgumentError, "DDSketch is not supported: #{Datadog::Core::LIBDATADOG_API_FAILURE}") - end - end - end + # Datadog::Core::DDSketch is defined completely in the native extension. + # Do not define it here (for example, as an empty class) because we don't + # want to be able to create instances of the empty stub class if the + # native extension is missing or failed to load. + # + # Use Core.ddsketch_supported? to determine if DDSketch class exists and + # is usable. + # + # See https://github.com/datadog/dd-trace-rb/pull/5008 and + # https://github.com/DataDog/dd-trace-rb/pull/4901 for the background on + # dependency issues with DDSketch. end end diff --git a/lib/datadog/data_streams/processor.rb b/lib/datadog/data_streams/processor.rb index c5f1090d675..4f98310565a 100644 --- a/lib/datadog/data_streams/processor.rb +++ b/lib/datadog/data_streams/processor.rb @@ -6,7 +6,6 @@ require_relative '../version' require_relative '../core/worker' require_relative '../core/workers/polling' -require_relative '../core/ddsketch' require_relative '../core/buffer/cruby' require_relative '../core/utils/time' @@ -39,7 +38,7 @@ class Processor < Core::Worker # (default: DEFAULT_BUFFER_SIZE). Higher values support more throughput but use more memory. # @raise [UnsupportedError] if DDSketch is not available on this platform def initialize(interval:, logger:, settings:, agent_settings:, buffer_size: DEFAULT_BUFFER_SIZE) - raise UnsupportedError, 'DDSketch is not supported' unless Datadog::Core::DDSketch.supported? + raise UnsupportedError, 'DDSketch is not supported' unless Datadog::Core.ddsketch_supported? @settings = settings @agent_settings = agent_settings diff --git a/sig/datadog/core.rbs b/sig/datadog/core.rbs index 3f7165f213d..f11f01080f6 100644 --- a/sig/datadog/core.rbs +++ b/sig/datadog/core.rbs @@ -2,5 +2,7 @@ module Datadog module Core LIBDATADOG_API_FAILURE: ::String? extend Core::Deprecations + + def self.ddsketch_supported?: () -> bool end end diff --git a/sig/datadog/core/ddsketch.rbs b/sig/datadog/core/ddsketch.rbs index bb24c2bf041..91e9140c605 100644 --- a/sig/datadog/core/ddsketch.rbs +++ b/sig/datadog/core/ddsketch.rbs @@ -1,8 +1,6 @@ module Datadog module Core class DDSketch - def self.supported?: () -> bool - # Adds a single point to the sketch # @param point [::Numeric] The value to add to the sketch # @return [true] Always returns true on success, raises RuntimeError on failure diff --git a/spec/datadog/core/ddsketch_spec.rb b/spec/datadog/core/ddsketch_spec.rb index edb928cf7b5..bca6742b467 100644 --- a/spec/datadog/core/ddsketch_spec.rb +++ b/spec/datadog/core/ddsketch_spec.rb @@ -1,18 +1,6 @@ -require 'datadog/core' -require 'datadog/core/ddsketch' require 'datadog/core/ddsketch_pprof/ddsketch_pb' RSpec.describe Datadog::Core::DDSketch do - context 'when DDSketch is not supported' do - before do - stub_const('Datadog::Core::LIBDATADOG_API_FAILURE', 'Example error loading libdatadog_api') - end - - it 'raises an error' do - expect { described_class.new }.to raise_error(ArgumentError, 'DDSketch is not supported: Example error loading libdatadog_api') - end - end - context 'when DDSketch is supported' do subject(:sketch) { described_class.new } diff --git a/spec/datadog/data_streams/processor_spec.rb b/spec/datadog/data_streams/processor_spec.rb index 52e205e6ea7..0bec97079d9 100644 --- a/spec/datadog/data_streams/processor_spec.rb +++ b/spec/datadog/data_streams/processor_spec.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true -require 'datadog/core' require 'datadog/data_streams/processor' -require 'datadog/core/ddsketch' require_relative 'spec_helper' # Expected deterministic hash values for specific pathways (with manual_checkpoint: false) diff --git a/spec/datadog/data_streams/spec_helper.rb b/spec/datadog/data_streams/spec_helper.rb index ee4acb0b184..54ae6bd1a44 100644 --- a/spec/datadog/data_streams/spec_helper.rb +++ b/spec/datadog/data_streams/spec_helper.rb @@ -14,7 +14,7 @@ def skip_if_data_streams_not_supported(testcase) ) end - return if Datadog::Core::DDSketch.supported? + return if Datadog::Core.ddsketch_supported? # Ensure DDSketch was loaded correctly raise "DDSketch does not seem to be available: #{Datadog::Core::LIBDATADOG_API_FAILURE}. " \ diff --git a/spec/datadog/tracing/contrib/kafka/data_streams_spec.rb b/spec/datadog/tracing/contrib/kafka/data_streams_spec.rb index 5c41900bfad..d1ee02c1aa4 100644 --- a/spec/datadog/tracing/contrib/kafka/data_streams_spec.rb +++ b/spec/datadog/tracing/contrib/kafka/data_streams_spec.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true require 'datadog/tracing/contrib/support/spec_helper' -require 'datadog/core' -require 'datadog/core/ddsketch' require 'datadog/data_streams/spec_helper' require 'ostruct' require 'datadog/tracing/contrib/kafka/integration' diff --git a/spec/datadog/tracing/contrib/karafka/data_streams_spec.rb b/spec/datadog/tracing/contrib/karafka/data_streams_spec.rb index 5d4db387dde..d7fce2018f3 100644 --- a/spec/datadog/tracing/contrib/karafka/data_streams_spec.rb +++ b/spec/datadog/tracing/contrib/karafka/data_streams_spec.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true require 'datadog/tracing/contrib/support/spec_helper' -require 'datadog/core' -require 'datadog/core/ddsketch' require 'datadog/data_streams/spec_helper' require 'karafka' require 'ostruct'