fluent-plugin-elasticsearch 5.0.4 → 5.1.2
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/.github/workflows/linux.yml +1 -1
- data/.github/workflows/macos.yml +1 -1
- data/.github/workflows/windows.yml +1 -1
- data/History.md +16 -0
- data/README.md +14 -2
- data/fluent-plugin-elasticsearch.gemspec +1 -1
- data/lib/fluent/plugin/elasticsearch_error_handler.rb +11 -1
- data/lib/fluent/plugin/elasticsearch_index_template.rb +13 -1
- data/lib/fluent/plugin/out_elasticsearch.rb +2 -2
- data/lib/fluent/plugin/out_elasticsearch_data_stream.rb +84 -49
- data/test/plugin/test_elasticsearch_error_handler.rb +19 -7
- data/test/plugin/test_elasticsearch_fallback_selector.rb +1 -1
- data/test/plugin/test_elasticsearch_index_lifecycle_management.rb +10 -0
- data/test/plugin/test_in_elasticsearch.rb +12 -0
- data/test/plugin/test_out_elasticsearch.rb +224 -17
- data/test/plugin/test_out_elasticsearch_data_stream.rb +423 -98
- data/test/plugin/test_out_elasticsearch_dynamic.rb +100 -5
- metadata +3 -5
- data/.travis.yml +0 -40
- data/appveyor.yml +0 -20
@@ -45,7 +45,7 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
45
45
|
{
|
46
46
|
'data_streams': [
|
47
47
|
{
|
48
|
-
'name' => '
|
48
|
+
'name' => 'foo',
|
49
49
|
'timestamp_field' => {
|
50
50
|
'name' => '@timestamp'
|
51
51
|
}
|
@@ -62,11 +62,11 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
62
62
|
DUPLICATED_DATA_STREAM_EXCEPTION = {"error": {}, "status": 400}
|
63
63
|
NONEXISTENT_DATA_STREAM_EXCEPTION = {"error": {}, "status": 404}
|
64
64
|
|
65
|
-
def stub_ilm_policy(name="
|
65
|
+
def stub_ilm_policy(name="foo_ilm")
|
66
66
|
stub_request(:put, "http://localhost:9200/_ilm/policy/#{name}_policy").to_return(:status => [200, RESPONSE_ACKNOWLEDGED])
|
67
67
|
end
|
68
68
|
|
69
|
-
def stub_index_template(name="
|
69
|
+
def stub_index_template(name="foo_tpl")
|
70
70
|
stub_request(:put, "http://localhost:9200/_index_template/#{name}").to_return(:status => [200, RESPONSE_ACKNOWLEDGED])
|
71
71
|
end
|
72
72
|
|
@@ -78,24 +78,60 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
78
78
|
stub_request(:get, "http://localhost:9200/_data_stream/#{name}").to_return(:status => [200, RESPONSE_ACKNOWLEDGED])
|
79
79
|
end
|
80
80
|
|
81
|
+
def stub_existent_ilm?(name="foo_ilm")
|
82
|
+
stub_request(:get, "http://localhost:9200/_ilm/policy/#{name}").to_return(:status => [200, RESPONSE_ACKNOWLEDGED])
|
83
|
+
end
|
84
|
+
|
85
|
+
def stub_existent_template?(name="foo_tpl")
|
86
|
+
stub_request(:get, "http://localhost:9200/_index_template/#{name}").to_return(:status => [200, RESPONSE_ACKNOWLEDGED])
|
87
|
+
end
|
88
|
+
|
81
89
|
def stub_nonexistent_data_stream?(name="foo")
|
82
90
|
stub_request(:get, "http://localhost:9200/_data_stream/#{name}").to_return(:status => [404, Elasticsearch::Transport::Transport::Errors::NotFound])
|
83
91
|
end
|
84
92
|
|
85
|
-
def
|
86
|
-
stub_request(:
|
93
|
+
def stub_nonexistent_ilm?(name="foo_ilm")
|
94
|
+
stub_request(:get, "http://localhost:9200/_ilm/policy/#{name}").to_return(:status => [404, Elasticsearch::Transport::Transport::Errors::NotFound])
|
95
|
+
end
|
96
|
+
|
97
|
+
def stub_nonexistent_template?(name="foo_tpl")
|
98
|
+
stub_request(:get, "http://localhost:9200/_index_template/#{name}").to_return(:status => [404, Elasticsearch::Transport::Transport::Errors::NotFound])
|
99
|
+
end
|
100
|
+
|
101
|
+
def stub_bulk_feed(datastream_name="foo", ilm_name="foo_ilm", template_name="foo_tpl")
|
102
|
+
stub_request(:post, "http://localhost:9200/#{datastream_name}/_bulk").with do |req|
|
87
103
|
# bulk data must be pair of OP and records
|
88
|
-
# {"create": {}}\
|
104
|
+
# {"create": {}}\nhttp://localhost:9200/_ilm/policy/foo_ilm_bar
|
89
105
|
# {"@timestamp": ...}
|
90
106
|
@bulk_records += req.body.split("\n").size / 2
|
91
107
|
end
|
108
|
+
stub_request(:post, "http://localhost:9200/#{ilm_name}/_bulk").with do |req|
|
109
|
+
# bulk data must be pair of OP and records
|
110
|
+
# {"create": {}}\nhttp://localhost:9200/_ilm/policy/foo_ilm_bar
|
111
|
+
# {"@timestamp": ...}
|
112
|
+
@bulk_records += req.body.split("\n").size / 2
|
113
|
+
end
|
114
|
+
stub_request(:post, "http://localhost:9200/#{template_name}/_bulk").with do |req|
|
115
|
+
# bulk data must be pair of OP and records
|
116
|
+
# {"create": {}}\nhttp://localhost:9200/_ilm/policy/foo_ilm_bar
|
117
|
+
# {"@timestamp": ...}
|
118
|
+
@bulk_records += req.body.split("\n").size / 2
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def stub_elastic_info(url="http://localhost:9200/", version="7.9.0")
|
123
|
+
body ="{\"version\":{\"number\":\"#{version}\", \"build_flavor\":\"default\"},\"tagline\" : \"You Know, for Search\"}"
|
124
|
+
stub_request(:get, url).to_return({:status => 200, :body => body, :headers => { 'Content-Type' => 'json' } })
|
92
125
|
end
|
93
126
|
|
94
|
-
def stub_default(
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
127
|
+
def stub_default(datastream_name="foo", ilm_name="foo_ilm", template_name="foo_tpl", host="http://localhost:9200")
|
128
|
+
stub_elastic_info(host)
|
129
|
+
stub_nonexistent_ilm?(ilm_name)
|
130
|
+
stub_ilm_policy(ilm_name)
|
131
|
+
stub_nonexistent_template?(template_name)
|
132
|
+
stub_index_template(template_name)
|
133
|
+
stub_nonexistent_data_stream?(datastream_name)
|
134
|
+
stub_data_stream(datastream_name)
|
99
135
|
end
|
100
136
|
|
101
137
|
def data_stream_supported?
|
@@ -115,82 +151,274 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
115
151
|
end
|
116
152
|
end
|
117
153
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
'
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
154
|
+
sub_test_case "invalid uppercase" do
|
155
|
+
def test_stream_name
|
156
|
+
conf = config_element(
|
157
|
+
'ROOT', '', {
|
158
|
+
'@type' => 'elasticsearch_datastream',
|
159
|
+
'data_stream_name' => 'TEST',
|
160
|
+
'data_stream_ilm_name' => 'default-policy',
|
161
|
+
'data_stream_template_name' => 'template'
|
162
|
+
})
|
163
|
+
assert_raise Fluent::ConfigError.new("'data_stream_name' must be lowercase only: <TEST>") do
|
164
|
+
driver(conf)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
def test_stream_ilm_name
|
168
|
+
conf = config_element(
|
169
|
+
'ROOT', '', {
|
170
|
+
'@type' => 'elasticsearch_datastream',
|
171
|
+
'data_stream_name' => 'data_stream',
|
172
|
+
'data_stream_ilm_name' => 'TEST-ILM',
|
173
|
+
'data_stream_template_name' => 'template'
|
174
|
+
})
|
175
|
+
assert_raise Fluent::ConfigError.new("'data_stream_ilm_name' must be lowercase only: <TEST-ILM>") do
|
176
|
+
driver(conf)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
def test_stream_template_name
|
180
|
+
conf = config_element(
|
181
|
+
'ROOT', '', {
|
182
|
+
'@type' => 'elasticsearch_datastream',
|
183
|
+
'data_stream_name' => 'default',
|
184
|
+
'data_stream_ilm_name' => 'default-policy',
|
185
|
+
'data_stream_template_name' => 'TEST-TPL'
|
186
|
+
})
|
187
|
+
assert_raise Fluent::ConfigError.new("'data_stream_template_name' must be lowercase only: <TEST-TPL>") do
|
188
|
+
driver(conf)
|
189
|
+
end
|
126
190
|
end
|
127
191
|
end
|
128
192
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
'
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
193
|
+
sub_test_case "invalid parameters" do
|
194
|
+
data("backslash" => "\\",
|
195
|
+
"slash" => "/",
|
196
|
+
"asterisk" => "*",
|
197
|
+
"question" => "?",
|
198
|
+
"doublequote" => "\"",
|
199
|
+
"lt" => "<",
|
200
|
+
"gt" => ">",
|
201
|
+
"bar" => "|",
|
202
|
+
"space" => " ",
|
203
|
+
"comma" => ",",
|
204
|
+
"sharp" => "#",
|
205
|
+
"colon" => ":")
|
206
|
+
def test_stream_name(data)
|
207
|
+
c, _ = data
|
208
|
+
conf = config_element(
|
209
|
+
'ROOT', '', {
|
210
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
211
|
+
'data_stream_name' => "TEST#{c}",
|
212
|
+
'data_stream_ilm_name' => "default_policy",
|
213
|
+
'data_stream_template_name' => "data_stream"
|
214
|
+
})
|
215
|
+
label = Fluent::Plugin::ElasticsearchOutputDataStream::INVALID_CHARACTERS.join(',')
|
216
|
+
assert_raise Fluent::ConfigError.new("'data_stream_name' must not contain invalid characters #{label}: <TEST#{c}>") do
|
217
|
+
driver(conf)
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
data("backslash" => "\\",
|
222
|
+
"slash" => "/",
|
223
|
+
"asterisk" => "*",
|
224
|
+
"question" => "?",
|
225
|
+
"doublequote" => "\"",
|
226
|
+
"lt" => "<",
|
227
|
+
"gt" => ">",
|
228
|
+
"bar" => "|",
|
229
|
+
"space" => " ",
|
230
|
+
"comma" => ",",
|
231
|
+
"sharp" => "#",
|
232
|
+
"colon" => ":")
|
233
|
+
def test_stream_ilm_name(data)
|
234
|
+
c, _ = data
|
235
|
+
conf = config_element(
|
236
|
+
'ROOT', '', {
|
237
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
238
|
+
'data_stream_name' => "default",
|
239
|
+
'data_stream_ilm_name' => "TEST#{c}",
|
240
|
+
'data_stream_template_name' => "data_stream"
|
241
|
+
})
|
242
|
+
label = Fluent::Plugin::ElasticsearchOutputDataStream::INVALID_CHARACTERS.join(',')
|
243
|
+
assert_raise Fluent::ConfigError.new("'data_stream_ilm_name' must not contain invalid characters #{label}: <TEST#{c}>") do
|
244
|
+
driver(conf)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
data("backslash" => "\\",
|
249
|
+
"slash" => "/",
|
250
|
+
"asterisk" => "*",
|
251
|
+
"question" => "?",
|
252
|
+
"doublequote" => "\"",
|
253
|
+
"lt" => "<",
|
254
|
+
"gt" => ">",
|
255
|
+
"bar" => "|",
|
256
|
+
"space" => " ",
|
257
|
+
"comma" => ",",
|
258
|
+
"sharp" => "#",
|
259
|
+
"colon" => ":")
|
260
|
+
def test_stream_template_name(data)
|
261
|
+
c, _ = data
|
262
|
+
conf = config_element(
|
263
|
+
'ROOT', '', {
|
264
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
265
|
+
'data_stream_name' => "default",
|
266
|
+
'data_stream_ilm_name' => "default_policy",
|
267
|
+
'data_stream_template_name' => "TEST#{c}"
|
268
|
+
})
|
269
|
+
label = Fluent::Plugin::ElasticsearchOutputDataStream::INVALID_CHARACTERS.join(',')
|
270
|
+
assert_raise Fluent::ConfigError.new("'data_stream_template_name' must not contain invalid characters #{label}: <TEST#{c}>") do
|
271
|
+
driver(conf)
|
272
|
+
end
|
151
273
|
end
|
152
274
|
end
|
153
275
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
'
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
276
|
+
sub_test_case "invalid start characters" do
|
277
|
+
data("hyphen" => "-",
|
278
|
+
"underscore" => "_",
|
279
|
+
"plus" => "+",
|
280
|
+
"period" => ".")
|
281
|
+
def test_stream_name(data)
|
282
|
+
c, _ = data
|
283
|
+
conf = config_element(
|
284
|
+
'ROOT', '', {
|
285
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
286
|
+
'data_stream_name' => "#{c}TEST",
|
287
|
+
'data_stream_ilm_name' => "default-policy",
|
288
|
+
'data_stream_template_name' => "template"
|
289
|
+
})
|
290
|
+
label = Fluent::Plugin::ElasticsearchOutputDataStream::INVALID_START_CHRACTERS.join(',')
|
291
|
+
assert_raise Fluent::ConfigError.new("'data_stream_name' must not start with #{label}: <#{c}TEST>") do
|
292
|
+
driver(conf)
|
293
|
+
end
|
294
|
+
end
|
295
|
+
data("hyphen" => "-",
|
296
|
+
"underscore" => "_",
|
297
|
+
"plus" => "+",
|
298
|
+
"period" => ".")
|
299
|
+
def test_stream_ilm_name(data)
|
300
|
+
c, _ = data
|
301
|
+
conf = config_element(
|
302
|
+
'ROOT', '', {
|
303
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
304
|
+
'data_stream_name' => "default",
|
305
|
+
'data_stream_ilm_name' => "#{c}TEST",
|
306
|
+
'data_stream_template_name' => "template"
|
307
|
+
})
|
308
|
+
label = Fluent::Plugin::ElasticsearchOutputDataStream::INVALID_START_CHRACTERS.join(',')
|
309
|
+
assert_raise Fluent::ConfigError.new("'data_stream_ilm_name' must not start with #{label}: <#{c}TEST>") do
|
310
|
+
driver(conf)
|
311
|
+
end
|
312
|
+
end
|
313
|
+
data("hyphen" => "-",
|
314
|
+
"underscore" => "_",
|
315
|
+
"plus" => "+",
|
316
|
+
"period" => ".")
|
317
|
+
def test_stream_template_name(data)
|
318
|
+
c, _ = data
|
319
|
+
conf = config_element(
|
320
|
+
'ROOT', '', {
|
321
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
322
|
+
'data_stream_name' => "default",
|
323
|
+
'data_stream_ilm_name' => "default-policy",
|
324
|
+
'data_stream_template_name' => "#{c}TEST"
|
325
|
+
})
|
326
|
+
label = Fluent::Plugin::ElasticsearchOutputDataStream::INVALID_START_CHRACTERS.join(',')
|
327
|
+
assert_raise Fluent::ConfigError.new("'data_stream_template_name' must not start with #{label}: <#{c}TEST>") do
|
328
|
+
driver(conf)
|
329
|
+
end
|
168
330
|
end
|
169
331
|
end
|
170
332
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
'
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
333
|
+
sub_test_case "invalid dots" do
|
334
|
+
data("current" => ".",
|
335
|
+
"parents" => "..")
|
336
|
+
def test_stream_name
|
337
|
+
c, _ = data
|
338
|
+
conf = config_element(
|
339
|
+
'ROOT', '', {
|
340
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
341
|
+
'data_stream_name' => "#{c}",
|
342
|
+
'data_stream_ilm_name' => "default-policy",
|
343
|
+
'data_stream_template_name' => "template"
|
344
|
+
})
|
345
|
+
assert_raise Fluent::ConfigError.new("'data_stream_name' must not be . or ..: <#{c}>") do
|
346
|
+
driver(conf)
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
data("current" => ".",
|
351
|
+
"parents" => "..")
|
352
|
+
def test_stream_ilm_name
|
353
|
+
c, _ = data
|
354
|
+
conf = config_element(
|
355
|
+
'ROOT', '', {
|
356
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
357
|
+
'data_stream_name' => "default",
|
358
|
+
'data_stream_ilm_name' => "#{c}",
|
359
|
+
'data_stream_template_name' => "template"
|
360
|
+
})
|
361
|
+
assert_raise Fluent::ConfigError.new("'data_stream_ilm_name' must not be . or ..: <#{c}>") do
|
362
|
+
driver(conf)
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
data("current" => ".",
|
367
|
+
"parents" => "..")
|
368
|
+
def test_stream_template_name
|
369
|
+
c, _ = data
|
370
|
+
conf = config_element(
|
371
|
+
'ROOT', '', {
|
372
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
373
|
+
'data_stream_name' => "default",
|
374
|
+
'data_stream_ilm_name' => "default-policy",
|
375
|
+
'data_stream_template_name' => "#{c}"
|
376
|
+
})
|
377
|
+
assert_raise Fluent::ConfigError.new("'data_stream_template_name' must not be . or ..: <#{c}>") do
|
378
|
+
driver(conf)
|
379
|
+
end
|
182
380
|
end
|
183
381
|
end
|
184
382
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
'
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
383
|
+
sub_test_case "invalid length" do
|
384
|
+
def test_stream_name
|
385
|
+
c = "a" * 256
|
386
|
+
conf = config_element(
|
387
|
+
'ROOT', '', {
|
388
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
389
|
+
'data_stream_name' => "#{c}",
|
390
|
+
'data_stream_ilm_name' => "default-policy",
|
391
|
+
'data_stream_template_name' => "template"
|
392
|
+
})
|
393
|
+
assert_raise Fluent::ConfigError.new("'data_stream_name' must not be longer than 255 bytes: <#{c}>") do
|
394
|
+
driver(conf)
|
395
|
+
end
|
396
|
+
end
|
397
|
+
def test_stream_ilm_name
|
398
|
+
c = "a" * 256
|
399
|
+
conf = config_element(
|
400
|
+
'ROOT', '', {
|
401
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
402
|
+
'data_stream_name' => "default",
|
403
|
+
'data_stream_ilm_name' => "#{c}",
|
404
|
+
'data_stream_template_name' => "template"
|
405
|
+
})
|
406
|
+
assert_raise Fluent::ConfigError.new("'data_stream_ilm_name' must not be longer than 255 bytes: <#{c}>") do
|
407
|
+
driver(conf)
|
408
|
+
end
|
409
|
+
end
|
410
|
+
def test_stream_template_name
|
411
|
+
c = "a" * 256
|
412
|
+
conf = config_element(
|
413
|
+
'ROOT', '', {
|
414
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
415
|
+
'data_stream_name' => "default",
|
416
|
+
'data_stream_ilm_name' => "default-policy",
|
417
|
+
'data_stream_template_name' => "#{c}"
|
418
|
+
})
|
419
|
+
assert_raise Fluent::ConfigError.new("'data_stream_template_name' must not be longer than 255 bytes: <#{c}>") do
|
420
|
+
driver(conf)
|
421
|
+
end
|
194
422
|
end
|
195
423
|
end
|
196
424
|
end
|
@@ -202,7 +430,9 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
202
430
|
conf = config_element(
|
203
431
|
'ROOT', '', {
|
204
432
|
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
205
|
-
'data_stream_name' => 'foo'
|
433
|
+
'data_stream_name' => 'foo',
|
434
|
+
'data_stream_ilm_name' => "foo_ilm",
|
435
|
+
'data_stream_template_name' => "foo_tpl"
|
206
436
|
})
|
207
437
|
assert_equal "foo", driver(conf).instance.data_stream_name
|
208
438
|
end
|
@@ -214,24 +444,105 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
214
444
|
stub_index_template
|
215
445
|
stub_existent_data_stream?
|
216
446
|
stub_data_stream
|
447
|
+
stub_elastic_info
|
217
448
|
conf = config_element(
|
218
449
|
'ROOT', '', {
|
219
450
|
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
220
|
-
'data_stream_name' => 'foo'
|
451
|
+
'data_stream_name' => 'foo',
|
452
|
+
'data_stream_ilm_name' => "foo_ilm",
|
453
|
+
'data_stream_template_name' => "foo_tpl"
|
221
454
|
})
|
222
455
|
assert_equal "foo", driver(conf).instance.data_stream_name
|
223
456
|
end
|
224
457
|
|
458
|
+
def test_template_unset
|
459
|
+
omit REQUIRED_ELASTIC_MESSAGE unless data_stream_supported?
|
460
|
+
|
461
|
+
stub_ilm_policy
|
462
|
+
stub_index_template
|
463
|
+
stub_existent_data_stream?
|
464
|
+
stub_data_stream
|
465
|
+
stub_elastic_info
|
466
|
+
conf = config_element(
|
467
|
+
'ROOT', '', {
|
468
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
469
|
+
'data_stream_name' => 'foo',
|
470
|
+
'data_stream_ilm_name' => "foo_ilm",
|
471
|
+
})
|
472
|
+
assert_equal "foo", driver(conf).instance.data_stream_name
|
473
|
+
assert_equal "foo_ilm", driver(conf).instance.data_stream_ilm_name
|
474
|
+
assert_equal "foo_template", driver(conf).instance.data_stream_template_name
|
475
|
+
end
|
476
|
+
|
477
|
+
def test_ilm_unset
|
478
|
+
omit REQUIRED_ELASTIC_MESSAGE unless data_stream_supported?
|
479
|
+
|
480
|
+
stub_ilm_policy
|
481
|
+
stub_index_template
|
482
|
+
stub_existent_data_stream?
|
483
|
+
stub_data_stream
|
484
|
+
stub_elastic_info
|
485
|
+
conf = config_element(
|
486
|
+
'ROOT', '', {
|
487
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
488
|
+
'data_stream_name' => 'foo',
|
489
|
+
'data_stream_template_name' => "foo_tpl"
|
490
|
+
})
|
491
|
+
assert_equal "foo", driver(conf).instance.data_stream_name
|
492
|
+
assert_equal "foo_tpl", driver(conf).instance.data_stream_template_name
|
493
|
+
end
|
494
|
+
|
495
|
+
def test_template_and_ilm_unset
|
496
|
+
omit REQUIRED_ELASTIC_MESSAGE unless data_stream_supported?
|
497
|
+
|
498
|
+
stub_ilm_policy
|
499
|
+
stub_index_template
|
500
|
+
stub_existent_data_stream?
|
501
|
+
stub_data_stream
|
502
|
+
stub_elastic_info
|
503
|
+
conf = config_element(
|
504
|
+
'ROOT', '', {
|
505
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
506
|
+
'data_stream_name' => 'foo',
|
507
|
+
})
|
508
|
+
assert_equal "foo", driver(conf).instance.data_stream_name
|
509
|
+
assert_equal "foo_template", driver(conf).instance.data_stream_template_name
|
510
|
+
assert_equal "foo_policy", driver(conf).instance.data_stream_ilm_name
|
511
|
+
end
|
512
|
+
|
225
513
|
def test_placeholder
|
226
514
|
omit REQUIRED_ELASTIC_MESSAGE unless data_stream_supported?
|
227
515
|
|
228
|
-
|
229
|
-
|
230
|
-
|
516
|
+
dsname = "foo_test"
|
517
|
+
ilmname = "foo_ilm_test"
|
518
|
+
tplname = "foo_tpl_test"
|
519
|
+
stub_default(dsname, ilmname, tplname)
|
520
|
+
stub_bulk_feed(dsname, ilmname, tplname)
|
521
|
+
conf = config_element(
|
522
|
+
'ROOT', '', {
|
523
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
524
|
+
'data_stream_name' => 'foo_${tag}',
|
525
|
+
'data_stream_ilm_name' => "foo_ilm_${tag}",
|
526
|
+
'data_stream_template_name' => "foo_tpl_${tag}"
|
527
|
+
})
|
528
|
+
driver(conf).run(default_tag: 'test') do
|
529
|
+
driver.feed(sample_record)
|
530
|
+
end
|
531
|
+
assert_equal 1, @bulk_records
|
532
|
+
end
|
533
|
+
|
534
|
+
def test_placeholder_params_unset
|
535
|
+
omit REQUIRED_ELASTIC_MESSAGE unless data_stream_supported?
|
536
|
+
|
537
|
+
dsname = "foo_test"
|
538
|
+
ilmname = "foo_test_policy"
|
539
|
+
tplname = "foo_test_template"
|
540
|
+
stub_default(dsname, ilmname, tplname)
|
541
|
+
stub_bulk_feed(dsname, ilmname, tplname)
|
231
542
|
conf = config_element(
|
232
543
|
'ROOT', '', {
|
233
544
|
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
234
|
-
'data_stream_name' => 'foo_${tag}'
|
545
|
+
'data_stream_name' => 'foo_${tag}',
|
235
546
|
})
|
236
547
|
driver(conf).run(default_tag: 'test') do
|
237
548
|
driver.feed(sample_record)
|
@@ -239,17 +550,22 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
239
550
|
assert_equal 1, @bulk_records
|
240
551
|
end
|
241
552
|
|
553
|
+
|
242
554
|
def test_time_placeholder
|
243
555
|
omit REQUIRED_ELASTIC_MESSAGE unless data_stream_supported?
|
244
556
|
|
245
557
|
time = Time.now
|
246
|
-
|
247
|
-
|
248
|
-
|
558
|
+
dsname = "foo_#{time.strftime("%Y%m%d")}"
|
559
|
+
ilmname = "foo_ilm_#{time.strftime("%Y%m%d")}"
|
560
|
+
tplname = "foo_tpl_#{time.strftime("%Y%m%d")}"
|
561
|
+
stub_default(dsname, ilmname, tplname)
|
562
|
+
stub_bulk_feed(dsname, ilmname, tplname)
|
249
563
|
conf = config_element(
|
250
564
|
'ROOT', '', {
|
251
565
|
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
252
|
-
'data_stream_name' => 'foo_%Y%m%d'
|
566
|
+
'data_stream_name' => 'foo_%Y%m%d',
|
567
|
+
'data_stream_ilm_name' => 'foo_ilm_%Y%m%d',
|
568
|
+
'data_stream_template_name' => 'foo_tpl_%Y%m%d'
|
253
569
|
}, [config_element('buffer', 'time', {
|
254
570
|
'timekey' => '1d'
|
255
571
|
}, [])]
|
@@ -265,14 +581,18 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
265
581
|
|
266
582
|
keys = ["bar", "baz"]
|
267
583
|
keys.each do |key|
|
268
|
-
|
269
|
-
|
270
|
-
|
584
|
+
dsname = "foo_#{key}"
|
585
|
+
ilmname = "foo_ilm_#{key}"
|
586
|
+
tplname = "foo_tpl_#{key}"
|
587
|
+
stub_default(dsname, ilmname, tplname)
|
588
|
+
stub_bulk_feed(dsname, ilmname, tplname)
|
271
589
|
end
|
272
590
|
conf = config_element(
|
273
591
|
'ROOT', '', {
|
274
592
|
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
275
|
-
'data_stream_name' => 'foo_${key1}'
|
593
|
+
'data_stream_name' => 'foo_${key1}',
|
594
|
+
'data_stream_ilm_name' => 'foo_ilm_${key1}',
|
595
|
+
'data_stream_template_name' => 'foo_tpl_${key1}'
|
276
596
|
}, [config_element('buffer', 'tag,key1', {
|
277
597
|
'timekey' => '1d'
|
278
598
|
}, [])]
|
@@ -294,7 +614,9 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
294
614
|
conf = config_element(
|
295
615
|
'ROOT', '', {
|
296
616
|
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
297
|
-
'data_stream_name' => 'foo'
|
617
|
+
'data_stream_name' => 'foo',
|
618
|
+
'data_stream_ilm_name' => 'foo_ilm',
|
619
|
+
'data_stream_template_name' => 'foo_tpl'
|
298
620
|
})
|
299
621
|
driver(conf).run(default_tag: 'test') do
|
300
622
|
driver.feed(sample_record)
|
@@ -309,14 +631,16 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
309
631
|
template_file = File.join(cwd, 'test_index_template.json')
|
310
632
|
|
311
633
|
config = %{
|
312
|
-
host
|
313
|
-
port
|
314
|
-
scheme
|
315
|
-
data_stream_name
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
634
|
+
host logs.google.com
|
635
|
+
port 778
|
636
|
+
scheme https
|
637
|
+
data_stream_name foo
|
638
|
+
data_stream_ilm_name foo_ilm
|
639
|
+
data_stream_template_name foo_tpl
|
640
|
+
user john
|
641
|
+
password doe
|
642
|
+
template_name logstash
|
643
|
+
template_file #{template_file}
|
320
644
|
max_retry_putting_template 3
|
321
645
|
}
|
322
646
|
|
@@ -327,6 +651,7 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
327
651
|
connection_resets += 1
|
328
652
|
raise Faraday::ConnectionFailed, "Test message"
|
329
653
|
end
|
654
|
+
stub_elastic_info("https://logs.google.com:778/")
|
330
655
|
|
331
656
|
assert_raise(Fluent::Plugin::ElasticsearchError::RetryableOperationExhaustedFailure) do
|
332
657
|
driver(config)
|