logstash-output-elasticsearch 2.0.0.pre.beta-java → 2.1.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 +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
|