logstash-output-elasticsearch 11.3.1-java → 11.3.2-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dccee6612b454d47b0596a9feb04db71f51f368a34906f559b8f7a8df7cf166e
4
- data.tar.gz: 27d8ab736dd7c3ffa46d1229ad70afd5e8b23813ee09aa3e9d4ec05b4f263a76
3
+ metadata.gz: b716e89a4ab884412f633b3c0e745ab787006466a44b09ca0c20c45410603eea
4
+ data.tar.gz: '09387e7905fcb56e033cf3b9d8c2db7df3f7d11d8e4dc8e638d3e9ff570f4231'
5
5
  SHA512:
6
- metadata.gz: d7ab3e32387faf0cc2680fc1446e9a330314d2ead466487fd6f63a27ab2757cac8c2d90cb41bb0eba422986b22821d0e0c813617ba153225058b1e1d09765598
7
- data.tar.gz: df0a5b6cbcbdc592e1c18906f6a54a97d309afbbd1c36529f812501df31f78c7e4c2ba2fb8a3eab72e9fd53dfbca8388b710dc772a20ba9084c59ce1f5aa43fc
6
+ metadata.gz: df0e1ef992ead1c347ef7d528309c732092037186310623aa2b538e086c6eea5cba24bb9aa354d7deeb1718904ff1965a40b3bed2d4c5597c14a8d3f64276a58
7
+ data.tar.gz: bec8153c3242e4de19410eac06f8e1ee716df545a0d0a2d49b69023901a8b928315409d863581a16f3fb1feb6648ec623ef5f35faf6f707fea64cceddf136e6b
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 11.3.2
2
+ - Refactor: review manticore error handling/logging, logging originating cause in case of connection related error when debug level is enabled [#1029](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1029)
3
+ - Java causes on connection related exceptions will now be extra logged when plugin is logging at debug level
4
+
1
5
  ## 11.3.1
2
6
  - ECS-related fixes [#1046](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1046)
3
7
  - Data Streams requirement on ECS is properly enforced when running on Logstash 8, and warned about when running on Logstash 7.
@@ -9,10 +13,10 @@
9
13
  - Adds templates for BETA preview of ECS v8 for both Elasticsearch 7.x and 8.x
10
14
 
11
15
  ## 11.2.3
12
- - Downgrade ECS templates, pinning to v1.10.0 of upstream; fixes an issue where ECS templates cannot be installed in Elasticsearch 6.x or 7.1-7.2, since the generated templates include fields of `type: flattened` that was introduced in Elasticsearch 7.3
16
+ - Downgrade ECS templates, pinning to v1.10.0 of upstream; fixes an issue where ECS templates cannot be installed in Elasticsearch 6.x or 7.1-7.2, since the generated templates include fields of `type: flattened` that was introduced in Elasticsearch 7.3. [#1049](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1049)
13
17
 
14
18
  ## 11.2.2
15
- - Update ECS templates from upstream; `ecs_compatiblity => v1` now resolves to templates for ECS v1.12.1 [#1027](https://github.com/logstash-plugins/logstash-output-elasticsearch/issues/1027)
19
+ - Update ECS templates from upstream; `ecs_compatiblity => v1` now resolves to templates for ECS v1.12.1 [#1047](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1047). Fixes [#1027](https://github.com/logstash-plugins/logstash-output-elasticsearch/issues/1027)
16
20
 
17
21
  ## 11.2.1
18
22
  - Fix referencing Gem classes from global lexical scope [#1044](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1044)
data/docs/index.asciidoc CHANGED
@@ -117,12 +117,8 @@ output {
117
117
 
118
118
  ==== Writing to different indices: best practices
119
119
 
120
- [NOTE]
121
- ================================================================================
122
- You cannot use dynamic variable substitution when `ilm_enabled` is `true` and
123
- when using `ilm_rollover_alias`.
124
-
125
- ================================================================================
120
+ NOTE: You cannot use dynamic variable substitution when `ilm_enabled` is `true`
121
+ and when using `ilm_rollover_alias`.
126
122
 
127
123
  If you're sending events to the same Elasticsearch cluster, but you're targeting different indices you can:
128
124
 
@@ -7,9 +7,9 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
7
7
  class ManticoreAdapter
8
8
  attr_reader :manticore, :logger
9
9
 
10
- def initialize(logger, options={})
10
+ def initialize(logger, options)
11
11
  @logger = logger
12
- options = options.clone || {}
12
+ options = options.dup
13
13
  options[:ssl] = options[:ssl] || {}
14
14
 
15
15
  # We manage our own retries directly, so let's disable them here
@@ -66,23 +66,53 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
66
66
 
67
67
  request_uri = format_url(url, path)
68
68
  request_uri_as_string = remove_double_escaping(request_uri.to_s)
69
- resp = @manticore.send(method.downcase, request_uri_as_string, params)
70
-
71
- # Manticore returns lazy responses by default
72
- # We want to block for our usage, this will wait for the repsonse
73
- # to finish
74
- resp.call
69
+ begin
70
+ resp = @manticore.send(method.downcase, request_uri_as_string, params)
71
+ # Manticore returns lazy responses by default
72
+ # We want to block for our usage, this will wait for the response to finish
73
+ resp.call
74
+ rescue ::Manticore::ManticoreException => e
75
+ log_request_error(e)
76
+ raise ::LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError.new(e, request_uri_as_string)
77
+ end
75
78
 
76
79
  # 404s are excluded because they are valid codes in the case of
77
80
  # template installation. We might need a better story around this later
78
81
  # but for our current purposes this is correct
79
- if resp.code < 200 || resp.code > 299 && resp.code != 404
80
- raise ::LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError.new(resp.code, request_uri, body, resp.body)
82
+ code = resp.code
83
+ if code < 200 || code > 299 && code != 404
84
+ raise ::LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError.new(code, request_uri, body, resp.body)
81
85
  end
82
86
 
83
87
  resp
84
88
  end
85
89
 
90
+ def log_request_error(e)
91
+ details = { message: e.message, exception: e.class }
92
+ details[:cause] = e.cause if e.respond_to?(:cause)
93
+ details[:backtrace] = e.backtrace if @logger.debug?
94
+
95
+ level = case e
96
+ when ::Manticore::Timeout
97
+ :debug
98
+ when ::Manticore::UnknownException
99
+ :warn
100
+ else
101
+ :info
102
+ end
103
+
104
+ @logger.send level, "Failed to perform request", details
105
+ log_java_exception(details[:cause], :debug) if details[:cause] && @logger.debug?
106
+ end
107
+
108
+ def log_java_exception(e, level = :debug)
109
+ return unless e.is_a?(java.lang.Exception)
110
+ # @logger.name using the same convention as LS does
111
+ logger = self.class.name.gsub('::', '.').downcase
112
+ logger = org.apache.logging.log4j.LogManager.getLogger(logger)
113
+ logger.send(level, '', e) # logger.error('', e) - prints nested causes
114
+ end
115
+
86
116
  # Returned urls from this method should be checked for double escaping.
87
117
  def format_url(url, path_and_query=nil)
88
118
  request_uri = url.clone
@@ -96,9 +126,6 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
96
126
 
97
127
  parsed_path_and_query = java.net.URI.new(path_and_query)
98
128
 
99
- query = request_uri.query
100
- parsed_query = parsed_path_and_query.query
101
-
102
129
  new_query_parts = [request_uri.query, parsed_path_and_query.query].select do |part|
103
130
  part && !part.empty? # Skip empty nil and ""
104
131
  end
@@ -124,8 +151,5 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
124
151
  @manticore.close
125
152
  end
126
153
 
127
- def host_unreachable_exceptions
128
- [::Manticore::Timeout,::Manticore::SocketException, ::Manticore::ClientProtocolException, ::Manticore::ResolutionFailure, Manticore::SocketTimeout]
129
- end
130
154
  end
131
155
  end; end; end; end
@@ -8,27 +8,25 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
8
8
  attr_reader :url, :response_code, :request_body, :response_body
9
9
 
10
10
  def initialize(response_code, url, request_body, response_body)
11
+ super("Got response code '#{response_code}' contacting Elasticsearch at URL '#{url}'")
12
+
11
13
  @response_code = response_code
12
14
  @url = url
13
15
  @request_body = request_body
14
16
  @response_body = response_body
15
17
  end
16
18
 
17
- def message
18
- "Got response code '#{response_code}' contacting Elasticsearch at URL '#{@url}'"
19
- end
20
19
  end
21
20
  class HostUnreachableError < Error;
22
21
  attr_reader :original_error, :url
23
22
 
24
23
  def initialize(original_error, url)
24
+ super("Elasticsearch Unreachable: [#{url}][#{original_error.class}] #{original_error.message}")
25
+
25
26
  @original_error = original_error
26
27
  @url = url
27
28
  end
28
29
 
29
- def message
30
- "Elasticsearch Unreachable: [#{@url}][#{original_error.class}] #{original_error.message}"
31
- end
32
30
  end
33
31
 
34
32
  attr_reader :logger, :adapter, :sniffing, :sniffer_delay, :resurrect_delay, :healthcheck_path, :sniffing_path, :bulk_path
@@ -323,9 +321,7 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
323
321
  end
324
322
 
325
323
  def perform_request_to_url(url, method, path, params={}, body=nil)
326
- res = @adapter.perform_request(url, method, path, params, body)
327
- rescue *@adapter.host_unreachable_exceptions => e
328
- raise HostUnreachableError.new(e, url), "Could not reach host #{e.class}: #{e.message}"
324
+ @adapter.perform_request(url, method, path, params, body)
329
325
  end
330
326
 
331
327
  def normalize_url(uri)
@@ -322,8 +322,7 @@ module LogStash; module Outputs; class ElasticSearch;
322
322
 
323
323
  adapter_options[:headers] = client_settings[:headers] if client_settings[:headers]
324
324
 
325
- adapter_class = ::LogStash::Outputs::ElasticSearch::HttpClient::ManticoreAdapter
326
- adapter = adapter_class.new(@logger, adapter_options)
325
+ ::LogStash::Outputs::ElasticSearch::HttpClient::ManticoreAdapter.new(@logger, adapter_options)
327
326
  end
328
327
 
329
328
  def prepare_user_agent
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-output-elasticsearch'
3
- s.version = '11.3.1'
3
+ s.version = '11.3.2'
4
4
 
5
5
  s.licenses = ['apache-2.0']
6
6
  s.summary = "Stores logs in Elasticsearch"
@@ -5,7 +5,7 @@ require "socket"
5
5
 
6
6
  describe "pool sniffer", :integration => true do
7
7
  let(:logger) { Cabin::Channel.get }
8
- let(:adapter) { LogStash::Outputs::ElasticSearch::HttpClient::ManticoreAdapter.new(logger) }
8
+ let(:adapter) { LogStash::Outputs::ElasticSearch::HttpClient::ManticoreAdapter.new(logger, {}) }
9
9
  let(:es_host) { get_host_port.split(":").first }
10
10
  let(:es_port) { get_host_port.split(":").last }
11
11
  let(:es_ip) { IPSocket.getaddress(es_host) }
@@ -10,11 +10,12 @@ describe LogStash::Outputs::ElasticSearch::HttpClient::ManticoreAdapter do
10
10
 
11
11
  it "should raise an exception if requests are issued after close" do
12
12
  subject.close
13
- expect { subject.perform_request(::LogStash::Util::SafeURI.new("http://localhost:9200"), :get, '/') }.to raise_error(::Manticore::ClientStoppedException)
14
- end
15
-
16
- it "should implement host unreachable exceptions" do
17
- expect(subject.host_unreachable_exceptions).to be_a(Array)
13
+ begin
14
+ subject.perform_request(::LogStash::Util::SafeURI.new("http://localhost:9200"), :get, '/')
15
+ fail 'expected to raise a HostUnreachableError'
16
+ rescue ::LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError => e
17
+ expect( e.original_error ).to be_a ::Manticore::ClientStoppedException
18
+ end
18
19
  end
19
20
 
20
21
  describe "auth" do
@@ -4,7 +4,7 @@ require 'cabin'
4
4
 
5
5
  describe LogStash::Outputs::ElasticSearch::HttpClient::Pool do
6
6
  let(:logger) { Cabin::Channel.get }
7
- let(:adapter) { LogStash::Outputs::ElasticSearch::HttpClient::ManticoreAdapter.new(logger) }
7
+ let(:adapter) { LogStash::Outputs::ElasticSearch::HttpClient::ManticoreAdapter.new(logger, {}) }
8
8
  let(:initial_urls) { [::LogStash::Util::SafeURI.new("http://localhost:9200")] }
9
9
  let(:options) { {:resurrect_delay => 2, :url_normalizer => proc {|u| u}} } # Shorten the delay a bit to speed up tests
10
10
  let(:es_node_versions) { [ "0.0.0" ] }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-output-elasticsearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 11.3.1
4
+ version: 11.3.2
5
5
  platform: java
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-05 00:00:00.000000000 Z
11
+ date: 2021-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement