logstash-output-elasticsearch 2.0.0.pre.beta-java → 2.1.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -0
- data/lib/logstash/outputs/elasticsearch.rb +113 -140
- data/lib/logstash/outputs/elasticsearch/http_client.rb +74 -36
- data/logstash-output-elasticsearch.gemspec +6 -5
- data/spec/es_spec_helper.rb +1 -0
- data/spec/integration/outputs/index_spec.rb +18 -36
- data/spec/integration/outputs/retry_spec.rb +16 -6
- data/spec/integration/outputs/routing_spec.rb +20 -39
- data/spec/unit/outputs/elasticsearch/protocol_spec.rb +31 -16
- data/spec/unit/outputs/elasticsearch_proxy_spec.rb +1 -1
- data/spec/unit/outputs/elasticsearch_spec.rb +50 -2
- metadata +61 -49
- data/.gitignore +0 -5
- data/Rakefile +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b46615e7a20412351d62189c561aff137efed71
|
4
|
+
data.tar.gz: ff02b2887b46616fadf1ae075a6512cd4012d745
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b1a582068d0f6fe453b48566c1b97a829d32501c15c4ba8eb241f9365b63b6f5cf9fd7be305698c4ba0dbe7b9b72aa1cbb517225809ce341475947d924018a9
|
7
|
+
data.tar.gz: 123a5e7173cd0984aeb750419021da26bd55644ed7f5bf607be20f697069eca492a669836a1663c9d7c24cbea7957a6e9f68d48abc99fa9ad5813896ed10c4d9
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
## 2.1.0
|
2
|
+
- New setting: timeout. This lets you control the behavior of a slow/stuck
|
3
|
+
request to Elasticsearch that could be, for example, caused by network,
|
4
|
+
firewall, or load balancer issues.
|
5
|
+
|
6
|
+
## 2.0.0
|
7
|
+
- Plugins were updated to follow the new shutdown semantic, this mainly allows Logstash to instruct input plugins to terminate gracefully,
|
8
|
+
instead of using Thread.raise on the plugins' threads. Ref: https://github.com/elastic/logstash/pull/3895
|
9
|
+
- Dependency on logstash-core update to 2.0
|
10
|
+
|
11
|
+
## 2.0.0-beta2
|
12
|
+
- Massive internal refactor of client handling
|
13
|
+
- Background HTTP sniffing support
|
14
|
+
- Reduced bulk request size to 500 from 5000 (better memory utilization)
|
15
|
+
- Removed 'host' config option. Now use 'hosts'
|
16
|
+
|
17
|
+
## 2.0.0-beta
|
18
|
+
- Only support HTTP Protocol
|
19
|
+
- Removed support for node and transport protocols (now in logstash-output-elasticsearch_java)
|
20
|
+
|
1
21
|
## 1.0.7
|
2
22
|
- Add update API support
|
3
23
|
|
@@ -10,44 +10,33 @@ require "thread" # for safe queueing
|
|
10
10
|
require "uri" # for escaping user input
|
11
11
|
require "logstash/outputs/elasticsearch/http_client"
|
12
12
|
|
13
|
-
# This
|
14
|
-
#
|
15
|
-
# want to use this output.
|
13
|
+
# This plugin is the recommended method of storing logs in Elasticsearch.
|
14
|
+
# If you plan on using the Kibana web interface, you'll want to use this output.
|
16
15
|
#
|
17
|
-
# This output only speaks the HTTP
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
16
|
+
# This output only speaks the HTTP protocol. HTTP is the preferred protocol for interacting with Elasticsearch as of Logstash 2.0.
|
17
|
+
# We strongly encourage the use of HTTP over the node protocol for a number of reasons. HTTP is only marginally slower,
|
18
|
+
# yet far easier to administer and work with. When using the HTTP protocol one may upgrade Elasticsearch versions without having
|
19
|
+
# to upgrade Logstash in lock-step. For those still wishing to use the node or transport protocols please see
|
20
|
+
# the https://www.elastic.co/guide/en/logstash/2.0/plugins-outputs-elasticsearch_java.html[logstash-output-elasticsearch_java] plugin.
|
22
21
|
#
|
23
22
|
# You can learn more about Elasticsearch at <https://www.elastic.co/products/elasticsearch>
|
24
23
|
#
|
25
24
|
# ==== Retry Policy
|
26
25
|
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
# events, we have a specific retry policy in place. We retry all events which fail to be reached by
|
31
|
-
# Elasticsearch for network related issues. We retry specific events which exhibit errors under a separate
|
32
|
-
# policy described below. Events of this nature are ones which experience ES error codes described as
|
33
|
-
# retryable errors.
|
34
|
-
#
|
35
|
-
# *Retryable Errors:*
|
26
|
+
# This plugin uses the Elasticsearch bulk API to optimize its imports into Elasticsearch. These requests may experience
|
27
|
+
# either partial or total failures. Events are retried if they fail due to either a network error or the status codes
|
28
|
+
# 429 (the server is busy), 409 (Version Conflict), or 503 (temporary overloading/maintenance).
|
36
29
|
#
|
37
|
-
#
|
38
|
-
# - 503, The server is currently unable to handle the request due to a temporary overloading or maintenance of the server.
|
39
|
-
#
|
40
|
-
# Here are the rules of what is retried when:
|
30
|
+
# The retry policy's logic can be described as follows:
|
41
31
|
#
|
42
|
-
# - Block and retry all events in bulk response that
|
32
|
+
# - Block and retry all events in the bulk response that experience transient network exceptions until
|
43
33
|
# a successful submission is received by Elasticsearch.
|
44
|
-
# - Retry subset of sent events which resulted in ES errors of a retryable nature
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
#
|
49
|
-
#
|
50
|
-
# the max interval time is reached, which is set in :retry_max_interval.
|
34
|
+
# - Retry the subset of sent events which resulted in ES errors of a retryable nature.
|
35
|
+
# - Events which returned retryable error codes will be pushed onto a separate queue for
|
36
|
+
# retrying events. Events in this queue will be retried a maximum of 5 times by default (configurable through :max_retries).
|
37
|
+
# The size of this queue is capped by the value set in :retry_max_items.
|
38
|
+
# - Events from the retry queue are submitted again when the queue reaches its max size or when
|
39
|
+
# the max interval time is reached. The max interval time is configurable via :retry_max_interval.
|
51
40
|
# - Events which are not retryable or have reached their max retry count are logged to stderr.
|
52
41
|
class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
53
42
|
attr_reader :client
|
@@ -67,13 +56,13 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
67
56
|
|
68
57
|
# The index type to write events to. Generally you should try to write only
|
69
58
|
# similar events to the same 'type'. String expansion `%{foo}` works here.
|
70
|
-
#
|
59
|
+
#
|
71
60
|
# Deprecated in favor of `document_type` field.
|
72
61
|
config :index_type, :validate => :string, :deprecated => "Please use the 'document_type' setting instead. It has the same effect, but is more appropriately named."
|
73
62
|
|
74
63
|
# The document type to write events to. Generally you should try to write only
|
75
64
|
# similar events to the same 'type'. String expansion `%{foo}` works here.
|
76
|
-
# Unless you set 'document_type', the event 'type' will be used if it exists
|
65
|
+
# Unless you set 'document_type', the event 'type' will be used if it exists
|
77
66
|
# otherwise the document type will be assigned the value of 'logs'
|
78
67
|
config :document_type, :validate => :string
|
79
68
|
|
@@ -113,24 +102,27 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
113
102
|
# This can be dynamic using the `%{foo}` syntax.
|
114
103
|
config :routing, :validate => :string
|
115
104
|
|
116
|
-
# Sets the host(s) of the remote instance. If given an array it will load balance requests across the hosts specified in the `
|
105
|
+
# Sets the host(s) of the remote instance. If given an array it will load balance requests across the hosts specified in the `hosts` parameter.
|
117
106
|
# Remember the `http` protocol uses the http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-http.html#modules-http[http] address (eg. 9200, not 9300).
|
118
107
|
# `"127.0.0.1"`
|
119
108
|
# `["127.0.0.1:9200","127.0.0.2:9200"]`
|
120
|
-
# It is important to exclude http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html[dedicated master nodes] from the `
|
121
|
-
# to prevent LS from sending bulk requests to the master nodes. So this parameter should only reference either data or client nodes.
|
109
|
+
# It is important to exclude http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html[dedicated master nodes] from the `hosts` list
|
110
|
+
# to prevent LS from sending bulk requests to the master nodes. So this parameter should only reference either data or client nodes in Elasticsearch.
|
122
111
|
|
123
112
|
config :hosts, :validate => :array
|
124
113
|
|
125
|
-
#
|
126
|
-
|
114
|
+
# The port setting is obsolete. Please use the 'hosts' setting instead.
|
115
|
+
# Hosts entries can be in "host:port" format.
|
116
|
+
config :port, :obsolete => "Please use the 'hosts' setting instead. Hosts entries can be in 'host:port' format."
|
127
117
|
|
128
|
-
# This plugin uses the bulk index
|
129
|
-
# To make efficient bulk
|
118
|
+
# This plugin uses the bulk index API for improved indexing performance.
|
119
|
+
# To make efficient bulk API calls, we will buffer a certain number of
|
130
120
|
# events before flushing that out to Elasticsearch. This setting
|
131
121
|
# controls how many events will be buffered before sending a batch
|
132
|
-
# of events.
|
133
|
-
|
122
|
+
# of events. Increasing the `flush_size` has an effect on Logstash's heap size.
|
123
|
+
# Remember to also increase the heap size using `LS_HEAP_SIZE` if you are sending big documents
|
124
|
+
# or have increased the `flush_size` to a higher value.
|
125
|
+
config :flush_size, :validate => :number, :default => 500
|
134
126
|
|
135
127
|
# The amount of time since last flush before a flush is forced.
|
136
128
|
#
|
@@ -143,64 +135,61 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
143
135
|
# near-real-time.
|
144
136
|
config :idle_flush_time, :validate => :number, :default => 1
|
145
137
|
|
146
|
-
# The Elasticsearch action to perform. Valid actions are:
|
147
|
-
#
|
148
|
-
# Use of this setting *REQUIRES* you also configure the `document_id` setting
|
149
|
-
# because `delete` actions all require a document id.
|
150
|
-
#
|
151
|
-
# What does each action do?
|
138
|
+
# The Elasticsearch action to perform. Valid actions are:
|
152
139
|
#
|
153
140
|
# - index: indexes a document (an event from Logstash).
|
154
|
-
# - delete: deletes a document by id
|
141
|
+
# - delete: deletes a document by id (An id is required for this action)
|
155
142
|
# - create: indexes a document, fails if a document by that id already exists in the index.
|
156
|
-
# - update: updates a document by id
|
157
|
-
#
|
143
|
+
# - update: updates a document by id. Update has a special case where you can upsert -- update a
|
144
|
+
# document if not already present. See the `upsert` option
|
158
145
|
#
|
159
|
-
# For more details on actions, check out the http://www.
|
146
|
+
# For more details on actions, check out the http://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html[Elasticsearch bulk API documentation]
|
160
147
|
config :action, :validate => %w(index delete create update), :default => "index"
|
161
148
|
|
162
|
-
# Username
|
149
|
+
# Username to authenticate to a secure Elasticsearch cluster
|
163
150
|
config :user, :validate => :string
|
151
|
+
# Password to authenticate to a secure Elasticsearch cluster
|
164
152
|
config :password, :validate => :password
|
165
153
|
|
166
|
-
# HTTP Path at which the Elasticsearch server lives. Use this if you must run
|
167
|
-
# the root path for the Elasticsearch HTTP API lives.
|
154
|
+
# HTTP Path at which the Elasticsearch server lives. Use this if you must run Elasticsearch behind a proxy that remaps
|
155
|
+
# the root path for the Elasticsearch HTTP API lives.
|
168
156
|
config :path, :validate => :string, :default => "/"
|
169
157
|
|
170
|
-
# SSL
|
171
|
-
#
|
172
|
-
# Enable SSL
|
158
|
+
# Enable SSL/TLS secured communication to Elasticsearch cluster
|
173
159
|
config :ssl, :validate => :boolean, :default => false
|
174
160
|
|
175
|
-
#
|
176
|
-
#
|
177
|
-
#
|
161
|
+
# Option to validate the server's certificate. Disabling this severely compromises security.
|
162
|
+
# For more information on disabling certificate verification please read
|
163
|
+
# https://www.cs.utexas.edu/~shmat/shmat_ccs12.pdf
|
178
164
|
config :ssl_certificate_verification, :validate => :boolean, :default => true
|
179
165
|
|
180
166
|
# The .cer or .pem file to validate the server's certificate
|
181
167
|
config :cacert, :validate => :path
|
182
168
|
|
183
|
-
# The JKS truststore to validate the server's certificate
|
169
|
+
# The JKS truststore to validate the server's certificate.
|
184
170
|
# Use either `:truststore` or `:cacert`
|
185
171
|
config :truststore, :validate => :path
|
186
172
|
|
187
173
|
# Set the truststore password
|
188
174
|
config :truststore_password, :validate => :password
|
189
175
|
|
190
|
-
# The keystore used to present a certificate to the server
|
176
|
+
# The keystore used to present a certificate to the server.
|
191
177
|
# It can be either .jks or .p12
|
192
178
|
config :keystore, :validate => :path
|
193
179
|
|
194
180
|
# Set the truststore password
|
195
181
|
config :keystore_password, :validate => :password
|
196
182
|
|
197
|
-
#
|
198
|
-
#
|
199
|
-
# Will return ALL nodes with HTTP enabled (including master nodes!). If you use
|
183
|
+
# This setting asks Elasticsearch for the list of all cluster nodes and adds them to the hosts list.
|
184
|
+
# Note: This will return ALL nodes with HTTP enabled (including master nodes!). If you use
|
200
185
|
# this with master nodes, you probably want to disable HTTP on them by setting
|
201
|
-
# `http.enabled` to false in their elasticsearch.yml.
|
186
|
+
# `http.enabled` to false in their elasticsearch.yml. You can either use the `sniffing` option or
|
187
|
+
# manually enter multiple Elasticsearch hosts using the `hosts` paramater.
|
202
188
|
config :sniffing, :validate => :boolean, :default => false
|
203
189
|
|
190
|
+
# How long to wait, in seconds, between sniffing attempts
|
191
|
+
config :sniffing_delay, :validate => :number, :default => 5
|
192
|
+
|
204
193
|
# Set max retry for each event
|
205
194
|
config :max_retries, :validate => :number, :default => 3
|
206
195
|
|
@@ -210,45 +199,54 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
210
199
|
# Set max interval between bulk retries
|
211
200
|
config :retry_max_interval, :validate => :number, :default => 5
|
212
201
|
|
213
|
-
# Set the address of a forward HTTP proxy.
|
214
|
-
# Can be either a string, such as
|
215
|
-
# {host: 'proxy.org' port: 80 scheme: 'http'}
|
202
|
+
# Set the address of a forward HTTP proxy.
|
203
|
+
# Can be either a string, such as `http://localhost:123` or a hash in the form
|
204
|
+
# of `{host: 'proxy.org' port: 80 scheme: 'http'}`.
|
216
205
|
# Note, this is NOT a SOCKS proxy, but a plain HTTP proxy
|
217
206
|
config :proxy
|
218
207
|
|
219
|
-
# Enable doc_as_upsert for update mode
|
220
|
-
#
|
208
|
+
# Enable `doc_as_upsert` for update mode.
|
209
|
+
# Create a new document with source if `document_id` doesn't exist in Elasticsearch
|
221
210
|
config :doc_as_upsert, :validate => :boolean, :default => false
|
222
211
|
|
223
|
-
# Set upsert content for update mode
|
224
|
-
#
|
212
|
+
# Set upsert content for update mode.
|
213
|
+
# Create a new document with this parameter as json string if `document_id` doesn't exists
|
225
214
|
config :upsert, :validate => :string, :default => ""
|
226
215
|
|
216
|
+
# Set the timeout for network operations and requests sent Elasticsearch. If
|
217
|
+
# a timeout occurs, the request will be retried.
|
218
|
+
config :timeout, :validate => :number
|
219
|
+
|
227
220
|
public
|
228
221
|
def register
|
229
222
|
@hosts = Array(@hosts)
|
230
223
|
# retry-specific variables
|
231
224
|
@retry_flush_mutex = Mutex.new
|
232
|
-
@
|
225
|
+
@retry_close_requested = Concurrent::AtomicBoolean.new(false)
|
233
226
|
# needs flushing when interval
|
234
227
|
@retry_queue_needs_flushing = ConditionVariable.new
|
235
228
|
@retry_queue_not_full = ConditionVariable.new
|
236
229
|
@retry_queue = Queue.new
|
230
|
+
@submit_mutex = Mutex.new
|
237
231
|
|
238
232
|
client_settings = {}
|
239
|
-
common_options = {
|
233
|
+
common_options = {
|
234
|
+
:client_settings => client_settings,
|
235
|
+
:sniffing => @sniffing,
|
236
|
+
:sniffing_delay => @sniffing_delay
|
237
|
+
}
|
240
238
|
|
239
|
+
common_options[:timeout] = @timeout if @timeout
|
241
240
|
client_settings[:path] = "/#{@path}/".gsub(/\/+/, "/") # Normalize slashes
|
242
241
|
@logger.debug? && @logger.debug("Normalizing http path", :path => @path, :normalized => client_settings[:path])
|
243
242
|
|
244
|
-
if @
|
243
|
+
if @hosts.nil? || @hosts.empty?
|
245
244
|
@logger.info("No 'host' set in elasticsearch output. Defaulting to localhost")
|
246
|
-
@
|
245
|
+
@hosts = ["localhost"]
|
247
246
|
end
|
248
247
|
|
249
248
|
client_settings.merge! setup_ssl()
|
250
249
|
client_settings.merge! setup_proxy()
|
251
|
-
client_settings.merge! setup_sniffing()
|
252
250
|
common_options.merge! setup_basic_auth()
|
253
251
|
|
254
252
|
# Update API setup
|
@@ -258,13 +256,8 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
258
256
|
}
|
259
257
|
common_options.merge! update_options if @action == 'update'
|
260
258
|
|
261
|
-
option_hosts = @hosts.map do |host|
|
262
|
-
host_name, port = host.split(":")
|
263
|
-
{ :host => host_name, :port => (port || @port).to_i }
|
264
|
-
end
|
265
|
-
|
266
259
|
@client = LogStash::Outputs::Elasticsearch::HttpClient.new(
|
267
|
-
common_options.merge(:hosts => @hosts)
|
260
|
+
common_options.merge(:hosts => @hosts, :logger => @logger)
|
268
261
|
)
|
269
262
|
|
270
263
|
if @manage_template
|
@@ -276,7 +269,7 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
276
269
|
end
|
277
270
|
end
|
278
271
|
|
279
|
-
@logger.info("New Elasticsearch output", :hosts => @hosts
|
272
|
+
@logger.info("New Elasticsearch output", :hosts => @hosts)
|
280
273
|
|
281
274
|
@client_idx = 0
|
282
275
|
|
@@ -294,7 +287,7 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
294
287
|
end
|
295
288
|
|
296
289
|
@retry_thread = Thread.new do
|
297
|
-
while @
|
290
|
+
while @retry_close_requested.false?
|
298
291
|
@retry_flush_mutex.synchronize { @retry_queue_needs_flushing.wait(@retry_flush_mutex) }
|
299
292
|
retry_flush
|
300
293
|
end
|
@@ -317,9 +310,8 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
317
310
|
|
318
311
|
public
|
319
312
|
def receive(event)
|
320
|
-
return unless output?(event)
|
321
313
|
|
322
|
-
# block until we have not maxed out our
|
314
|
+
# block until we have not maxed out our
|
323
315
|
# retry queue. This is applying back-pressure
|
324
316
|
# to slow down the receive-rate
|
325
317
|
@retry_flush_mutex.synchronize {
|
@@ -343,7 +335,7 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
343
335
|
:_type => type,
|
344
336
|
:_routing => @routing ? event.sprintf(@routing) : nil
|
345
337
|
}
|
346
|
-
|
338
|
+
|
347
339
|
params[:_upsert] = LogStash::Json.load(event.sprintf(@upsert)) if @action == 'update' && @upsert != ""
|
348
340
|
|
349
341
|
buffer_receive([event.sprintf(@action), params, event])
|
@@ -353,21 +345,29 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
353
345
|
# The submit method can be called from both the
|
354
346
|
# Stud::Buffer flush thread and from our own retry thread.
|
355
347
|
def submit(actions)
|
356
|
-
|
348
|
+
@submit_mutex.synchronize do
|
349
|
+
es_actions = actions.map { |a, doc, event| [a, doc, event.to_hash] }
|
350
|
+
|
351
|
+
bulk_response = @client.bulk(es_actions)
|
357
352
|
|
358
|
-
|
353
|
+
next unless bulk_response["errors"]
|
359
354
|
|
360
|
-
if bulk_response["errors"]
|
361
|
-
actions_with_responses = actions.zip(bulk_response['statuses'])
|
362
355
|
actions_to_retry = []
|
363
|
-
|
364
|
-
|
365
|
-
|
356
|
+
|
357
|
+
bulk_response["items"].each_with_index do |resp,idx|
|
358
|
+
action_type, action_props = resp.first
|
359
|
+
|
360
|
+
status = action_props["status"]
|
361
|
+
action = actions[idx]
|
362
|
+
|
363
|
+
if RETRYABLE_CODES.include?(status)
|
364
|
+
@logger.warn "retrying failed action with response code: #{status}"
|
366
365
|
actions_to_retry << action
|
367
|
-
elsif not SUCCESS_CODES.include?(
|
368
|
-
@logger.warn "
|
366
|
+
elsif not SUCCESS_CODES.include?(status)
|
367
|
+
@logger.warn "Failed action. ", status: status, action: action, response: resp
|
369
368
|
end
|
370
369
|
end
|
370
|
+
|
371
371
|
retry_push(actions_to_retry) unless actions_to_retry.empty?
|
372
372
|
end
|
373
373
|
end
|
@@ -375,7 +375,7 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
375
375
|
# When there are exceptions raised upon submission, we raise an exception so that
|
376
376
|
# Stud::Buffer will retry to flush
|
377
377
|
public
|
378
|
-
def flush(actions,
|
378
|
+
def flush(actions, close = false)
|
379
379
|
begin
|
380
380
|
submit(actions)
|
381
381
|
rescue Manticore::SocketException => e
|
@@ -407,26 +407,24 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
407
407
|
end # def flush
|
408
408
|
|
409
409
|
public
|
410
|
-
def
|
411
|
-
|
412
|
-
File.delete(@truststore)
|
413
|
-
end
|
410
|
+
def close
|
411
|
+
@client.stop_sniffing!
|
414
412
|
|
415
|
-
@
|
413
|
+
@retry_close_requested.make_true
|
416
414
|
# First, make sure retry_timer_thread is stopped
|
417
|
-
# to ensure we do not signal a retry based on
|
415
|
+
# to ensure we do not signal a retry based on
|
418
416
|
# the retry interval.
|
419
417
|
Thread.kill(@retry_timer_thread)
|
420
418
|
@retry_timer_thread.join
|
421
|
-
# Signal flushing in the case that #retry_flush is in
|
419
|
+
# Signal flushing in the case that #retry_flush is in
|
422
420
|
# the process of waiting for a signal.
|
423
421
|
@retry_flush_mutex.synchronize { @retry_queue_needs_flushing.signal }
|
424
|
-
# Now, #retry_flush is ensured to not be in a state of
|
422
|
+
# Now, #retry_flush is ensured to not be in a state of
|
425
423
|
# waiting and can be safely joined into the main thread
|
426
424
|
# for further final execution of an in-process remaining call.
|
427
425
|
@retry_thread.join
|
428
426
|
|
429
|
-
# execute any final actions along with a proceeding retry for any
|
427
|
+
# execute any final actions along with a proceeding retry for any
|
430
428
|
# final actions that did not succeed.
|
431
429
|
buffer_flush(:final => true)
|
432
430
|
retry_flush
|
@@ -448,11 +446,6 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
448
446
|
return {:proxy => proxy}
|
449
447
|
end
|
450
448
|
|
451
|
-
private
|
452
|
-
def setup_sniffing
|
453
|
-
{ :reload_connections => @reload_connections }
|
454
|
-
end
|
455
|
-
|
456
449
|
private
|
457
450
|
def setup_ssl
|
458
451
|
return {} unless @ssl
|
@@ -460,12 +453,15 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
460
453
|
if @cacert && @truststore
|
461
454
|
raise(LogStash::ConfigurationError, "Use either \"cacert\" or \"truststore\" when configuring the CA certificate") if @truststore
|
462
455
|
end
|
456
|
+
|
463
457
|
ssl_options = {}
|
464
|
-
|
465
|
-
|
458
|
+
|
459
|
+
if @cacert
|
460
|
+
ssl_options[:ca_file] = @cacert
|
466
461
|
elsif @truststore
|
467
462
|
ssl_options[:truststore_password] = @truststore_password.value if @truststore_password
|
468
463
|
end
|
464
|
+
|
469
465
|
ssl_options[:truststore] = @truststore if @truststore
|
470
466
|
if @keystore
|
471
467
|
ssl_options[:keystore] = @keystore
|
@@ -493,35 +489,12 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
493
489
|
end
|
494
490
|
|
495
491
|
private
|
496
|
-
|
497
|
-
|
498
|
-
require 'securerandom'
|
499
|
-
require 'tempfile'
|
500
|
-
require 'java'
|
501
|
-
import java.io.FileInputStream
|
502
|
-
import java.io.FileOutputStream
|
503
|
-
import java.security.KeyStore
|
504
|
-
import java.security.cert.CertificateFactory
|
505
|
-
|
506
|
-
jks = java.io.File.createTempFile("cert", ".jks")
|
507
|
-
|
508
|
-
ks = KeyStore.getInstance "JKS"
|
509
|
-
ks.load nil, nil
|
510
|
-
cf = CertificateFactory.getInstance "X.509"
|
511
|
-
cert = cf.generateCertificate FileInputStream.new(cert_path)
|
512
|
-
ks.setCertificateEntry "cacert", cert
|
513
|
-
pwd = SecureRandom.urlsafe_base64(9)
|
514
|
-
ks.store FileOutputStream.new(jks), pwd.to_java.toCharArray
|
515
|
-
[jks.path, pwd]
|
516
|
-
end
|
517
|
-
|
518
|
-
private
|
519
|
-
# in charge of submitting any actions in @retry_queue that need to be
|
492
|
+
# in charge of submitting any actions in @retry_queue that need to be
|
520
493
|
# retried
|
521
494
|
#
|
522
495
|
# This method is not called concurrently. It is only called by @retry_thread
|
523
|
-
# and once that thread is ended during the
|
524
|
-
# to this method is done upon
|
496
|
+
# and once that thread is ended during the close process, a final call
|
497
|
+
# to this method is done upon close in the main thread.
|
525
498
|
def retry_flush()
|
526
499
|
unless @retry_queue.empty?
|
527
500
|
buffer = @retry_queue.size.times.map do
|