logstash-output-elasticsearch 11.22.13-java → 12.0.0-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 +4 -4
- data/CHANGELOG.md +11 -8
- data/docs/index.asciidoc +19 -106
- data/lib/logstash/outputs/elasticsearch/http_client/manticore_adapter.rb +4 -1
- data/lib/logstash/outputs/elasticsearch/http_client/pool.rb +22 -11
- data/lib/logstash/outputs/elasticsearch/http_client.rb +29 -42
- data/lib/logstash/outputs/elasticsearch.rb +0 -47
- data/lib/logstash/plugin_mixins/elasticsearch/api_configs.rb +12 -28
- data/logstash-output-elasticsearch.gemspec +1 -1
- data/spec/es_spec_helper.rb +22 -34
- data/spec/fixtures/test_certs/GENERATED_AT +1 -1
- data/spec/fixtures/test_certs/ca.crt +27 -30
- data/spec/fixtures/test_certs/ca.der.sha256 +1 -1
- data/spec/fixtures/test_certs/renew.sh +3 -2
- data/spec/fixtures/test_certs/test.crt +28 -29
- data/spec/fixtures/test_certs/test.der.sha256 +1 -1
- data/spec/fixtures/test_certs/test.p12 +0 -0
- data/spec/integration/outputs/compressed_indexing_spec.rb +1 -3
- data/spec/integration/outputs/delete_spec.rb +4 -4
- data/spec/integration/outputs/ilm_spec.rb +12 -18
- data/spec/integration/outputs/index_spec.rb +2 -12
- data/spec/integration/outputs/index_version_spec.rb +7 -7
- data/spec/integration/outputs/painless_update_spec.rb +10 -11
- data/spec/integration/outputs/unsupported_actions_spec.rb +10 -15
- data/spec/integration/outputs/update_spec.rb +9 -11
- data/spec/spec_helper.rb +0 -8
- data/spec/support/elasticsearch/api/actions/get_alias.rb +18 -0
- data/spec/support/elasticsearch/api/actions/put_alias.rb +24 -0
- data/spec/unit/outputs/elasticsearch/http_client_spec.rb +0 -77
- data/spec/unit/outputs/elasticsearch_spec.rb +2 -82
- data/spec/unit/outputs/elasticsearch_ssl_spec.rb +22 -0
- data/spec/unit/outputs/error_whitelist_spec.rb +1 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 983d99de3a0dcd5e58fb123e01ad8ee4c2396ce15fd565dda439e43c182b32e6
|
4
|
+
data.tar.gz: 8733e1a9b256b36e9f08a9be0803ca667817d7fe9f1e4cd1e090fe95882eb245
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9626da6b7d428b17a16b2874a8758e260e84af265636fabea8e35dec0777ecdeae1b662910d2e065eccc4742ef706765d87b6cf475a141544a78347c69953de
|
7
|
+
data.tar.gz: 7997cfb3b851130a0504c0907761aba37ea31ec35deb7fc4de19eaf7f1ae00cee9df7b2575d59ace2b08c19ad7710460c534467bb79f7019c3a125478d0de5e2
|
data/CHANGELOG.md
CHANGED
@@ -1,11 +1,14 @@
|
|
1
|
-
##
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
1
|
+
## 12.0.0
|
2
|
+
- SSL settings that were marked deprecated in version `11.14.0` are now marked obsolete, and will prevent the plugin from starting.
|
3
|
+
- These settings are:
|
4
|
+
- `cacert`, which should be replaced by `ssl_certificate_authorities`
|
5
|
+
- `keystore`, which should be replaced by `ssl_keystore_path`
|
6
|
+
- `keystore_password`, which should be replaced by `ssl_keystore_password`
|
7
|
+
- `ssl`, which should be replaced by `ssl_enabled`
|
8
|
+
- `ssl_certificate_verification`, which should be replaced by `ssl_verification_mode`
|
9
|
+
- `truststore`, which should be replaced by `ssl_truststore_path`
|
10
|
+
- `truststore_password`, which should be replaced by `ssl_truststore_password`
|
11
|
+
- [#1197](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1197)
|
9
12
|
|
10
13
|
## 11.22.10
|
11
14
|
- Add `x-elastic-product-origin` header to Elasticsearch requests [#1195](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1195)
|
data/docs/index.asciidoc
CHANGED
@@ -196,22 +196,7 @@ This plugin uses the Elasticsearch bulk API to optimize its imports into Elastic
|
|
196
196
|
either partial or total failures. The bulk API sends batches of requests to an HTTP endpoint. Error codes for the HTTP
|
197
197
|
request are handled differently than error codes for individual documents.
|
198
198
|
|
199
|
-
|
200
|
-
HTTP requests to the bulk API are expected to return a 200 response code. All other response codes are retried indefinitely,
|
201
|
-
including 413 (Payload Too Large) responses.
|
202
|
-
|
203
|
-
If you want to handle large payloads differently, you can configure 413 responses to go to the Dead Letter Queue instead:
|
204
|
-
|
205
|
-
[source,ruby]
|
206
|
-
-----
|
207
|
-
output {
|
208
|
-
elasticsearch {
|
209
|
-
hosts => ["localhost:9200"]
|
210
|
-
dlq_custom_codes => [413] # Send 413 errors to DLQ instead of retrying
|
211
|
-
}
|
212
|
-
-----
|
213
|
-
|
214
|
-
This will capture oversized payloads in the DLQ for analysis rather than retrying them.
|
199
|
+
HTTP requests to the bulk API are expected to return a 200 response code. All other response codes are retried indefinitely.
|
215
200
|
|
216
201
|
The following document errors are handled as follows:
|
217
202
|
|
@@ -340,8 +325,10 @@ When a string value on an event contains one or more byte sequences that are not
|
|
340
325
|
[id="plugins-{type}s-{plugin}-options"]
|
341
326
|
==== Elasticsearch Output Configuration Options
|
342
327
|
|
343
|
-
This plugin supports
|
344
|
-
|
328
|
+
This plugin supports these configuration options plus the <<plugins-{type}s-{plugin}-common-options>> described later.
|
329
|
+
|
330
|
+
NOTE: As of version 12.0.0 of this plugin, a number of previously deprecated SSL settings have been removed.
|
331
|
+
Please check out <<plugins-{type}s-{plugin}-obsolete-options>> for details.
|
345
332
|
|
346
333
|
[cols="<,<,<",options="header",]
|
347
334
|
|=======================================================================
|
@@ -456,7 +443,7 @@ For more details on actions, check out the {ref}/docs-bulk.html[Elasticsearch bu
|
|
456
443
|
* There is no default value for this setting.
|
457
444
|
|
458
445
|
Authenticate using Elasticsearch API key.
|
459
|
-
Note that this option also requires SSL/TLS, which can be enabled by supplying a <<plugins-{type}s-{plugin}-cloud_id>>, a list of HTTPS <<plugins-{type}s-{plugin}-hosts>>, or by setting <<plugins-{type}s-{plugin}-
|
446
|
+
Note that this option also requires SSL/TLS, which can be enabled by supplying a <<plugins-{type}s-{plugin}-cloud_id>>, a list of HTTPS <<plugins-{type}s-{plugin}-hosts>>, or by setting <<plugins-{type}s-{plugin}-ssl_enabled,`ssl_enabled => true`>>.
|
460
447
|
|
461
448
|
Format is `id:api_key` where `id` and `api_key` are as returned by the
|
462
449
|
Elasticsearch {ref}/security-api-create-api-key.html[Create API key API].
|
@@ -1339,98 +1326,24 @@ https://www.elastic.co/blog/elasticsearch-versioning-support[versioning support
|
|
1339
1326
|
blog] and {ref}/docs-index_.html#_version_types[Version types] in the
|
1340
1327
|
Elasticsearch documentation.
|
1341
1328
|
|
1342
|
-
[id="plugins-{type}s-{plugin}-
|
1343
|
-
==== Elasticsearch Output
|
1344
|
-
|
1345
|
-
This plugin supports the following deprecated configurations.
|
1329
|
+
[id="plugins-{type}s-{plugin}-obsolete-options"]
|
1330
|
+
==== Elasticsearch Output Obsolete Configuration Options
|
1346
1331
|
|
1347
|
-
WARNING:
|
1332
|
+
WARNING: As of version `12.0.0` of this plugin, some configuration options have been replaced.
|
1333
|
+
The plugin will fail to start if it contains any of these obsolete options.
|
1348
1334
|
|
1349
|
-
[cols="
|
1335
|
+
[cols="<,<",options="header",]
|
1350
1336
|
|=======================================================================
|
1351
|
-
|Setting|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1337
|
+
|Setting|Replaced by
|
1338
|
+
| cacert | <<plugins-{type}s-{plugin}-ssl_certificate_authorities>>
|
1339
|
+
| keystore | <<plugins-{type}s-{plugin}-ssl_keystore_path>>
|
1340
|
+
| keystore_password | <<plugins-{type}s-{plugin}-ssl_keystore_password>>
|
1341
|
+
| ssl | <<plugins-{type}s-{plugin}-ssl_enabled>>
|
1342
|
+
| ssl_certificate_verification | <<plugins-{type}s-{plugin}-ssl_verification_mode>>
|
1343
|
+
| truststore | <<plugins-{type}s-{plugin}-ssl_truststore_path>>
|
1344
|
+
| truststore_password | <<plugins-{type}s-{plugin}-ssl_truststore_password>>
|
1359
1345
|
|=======================================================================
|
1360
1346
|
|
1361
|
-
|
1362
|
-
[id="plugins-{type}s-{plugin}-cacert"]
|
1363
|
-
===== `cacert`
|
1364
|
-
deprecated[11.14.0, Replaced by <<plugins-{type}s-{plugin}-ssl_certificate_authorities>>]
|
1365
|
-
|
1366
|
-
* Value type is a list of <<path,path>>
|
1367
|
-
* There is no default value for this setting.
|
1368
|
-
|
1369
|
-
The .cer or .pem file to validate the server's certificate.
|
1370
|
-
|
1371
|
-
[id="plugins-{type}s-{plugin}-keystore"]
|
1372
|
-
===== `keystore`
|
1373
|
-
deprecated[11.14.0, Replaced by <<plugins-{type}s-{plugin}-ssl_keystore_path>>]
|
1374
|
-
|
1375
|
-
* Value type is <<path,path>>
|
1376
|
-
* There is no default value for this setting.
|
1377
|
-
|
1378
|
-
The keystore used to present a certificate to the server.
|
1379
|
-
It can be either .jks or .p12
|
1380
|
-
|
1381
|
-
NOTE: You cannot use this setting and <<plugins-{type}s-{plugin}-ssl_certificate>> at the same time.
|
1382
|
-
|
1383
|
-
[id="plugins-{type}s-{plugin}-keystore_password"]
|
1384
|
-
===== `keystore_password`
|
1385
|
-
deprecated[11.14.0, Replaced by <<plugins-{type}s-{plugin}-ssl_keystore_password>>]
|
1386
|
-
|
1387
|
-
* Value type is <<password,password>>
|
1388
|
-
* There is no default value for this setting.
|
1389
|
-
|
1390
|
-
Set the keystore password
|
1391
|
-
|
1392
|
-
[id="plugins-{type}s-{plugin}-ssl"]
|
1393
|
-
===== `ssl`
|
1394
|
-
deprecated[11.14.0, Replaced by <<plugins-{type}s-{plugin}-ssl_enabled>>]
|
1395
|
-
|
1396
|
-
* Value type is <<boolean,boolean>>
|
1397
|
-
* There is no default value for this setting.
|
1398
|
-
|
1399
|
-
Enable SSL/TLS secured communication to Elasticsearch cluster.
|
1400
|
-
Leaving this unspecified will use whatever scheme is specified in the URLs listed in <<plugins-{type}s-{plugin}-hosts>> or extracted from the <<plugins-{type}s-{plugin}-cloud_id>>.
|
1401
|
-
If no explicit protocol is specified plain HTTP will be used.
|
1402
|
-
|
1403
|
-
[id="plugins-{type}s-{plugin}-ssl_certificate_verification"]
|
1404
|
-
===== `ssl_certificate_verification`
|
1405
|
-
deprecated[11.14.0, Replaced by <<plugins-{type}s-{plugin}-ssl_verification_mode>>]
|
1406
|
-
|
1407
|
-
* Value type is <<boolean,boolean>>
|
1408
|
-
* Default value is `true`
|
1409
|
-
|
1410
|
-
Option to validate the server's certificate. Disabling this severely compromises security.
|
1411
|
-
For more information on disabling certificate verification please read
|
1412
|
-
https://www.cs.utexas.edu/~shmat/shmat_ccs12.pdf
|
1413
|
-
|
1414
|
-
[id="plugins-{type}s-{plugin}-truststore"]
|
1415
|
-
===== `truststore`
|
1416
|
-
deprecated[11.14.0, Replaced by <<plugins-{type}s-{plugin}-ssl_truststore_path>>]
|
1417
|
-
|
1418
|
-
* Value type is <<path,path>>
|
1419
|
-
* There is no default value for this setting.
|
1420
|
-
|
1421
|
-
The truststore to validate the server's certificate.
|
1422
|
-
It can be either `.jks` or `.p12`.
|
1423
|
-
Use either `:truststore` or `:cacert`.
|
1424
|
-
|
1425
|
-
[id="plugins-{type}s-{plugin}-truststore_password"]
|
1426
|
-
===== `truststore_password`
|
1427
|
-
deprecated[11.14.0, Replaced by <<plugins-{type}s-{plugin}-ssl_truststore_password>>]
|
1428
|
-
|
1429
|
-
* Value type is <<password,password>>
|
1430
|
-
* There is no default value for this setting.
|
1431
|
-
|
1432
|
-
Set the truststore password
|
1433
|
-
|
1434
1347
|
[id="plugins-{type}s-{plugin}-common-options"]
|
1435
1348
|
include::{include_path}/{type}.asciidoc[]
|
1436
1349
|
|
@@ -76,8 +76,11 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
76
76
|
raise ::LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError.new(e, request_uri_as_string)
|
77
77
|
end
|
78
78
|
|
79
|
+
# 404s are excluded because they are valid codes in the case of
|
80
|
+
# template installation. We might need a better story around this later
|
81
|
+
# but for our current purposes this is correct
|
79
82
|
code = resp.code
|
80
|
-
if code < 200 || code > 299
|
83
|
+
if code < 200 || code > 299 && code != 404
|
81
84
|
raise ::LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError.new(code, request_uri, body, resp.body)
|
82
85
|
end
|
83
86
|
|
@@ -253,11 +253,13 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
253
253
|
def health_check_request(url)
|
254
254
|
logger.debug("Running health check to see if an Elasticsearch connection is working",
|
255
255
|
:healthcheck_url => url.sanitized.to_s, :path => @healthcheck_path)
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
256
|
+
begin
|
257
|
+
response = perform_request_to_url(url, :head, @healthcheck_path)
|
258
|
+
return response, nil
|
259
|
+
rescue ::LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError => e
|
260
|
+
logger.warn("Health check failed", code: e.response_code, url: e.url, message: e.message)
|
261
|
+
return nil, e
|
262
|
+
end
|
261
263
|
end
|
262
264
|
|
263
265
|
def healthcheck!(register_phase = true)
|
@@ -310,11 +312,13 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
310
312
|
end
|
311
313
|
|
312
314
|
def get_root_path(url, params={})
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
315
|
+
begin
|
316
|
+
resp = perform_request_to_url(url, :get, ROOT_URI_PATH, params)
|
317
|
+
return resp, nil
|
318
|
+
rescue ::LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError => e
|
319
|
+
logger.warn("Elasticsearch main endpoint returns #{e.response_code}", message: e.message, body: e.response_body)
|
320
|
+
return nil, e
|
321
|
+
end
|
318
322
|
end
|
319
323
|
|
320
324
|
def test_serverless_connection(url, root_response)
|
@@ -511,13 +515,20 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
511
515
|
major = major_version(version)
|
512
516
|
if @maximum_seen_major_version.nil?
|
513
517
|
@logger.info("Elasticsearch version determined (#{version})", es_version: major)
|
514
|
-
|
518
|
+
set_maximum_seen_major_version(major)
|
515
519
|
elsif major > @maximum_seen_major_version
|
516
520
|
warn_on_higher_major_version(major, url)
|
517
521
|
@maximum_seen_major_version = major
|
518
522
|
end
|
519
523
|
end
|
520
524
|
|
525
|
+
def set_maximum_seen_major_version(major)
|
526
|
+
if major >= 6
|
527
|
+
@logger.warn("Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type", es_version: major)
|
528
|
+
end
|
529
|
+
@maximum_seen_major_version = major
|
530
|
+
end
|
531
|
+
|
521
532
|
def warn_on_higher_major_version(major, url)
|
522
533
|
@logger.warn("Detected a node with a higher major version than previously observed, " +
|
523
534
|
"this could be the result of an Elasticsearch cluster upgrade",
|
@@ -21,8 +21,7 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
21
21
|
# We wound up agreeing that a number greater than 10 MiB and less than 100MiB
|
22
22
|
# made sense. We picked one on the lowish side to not use too much heap.
|
23
23
|
TARGET_BULK_BYTES = 20 * 1024 * 1024 # 20MiB
|
24
|
-
|
25
|
-
UNCOMPRESSED_LENGTH_HEADER = "X-Elastic-Uncompressed-Request-Length".freeze
|
24
|
+
|
26
25
|
|
27
26
|
class HttpClient
|
28
27
|
attr_reader :client, :options, :logger, :pool, :action_count, :recv_count
|
@@ -144,11 +143,7 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
144
143
|
:payload_size => stream_writer.pos,
|
145
144
|
:content_length => body_stream.size,
|
146
145
|
:batch_offset => (index + 1 - batch_actions.size))
|
147
|
-
|
148
|
-
EVENT_COUNT_HEADER => batch_actions.size.to_s,
|
149
|
-
UNCOMPRESSED_LENGTH_HEADER => stream_writer.pos.to_s
|
150
|
-
}
|
151
|
-
bulk_responses << bulk_send(body_stream, batch_actions, headers)
|
146
|
+
bulk_responses << bulk_send(body_stream, batch_actions)
|
152
147
|
body_stream.truncate(0) && body_stream.seek(0)
|
153
148
|
stream_writer = gzip_writer(body_stream) if compression_level?
|
154
149
|
batch_actions.clear
|
@@ -164,14 +159,7 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
164
159
|
:payload_size => stream_writer.pos,
|
165
160
|
:content_length => body_stream.size,
|
166
161
|
:batch_offset => (actions.size - batch_actions.size))
|
167
|
-
|
168
|
-
if body_stream.size > 0
|
169
|
-
headers = {
|
170
|
-
EVENT_COUNT_HEADER => batch_actions.size.to_s,
|
171
|
-
UNCOMPRESSED_LENGTH_HEADER => stream_writer.pos.to_s
|
172
|
-
}
|
173
|
-
bulk_responses << bulk_send(body_stream, batch_actions, headers)
|
174
|
-
end
|
162
|
+
bulk_responses << bulk_send(body_stream, batch_actions) if body_stream.size > 0
|
175
163
|
|
176
164
|
body_stream.close unless compression_level?
|
177
165
|
join_bulk_responses(bulk_responses)
|
@@ -191,23 +179,25 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
191
179
|
}
|
192
180
|
end
|
193
181
|
|
194
|
-
def bulk_send(body_stream, batch_actions
|
195
|
-
params = compression_level? ? {:headers =>
|
182
|
+
def bulk_send(body_stream, batch_actions)
|
183
|
+
params = compression_level? ? {:headers => {"Content-Encoding" => "gzip"}} : {}
|
196
184
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
185
|
+
response = @pool.post(@bulk_path, params, body_stream.string)
|
186
|
+
|
187
|
+
@bulk_response_metrics.increment(response.code.to_s)
|
188
|
+
|
189
|
+
case response.code
|
190
|
+
when 200 # OK
|
191
|
+
LogStash::Json.load(response.body)
|
192
|
+
when 413 # Payload Too Large
|
204
193
|
logger.warn("Bulk request rejected: `413 Payload Too Large`", :action_count => batch_actions.size, :content_length => body_stream.size)
|
205
|
-
|
206
|
-
|
207
|
-
|
194
|
+
emulate_batch_error_response(batch_actions, response.code, 'payload_too_large')
|
195
|
+
else
|
196
|
+
url = ::LogStash::Util::SafeURI.new(response.final_url)
|
197
|
+
raise ::LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError.new(
|
198
|
+
response.code, url, body_stream.to_s, response.body
|
199
|
+
)
|
208
200
|
end
|
209
|
-
|
210
|
-
LogStash::Json.load(response.body)
|
211
201
|
end
|
212
202
|
|
213
203
|
def emulate_batch_error_response(actions, http_code, reason)
|
@@ -421,9 +411,6 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
421
411
|
def exists?(path, use_get=false)
|
422
412
|
response = use_get ? @pool.get(path) : @pool.head(path)
|
423
413
|
response.code >= 200 && response.code <= 299
|
424
|
-
rescue ::LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError => e
|
425
|
-
return false if e.response_code == 404
|
426
|
-
raise e
|
427
414
|
end
|
428
415
|
|
429
416
|
def template_exists?(template_endpoint, name)
|
@@ -434,8 +421,6 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
434
421
|
path = "#{template_endpoint}/#{name}"
|
435
422
|
logger.info("Installing Elasticsearch template", name: name)
|
436
423
|
@pool.put(path, nil, LogStash::Json.dump(template))
|
437
|
-
rescue ::LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError => e
|
438
|
-
raise e unless e.response_code == 404
|
439
424
|
end
|
440
425
|
|
441
426
|
# ILM methods
|
@@ -447,15 +432,17 @@ module LogStash; module Outputs; class ElasticSearch;
|
|
447
432
|
|
448
433
|
# Create a new rollover alias
|
449
434
|
def rollover_alias_put(alias_name, alias_definition)
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
435
|
+
begin
|
436
|
+
@pool.put(CGI::escape(alias_name), nil, LogStash::Json.dump(alias_definition))
|
437
|
+
logger.info("Created rollover alias", name: alias_name)
|
438
|
+
# If the rollover alias already exists, ignore the error that comes back from Elasticsearch
|
439
|
+
rescue ::LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError => e
|
440
|
+
if e.response_code == 400
|
441
|
+
logger.info("Rollover alias already exists, skipping", name: alias_name)
|
442
|
+
return
|
443
|
+
end
|
444
|
+
raise e
|
457
445
|
end
|
458
|
-
raise e
|
459
446
|
end
|
460
447
|
|
461
448
|
def get_xpack_info
|
@@ -275,7 +275,6 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
275
275
|
def initialize(*params)
|
276
276
|
super
|
277
277
|
setup_ecs_compatibility_related_defaults
|
278
|
-
setup_ssl_params!
|
279
278
|
setup_compression_level!
|
280
279
|
end
|
281
280
|
|
@@ -694,52 +693,6 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
694
693
|
end
|
695
694
|
end
|
696
695
|
|
697
|
-
def setup_ssl_params!
|
698
|
-
@ssl_enabled = normalize_config(:ssl_enabled) do |normalize|
|
699
|
-
normalize.with_deprecated_alias(:ssl)
|
700
|
-
end
|
701
|
-
|
702
|
-
@ssl_certificate_authorities = normalize_config(:ssl_certificate_authorities) do |normalize|
|
703
|
-
normalize.with_deprecated_mapping(:cacert) do |cacert|
|
704
|
-
[cacert]
|
705
|
-
end
|
706
|
-
end
|
707
|
-
|
708
|
-
@ssl_keystore_path = normalize_config(:ssl_keystore_path) do |normalize|
|
709
|
-
normalize.with_deprecated_alias(:keystore)
|
710
|
-
end
|
711
|
-
|
712
|
-
@ssl_keystore_password = normalize_config(:ssl_keystore_password) do |normalize|
|
713
|
-
normalize.with_deprecated_alias(:keystore_password)
|
714
|
-
end
|
715
|
-
|
716
|
-
@ssl_truststore_path = normalize_config(:ssl_truststore_path) do |normalize|
|
717
|
-
normalize.with_deprecated_alias(:truststore)
|
718
|
-
end
|
719
|
-
|
720
|
-
@ssl_truststore_password = normalize_config(:ssl_truststore_password) do |normalize|
|
721
|
-
normalize.with_deprecated_alias(:truststore_password)
|
722
|
-
end
|
723
|
-
|
724
|
-
@ssl_verification_mode = normalize_config(:ssl_verification_mode) do |normalize|
|
725
|
-
normalize.with_deprecated_mapping(:ssl_certificate_verification) do |ssl_certificate_verification|
|
726
|
-
if ssl_certificate_verification == true
|
727
|
-
"full"
|
728
|
-
else
|
729
|
-
"none"
|
730
|
-
end
|
731
|
-
end
|
732
|
-
end
|
733
|
-
|
734
|
-
params['ssl_enabled'] = @ssl_enabled unless @ssl_enabled.nil?
|
735
|
-
params['ssl_certificate_authorities'] = @ssl_certificate_authorities unless @ssl_certificate_authorities.nil?
|
736
|
-
params['ssl_keystore_path'] = @ssl_keystore_path unless @ssl_keystore_path.nil?
|
737
|
-
params['ssl_keystore_password'] = @ssl_keystore_password unless @ssl_keystore_password.nil?
|
738
|
-
params['ssl_truststore_path'] = @ssl_truststore_path unless @ssl_truststore_path.nil?
|
739
|
-
params['ssl_truststore_password'] = @ssl_truststore_password unless @ssl_truststore_password.nil?
|
740
|
-
params['ssl_verification_mode'] = @ssl_verification_mode unless @ssl_verification_mode.nil?
|
741
|
-
end
|
742
|
-
|
743
696
|
def setup_compression_level!
|
744
697
|
@compression_level = normalize_config(:compression_level) do |normalize|
|
745
698
|
normalize.with_deprecated_mapping(:http_compression) do |http_compression|
|
@@ -43,40 +43,23 @@ module LogStash; module PluginMixins; module ElasticSearch
|
|
43
43
|
# urls that already have query strings, the one specified here will be appended.
|
44
44
|
:parameters => { :validate => :hash },
|
45
45
|
|
46
|
-
# Enable SSL/TLS secured communication to Elasticsearch cluster. Leaving this unspecified will use whatever scheme
|
47
|
-
# is specified in the URLs listed in 'hosts'. If no explicit protocol is specified plain HTTP will be used.
|
48
|
-
# If SSL is explicitly disabled here the plugin will refuse to start if an HTTPS URL is given in 'hosts'
|
49
|
-
:ssl => { :validate => :boolean, :deprecated => "Set 'ssl_enabled' instead." },
|
50
|
-
|
51
46
|
# Enable SSL/TLS secured communication to Elasticsearch cluster. Leaving this unspecified will use whatever scheme
|
52
47
|
# is specified in the URLs listed in 'hosts'. If no explicit protocol is specified plain HTTP will be used.
|
53
48
|
# If SSL is explicitly disabled here the plugin will refuse to start if an HTTPS URL is given in 'hosts'
|
54
49
|
:ssl_enabled => { :validate => :boolean },
|
55
50
|
|
56
|
-
# Option to validate the server's certificate. Disabling this severely compromises security.
|
57
|
-
# For more information on disabling certificate verification please read
|
58
|
-
# https://www.cs.utexas.edu/~shmat/shmat_ccs12.pdf
|
59
|
-
:ssl_certificate_verification => { :validate => :boolean, :default => true, :deprecated => "Set 'ssl_verification_mode' instead." },
|
60
|
-
|
61
51
|
# Options to verify the server's certificate.
|
62
52
|
# "full": validates that the provided certificate has an issue date that’s within the not_before and not_after dates;
|
63
53
|
# chains to a trusted Certificate Authority (CA); has a hostname or IP address that matches the names within the certificate.
|
64
54
|
# "none": performs no certificate validation. Disabling this severely compromises security (https://www.cs.utexas.edu/~shmat/shmat_ccs12.pdf)
|
65
55
|
:ssl_verification_mode => { :validate => %w[full none], :default => 'full' },
|
66
56
|
|
67
|
-
# The .cer or .pem file to validate the server's certificate
|
68
|
-
:cacert => { :validate => :path, :deprecated => "Set 'ssl_certificate_authorities' instead." },
|
69
|
-
|
70
57
|
# The .cer or .pem files to validate the server's certificate
|
71
58
|
:ssl_certificate_authorities => { :validate => :path, :list => true },
|
72
59
|
|
73
60
|
# One or more hex-encoded SHA256 fingerprints to trust as Certificate Authorities
|
74
61
|
:ca_trusted_fingerprint => LogStash::PluginMixins::CATrustedFingerprintSupport,
|
75
62
|
|
76
|
-
# The JKS truststore to validate the server's certificate.
|
77
|
-
# Use either `:truststore` or `:cacert`
|
78
|
-
:truststore => { :validate => :path, :deprecated => "Set 'ssl_truststore_path' instead." },
|
79
|
-
|
80
63
|
# The JKS truststore to validate the server's certificate.
|
81
64
|
# Use either `:ssl_truststore_path` or `:ssl_certificate_authorities`
|
82
65
|
:ssl_truststore_path => { :validate => :path },
|
@@ -84,16 +67,9 @@ module LogStash; module PluginMixins; module ElasticSearch
|
|
84
67
|
# The format of the truststore file. It must be either jks or pkcs12
|
85
68
|
:ssl_truststore_type => { :validate => %w[pkcs12 jks] },
|
86
69
|
|
87
|
-
# Set the truststore password
|
88
|
-
:truststore_password => { :validate => :password, :deprecated => "Use 'ssl_truststore_password' instead." },
|
89
|
-
|
90
70
|
# Set the truststore password
|
91
71
|
:ssl_truststore_password => { :validate => :password },
|
92
72
|
|
93
|
-
# The keystore used to present a certificate to the server.
|
94
|
-
# It can be either .jks or .p12
|
95
|
-
:keystore => { :validate => :path, :deprecated => "Set 'ssl_keystore_path' instead." },
|
96
|
-
|
97
73
|
# The keystore used to present a certificate to the server.
|
98
74
|
# It can be either .jks or .p12
|
99
75
|
:ssl_keystore_path => { :validate => :path },
|
@@ -101,9 +77,6 @@ module LogStash; module PluginMixins; module ElasticSearch
|
|
101
77
|
# The format of the keystore file. It must be either jks or pkcs12
|
102
78
|
:ssl_keystore_type => { :validate => %w[pkcs12 jks] },
|
103
79
|
|
104
|
-
# Set the keystore password
|
105
|
-
:keystore_password => { :validate => :password, :deprecated => "Set 'ssl_keystore_password' instead." },
|
106
|
-
|
107
80
|
# Set the keystore password
|
108
81
|
:ssl_keystore_password => { :validate => :password },
|
109
82
|
|
@@ -229,7 +202,17 @@ module LogStash; module PluginMixins; module ElasticSearch
|
|
229
202
|
:dlq_custom_codes => { :validate => :number, :list => true, :default => [] },
|
230
203
|
|
231
204
|
# if enabled, failed index name interpolation events go into dead letter queue.
|
232
|
-
:dlq_on_failed_indexname_interpolation => { :validate => :boolean, :default => true }
|
205
|
+
:dlq_on_failed_indexname_interpolation => { :validate => :boolean, :default => true },
|
206
|
+
|
207
|
+
# Obsolete Settings
|
208
|
+
:ssl => { :obsolete => "Set 'ssl_enabled' instead." },
|
209
|
+
:ssl_certificate_verification => { :obsolete => "Set 'ssl_verification_mode' instead." },
|
210
|
+
:cacert => { :obsolete => "Set 'ssl_certificate_authorities' instead." },
|
211
|
+
:truststore => { :obsolete => "Set 'ssl_truststore_path' instead." },
|
212
|
+
:keystore => { :obsolete => "Set 'ssl_keystore_path' instead." },
|
213
|
+
# Leave :validate to ensure obfuscation of sensitive setting for passwords
|
214
|
+
:truststore_password => { :validate => :password, :obsolete => "Use 'ssl_truststore_password' instead." },
|
215
|
+
:keystore_password => { :validate => :password, :obsolete => "Set 'ssl_keystore_password' instead." }
|
233
216
|
}.freeze
|
234
217
|
|
235
218
|
def self.included(base)
|
@@ -243,3 +226,4 @@ module LogStash; module PluginMixins; module ElasticSearch
|
|
243
226
|
end
|
244
227
|
end
|
245
228
|
end; end; end
|
229
|
+
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'logstash-output-elasticsearch'
|
3
|
-
s.version = '
|
3
|
+
s.version = '12.0.0'
|
4
4
|
s.licenses = ['apache-2.0']
|
5
5
|
s.summary = "Stores logs in Elasticsearch"
|
6
6
|
s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
|
data/spec/es_spec_helper.rb
CHANGED
@@ -1,18 +1,15 @@
|
|
1
1
|
require_relative './spec_helper'
|
2
2
|
|
3
3
|
require 'elasticsearch'
|
4
|
+
require_relative "support/elasticsearch/api/actions/delete_ilm_policy"
|
5
|
+
require_relative "support/elasticsearch/api/actions/get_alias"
|
6
|
+
require_relative "support/elasticsearch/api/actions/put_alias"
|
7
|
+
require_relative "support/elasticsearch/api/actions/get_ilm_policy"
|
8
|
+
require_relative "support/elasticsearch/api/actions/put_ilm_policy"
|
4
9
|
|
5
10
|
require 'json'
|
6
11
|
require 'cabin'
|
7
12
|
|
8
|
-
# remove this condition and support package once plugin starts consuming elasticsearch-ruby v8 client
|
9
|
-
# in elasticsearch-ruby v7, ILM APIs were in a separate xpack gem, now directly available
|
10
|
-
unless elastic_ruby_v8_client_available?
|
11
|
-
require_relative "support/elasticsearch/api/actions/delete_ilm_policy"
|
12
|
-
require_relative "support/elasticsearch/api/actions/get_ilm_policy"
|
13
|
-
require_relative "support/elasticsearch/api/actions/put_ilm_policy"
|
14
|
-
end
|
15
|
-
|
16
13
|
module ESHelper
|
17
14
|
def get_host_port
|
18
15
|
if ENV["INTEGRATION"] == "true"
|
@@ -23,12 +20,8 @@ module ESHelper
|
|
23
20
|
end
|
24
21
|
|
25
22
|
def get_client
|
26
|
-
|
27
|
-
|
28
|
-
else
|
29
|
-
Elasticsearch::Client.new(:hosts => [get_host_port]).tap do |client|
|
30
|
-
allow(client).to receive(:verify_elasticsearch).and_return(true) # bypass client side version checking
|
31
|
-
end
|
23
|
+
Elasticsearch::Client.new(:hosts => [get_host_port]).tap do |client|
|
24
|
+
allow(client).to receive(:verify_elasticsearch).and_return(true) # bypass client side version checking
|
32
25
|
end
|
33
26
|
end
|
34
27
|
|
@@ -135,36 +128,31 @@ module ESHelper
|
|
135
128
|
end
|
136
129
|
|
137
130
|
def get_policy(client, policy_name)
|
138
|
-
|
139
|
-
client.index_lifecycle_management.get_lifecycle(policy: policy_name)
|
140
|
-
else
|
141
|
-
client.get_ilm_policy(name: policy_name)
|
142
|
-
end
|
131
|
+
client.get_ilm_policy(name: policy_name)
|
143
132
|
end
|
144
133
|
|
145
134
|
def put_policy(client, policy_name, policy)
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
135
|
+
client.put_ilm_policy({:name => policy_name, :body=> policy})
|
136
|
+
end
|
137
|
+
|
138
|
+
def put_alias(client, the_alias, index)
|
139
|
+
body = {
|
140
|
+
"aliases" => {
|
141
|
+
index => {
|
142
|
+
"is_write_index"=> true
|
143
|
+
}
|
144
|
+
}
|
145
|
+
}
|
146
|
+
client.put_alias({name: the_alias, body: body})
|
151
147
|
end
|
152
148
|
|
153
149
|
def clean_ilm(client)
|
154
|
-
if
|
155
|
-
client.index_lifecycle_management.get_lifecycle.each_key { |key| client.index_lifecycle_management.delete_lifecycle(policy: key) if key =~ /logstash-policy/ }
|
156
|
-
else
|
157
|
-
client.get_ilm_policy.each_key { |key| client.delete_ilm_policy(name: key) if key =~ /logstash-policy/ }
|
158
|
-
end
|
150
|
+
client.get_ilm_policy.each_key { |key| client.delete_ilm_policy(name: key) if key =~ /logstash-policy/ }
|
159
151
|
end
|
160
152
|
|
161
153
|
def supports_ilm?(client)
|
162
154
|
begin
|
163
|
-
|
164
|
-
client.index_lifecycle_management.get_lifecycle
|
165
|
-
else
|
166
|
-
client.get_ilm_policy
|
167
|
-
end
|
155
|
+
client.get_ilm_policy
|
168
156
|
true
|
169
157
|
rescue
|
170
158
|
false
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2024-06-25T21:50:58+01:00
|