logstash-output-elasticsearch_java 2.0.2 → 2.1.1.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/Gemfile +1 -1
- data/lib/logstash/outputs/elasticsearch_java.rb +37 -386
- data/lib/logstash/outputs/elasticsearch_java/protocol.rb +201 -228
- data/logstash-output-elasticsearch_java.gemspec +2 -1
- data/spec/integration/outputs/elasticsearch/node_spec.rb +0 -25
- data/spec/integration/outputs/index_spec.rb +2 -4
- data/spec/integration/outputs/retry_spec.rb +24 -14
- data/spec/integration/outputs/routing_spec.rb +1 -2
- data/spec/integration/outputs/secure_spec.rb +4 -4
- data/spec/integration/outputs/templates_spec.rb +13 -11
- data/spec/integration/outputs/transport_create_spec.rb +5 -6
- data/spec/integration/outputs/update_spec.rb +5 -6
- data/spec/unit/outputs/elasticsearch/protocol_spec.rb +6 -3
- data/spec/unit/outputs/elasticsearch_spec.rb +0 -1
- data/vendor/jar-dependencies/runtime-jars/{elasticsearch-2.0.0.jar → elasticsearch-2.1.0.jar} +0 -0
- data/vendor/jar-dependencies/runtime-jars/jackson-core-2.6.2.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/jackson-dataformat-cbor-2.6.2.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/jackson-dataformat-smile-2.6.2.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/jackson-dataformat-yaml-2.6.2.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/{lucene-analyzers-common-5.2.1.jar → lucene-analyzers-common-5.3.1.jar} +0 -0
- data/vendor/jar-dependencies/runtime-jars/{lucene-backward-codecs-5.2.1.jar → lucene-backward-codecs-5.3.1.jar} +0 -0
- data/vendor/jar-dependencies/runtime-jars/{lucene-core-5.2.1.jar → lucene-core-5.3.1.jar} +0 -0
- data/vendor/jar-dependencies/runtime-jars/{lucene-expressions-5.2.1.jar → lucene-expressions-5.3.1.jar} +0 -0
- data/vendor/jar-dependencies/runtime-jars/{lucene-grouping-5.2.1.jar → lucene-grouping-5.3.1.jar} +0 -0
- data/vendor/jar-dependencies/runtime-jars/{lucene-highlighter-5.2.1.jar → lucene-highlighter-5.3.1.jar} +0 -0
- data/vendor/jar-dependencies/runtime-jars/lucene-join-5.3.1.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/lucene-memory-5.3.1.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/{lucene-misc-5.2.1.jar → lucene-misc-5.3.1.jar} +0 -0
- data/vendor/jar-dependencies/runtime-jars/{lucene-queries-5.2.1.jar → lucene-queries-5.3.1.jar} +0 -0
- data/vendor/jar-dependencies/runtime-jars/{lucene-queryparser-5.2.1.jar → lucene-queryparser-5.3.1.jar} +0 -0
- data/vendor/jar-dependencies/runtime-jars/lucene-sandbox-5.3.1.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/{lucene-spatial-5.2.1.jar → lucene-spatial-5.3.1.jar} +0 -0
- data/vendor/jar-dependencies/runtime-jars/lucene-spatial3d-5.3.1.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/lucene-suggest-5.3.1.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/snakeyaml-1.15.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/spatial4j-0.5.jar +0 -0
- metadata +105 -91
- data/lib/logstash/outputs/elasticsearch_java/elasticsearch-template.json +0 -93
- data/vendor/jar-dependencies/runtime-jars/jackson-core-2.5.3.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/jackson-dataformat-cbor-2.5.3.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/jackson-dataformat-smile-2.5.3.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/jackson-dataformat-yaml-2.5.3.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/lucene-join-5.2.1.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/lucene-memory-5.2.1.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/lucene-sandbox-5.2.1.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/lucene-suggest-5.2.1.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/snakeyaml-1.12.jar +0 -0
- data/vendor/jar-dependencies/runtime-jars/spatial4j-0.4.1.jar +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5cebb6798c2db7392cf7a8a7957e37b7290306d5
|
4
|
+
data.tar.gz: ad5f55d2a1b7de142b35c7b69262f7d501867b0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 220a4b40f8bf0294b3e2ecdba3d7647fa72fbb1e1f0d7e0ecf22ad27c823aefeef3dd584227193e0e24781b881a4545227c70691f458bcecc695aafc47d63740
|
7
|
+
data.tar.gz: b7db119540b418fb3602be6e86909eb4675cc340e56b546bd2b4e8bfa22b0c61f9ec7cdbe42b65a3a1b243b6d271c3402e15805dea1cc2d7d3bc3bb1e679f1c6
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## 2.1.1
|
2
|
+
- Support Elasticsearch 2.1.0
|
3
|
+
- Fix issue where transport client w/o port specified breaks
|
4
|
+
## 2.1.0
|
5
|
+
- Port option no longer allowed
|
6
|
+
- Majority of code now shared with logstash-output-elasticsearch
|
1
7
|
## 2.0.2
|
2
8
|
- Update loading of addons to conform with new naming scheme (replaced - with _)
|
3
9
|
## 2.0.1
|
data/Gemfile
CHANGED
@@ -4,11 +4,11 @@ require "logstash/environment"
|
|
4
4
|
require "logstash/outputs/base"
|
5
5
|
require "logstash/json"
|
6
6
|
require "concurrent"
|
7
|
-
require "stud/buffer"
|
8
7
|
require "socket" # for Socket.gethostname
|
9
8
|
require "thread" # for safe queueing
|
10
9
|
require "uri" # for escaping user input
|
11
10
|
require "logstash/outputs/elasticsearch_java/protocol"
|
11
|
+
require "logstash/outputs/elasticsearch"
|
12
12
|
|
13
13
|
# This output lets you store logs in Elasticsearch using the native 'node' and 'transport'
|
14
14
|
# protocols. It is highly recommended to use the regular 'logstash-output-elasticsearch' output
|
@@ -67,66 +67,25 @@ require "logstash/outputs/elasticsearch_java/protocol"
|
|
67
67
|
class LogStash::Outputs::ElasticSearchJava < LogStash::Outputs::Base
|
68
68
|
attr_reader :client
|
69
69
|
|
70
|
-
include
|
70
|
+
include LogStash::Outputs::ElasticSearch::CommonConfigs
|
71
|
+
include LogStash::Outputs::ElasticSearch::Common
|
72
|
+
|
71
73
|
RETRYABLE_CODES = [409, 429, 503]
|
72
74
|
SUCCESS_CODES = [200, 201]
|
73
75
|
|
74
76
|
config_name "elasticsearch_java"
|
75
77
|
|
76
|
-
# The
|
77
|
-
# The default value will partition your indices by day so you can more easily
|
78
|
-
# delete old data or only search specific date ranges.
|
79
|
-
# Indexes may not contain uppercase characters.
|
80
|
-
# For weekly indexes ISO 8601 format is recommended, eg. logstash-%{+xxxx.ww}
|
81
|
-
config :index, :validate => :string, :default => "logstash-%{+YYYY.MM.dd}"
|
82
|
-
|
83
|
-
# The index type to write events to. Generally you should try to write only
|
84
|
-
# similar events to the same 'type'. String expansion `%{foo}` works here.
|
85
|
-
#
|
86
|
-
# Deprecated in favor of `document_type` field.
|
87
|
-
config :index_type, :validate => :string, :deprecated => "Please use the 'document_type' setting instead. It has the same effect, but is more appropriately named."
|
88
|
-
|
89
|
-
# The document type to write events to. Generally you should try to write only
|
90
|
-
# similar events to the same 'type'. String expansion `%{foo}` works here.
|
91
|
-
# Unless you set 'document_type', the event 'type' will be used if it exists
|
92
|
-
# otherwise the document type will be assigned the value of 'logs'
|
93
|
-
config :document_type, :validate => :string
|
94
|
-
|
95
|
-
# Starting in Logstash 1.3 (unless you set option `manage_template` to false)
|
96
|
-
# a default mapping template for Elasticsearch will be applied, if you do not
|
97
|
-
# already have one set to match the index pattern defined (default of
|
98
|
-
# `logstash-%{+YYYY.MM.dd}`), minus any variables. For example, in this case
|
99
|
-
# the template will be applied to all indices starting with `logstash-*`
|
78
|
+
# The Elasticsearch action to perform. Valid actions are:
|
100
79
|
#
|
101
|
-
#
|
102
|
-
#
|
103
|
-
#
|
104
|
-
|
105
|
-
|
106
|
-
#
|
107
|
-
# Note that if you have used the template management features and subsequently
|
108
|
-
# change this, you will need to prune the old template manually, e.g.
|
109
|
-
#
|
110
|
-
# `curl -XDELETE <http://localhost:9200/_template/OldTemplateName?pretty>`
|
80
|
+
# - index: indexes a document (an event from Logstash).
|
81
|
+
# - delete: deletes a document by id (An id is required for this action)
|
82
|
+
# - create: indexes a document, fails if a document by that id already exists in the index.
|
83
|
+
# - update: updates a document by id. Update has a special case where you can upsert -- update a
|
84
|
+
# document if not already present. See the `upsert` option
|
85
|
+
# - create_unless_exists: create the document unless it already exists, in which case do nothing.
|
111
86
|
#
|
112
|
-
#
|
113
|
-
config :
|
114
|
-
|
115
|
-
# You can set the path to your own template here, if you so desire.
|
116
|
-
# If not set, the included template will be used.
|
117
|
-
config :template, :validate => :path
|
118
|
-
|
119
|
-
# Overwrite the current template with whatever is configured
|
120
|
-
# in the `template` and `template_name` directives.
|
121
|
-
config :template_overwrite, :validate => :boolean, :default => false
|
122
|
-
|
123
|
-
# The document ID for the index. Useful for overwriting existing entries in
|
124
|
-
# Elasticsearch with the same ID.
|
125
|
-
config :document_id, :validate => :string
|
126
|
-
|
127
|
-
# A routing override to be applied to all processed events.
|
128
|
-
# This can be dynamic using the `%{foo}` syntax.
|
129
|
-
config :routing, :validate => :string
|
87
|
+
# For more details on actions, check out the http://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html[Elasticsearch bulk API documentation]
|
88
|
+
config :action, :validate => %w(index delete create update create_unless_exists), :default => "index"
|
130
89
|
|
131
90
|
# The name of your cluster if you set it on the Elasticsearch side. Useful
|
132
91
|
# for discovery when using `node` or `transport` protocols.
|
@@ -134,53 +93,6 @@ class LogStash::Outputs::ElasticSearchJava < LogStash::Outputs::Base
|
|
134
93
|
# Equivalent to the Elasticsearch option 'cluster.name'
|
135
94
|
config :cluster, :validate => :string
|
136
95
|
|
137
|
-
# For the `node` protocol, if you do not specify `host`, it will attempt to use
|
138
|
-
# multicast discovery to connect to Elasticsearch. If http://www.elastic.co/guide/en/elasticsearch/guide/current/_important_configuration_changes.html#_prefer_unicast_over_multicast[multicast is disabled] in Elasticsearch,
|
139
|
-
# you must include the hostname or IP address of the host(s) to use for Elasticsearch unicast discovery.
|
140
|
-
# Remember the `node` protocol uses the http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-transport.html#modules-transport[transport] address (eg. 9300, not 9200).
|
141
|
-
# `"127.0.0.1"`
|
142
|
-
# `["127.0.0.1:9300","127.0.0.2:9300"]`
|
143
|
-
# When setting hosts for `node` protocol, it is important to confirm that at least one non-client
|
144
|
-
# node is listed in the `host` list. Also keep in mind that the `host` parameter when used with
|
145
|
-
# the `node` protocol is for *discovery purposes only* (not for load balancing). When multiple hosts
|
146
|
-
# are specified, it will contact the first host to see if it can use it to discover the cluster. If not,
|
147
|
-
# then it will contact the second host in the list and so forth. With the `node` protocol,
|
148
|
-
# Logstash will join the Elasticsearch cluster as a node client (which has a copy of the cluster
|
149
|
-
# state) and this node client is the one that will automatically handle the load balancing of requests
|
150
|
-
# across data nodes in the cluster.
|
151
|
-
# If you are looking for a high availability setup, our recommendation is to use the `transport` protocol (below),
|
152
|
-
# set up multiple http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html[client nodes] and list the client nodes in the `host` parameter.
|
153
|
-
#
|
154
|
-
# For the `transport` protocol, it will load balance requests across the hosts specified in the `host` parameter.
|
155
|
-
# Remember the `transport` protocol uses the http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-transport.html#modules-transport[transport] address (eg. 9300, not 9200).
|
156
|
-
# `"127.0.0.1"`
|
157
|
-
# `["127.0.0.1:9300","127.0.0.2:9300"]`
|
158
|
-
# There is also a `sniffing` option (see below) that can be used with the transport protocol to instruct it to use the host to sniff for
|
159
|
-
# "alive" nodes in the cluster and automatically use it as the hosts list (but will skip the dedicated master nodes).
|
160
|
-
# If you do not use the sniffing option, it is important to exclude http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html[dedicated master nodes] from the `host` list
|
161
|
-
# to prevent Logstash from sending bulk requests to the master nodes. So this parameter should only reference either data or client nodes.
|
162
|
-
#
|
163
|
-
# For the `http` protocol, it will load balance requests across the hosts specified in the `host` parameter.
|
164
|
-
# 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).
|
165
|
-
# `"127.0.0.1"`
|
166
|
-
# `["127.0.0.1:9200","127.0.0.2:9200"]`
|
167
|
-
# It is important to exclude http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html[dedicated master nodes] from the `host` list
|
168
|
-
# to prevent LS from sending bulk requests to the master nodes. So this parameter should only reference either data or client nodes.
|
169
|
-
config :hosts, :validate => :array, :default => ["127.0.0.1"]
|
170
|
-
|
171
|
-
# The port for Elasticsearch transport to use.
|
172
|
-
#
|
173
|
-
# If you do not set this, the following defaults are used:
|
174
|
-
# * `protocol => transport` - port 9300-9305
|
175
|
-
# * `protocol => node` - port 9300-9305
|
176
|
-
config :port, :validate => :string, :default => "9300-9305"
|
177
|
-
|
178
|
-
# The name/address of the host to bind to for Elasticsearch clustering. Equivalent to the Elasticsearch option 'network.host'
|
179
|
-
# option.
|
180
|
-
# This MUST be set for either protocol to work (node or transport)! The internal Elasticsearch node
|
181
|
-
# will bind to this ip. This ip MUST be reachable by all nodes in the Elasticsearch cluster
|
182
|
-
config :network_host, :validate => :string, :required => true
|
183
|
-
|
184
96
|
# This sets the local port to bind to. Equivalent to the Elasticsrearch option 'transport.tcp.port'
|
185
97
|
config :transport_tcp_port, :validate => :number
|
186
98
|
|
@@ -193,24 +105,6 @@ class LogStash::Outputs::ElasticSearchJava < LogStash::Outputs::Base
|
|
193
105
|
# By default, this is generated internally by the ES client.
|
194
106
|
config :node_name, :validate => :string
|
195
107
|
|
196
|
-
# This plugin uses the bulk index api for improved indexing performance.
|
197
|
-
# To make efficient bulk api calls, we will buffer a certain number of
|
198
|
-
# events before flushing that out to Elasticsearch. This setting
|
199
|
-
# controls how many events will be buffered before sending a batch
|
200
|
-
# of events.
|
201
|
-
config :flush_size, :validate => :number, :default => 500
|
202
|
-
|
203
|
-
# The amount of time since last flush before a flush is forced.
|
204
|
-
#
|
205
|
-
# This setting helps ensure slow event rates don't get stuck in Logstash.
|
206
|
-
# For example, if your `flush_size` is 100, and you have received 10 events,
|
207
|
-
# and it has been more than `idle_flush_time` seconds since the last flush,
|
208
|
-
# Logstash will flush those 10 events automatically.
|
209
|
-
#
|
210
|
-
# This helps keep both fast and slow log streams moving along in
|
211
|
-
# near-real-time.
|
212
|
-
config :idle_flush_time, :validate => :number, :default => 1
|
213
|
-
|
214
108
|
# Choose the protocol used to talk to Elasticsearch.
|
215
109
|
#
|
216
110
|
# The 'node' protocol (default) will connect to the cluster as a normal Elasticsearch
|
@@ -231,132 +125,16 @@ class LogStash::Outputs::ElasticSearchJava < LogStash::Outputs::Base
|
|
231
125
|
# All protocols will use bulk requests when talking to Elasticsearch.
|
232
126
|
config :protocol, :validate => [ "node", "transport"], :default => "transport"
|
233
127
|
|
234
|
-
# The Elasticsearch action to perform. Valid actions are: `index`, `delete`.
|
235
|
-
#
|
236
|
-
# Use of this setting *REQUIRES* you also configure the `document_id` setting
|
237
|
-
# because `delete` actions all require a document id.
|
238
|
-
#
|
239
|
-
# What does each action do?
|
240
|
-
#
|
241
|
-
# - index: indexes a document (an event from Logstash).
|
242
|
-
# - delete: deletes a document by id
|
243
|
-
# - create: indexes a document, fails if a document by that id already exists in the index.
|
244
|
-
# - update: updates a document by id
|
245
|
-
# following action is not supported by HTTP protocol
|
246
|
-
# - create_unless_exists: creates a document, fails if no id is provided
|
247
|
-
#
|
248
|
-
# For more details on actions, check out the http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html[Elasticsearch bulk API documentation]
|
249
|
-
config :action, :validate => :string, :default => "index"
|
250
|
-
|
251
|
-
# Validate the server's certificate
|
252
|
-
# Disabling this severely compromises security
|
253
|
-
# For more information read https://www.cs.utexas.edu/~shmat/shmat_ccs12.pdf
|
254
|
-
config :ssl_certificate_verification, :validate => :boolean, :default => true
|
255
|
-
|
256
|
-
# The .cer or .pem file to validate the server's certificate
|
257
|
-
config :cacert, :validate => :path
|
258
|
-
|
259
|
-
# The JKS truststore to validate the server's certificate
|
260
|
-
# Use either `:truststore` or `:cacert`
|
261
|
-
config :truststore, :validate => :path
|
262
|
-
|
263
|
-
# Set the truststore password
|
264
|
-
config :truststore_password, :validate => :password
|
265
|
-
|
266
|
-
# The keystore used to present a certificate to the server
|
267
|
-
# It can be either .jks or .p12
|
268
|
-
config :keystore, :validate => :path
|
269
|
-
|
270
|
-
# Set the truststore password
|
271
|
-
config :keystore_password, :validate => :password
|
272
|
-
|
273
128
|
# Enable cluster sniffing (transport only).
|
274
129
|
# Asks host for the list of all cluster nodes and adds them to the hosts list
|
275
130
|
# Equivalent to the Elasticsearch option 'client.transport.sniff'
|
276
131
|
config :sniffing, :validate => :boolean, :default => false
|
277
132
|
|
278
|
-
#
|
279
|
-
|
280
|
-
|
281
|
-
#
|
282
|
-
config :
|
283
|
-
|
284
|
-
# Set max interval between bulk retries
|
285
|
-
config :retry_max_interval, :validate => :number, :default => 5
|
286
|
-
|
287
|
-
# Enable doc_as_upsert for update mode
|
288
|
-
# create a new document with source if document_id doesn't exists
|
289
|
-
config :doc_as_upsert, :validate => :boolean, :default => false
|
290
|
-
|
291
|
-
# Set upsert content for update mode
|
292
|
-
# create a new document with this parameter as json string if document_id doesn't exists
|
293
|
-
config :upsert, :validate => :string, :default => ""
|
294
|
-
|
295
|
-
public
|
296
|
-
def register
|
297
|
-
@submit_mutex = Mutex.new
|
298
|
-
# retry-specific variables
|
299
|
-
@retry_flush_mutex = Mutex.new
|
300
|
-
@retry_teardown_requested = Concurrent::AtomicBoolean.new(false)
|
301
|
-
# needs flushing when interval
|
302
|
-
@retry_queue_needs_flushing = ConditionVariable.new
|
303
|
-
@retry_queue_not_full = ConditionVariable.new
|
304
|
-
@retry_queue = Queue.new
|
305
|
-
|
306
|
-
|
307
|
-
if @protocol =='node' && !@network_host
|
308
|
-
raise LogStash::ConfigurationError, "network_host MUST be set if the 'node' protocol is in use! If this is set incorrectly Logstash will hang attempting to connect!"
|
309
|
-
end
|
310
|
-
|
311
|
-
if (@hosts.nil? || @hosts.empty?) && @protocol != "node" # node can use zen discovery
|
312
|
-
@logger.info("No 'hosts' set in elasticsearch output. Defaulting to localhost")
|
313
|
-
@hosts = ["localhost"]
|
314
|
-
end
|
315
|
-
|
316
|
-
client_class = case @protocol
|
317
|
-
when "transport"
|
318
|
-
LogStash::Outputs::ElasticSearchJavaPlugins::Protocols::TransportClient
|
319
|
-
when "node"
|
320
|
-
LogStash::Outputs::ElasticSearchJavaPlugins::Protocols::NodeClient
|
321
|
-
end
|
322
|
-
|
323
|
-
@client = client_class.new(client_options)
|
324
|
-
|
325
|
-
if @manage_template
|
326
|
-
begin
|
327
|
-
@logger.info("Automatic template management enabled", :manage_template => @manage_template.to_s)
|
328
|
-
client.template_install(@template_name, get_template, @template_overwrite)
|
329
|
-
rescue => e
|
330
|
-
@logger.error("Failed to install template",
|
331
|
-
:message => e.message,
|
332
|
-
:error_class => e.class.name,
|
333
|
-
)
|
334
|
-
end
|
335
|
-
end
|
336
|
-
|
337
|
-
@logger.info("New Elasticsearch output", :cluster => @cluster,
|
338
|
-
:hosts => @host, :port => @port, :protocol => @protocol)
|
339
|
-
|
340
|
-
buffer_initialize(
|
341
|
-
:max_items => @flush_size,
|
342
|
-
:max_interval => @idle_flush_time,
|
343
|
-
:logger => @logger
|
344
|
-
)
|
345
|
-
|
346
|
-
@retry_timer_thread = Thread.new do
|
347
|
-
loop do
|
348
|
-
sleep(@retry_max_interval)
|
349
|
-
@retry_flush_mutex.synchronize { @retry_queue_needs_flushing.signal }
|
350
|
-
end
|
351
|
-
end
|
352
|
-
|
353
|
-
@retry_thread = Thread.new do
|
354
|
-
while @retry_teardown_requested.false?
|
355
|
-
@retry_flush_mutex.synchronize { @retry_queue_needs_flushing.wait(@retry_flush_mutex) }
|
356
|
-
retry_flush
|
357
|
-
end
|
358
|
-
end
|
359
|
-
end # def register
|
133
|
+
# The name/address of the host to bind to for Elasticsearch clustering. Equivalent to the Elasticsearch option 'network.host'
|
134
|
+
# option.
|
135
|
+
# This MUST be set for either protocol to work (node or transport)! The internal Elasticsearch node
|
136
|
+
# will bind to this ip. This ip MUST be reachable by all nodes in the Elasticsearch cluster
|
137
|
+
config :network_host, :validate => :string, :required => true
|
360
138
|
|
361
139
|
def client_options
|
362
140
|
client_settings = {}
|
@@ -371,16 +149,10 @@ class LogStash::Outputs::ElasticSearchJava < LogStash::Outputs::Base
|
|
371
149
|
client_settings["node.name"] = "logstash-#{Socket.gethostname}-#{$$}-#{object_id}"
|
372
150
|
end
|
373
151
|
|
374
|
-
|
375
|
-
name = plugin.name.split('_')[-1]
|
376
|
-
client_settings.merge!(LogStash::Outputs::ElasticSearchJava.const_get(name.capitalize).create_client_config(self))
|
377
|
-
end
|
378
|
-
|
379
|
-
common_options = {
|
152
|
+
options = {
|
380
153
|
:protocol => @protocol,
|
381
154
|
:client_settings => client_settings,
|
382
|
-
:hosts => @hosts
|
383
|
-
:port => @port
|
155
|
+
:hosts => @hosts
|
384
156
|
}
|
385
157
|
|
386
158
|
# Update API setup
|
@@ -388,155 +160,34 @@ class LogStash::Outputs::ElasticSearchJava < LogStash::Outputs::Base
|
|
388
160
|
:upsert => @upsert,
|
389
161
|
:doc_as_upsert => @doc_as_upsert
|
390
162
|
}
|
391
|
-
|
163
|
+
options.merge! update_options if @action == 'update'
|
392
164
|
|
393
|
-
|
165
|
+
options
|
394
166
|
end
|
395
167
|
|
396
|
-
|
397
|
-
|
398
|
-
def get_template
|
399
|
-
if @template.nil?
|
400
|
-
@template = ::File.expand_path('elasticsearch_java/elasticsearch-template.json', ::File.dirname(__FILE__))
|
401
|
-
if !File.exists?(@template)
|
402
|
-
raise "You must specify 'template => ...' in your elasticsearch output (I looked for '#{@template}')"
|
403
|
-
end
|
404
|
-
end
|
405
|
-
template_json = IO.read(@template).gsub(/\n/,'')
|
406
|
-
template = LogStash::Json.load(template_json)
|
407
|
-
@logger.info("Using mapping template", :template => template)
|
408
|
-
return template
|
409
|
-
end # def get_template
|
410
|
-
|
411
|
-
public
|
412
|
-
def receive(event)
|
413
|
-
|
414
|
-
|
415
|
-
# block until we have not maxed out our
|
416
|
-
# retry queue. This is applying back-pressure
|
417
|
-
# to slow down the receive-rate
|
418
|
-
@retry_flush_mutex.synchronize {
|
419
|
-
@retry_queue_not_full.wait(@retry_flush_mutex) while @retry_queue.size > @retry_max_items
|
420
|
-
}
|
421
|
-
|
422
|
-
event['@metadata']['retry_count'] = 0
|
423
|
-
|
424
|
-
# Set the 'type' value for the index.
|
425
|
-
type = if @document_type
|
426
|
-
event.sprintf(@document_type)
|
427
|
-
elsif @index_type # deprecated
|
428
|
-
event.sprintf(@index_type)
|
429
|
-
else
|
430
|
-
event["type"] || "logs"
|
431
|
-
end
|
432
|
-
|
433
|
-
params = {
|
434
|
-
:_id => @document_id ? event.sprintf(@document_id) : nil,
|
435
|
-
:_index => event.sprintf(@index),
|
436
|
-
:_type => type,
|
437
|
-
:_routing => @routing ? event.sprintf(@routing) : nil
|
438
|
-
}
|
439
|
-
|
440
|
-
params[:_upsert] = LogStash::Json.load(event.sprintf(@upsert)) if @action == 'update' && @upsert != ""
|
441
|
-
|
442
|
-
buffer_receive([event.sprintf(@action), params, event])
|
443
|
-
end # def receive
|
444
|
-
|
445
|
-
public
|
446
|
-
# The submit method can be called from both the
|
447
|
-
# Stud::Buffer flush thread and from our own retry thread.
|
448
|
-
def submit(actions)
|
449
|
-
es_actions = actions.map { |a, doc, event| [a, doc, event.to_hash] }
|
450
|
-
@submit_mutex.lock
|
451
|
-
begin
|
452
|
-
bulk_response = @client.bulk(es_actions)
|
453
|
-
ensure
|
454
|
-
@submit_mutex.unlock
|
455
|
-
end
|
456
|
-
if bulk_response["errors"]
|
457
|
-
actions_with_responses = actions.zip(bulk_response['statuses'])
|
458
|
-
actions_to_retry = []
|
459
|
-
actions_with_responses.each do |action, resp_code|
|
460
|
-
if RETRYABLE_CODES.include?(resp_code)
|
461
|
-
@logger.warn "retrying failed action with response code: #{resp_code}"
|
462
|
-
actions_to_retry << action
|
463
|
-
elsif not SUCCESS_CODES.include?(resp_code)
|
464
|
-
@logger.warn "failed action with response of #{resp_code}, dropping action: #{action}"
|
465
|
-
end
|
466
|
-
end
|
467
|
-
retry_push(actions_to_retry) unless actions_to_retry.empty?
|
468
|
-
end
|
168
|
+
def build_client
|
169
|
+
@client = client_class.new(client_options)
|
469
170
|
end
|
470
171
|
|
471
|
-
# When there are exceptions raised upon submission, we raise an exception so that
|
472
|
-
# Stud::Buffer will retry to flush
|
473
|
-
public
|
474
|
-
def flush(actions, teardown = false)
|
475
|
-
begin
|
476
|
-
submit(actions)
|
477
|
-
rescue => e
|
478
|
-
@logger.error "Got error to send bulk of actions: #{e.message}"
|
479
|
-
raise e
|
480
|
-
end
|
481
|
-
end # def flush
|
482
|
-
|
483
|
-
public
|
484
172
|
def close
|
485
|
-
@
|
486
|
-
|
487
|
-
# to ensure we do not signal a retry based on
|
488
|
-
# the retry interval.
|
489
|
-
Thread.kill(@retry_timer_thread)
|
490
|
-
@retry_timer_thread.join
|
491
|
-
# Signal flushing in the case that #retry_flush is in
|
492
|
-
# the process of waiting for a signal.
|
493
|
-
@retry_flush_mutex.synchronize { @retry_queue_needs_flushing.signal }
|
494
|
-
# Now, #retry_flush is ensured to not be in a state of
|
495
|
-
# waiting and can be safely joined into the main thread
|
496
|
-
# for further final execution of an in-process remaining call.
|
497
|
-
@retry_thread.join
|
498
|
-
|
499
|
-
# execute any final actions along with a proceeding retry for any
|
500
|
-
# final actions that did not succeed.
|
501
|
-
buffer_flush(:final => true)
|
502
|
-
retry_flush
|
173
|
+
@stopping.make_true
|
174
|
+
@buffer.stop
|
503
175
|
end
|
504
176
|
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
# This method is not called concurrently. It is only called by @retry_thread
|
510
|
-
# and once that thread is ended during the teardown process, a final call
|
511
|
-
# to this method is done upon teardown in the main thread.
|
512
|
-
def retry_flush()
|
513
|
-
unless @retry_queue.empty?
|
514
|
-
buffer = @retry_queue.size.times.map do
|
515
|
-
next_action, next_doc, next_event = @retry_queue.pop
|
516
|
-
next_event['@metadata']['retry_count'] += 1
|
517
|
-
|
518
|
-
if next_event['@metadata']['retry_count'] > @max_retries
|
519
|
-
@logger.error "too many attempts at sending event. dropping: #{next_event}"
|
520
|
-
nil
|
521
|
-
else
|
522
|
-
[next_action, next_doc, next_event]
|
523
|
-
end
|
524
|
-
end.compact
|
525
|
-
|
526
|
-
submit(buffer) unless buffer.empty?
|
177
|
+
def get_plugin_options
|
178
|
+
@@plugins.each do |plugin|
|
179
|
+
name = plugin.name.split('-')[-1]
|
180
|
+
client_settings.merge!(LogStash::Outputs::ElasticSearchJava.const_get(name.capitalize).create_client_config(self))
|
527
181
|
end
|
528
|
-
|
529
|
-
@retry_flush_mutex.synchronize {
|
530
|
-
@retry_queue_not_full.signal if @retry_queue.size < @retry_max_items
|
531
|
-
}
|
532
182
|
end
|
533
183
|
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
184
|
+
def client_class
|
185
|
+
case @protocol
|
186
|
+
when "transport"
|
187
|
+
LogStash::Outputs::ElasticSearchJavaPlugins::Protocols::TransportClient
|
188
|
+
when "node"
|
189
|
+
LogStash::Outputs::ElasticSearchJavaPlugins::Protocols::NodeClient
|
190
|
+
end
|
540
191
|
end
|
541
192
|
|
542
193
|
@@plugins = Gem::Specification.find_all{|spec| spec.name =~ /logstash-output-elasticsearch_java_/ }
|