fluent-plugin-elasticsearch 1.7.0 → 1.8.0
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/History.md +4 -1
- data/README.md +11 -0
- data/fluent-plugin-elasticsearch.gemspec +1 -1
- data/lib/fluent/plugin/elasticsearch_index_template.rb +6 -0
- data/lib/fluent/plugin/out_elasticsearch.rb +6 -2
- data/lib/fluent/plugin/out_elasticsearch_dynamic.rb +3 -3
- data/test/plugin/test_out_elasticsearch.rb +114 -1
- data/test/plugin/test_out_elasticsearch_dynamic.rb +20 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f279ccf2181eb8582234fb5b417439dfd8f22ac9
|
4
|
+
data.tar.gz: e3b8e02a2aa972ac0e07971369dd9381b58401e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a576bf1cd9ff05130d1f71cabfc6b264ffc53f86cb9780af42ee0aa4f647a24905e5d41c22dd446474896bf2ee17b7ad942011bc2f6dd10cf4231fde348e35aa
|
7
|
+
data.tar.gz: b938736ba3ed0fbf8846e864c5f7273c1b059a930a4b91165d2513e6038de6bdf48968570479047dce33a7ad3fa727a02f48215d3be724a6d60414c024010ae4
|
data/History.md
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
## Changelog [[tags]](https://github.com/uken/fluent-plugin-elasticsearch/tags)
|
2
2
|
|
3
|
-
###
|
3
|
+
### [Unreleased]
|
4
|
+
- fix typo in defaults for ssl_verify on elasticsearch_dynamic (#202)
|
5
|
+
- add support for `templates` (#196)
|
6
|
+
- rename `send` method to `send_bulk` (#206)
|
4
7
|
|
5
8
|
### 1.7.0
|
6
9
|
- add support for `template_name` and `template_file` (#194)
|
data/README.md
CHANGED
@@ -28,6 +28,7 @@ Note: For Amazon Elasticsearch Service please consider using [fluent-plugin-aws-
|
|
28
28
|
+ [target_type_key](#target_type_key)
|
29
29
|
+ [template_name](#template_name)
|
30
30
|
+ [template_file](#template_file)
|
31
|
+
+ [templates](#templates)
|
31
32
|
+ [request_timeout](#request_timeout)
|
32
33
|
+ [reload_connections](#reload_connections)
|
33
34
|
+ [reload_on_failure](#reload_on_failure)
|
@@ -240,6 +241,16 @@ The path to the file containing the template to install.
|
|
240
241
|
|
241
242
|
[template_name](#template_name) must also be specified.
|
242
243
|
|
244
|
+
### templates
|
245
|
+
|
246
|
+
Specify index templates in form of hash. Can contain multiple templates.
|
247
|
+
|
248
|
+
```
|
249
|
+
templates { "templane_name_1": "path_to_template_1_file", "templane_name_2": "path_to_template_2_file"}
|
250
|
+
```
|
251
|
+
|
252
|
+
If `template_file` and `template_name` are set, then this parameter will be ignored.
|
253
|
+
|
243
254
|
### request_timeout
|
244
255
|
|
245
256
|
You can specify HTTP request timeout.
|
@@ -3,7 +3,7 @@ $:.push File.expand_path('../lib', __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = 'fluent-plugin-elasticsearch'
|
6
|
-
s.version = '1.
|
6
|
+
s.version = '1.8.0'
|
7
7
|
s.authors = ['diogo', 'pitr']
|
8
8
|
s.email = ['pitr.vern@gmail.com', 'me@diogoterror.com']
|
9
9
|
s.description = %q{ElasticSearch output plugin for Fluent event collector}
|
@@ -54,6 +54,7 @@ class Fluent::ElasticsearchOutput < Fluent::BufferedOutput
|
|
54
54
|
config_param :flatten_hashes_separator, :string, :default => "_"
|
55
55
|
config_param :template_name, :string, :default => nil
|
56
56
|
config_param :template_file, :string, :default => nil
|
57
|
+
config_param :templates, :hash, :default => nil
|
57
58
|
|
58
59
|
include Fluent::SetTagKeyMixin
|
59
60
|
include Fluent::ElasticsearchIndexTemplate
|
@@ -86,7 +87,10 @@ class Fluent::ElasticsearchOutput < Fluent::BufferedOutput
|
|
86
87
|
|
87
88
|
if @template_name && @template_file
|
88
89
|
template_install(@template_name, @template_file)
|
90
|
+
elsif @templates
|
91
|
+
templates_hash_install (@templates)
|
89
92
|
end
|
93
|
+
|
90
94
|
end
|
91
95
|
|
92
96
|
def start
|
@@ -315,7 +319,7 @@ class Fluent::ElasticsearchOutput < Fluent::BufferedOutput
|
|
315
319
|
append_record_to_messages(@write_operation, meta, record, bulk_message)
|
316
320
|
end
|
317
321
|
|
318
|
-
|
322
|
+
send_bulk(bulk_message) unless bulk_message.empty?
|
319
323
|
bulk_message.clear
|
320
324
|
end
|
321
325
|
|
@@ -328,7 +332,7 @@ class Fluent::ElasticsearchOutput < Fluent::BufferedOutput
|
|
328
332
|
[parent_object, path[-1]]
|
329
333
|
end
|
330
334
|
|
331
|
-
def
|
335
|
+
def send_bulk(data)
|
332
336
|
retries = 0
|
333
337
|
begin
|
334
338
|
client.bulk body: data
|
@@ -15,7 +15,7 @@ class Fluent::ElasticsearchOutputDynamic < Fluent::ElasticsearchOutput
|
|
15
15
|
config_param :reload_connections, :string, :default => "true"
|
16
16
|
config_param :reload_on_failure, :string, :default => "false"
|
17
17
|
config_param :resurrect_after, :string, :default => "60"
|
18
|
-
config_param :ssl_verify, :string, :
|
18
|
+
config_param :ssl_verify, :string, :default => "true"
|
19
19
|
|
20
20
|
def configure(conf)
|
21
21
|
super
|
@@ -178,12 +178,12 @@ class Fluent::ElasticsearchOutputDynamic < Fluent::ElasticsearchOutput
|
|
178
178
|
end
|
179
179
|
|
180
180
|
bulk_message.each do | hKey, array |
|
181
|
-
|
181
|
+
send_bulk(array, hKey) unless array.empty?
|
182
182
|
array.clear
|
183
183
|
end
|
184
184
|
end
|
185
185
|
|
186
|
-
def
|
186
|
+
def send_bulk(data, host)
|
187
187
|
retries = 0
|
188
188
|
begin
|
189
189
|
client(host).bulk body: data
|
@@ -113,7 +113,8 @@ class ElasticsearchOutput < Test::Unit::TestCase
|
|
113
113
|
to_return(:status => 200, :body => "", :headers => {})
|
114
114
|
|
115
115
|
driver('test', config)
|
116
|
-
end
|
116
|
+
end
|
117
|
+
|
117
118
|
|
118
119
|
def test_template_create_invalid_filename
|
119
120
|
config = %{
|
@@ -139,6 +140,118 @@ class ElasticsearchOutput < Test::Unit::TestCase
|
|
139
140
|
}
|
140
141
|
end
|
141
142
|
|
143
|
+
def test_templates_create
|
144
|
+
cwd = File.dirname(__FILE__)
|
145
|
+
template_file = File.join(cwd, 'test_template.json')
|
146
|
+
config = %{
|
147
|
+
host logs.google.com
|
148
|
+
port 777
|
149
|
+
scheme https
|
150
|
+
path /es/
|
151
|
+
user john
|
152
|
+
password doe
|
153
|
+
templates {"logstash1":"#{template_file}", "logstash2":"#{template_file}","logstash3":"#{template_file}" }
|
154
|
+
}
|
155
|
+
|
156
|
+
stub_request(:head, "https://john:doe@logs.google.com:777/es//").
|
157
|
+
to_return(:status => 200, :body => "", :headers => {})
|
158
|
+
# check if template exists
|
159
|
+
stub_request(:get, "https://john:doe@logs.google.com:777/es//_template/logstash1").
|
160
|
+
to_return(:status => 404, :body => "", :headers => {})
|
161
|
+
stub_request(:get, "https://john:doe@logs.google.com:777/es//_template/logstash2").
|
162
|
+
to_return(:status => 404, :body => "", :headers => {})
|
163
|
+
|
164
|
+
stub_request(:get, "https://john:doe@logs.google.com:777/es//_template/logstash3").
|
165
|
+
to_return(:status => 200, :body => "", :headers => {}) #exists
|
166
|
+
|
167
|
+
stub_request(:put, "https://john:doe@logs.google.com:777/es//_template/logstash1").
|
168
|
+
to_return(:status => 200, :body => "", :headers => {})
|
169
|
+
stub_request(:put, "https://john:doe@logs.google.com:777/es//_template/logstash2").
|
170
|
+
to_return(:status => 200, :body => "", :headers => {})
|
171
|
+
stub_request(:put, "https://john:doe@logs.google.com:777/es//_template/logstash3").
|
172
|
+
to_return(:status => 200, :body => "", :headers => {})
|
173
|
+
|
174
|
+
driver('test', config)
|
175
|
+
|
176
|
+
assert_requested( :put, "https://john:doe@logs.google.com:777/es//_template/logstash1", times: 1)
|
177
|
+
assert_requested( :put, "https://john:doe@logs.google.com:777/es//_template/logstash2", times: 1)
|
178
|
+
assert_not_requested(:put, "https://john:doe@logs.google.com:777/es//_template/logstash3") #exists
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_templates_not_used
|
182
|
+
cwd = File.dirname(__FILE__)
|
183
|
+
template_file = File.join(cwd, 'test_template.json')
|
184
|
+
|
185
|
+
config = %{
|
186
|
+
host logs.google.com
|
187
|
+
port 777
|
188
|
+
scheme https
|
189
|
+
path /es/
|
190
|
+
user john
|
191
|
+
password doe
|
192
|
+
template_name logstash
|
193
|
+
template_file #{template_file}
|
194
|
+
templates {"logstash1":"#{template_file}", "logstash2":"#{template_file}" }
|
195
|
+
}
|
196
|
+
# connection start
|
197
|
+
stub_request(:head, "https://john:doe@logs.google.com:777/es//").
|
198
|
+
to_return(:status => 200, :body => "", :headers => {})
|
199
|
+
# check if template exists
|
200
|
+
stub_request(:get, "https://john:doe@logs.google.com:777/es//_template/logstash").
|
201
|
+
to_return(:status => 404, :body => "", :headers => {})
|
202
|
+
stub_request(:get, "https://john:doe@logs.google.com:777/es//_template/logstash1").
|
203
|
+
to_return(:status => 404, :body => "", :headers => {})
|
204
|
+
stub_request(:get, "https://john:doe@logs.google.com:777/es//_template/logstash2").
|
205
|
+
to_return(:status => 404, :body => "", :headers => {})
|
206
|
+
#creation
|
207
|
+
stub_request(:put, "https://john:doe@logs.google.com:777/es//_template/logstash").
|
208
|
+
to_return(:status => 200, :body => "", :headers => {})
|
209
|
+
stub_request(:put, "https://john:doe@logs.google.com:777/es//_template/logstash1").
|
210
|
+
to_return(:status => 200, :body => "", :headers => {})
|
211
|
+
stub_request(:put, "https://john:doe@logs.google.com:777/es//_template/logstash2").
|
212
|
+
to_return(:status => 200, :body => "", :headers => {})
|
213
|
+
|
214
|
+
driver('test', config)
|
215
|
+
|
216
|
+
assert_requested(:put, "https://john:doe@logs.google.com:777/es//_template/logstash", times: 1)
|
217
|
+
|
218
|
+
assert_not_requested(:put, "https://john:doe@logs.google.com:777/es//_template/logstash1")
|
219
|
+
assert_not_requested(:put, "https://john:doe@logs.google.com:777/es//_template/logstash2")
|
220
|
+
end
|
221
|
+
|
222
|
+
def test_templates_can_be_partially_created_if_error_occurs
|
223
|
+
cwd = File.dirname(__FILE__)
|
224
|
+
template_file = File.join(cwd, 'test_template.json')
|
225
|
+
config = %{
|
226
|
+
host logs.google.com
|
227
|
+
port 777
|
228
|
+
scheme https
|
229
|
+
path /es/
|
230
|
+
user john
|
231
|
+
password doe
|
232
|
+
templates {"logstash1":"#{template_file}", "logstash2":"/abc" }
|
233
|
+
}
|
234
|
+
stub_request(:head, "https://john:doe@logs.google.com:777/es//").
|
235
|
+
to_return(:status => 200, :body => "", :headers => {})
|
236
|
+
# check if template exists
|
237
|
+
stub_request(:get, "https://john:doe@logs.google.com:777/es//_template/logstash1").
|
238
|
+
to_return(:status => 404, :body => "", :headers => {})
|
239
|
+
stub_request(:get, "https://john:doe@logs.google.com:777/es//_template/logstash2").
|
240
|
+
to_return(:status => 404, :body => "", :headers => {})
|
241
|
+
|
242
|
+
stub_request(:put, "https://john:doe@logs.google.com:777/es//_template/logstash1").
|
243
|
+
to_return(:status => 200, :body => "", :headers => {})
|
244
|
+
stub_request(:put, "https://john:doe@logs.google.com:777/es//_template/logstash2").
|
245
|
+
to_return(:status => 200, :body => "", :headers => {})
|
246
|
+
|
247
|
+
assert_raise(RuntimeError) {
|
248
|
+
driver('test', config)
|
249
|
+
}
|
250
|
+
|
251
|
+
assert_requested(:put, "https://john:doe@logs.google.com:777/es//_template/logstash1", times: 1)
|
252
|
+
assert_not_requested(:put, "https://john:doe@logs.google.com:777/es//_template/logstash2")
|
253
|
+
end
|
254
|
+
|
142
255
|
def test_legacy_hosts_list
|
143
256
|
config = %{
|
144
257
|
hosts host1:50,host2:100,host3
|
@@ -63,6 +63,26 @@ class ElasticsearchOutputDynamic < Test::Unit::TestCase
|
|
63
63
|
assert_equal 'doe', instance.password
|
64
64
|
end
|
65
65
|
|
66
|
+
def test_defaults
|
67
|
+
config = %{
|
68
|
+
host logs.google.com
|
69
|
+
scheme https
|
70
|
+
path /es/
|
71
|
+
user john
|
72
|
+
password doe
|
73
|
+
}
|
74
|
+
instance = driver('test', config).instance
|
75
|
+
|
76
|
+
assert_equal "9200", instance.port
|
77
|
+
assert_equal "false", instance.logstash_format
|
78
|
+
assert_equal "true", instance.utc_index
|
79
|
+
assert_equal false, instance.time_key_exclude_timestamp
|
80
|
+
assert_equal "true", instance.reload_connections
|
81
|
+
assert_equal "false", instance.reload_on_failure
|
82
|
+
assert_equal "60", instance.resurrect_after
|
83
|
+
assert_equal "true", instance.ssl_verify
|
84
|
+
end
|
85
|
+
|
66
86
|
def test_legacy_hosts_list
|
67
87
|
config = %{
|
68
88
|
hosts host1:50,host2:100,host3
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-elasticsearch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- diogo
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-10-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fluentd
|