logstash-output-elasticsearch 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/logstash/outputs/elasticsearch.rb +50 -29
- data/logstash-output-elasticsearch.gemspec +8 -7
- data/spec/outputs/elasticsearch.rb +29 -0
- metadata +41 -23
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
N2UwMzczMTE0ZWNmZjFhOGU4Mjk0YjUwZDE5YmVmNDQyMWUzMzg0Mw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ODJkYzg1NWU5YWEzYmZmOWRiMDFkNjFlYmM0Y2Q2NmZiZGEwNjYyMQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
Y2M3ZDliMjhjYmY4OGM0NjI5ODA2OTYyZWE1MzM2MzE0MmVlZDI1NmE0OTNl
|
10
|
+
YWY0MmEzNzQ2OWUwODc0ZWRkNmI0OWY3MDViOTU3ZjlhMGY5NzFjZDJhNGQz
|
11
|
+
NjdlZWQ4YWM3Nzk1NTI3OWQ1MDEyZmY0MzBkODM0Nzc3YTgzNWM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MjY2Mzc0ZDRiOGEyOGIzMDg2NWMzNGRiMDA2MWYxMDM4YzhiZmZiN2ViZDhk
|
14
|
+
ZDI2ZGE2MzRhMTA1ZDMxZGM2NTQ3YzU1ZjE0NjYzMTU0NTk4OTJhMWFiNTMy
|
15
|
+
MzQzYzc0OGM2NTNkMzJmNmIxY2I4YWY5ODZhYTgzOTAwODUxYWM=
|
@@ -42,6 +42,7 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
42
42
|
# The default value will partition your indices by day so you can more easily
|
43
43
|
# delete old data or only search specific date ranges.
|
44
44
|
# Indexes may not contain uppercase characters.
|
45
|
+
# For weekly indexes ISO 8601 format is recommended, eg. logstash-%{+xxxx.ww}
|
45
46
|
config :index, :validate => :string, :default => "logstash-%{+YYYY.MM.dd}"
|
46
47
|
|
47
48
|
# The index type to write events to. Generally you should try to write only
|
@@ -178,7 +179,7 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
178
179
|
# - index: indexes a document (an event from Logstash).
|
179
180
|
# - delete: deletes a document by id
|
180
181
|
#
|
181
|
-
# For more details on actions, check out the
|
182
|
+
# For more details on actions, check out the http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html[Elasticsearch bulk API documentation]
|
182
183
|
config :action, :validate => :string, :default => "index"
|
183
184
|
|
184
185
|
# Username and password (HTTP only)
|
@@ -200,6 +201,14 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
200
201
|
# Set the truststore password
|
201
202
|
config :truststore_password, :validate => :password
|
202
203
|
|
204
|
+
# helper function to replace placeholders
|
205
|
+
# in index names to wildcards
|
206
|
+
# example:
|
207
|
+
# "logs-%{YYYY}" -> "logs-*"
|
208
|
+
def wildcard_substitute(name)
|
209
|
+
name.gsub(/%\{[^}]+\}/, "*")
|
210
|
+
end
|
211
|
+
|
203
212
|
public
|
204
213
|
def register
|
205
214
|
client_settings = {}
|
@@ -242,38 +251,14 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
242
251
|
@host = ["localhost"]
|
243
252
|
end
|
244
253
|
|
245
|
-
|
246
|
-
if @protocol == "http"
|
247
|
-
@protocol = "https"
|
248
|
-
if @cacert && @truststore
|
249
|
-
raise(LogStash::ConfigurationError, "Use either \"cacert\" or \"truststore\" when configuring the CA certificate") if @truststore
|
250
|
-
end
|
251
|
-
ssl_options = {}
|
252
|
-
if @cacert then
|
253
|
-
@truststore, ssl_options[:truststore_password] = generate_jks @cacert
|
254
|
-
elsif @truststore
|
255
|
-
ssl_options[:truststore_password] = @truststore_password.value if @truststore_password
|
256
|
-
end
|
257
|
-
ssl_options[:truststore] = @truststore
|
258
|
-
client_settings[:ssl] = ssl_options
|
259
|
-
else
|
260
|
-
raise(LogStash::ConfigurationError, "SSL is not supported for '#{@protocol}'. Change the protocol to 'http' if you need SSL.")
|
261
|
-
end
|
262
|
-
end
|
254
|
+
client_settings.merge! setup_ssl()
|
263
255
|
|
264
256
|
common_options = {
|
265
257
|
:protocol => @protocol,
|
266
258
|
:client_settings => client_settings
|
267
259
|
}
|
268
260
|
|
269
|
-
|
270
|
-
if @protocol =~ /http/
|
271
|
-
common_options[:user] = ::URI.escape(@user, "@:")
|
272
|
-
common_options[:password] = ::URI.escape(@password.value, "@:")
|
273
|
-
else
|
274
|
-
raise(LogStash::ConfigurationError, "User and password parameters are not supported for '#{@protocol}'. Change the protocol to 'http' if you need them.")
|
275
|
-
end
|
276
|
-
end
|
261
|
+
common_options.merge! setup_basic_auth()
|
277
262
|
|
278
263
|
client_class = case @protocol
|
279
264
|
when "transport"
|
@@ -350,6 +335,40 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
350
335
|
@logger.debug? and @logger.debug("Switched current elasticsearch client to ##{@client_idx} at #{@host[@client_idx]}")
|
351
336
|
end
|
352
337
|
|
338
|
+
private
|
339
|
+
def setup_ssl
|
340
|
+
return {} unless @ssl
|
341
|
+
if @protocol != "http"
|
342
|
+
raise(LogStash::ConfigurationError, "SSL is not supported for '#{@protocol}'. Change the protocol to 'http' if you need SSL.")
|
343
|
+
end
|
344
|
+
@protocol = "https"
|
345
|
+
if @cacert && @truststore
|
346
|
+
raise(LogStash::ConfigurationError, "Use either \"cacert\" or \"truststore\" when configuring the CA certificate") if @truststore
|
347
|
+
end
|
348
|
+
ssl_options = {}
|
349
|
+
if @cacert then
|
350
|
+
@truststore, ssl_options[:truststore_password] = generate_jks @cacert
|
351
|
+
elsif @truststore
|
352
|
+
ssl_options[:truststore_password] = @truststore_password.value if @truststore_password
|
353
|
+
end
|
354
|
+
ssl_options[:truststore] = @truststore
|
355
|
+
{ ssl: ssl_options }
|
356
|
+
end
|
357
|
+
|
358
|
+
private
|
359
|
+
def setup_basic_auth
|
360
|
+
return {} unless @user && @password
|
361
|
+
|
362
|
+
if @protocol =~ /http/
|
363
|
+
{
|
364
|
+
:user => ::URI.escape(@user, "@:"),
|
365
|
+
:password => ::URI.escape(@password.value, "@:")
|
366
|
+
}
|
367
|
+
else
|
368
|
+
raise(LogStash::ConfigurationError, "User and password parameters are not supported for '#{@protocol}'. Change the protocol to 'http' if you need them.")
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
353
372
|
public
|
354
373
|
def get_template
|
355
374
|
if @template.nil?
|
@@ -359,8 +378,10 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
359
378
|
end
|
360
379
|
end
|
361
380
|
template_json = IO.read(@template).gsub(/\n/,'')
|
362
|
-
|
363
|
-
|
381
|
+
template = LogStash::Json.load(template_json)
|
382
|
+
template['template'] = wildcard_substitute(@index)
|
383
|
+
@logger.info("Using mapping template", :template => template)
|
384
|
+
return template
|
364
385
|
end # def get_template
|
365
386
|
|
366
387
|
protected
|
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'logstash-output-elasticsearch'
|
4
|
-
s.version = '0.1.
|
4
|
+
s.version = '0.1.6'
|
5
5
|
s.licenses = ['Apache License (2.0)']
|
6
6
|
s.summary = "Logstash Output to Elasticsearch"
|
7
7
|
s.description = "Output events to elasticsearch"
|
@@ -20,18 +20,19 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.metadata = { "logstash_plugin" => "true", "logstash_group" => "output" }
|
21
21
|
|
22
22
|
# Jar dependencies
|
23
|
-
s.requirements << "jar 'org.elasticsearch:elasticsearch', '1.
|
23
|
+
s.requirements << "jar 'org.elasticsearch:elasticsearch', '1.4.0'"
|
24
24
|
|
25
25
|
# Gem dependencies
|
26
|
-
s.add_runtime_dependency 'elasticsearch', ['
|
27
|
-
s.add_runtime_dependency 'stud'
|
28
|
-
s.add_runtime_dependency 'cabin', ['
|
29
|
-
s.add_runtime_dependency 'ftw', ['~> 0.0.40']
|
26
|
+
s.add_runtime_dependency 'elasticsearch', ['>= 1.0.6', '~> 1.0']
|
27
|
+
s.add_runtime_dependency 'stud', ['>= 0.0.17', '~> 0.0']
|
28
|
+
s.add_runtime_dependency 'cabin', ['~> 0.6']
|
30
29
|
s.add_runtime_dependency 'logstash', '>= 1.4.0', '< 2.0.0'
|
31
30
|
s.add_runtime_dependency 'jar-dependencies'
|
32
31
|
|
32
|
+
s.add_development_dependency 'ftw', ['>= 0.0.40', '~> 0']
|
33
|
+
|
33
34
|
if RUBY_PLATFORM == 'java'
|
34
|
-
|
35
|
+
s.add_runtime_dependency "manticore", '~> 0.3'
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
@@ -12,6 +12,7 @@ describe "outputs/elasticsearch" do
|
|
12
12
|
expect {output.register}.to_not raise_error
|
13
13
|
end
|
14
14
|
|
15
|
+
|
15
16
|
describe "ship lots of events w/ default index_type", :elasticsearch => true do
|
16
17
|
# Generate a random index name
|
17
18
|
index = 10.times.collect { rand(10).to_s }.join("")
|
@@ -257,6 +258,34 @@ describe "outputs/elasticsearch" do
|
|
257
258
|
end
|
258
259
|
end
|
259
260
|
|
261
|
+
describe "wildcard substitution in index templates", :todo => true do
|
262
|
+
require "logstash/outputs/elasticsearch"
|
263
|
+
|
264
|
+
let(:template) { '{"template" : "not important, will be updated by :index"}' }
|
265
|
+
|
266
|
+
def settings_with_index(index)
|
267
|
+
return {
|
268
|
+
"manage_template" => true,
|
269
|
+
"template_overwrite" => true,
|
270
|
+
"protocol" => "http",
|
271
|
+
"host" => "localhost",
|
272
|
+
"index" => "#{index}"
|
273
|
+
}
|
274
|
+
end
|
275
|
+
|
276
|
+
it "should substitude placeholders" do
|
277
|
+
IO.stub(:read).with(anything) { template }
|
278
|
+
es_output = LogStash::Outputs::ElasticSearch.new(settings_with_index("index-%{YYYY}"))
|
279
|
+
insist { es_output.get_template['template'] } == "index-*"
|
280
|
+
end
|
281
|
+
|
282
|
+
it "should do nothing to an index with no placeholder" do
|
283
|
+
IO.stub(:read).with(anything) { template }
|
284
|
+
es_output = LogStash::Outputs::ElasticSearch.new(settings_with_index("index"))
|
285
|
+
insist { es_output.get_template['template'] } == "index"
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
260
289
|
describe "index template expected behavior", :elasticsearch => true do
|
261
290
|
["node", "transport", "http"].each do |protocol|
|
262
291
|
context "with protocol => #{protocol}" do
|
metadata
CHANGED
@@ -1,71 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-output-elasticsearch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elasticsearch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: elasticsearch
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ! '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 1.0.6
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
20
|
- - ~>
|
25
21
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.0
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: stud
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ! '>='
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
22
|
+
version: '1.0'
|
34
23
|
type: :runtime
|
35
24
|
prerelease: false
|
36
25
|
version_requirements: !ruby/object:Gem::Requirement
|
37
26
|
requirements:
|
38
27
|
- - ! '>='
|
39
28
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
29
|
+
version: 1.0.6
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '1.0'
|
41
33
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
34
|
+
name: stud
|
43
35
|
requirement: !ruby/object:Gem::Requirement
|
44
36
|
requirements:
|
45
37
|
- - ! '>='
|
46
38
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
39
|
+
version: 0.0.17
|
40
|
+
- - ~>
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0.0'
|
48
43
|
type: :runtime
|
49
44
|
prerelease: false
|
50
45
|
version_requirements: !ruby/object:Gem::Requirement
|
51
46
|
requirements:
|
52
47
|
- - ! '>='
|
53
48
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
49
|
+
version: 0.0.17
|
50
|
+
- - ~>
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0.0'
|
55
53
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
54
|
+
name: cabin
|
57
55
|
requirement: !ruby/object:Gem::Requirement
|
58
56
|
requirements:
|
59
57
|
- - ~>
|
60
58
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.
|
59
|
+
version: '0.6'
|
62
60
|
type: :runtime
|
63
61
|
prerelease: false
|
64
62
|
version_requirements: !ruby/object:Gem::Requirement
|
65
63
|
requirements:
|
66
64
|
- - ~>
|
67
65
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.
|
66
|
+
version: '0.6'
|
69
67
|
- !ruby/object:Gem::Dependency
|
70
68
|
name: logstash
|
71
69
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,6 +98,26 @@ dependencies:
|
|
100
98
|
- - ! '>='
|
101
99
|
- !ruby/object:Gem::Version
|
102
100
|
version: '0'
|
101
|
+
- !ruby/object:Gem::Dependency
|
102
|
+
name: ftw
|
103
|
+
requirement: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ! '>='
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: 0.0.40
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
type: :development
|
112
|
+
prerelease: false
|
113
|
+
version_requirements: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.0.40
|
118
|
+
- - ~>
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
103
121
|
description: Output events to elasticsearch
|
104
122
|
email: richard.pijnenburg@elasticsearch.com
|
105
123
|
executables: []
|
@@ -138,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
156
|
- !ruby/object:Gem::Version
|
139
157
|
version: '0'
|
140
158
|
requirements:
|
141
|
-
- jar 'org.elasticsearch:elasticsearch', '1.
|
159
|
+
- jar 'org.elasticsearch:elasticsearch', '1.4.0'
|
142
160
|
rubyforge_project:
|
143
161
|
rubygems_version: 2.4.1
|
144
162
|
signing_key:
|