From 01ba6abc7966543c8bff155a7b387af44e5d0271 Mon Sep 17 00:00:00 2001 From: Mashhur <99575341+mashhurs@users.noreply.github.com> Date: Thu, 13 Mar 2025 10:03:07 -0700 Subject: [PATCH 1/3] Upgrade elasticsearch-ruby client. (#17161) * Upgrade elasticsearch-ruby client. * Fix Faraday removed basic auth option and apply the ES client module name change. (cherry picked from commit e748488e4a5cdc196e11f2e3071c0ccfa6ce7971) --- Gemfile.template | 1 - logstash-core/logstash-core.gemspec | 4 ++-- logstash-core/spec/logstash/webserver_spec.rb | 4 ++-- qa/integration/specs/dlq_spec.rb | 4 ++-- x-pack/qa/integration/management/multiple_pipelines_spec.rb | 2 +- .../monitoring/es_documents_structure_validation_spec.rb | 4 ++-- x-pack/qa/integration/support/helpers.rb | 2 +- x-pack/qa/integration/support/shared_examples.rb | 4 ++-- 8 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Gemfile.template b/Gemfile.template index b773f7a0430..40e86ddecc3 100644 --- a/Gemfile.template +++ b/Gemfile.template @@ -12,7 +12,6 @@ gem "ruby-progressbar", "~> 1", require: false gem "ruby-maven-libs", "~> 3", ">= 3.9.6.1" gem "polyglot", require: false gem "treetop", require: false -gem "faraday", "~> 1", :require => false # due elasticsearch-transport (elastic-transport) depending faraday '~> 1' gem "minitar", "~> 1", :group => :build gem "childprocess", "~> 4", :group => :build gem "fpm", "~> 1", ">= 1.14.1", :group => :build # compound due to bugfix https://github.com/jordansissel/fpm/pull/1856 diff --git a/logstash-core/logstash-core.gemspec b/logstash-core/logstash-core.gemspec index bb1a043e189..43b4258974d 100644 --- a/logstash-core/logstash-core.gemspec +++ b/logstash-core/logstash-core.gemspec @@ -39,7 +39,7 @@ Gem::Specification.new do |gem| gem.email = ["info@elastic.co"] gem.description = %q{The core components of logstash, the scalable log and event management tool} gem.summary = %q{logstash-core - The core components of logstash} - gem.homepage = "http://www.elastic.co/guide/en/logstash/current/index.html" + gem.homepage = "https://www.elastic.co/logstash" gem.license = "Apache-2.0" gem.files = Dir.glob( @@ -78,7 +78,7 @@ Gem::Specification.new do |gem| gem.add_runtime_dependency "jrjackson", "= #{ALL_VERSIONS.fetch('jrjackson')}" #(Apache 2.0 license) - gem.add_runtime_dependency "elasticsearch", '~> 7' + gem.add_runtime_dependency "elasticsearch", '~> 8' gem.add_runtime_dependency "manticore", '~> 0.6' # xpack geoip database service diff --git a/logstash-core/spec/logstash/webserver_spec.rb b/logstash-core/spec/logstash/webserver_spec.rb index e766be329be..18b9ce42ea3 100644 --- a/logstash-core/spec/logstash/webserver_spec.rb +++ b/logstash-core/spec/logstash/webserver_spec.rb @@ -189,7 +189,7 @@ def free_ports(servers) context "and invalid basic auth is provided" do it 'emits an HTTP 401 with WWW-Authenticate header' do response = Faraday.new("http://#{api_host}:#{webserver.port}") do |conn| - conn.request :basic_auth, 'john-doe', 'open-sesame' + conn.request :authorization, :basic, 'john-doe', 'open-sesame' end.get('/') aggregate_failures do expect(response.status).to eq(401) @@ -200,7 +200,7 @@ def free_ports(servers) context "and valid auth is provided" do it "returns a relevant response" do response = Faraday.new("http://#{api_host}:#{webserver.port}") do |conn| - conn.request :basic_auth, 'a-user', 's3cur3dPas!' + conn.request :authorization, :basic, 'a-user', 's3cur3dPas!' end.get('/') aggregate_failures do expect(response.status).to eq(200) diff --git a/qa/integration/specs/dlq_spec.rb b/qa/integration/specs/dlq_spec.rb index 965b39d0c07..db1879d5f57 100644 --- a/qa/integration/specs/dlq_spec.rb +++ b/qa/integration/specs/dlq_spec.rb @@ -83,10 +83,10 @@ try(60) do begin result = es_client.search(index: 'test-index', size: 0, q: '*') - rescue Elasticsearch::Transport::Transport::Errors::ServiceUnavailable => e + rescue Elastic::Transport::Transport::Errors::ServiceUnavailable => e puts "Elasticsearch unavailable #{e.inspect}" hits = 0 - rescue Elasticsearch::Transport::Transport::Errors::NotFound => e + rescue Elastic::Transport::Transport::Errors::NotFound => e puts "Index not found" hits = 0 end diff --git a/x-pack/qa/integration/management/multiple_pipelines_spec.rb b/x-pack/qa/integration/management/multiple_pipelines_spec.rb index 0511da0bfac..c678a23deae 100644 --- a/x-pack/qa/integration/management/multiple_pipelines_spec.rb +++ b/x-pack/qa/integration/management/multiple_pipelines_spec.rb @@ -137,7 +137,7 @@ def count_hashes(pipelines) begin res = elasticsearch_client.search(index: '.monitoring-logstash-*', body: query) - rescue Elasticsearch::Transport::Transport::Errors::ServiceUnavailable + rescue Elastic::Transport::Transport::Errors::ServiceUnavailable return nil end diff --git a/x-pack/qa/integration/monitoring/es_documents_structure_validation_spec.rb b/x-pack/qa/integration/monitoring/es_documents_structure_validation_spec.rb index 9b3c31057cb..e8bd42f1fd5 100644 --- a/x-pack/qa/integration/monitoring/es_documents_structure_validation_spec.rb +++ b/x-pack/qa/integration/monitoring/es_documents_structure_validation_spec.rb @@ -19,8 +19,8 @@ let(:retryable_errors) do [NoMethodError, RSpec::Expectations::ExpectationNotMetError, - Elasticsearch::Transport::Transport::Errors::ServiceUnavailable, - Elasticsearch::Transport::Transport::Errors::NotFound] + Elastic::Transport::Transport::Errors::ServiceUnavailable, + Elastic::Transport::Transport::Errors::NotFound] end describe "metrics" do diff --git a/x-pack/qa/integration/support/helpers.rb b/x-pack/qa/integration/support/helpers.rb index a216d1cd8d4..0122b8dbab1 100644 --- a/x-pack/qa/integration/support/helpers.rb +++ b/x-pack/qa/integration/support/helpers.rb @@ -124,7 +124,7 @@ def cleanup_system_indices(pipeline_ids) pipeline_ids.each do |id| begin elasticsearch_client.perform_request(:delete, "_logstash/pipeline/#{id}") - rescue Elasticsearch::Transport::Transport::Errors::NotFound => e + rescue Elastic::Transport::Transport::Errors::NotFound => e puts ".logstash can be empty #{e.message}" end end diff --git a/x-pack/qa/integration/support/shared_examples.rb b/x-pack/qa/integration/support/shared_examples.rb index 5c8a54f00f3..e3890339608 100644 --- a/x-pack/qa/integration/support/shared_examples.rb +++ b/x-pack/qa/integration/support/shared_examples.rb @@ -9,8 +9,8 @@ let(:retryable_errors) do [NoMethodError, RSpec::Expectations::ExpectationNotMetError, - Elasticsearch::Transport::Transport::Errors::ServiceUnavailable, - Elasticsearch::Transport::Transport::Errors::NotFound] + Elastic::Transport::Transport::Errors::ServiceUnavailable, + Elastic::Transport::Transport::Errors::NotFound] end describe "metrics" do From f7b8d29ba13e23b34a958cfa09472ffce084860c Mon Sep 17 00:00:00 2001 From: Mashhur Date: Thu, 13 Mar 2025 12:06:07 -0700 Subject: [PATCH 2/3] Apply the required changes in elasticsearch_client.rb after upgrading the elasticsearch-ruby client to 8.x --- logstash-core/lib/logstash/elasticsearch_client.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/logstash-core/lib/logstash/elasticsearch_client.rb b/logstash-core/lib/logstash/elasticsearch_client.rb index 7a79efa1666..cc49485d78e 100644 --- a/logstash-core/lib/logstash/elasticsearch_client.rb +++ b/logstash-core/lib/logstash/elasticsearch_client.rb @@ -16,7 +16,7 @@ # under the License. require "elasticsearch" -require "elasticsearch/transport/transport/http/manticore" +require "elastic/transport/transport/http/manticore" require 'logstash/util/manticore_ssl_config_helper' require 'logstash/util/password' @@ -24,7 +24,7 @@ module LogStash class ElasticsearchClient include LogStash::Util::Loggable class Response - # duplicated here from Elasticsearch::Transport::Transport::Response + # duplicated here from Elastic::Transport::Transport::Response # to create a normalised response across different client IMPL attr_reader :status, :body, :headers @@ -65,8 +65,10 @@ def initialize(settings, logger) def can_connect? begin head(SecureRandom.hex(32).prepend('_')) - rescue Elasticsearch::Transport::Transport::Errors::BadRequest + rescue Elastic::Transport::Transport::Errors::BadRequest true + rescue Elastic::Transport::Transport::Errors::Unauthorized + false rescue Manticore::SocketException false end @@ -116,7 +118,7 @@ def normalize_response(response) def client_args { - :transport_class => Elasticsearch::Transport::Transport::HTTP::Manticore, + :transport_class => Elastic::Transport::Transport::HTTP::Manticore, :hosts => [*unpack_hosts], # :logger => @logger, # silence the client logging } From 4e62dd0d95d2b2be498b38dc1a2a2b7fbab4f729 Mon Sep 17 00:00:00 2001 From: Mashhur Date: Thu, 13 Mar 2025 13:53:32 -0700 Subject: [PATCH 3/3] Swallow the exception and make non-connectable client when ES client raises connection refuses exception. --- logstash-core/lib/logstash/elasticsearch_client.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/logstash-core/lib/logstash/elasticsearch_client.rb b/logstash-core/lib/logstash/elasticsearch_client.rb index cc49485d78e..27e9978613f 100644 --- a/logstash-core/lib/logstash/elasticsearch_client.rb +++ b/logstash-core/lib/logstash/elasticsearch_client.rb @@ -68,7 +68,10 @@ def can_connect? rescue Elastic::Transport::Transport::Errors::BadRequest true rescue Elastic::Transport::Transport::Errors::Unauthorized - false + true + rescue Exception => e + return true if e.message.include?('Connection refused') + raise e rescue Manticore::SocketException false end