diff --git a/lib/datadog/tracing/contrib/elasticsearch/patcher.rb b/lib/datadog/tracing/contrib/elasticsearch/patcher.rb index 5cebc0f53b9..0b3396da445 100644 --- a/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +++ b/lib/datadog/tracing/contrib/elasticsearch/patcher.rb @@ -24,6 +24,7 @@ def patch require 'json' require_relative 'quantize' + transport_module::Client.prepend(DatadogPin) transport_module::Client.prepend(Client) end @@ -34,26 +35,8 @@ module Client # rubocop:disable Metrics/MethodLength # rubocop:disable Metrics/AbcSize def perform_request(*args) - # DEV-2.0: Remove this access, as `Client#self` in this context is not exposed to the user - # since `elasticsearch` v8.0.0. In contrast, `Client#transport` is always available across - # all `elasticsearch` gem versions and should be used instead. - service = Datadog.configuration_for(self, :service_name) - - if service - SELF_DEPRECATION_ONLY_ONCE.run do - Datadog.logger.warn( - 'Providing configuration though the Elasticsearch client object is deprecated.' \ - 'Configure the `client#transport` object instead: ' \ - 'Datadog.configure_onto(client.transport, service_name: service_name, ...)' - ) - end - end - - # `Client#transport` is most convenient object both this integration and the library - # user have shared access to across all `elasticsearch` versions. - # - # `Client#self` in this context is an internal object that the library user - # does not have access to since `elasticsearch` v8.0.0. + # `Client#transport` is the most convenient object both for this integration and the library + # as users have shared access to it across all `elasticsearch` versions. service ||= Datadog.configuration_for(transport, :service_name) || datadog_configuration[:service_name] method = args[0] @@ -144,6 +127,25 @@ def datadog_configuration # rubocop:enable Metrics/MethodLength # rubocop:enable Metrics/AbcSize + # Patch to support both `elasticsearch` and `elastic-transport` versions + module DatadogPin + def datadog_pin=(pin) + pin.onto(pin_candidate) + end + + def datadog_pin + Datadog.configuration_for(pin_candidate) + end + + def pin_candidate(candidate = self) + if candidate.respond_to?(:transport) + pin_candidate(candidate.transport) + else + candidate + end + end + end + # `Elasticsearch` namespace renamed to `Elastic` in version 8.0.0 of the transport gem: # @see https://github.com/elastic/elastic-transport-ruby/commit/ef804cbbd284f2a82d825221f87124f8b5ff823c def transport_module diff --git a/spec/datadog/tracing/contrib/elasticsearch/transport_spec.rb b/spec/datadog/tracing/contrib/elasticsearch/transport_spec.rb index b461c7b817b..6e0561e9e43 100644 --- a/spec/datadog/tracing/contrib/elasticsearch/transport_spec.rb +++ b/spec/datadog/tracing/contrib/elasticsearch/transport_spec.rb @@ -175,12 +175,12 @@ def call(env) end end - describe 'client configuration override' do + describe 'transport configuration override' do context 'when #service is overridden' do - before { Datadog.configure_onto(client.transport, service_name: service_name) } - let(:service_name) { 'bar' } + before { Datadog.configure_onto(client.transport, service_name: service_name) } + describe 'then a GET request' do subject(:response) { client.perform_request(method, path) } @@ -198,25 +198,6 @@ def call(env) expect(span.name).to eq('elasticsearch.query') expect(span.service).to eq(service_name) end - - context 'configured at the Elasticsearch client level' do - before do - skip('Configuration through client object is not possible in Elasticsearch >= 8.0.0') if version_greater_than_8 - - Datadog::Tracing::Contrib::Elasticsearch::Patcher::SELF_DEPRECATION_ONLY_ONCE - .send(:reset_ran_once_state_for_tests) - - Datadog.configure_onto(client, service_name: 'custom') - end - - let(:version_greater_than_8) { Gem::Version.new(::Elasticsearch::VERSION) >= Gem::Version.new('8.0.0') } - - it 'warns about deprecated configuration of the Elasticsearch client itself' do - expect { response }.to emit_deprecation_warning( - include('Providing configuration though the Elasticsearch client object is deprecated') - ) - end - end end end end