logstash-output-elasticsearch 11.3.1-java → 11.4.1-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.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -2
  3. data/Gemfile +2 -1
  4. data/docs/index.asciidoc +3 -7
  5. data/lib/logstash/outputs/elasticsearch/data_stream_support.rb +1 -1
  6. data/lib/logstash/outputs/elasticsearch/http_client/manticore_adapter.rb +40 -16
  7. data/lib/logstash/outputs/elasticsearch/http_client/pool.rb +5 -9
  8. data/lib/logstash/outputs/elasticsearch/http_client.rb +1 -2
  9. data/lib/logstash/outputs/elasticsearch/http_client_builder.rb +3 -6
  10. data/lib/logstash/outputs/elasticsearch/templates/ecs-v1/elasticsearch-7x.json +2196 -288
  11. data/lib/logstash/outputs/elasticsearch/templates/ecs-v1/elasticsearch-8x.json +2196 -288
  12. data/logstash-output-elasticsearch.gemspec +2 -2
  13. data/spec/es_spec_helper.rb +5 -1
  14. data/spec/fixtures/test_certs/{ca/ca.crt → ca.crt} +0 -0
  15. data/spec/fixtures/test_certs/{ca/ca.key → ca.key} +0 -0
  16. data/spec/fixtures/test_certs/test.p12 +0 -0
  17. data/spec/fixtures/test_certs/test_invalid.crt +36 -0
  18. data/spec/fixtures/test_certs/test_invalid.key +51 -0
  19. data/spec/fixtures/test_certs/test_invalid.p12 +0 -0
  20. data/spec/fixtures/test_certs/test_self_signed.crt +32 -0
  21. data/spec/fixtures/test_certs/test_self_signed.key +54 -0
  22. data/spec/fixtures/test_certs/test_self_signed.p12 +0 -0
  23. data/spec/integration/outputs/ilm_spec.rb +2 -1
  24. data/spec/integration/outputs/index_spec.rb +87 -43
  25. data/spec/integration/outputs/ingest_pipeline_spec.rb +2 -1
  26. data/spec/integration/outputs/no_es_on_startup_spec.rb +12 -6
  27. data/spec/integration/outputs/retry_spec.rb +2 -1
  28. data/spec/integration/outputs/sniffer_spec.rb +1 -1
  29. data/spec/unit/outputs/elasticsearch/http_client/manticore_adapter_spec.rb +6 -5
  30. data/spec/unit/outputs/elasticsearch/http_client/pool_spec.rb +1 -1
  31. data/spec/unit/outputs/elasticsearch_ssl_spec.rb +1 -1
  32. metadata +22 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dccee6612b454d47b0596a9feb04db71f51f368a34906f559b8f7a8df7cf166e
4
- data.tar.gz: 27d8ab736dd7c3ffa46d1229ad70afd5e8b23813ee09aa3e9d4ec05b4f263a76
3
+ metadata.gz: c1ce0504aa5082dc3fc958b72019f243c6cad0174bb883612c25eb5d7f8aedfe
4
+ data.tar.gz: 4d28c34d89b5a70a02c10ebd3b8d425111d3902bc58fb9e428acadee4a471646
5
5
  SHA512:
6
- metadata.gz: d7ab3e32387faf0cc2680fc1446e9a330314d2ead466487fd6f63a27ab2757cac8c2d90cb41bb0eba422986b22821d0e0c813617ba153225058b1e1d09765598
7
- data.tar.gz: df0a5b6cbcbdc592e1c18906f6a54a97d309afbbd1c36529f812501df31f78c7e4c2ba2fb8a3eab72e9fd53dfbca8388b710dc772a20ba9084c59ce1f5aa43fc
6
+ metadata.gz: d1d0680cf639e01b6c2a2a3b8eb87a2ad525764d006fb3cbfadc06c845925d9f1055075265d7327794e326b1a9df67308d85ebefafb38297bd2121499ecc2279
7
+ data.tar.gz: 285bafc2ffa2ae726bdafdb3176c193c7cd20979625e59cd7526445ae5243137e6dad37cc64208bb3494fc45afe44d913f7b7b4188fcf6b25faf1e9fb6a04d06
data/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ ## 11.4.1
2
+ - Feat: upgrade manticore (http-client) library [#1063](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1063)
3
+ - the underlying changes include latest HttpClient (4.5.13)
4
+ - resolves an old issue with `ssl_certificate_verification => false` still doing some verification logic
5
+
6
+ ## 11.4.0
7
+ - Updates ECS templates [#1062](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1062)
8
+ - Updates v1 templates to 1.12.1 for use with Elasticsearch 7.x and 8.x
9
+ - Updates BETA preview of ECS v8 templates for Elasticsearch 7.x and 8.x
10
+
11
+ ## 11.3.3
12
+ - Feat: add support for 'traces' data stream type [#1057](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1057)
13
+
14
+ ## 11.3.2
15
+ - 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)
16
+ - Java causes on connection related exceptions will now be extra logged when plugin is logging at debug level
17
+
1
18
  ## 11.3.1
2
19
  - ECS-related fixes [#1046](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1046)
3
20
  - Data Streams requirement on ECS is properly enforced when running on Logstash 8, and warned about when running on Logstash 7.
@@ -9,10 +26,10 @@
9
26
  - Adds templates for BETA preview of ECS v8 for both Elasticsearch 7.x and 8.x
10
27
 
11
28
  ## 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
29
+ - 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
30
 
14
31
  ## 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)
32
+ - 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
33
 
17
34
  ## 11.2.1
18
35
  - Fix referencing Gem classes from global lexical scope [#1044](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1044)
data/Gemfile CHANGED
@@ -12,4 +12,5 @@ end
12
12
 
13
13
  if RUBY_VERSION == "1.9.3"
14
14
  gem 'rake', '12.2.1'
15
- end
15
+ end
16
+
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
 
@@ -509,7 +505,7 @@ overwritten with a warning.
509
505
  * Default value is `logs`.
510
506
 
511
507
  The data stream type used to construct the data stream at index time.
512
- Currently, only `logs`, `metrics` and `synthetics` are supported.
508
+ Currently, only `logs`, `metrics`, `synthetics` and `traces` are supported.
513
509
 
514
510
  [id="plugins-{type}s-{plugin}-doc_as_upsert"]
515
511
  ===== `doc_as_upsert`
@@ -18,7 +18,7 @@ module LogStash module Outputs class ElasticSearch
18
18
  # Defaults to `false` in Logstash 7.x and `auto` starting in Logstash 8.0.
19
19
  base.config :data_stream, :validate => ['true', 'false', 'auto']
20
20
 
21
- base.config :data_stream_type, :validate => ['logs', 'metrics', 'synthetics'], :default => 'logs'
21
+ base.config :data_stream_type, :validate => ['logs', 'metrics', 'synthetics', 'traces'], :default => 'logs'
22
22
  base.config :data_stream_dataset, :validate => :dataset_identifier, :default => 'generic'
23
23
  base.config :data_stream_namespace, :validate => :namespace_identifier, :default => 'default'
24
24
 
@@ -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
@@ -133,12 +133,9 @@ module LogStash; module Outputs; class ElasticSearch;
133
133
  ssl_options[:keystore_password] = keystore_password.value if keystore_password
134
134
  end
135
135
  if !params["ssl_certificate_verification"]
136
- logger.warn [
137
- "** WARNING ** Detected UNSAFE options in elasticsearch output configuration!",
138
- "** WARNING ** You have enabled encryption but DISABLED certificate verification.",
139
- "** WARNING ** To make sure your data is secure change :ssl_certificate_verification to true"
140
- ].join("\n")
141
- ssl_options[:verify] = false
136
+ logger.warn "You have enabled encryption but DISABLED certificate verification, " +
137
+ "to make sure your data is secure remove `ssl_certificate_verification => false`"
138
+ ssl_options[:verify] = :disable # false accepts self-signed but still validates hostname
142
139
  end
143
140
  { ssl: ssl_options }
144
141
  end