fluent-plugin-elasticsearch 4.0.0 → 4.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +4 -0
- data/README.md +9 -0
- data/fluent-plugin-elasticsearch.gemspec +2 -2
- data/lib/fluent/plugin/elasticsearch_index_lifecycle_management.rb +4 -4
- data/lib/fluent/plugin/elasticsearch_index_template.rb +3 -4
- data/lib/fluent/plugin/out_elasticsearch.rb +47 -20
- data/test/plugin/test_out_elasticsearch.rb +359 -28
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d857451dc47373e32d9b2833fcb63a6afca5e45c1d131ee229ff8e29e408955
|
4
|
+
data.tar.gz: c0b7f154abe0b1e8288f72a7447c81a1c96ef3c7bb939af9f5964257e413a926
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1366c860429fe8da518a618f3651c839d5e151fbdf8025557433e323c84b718b7132fb27ad2c5c40d7d72980dcdb430a3398cb74aa1aafd99e4c4f701564c56d
|
7
|
+
data.tar.gz: caba8636b01815d08a00a81bf8159eaeafa0fce7824f2408d11f813f23504ab63b5ab1076c0a47ebc6f786f0228765a50f26b2076b5d1004710b1b448dace176
|
data/History.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
## Changelog [[tags]](https://github.com/uken/fluent-plugin-elasticsearch/tags)
|
2
2
|
|
3
3
|
### [Unreleased]
|
4
|
+
### 4.0.1
|
5
|
+
- Placeholders for template name and customize template (#708)
|
6
|
+
- Add overwriting ilm policy config parameter (#707)
|
7
|
+
- Fix a failing ILM config testcase (#706)
|
4
8
|
|
5
9
|
### 4.0.0
|
6
10
|
- Restructuring ILM related features (#701)
|
data/README.md
CHANGED
@@ -91,6 +91,7 @@ Current maintainers: @cosmo0920
|
|
91
91
|
+ [enable_ilm](#enable_ilm)
|
92
92
|
+ [ilm_policy_id](#ilm_policy_id)
|
93
93
|
+ [ilm_policy](#ilm_policy)
|
94
|
+
+ [ilm_policy_overwrite](#ilm_policy_overwrite)
|
94
95
|
* [Configuration - Elasticsearch Input](#configuration---elasticsearch-input)
|
95
96
|
* [Troubleshooting](#troubleshooting)
|
96
97
|
+ [Cannot send events to elasticsearch](#cannot-send-events-to-elasticsearch)
|
@@ -1162,6 +1163,14 @@ Default value is `{}`.
|
|
1162
1163
|
|
1163
1164
|
**NOTE:** This parameter requests to install elasticsearch-xpack gem.
|
1164
1165
|
|
1166
|
+
## ilm_policy_overwrite
|
1167
|
+
|
1168
|
+
Specify whether overwriting ilm policy or not.
|
1169
|
+
|
1170
|
+
Default value is `false`.
|
1171
|
+
|
1172
|
+
**NOTE:** This parameter requests to install elasticsearch-xpack gem.
|
1173
|
+
|
1165
1174
|
## Configuration - Elasticsearch Input
|
1166
1175
|
|
1167
1176
|
See [Elasticsearch Input plugin document](README.ElasticsearchInput.md)
|
@@ -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 = '4.0.
|
6
|
+
s.version = '4.0.1'
|
7
7
|
s.authors = ['diogo', 'pitr', 'Hiroshi Hatake']
|
8
8
|
s.email = ['pitr.vern@gmail.com', 'me@diogoterror.com', 'cosmo0920.wp@gmail.com']
|
9
9
|
s.description = %q{Elasticsearch output plugin for Fluent event collector}
|
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.metadata["changelog_uri"] = "https://github.com/uken/fluent-plugin-elasticsearch/blob/master/History.md"
|
21
21
|
end
|
22
22
|
|
23
|
-
s.required_ruby_version = Gem::Requirement.new(">= 2.
|
23
|
+
s.required_ruby_version = Gem::Requirement.new(">= 2.3".freeze)
|
24
24
|
|
25
25
|
s.add_runtime_dependency 'fluentd', '>= 0.14.22'
|
26
26
|
s.add_runtime_dependency 'excon', '>= 0'
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Fluent::Plugin::ElasticsearchIndexLifecycleManagement
|
2
2
|
ILM_DEFAULT_POLICY_PATH = "default-ilm-policy.json"
|
3
3
|
|
4
|
-
def setup_ilm(enable_ilm, policy_id, ilm_policy = default_policy_payload)
|
4
|
+
def setup_ilm(enable_ilm, policy_id, ilm_policy = default_policy_payload, overwrite = false)
|
5
5
|
return unless enable_ilm
|
6
6
|
|
7
|
-
create_ilm_policy(policy_id, ilm_policy)
|
7
|
+
create_ilm_policy(policy_id, ilm_policy, overwrite)
|
8
8
|
end
|
9
9
|
|
10
10
|
def verify_ilm_working
|
@@ -26,8 +26,8 @@ module Fluent::Plugin::ElasticsearchIndexLifecycleManagement
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
def create_ilm_policy(policy_id, ilm_policy = default_policy_payload)
|
30
|
-
if !ilm_policy_exists?(policy_id)
|
29
|
+
def create_ilm_policy(policy_id, ilm_policy = default_policy_payload, overwrite = false)
|
30
|
+
if overwrite || !ilm_policy_exists?(policy_id)
|
31
31
|
ilm_policy_put(policy_id, ilm_policy)
|
32
32
|
end
|
33
33
|
end
|
@@ -127,7 +127,7 @@ module Fluent::ElasticsearchIndexTemplate
|
|
127
127
|
template
|
128
128
|
end
|
129
129
|
|
130
|
-
def create_rollover_alias(index_prefix, rollover_index, deflector_alias_name, app_name, index_date_pattern, index_separator, enable_ilm, ilm_policy_id, ilm_policy, host)
|
130
|
+
def create_rollover_alias(index_prefix, rollover_index, deflector_alias_name, app_name, index_date_pattern, index_separator, enable_ilm, ilm_policy_id, ilm_policy, ilm_policy_overwrite, host)
|
131
131
|
# ILM request to create alias.
|
132
132
|
if rollover_index || enable_ilm
|
133
133
|
if !client.indices.exists_alias(:name => deflector_alias_name)
|
@@ -137,8 +137,7 @@ module Fluent::ElasticsearchIndexTemplate
|
|
137
137
|
index_name_temp='<'+index_prefix.downcase+index_separator+app_name.downcase+'-{'+index_date_pattern+'}-000001>'
|
138
138
|
end
|
139
139
|
indexcreation(index_name_temp, host)
|
140
|
-
body =
|
141
|
-
body = rollover_alias_payload(deflector_alias_name) if enable_ilm
|
140
|
+
body = rollover_alias_payload(deflector_alias_name)
|
142
141
|
client.indices.put_alias(:index => index_name_temp, :name => deflector_alias_name,
|
143
142
|
:body => body)
|
144
143
|
log.info("The alias '#{deflector_alias_name}' is created for the index '#{index_name_temp}'")
|
@@ -146,7 +145,7 @@ module Fluent::ElasticsearchIndexTemplate
|
|
146
145
|
if ilm_policy.empty?
|
147
146
|
setup_ilm(enable_ilm, ilm_policy_id)
|
148
147
|
else
|
149
|
-
setup_ilm(enable_ilm, ilm_policy_id, ilm_policy)
|
148
|
+
setup_ilm(enable_ilm, ilm_policy_id, ilm_policy, ilm_policy_overwrite)
|
150
149
|
end
|
151
150
|
end
|
152
151
|
else
|
@@ -52,6 +52,7 @@ module Fluent::Plugin
|
|
52
52
|
RequestInfo = Struct.new(:host, :index, :ilm_index)
|
53
53
|
|
54
54
|
attr_reader :alias_indexes
|
55
|
+
attr_reader :template_names
|
55
56
|
|
56
57
|
helpers :event_emitter, :compat_parameters, :record_accessor
|
57
58
|
|
@@ -155,6 +156,7 @@ EOC
|
|
155
156
|
config_param :enable_ilm, :bool, :default => false
|
156
157
|
config_param :ilm_policy_id, :string, :default => DEFAULT_POLICY_ID
|
157
158
|
config_param :ilm_policy, :hash, :default => {}
|
159
|
+
config_param :ilm_policy_overwrite, :bool, :default => false
|
158
160
|
|
159
161
|
config_section :buffer do
|
160
162
|
config_set_default :@type, DEFAULT_BUFFER_TYPE
|
@@ -212,17 +214,21 @@ EOC
|
|
212
214
|
end
|
213
215
|
|
214
216
|
@alias_indexes = []
|
217
|
+
@template_names = []
|
215
218
|
if !dry_run?
|
216
219
|
if @template_name && @template_file
|
217
220
|
if @enable_ilm
|
218
221
|
raise Fluent::ConfigError, "deflector_alias is prohibited to use with 'logstash_format at same time." if @logstash_format and @deflector_alias
|
219
222
|
end
|
223
|
+
if @ilm_policy.empty? && @ilm_policy_overwrite
|
224
|
+
raise Fluent::ConfigError, "ilm_policy_overwrite can work with non empty ilm_policy. Specify non-empty ilm policy into ilm_policy. "
|
225
|
+
end
|
220
226
|
if @logstash_format || placeholder_substitution_needed_for_template?
|
221
227
|
class << self
|
222
228
|
alias_method :template_installation, :template_installation_actual
|
223
229
|
end
|
224
230
|
else
|
225
|
-
template_installation_actual(@deflector_alias ? @deflector_alias : @index_name, @application_name, @index_name)
|
231
|
+
template_installation_actual(@deflector_alias ? @deflector_alias : @index_name, @template_name, @customize_template, @application_name, @index_name)
|
226
232
|
end
|
227
233
|
verify_ilm_working if @enable_ilm
|
228
234
|
elsif @templates
|
@@ -358,13 +364,17 @@ EOC
|
|
358
364
|
end
|
359
365
|
|
360
366
|
def placeholder?(name, param)
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
+
placeholder_validities = []
|
368
|
+
placeholder_validators(name, param).each do |v|
|
369
|
+
begin
|
370
|
+
v.validate!
|
371
|
+
placeholder_validities << true
|
372
|
+
rescue Fluent::ConfigError => e
|
373
|
+
log.debug("'#{name} #{param}' is tested built-in placeholder(s) but there is no valid placeholder(s). error: #{e}")
|
374
|
+
placeholder_validities << false
|
375
|
+
end
|
367
376
|
end
|
377
|
+
placeholder_validities.include?(true)
|
368
378
|
end
|
369
379
|
|
370
380
|
def compression
|
@@ -647,6 +657,16 @@ EOC
|
|
647
657
|
else
|
648
658
|
type_name = nil
|
649
659
|
end
|
660
|
+
if @template_name
|
661
|
+
template_name = extract_placeholders(@template_name, chunk)
|
662
|
+
else
|
663
|
+
template_name = nil
|
664
|
+
end
|
665
|
+
if @customize_template
|
666
|
+
customize_template = @customize_template.each_with_object({}) { |(key, value), hash| hash[key] = extract_placeholders(value, chunk) }
|
667
|
+
else
|
668
|
+
customize_template = nil
|
669
|
+
end
|
650
670
|
if @deflector_alias
|
651
671
|
deflector_alias = extract_placeholders(@deflector_alias, chunk)
|
652
672
|
else
|
@@ -662,7 +682,7 @@ EOC
|
|
662
682
|
else
|
663
683
|
pipeline = nil
|
664
684
|
end
|
665
|
-
return logstash_prefix, index_name, type_name, deflector_alias, application_name, pipeline
|
685
|
+
return logstash_prefix, index_name, type_name, template_name, customize_template, deflector_alias, application_name, pipeline
|
666
686
|
end
|
667
687
|
|
668
688
|
def multi_workers_ready?
|
@@ -736,7 +756,7 @@ EOC
|
|
736
756
|
end
|
737
757
|
|
738
758
|
def process_message(tag, meta, header, time, record, extracted_values)
|
739
|
-
logstash_prefix, index_name, type_name, _deflector_alias, _application_name, pipeline = extracted_values
|
759
|
+
logstash_prefix, index_name, type_name, _template_name, _customize_template, _deflector_alias, _application_name, pipeline = extracted_values
|
740
760
|
|
741
761
|
if @flatten_hashes
|
742
762
|
record = flatten_record(record)
|
@@ -837,31 +857,38 @@ EOC
|
|
837
857
|
end
|
838
858
|
|
839
859
|
def placeholder_substitution_needed_for_template?
|
840
|
-
placeholder?(:host, @host.to_s) ||
|
860
|
+
need_substitution = placeholder?(:host, @host.to_s) ||
|
841
861
|
placeholder?(:index_name, @index_name.to_s) ||
|
862
|
+
placeholder?(:template_name, @template_name.to_s) ||
|
863
|
+
@customize_template&.values&.any? { |value| placeholder?(:customize_template, value.to_s) } ||
|
842
864
|
placeholder?(:logstash_prefix, @logstash_prefix.to_s) ||
|
843
865
|
placeholder?(:deflector_alias, @deflector_alias.to_s) ||
|
844
866
|
placeholder?(:application_name, @application_name.to_s)
|
867
|
+
log.debug("Need substitution: #{need_substitution}")
|
868
|
+
need_substitution
|
845
869
|
end
|
846
870
|
|
847
|
-
def template_installation(deflector_alias, application_name, target_index, host)
|
871
|
+
def template_installation(deflector_alias, template_name, customize_template, application_name, target_index, host)
|
848
872
|
# for safety.
|
849
873
|
end
|
850
874
|
|
851
|
-
def template_installation_actual(deflector_alias, application_name, target_index, host=nil)
|
852
|
-
if
|
875
|
+
def template_installation_actual(deflector_alias, template_name, customize_template, application_name, target_index, host=nil)
|
876
|
+
if template_name && @template_file
|
853
877
|
if @alias_indexes.include? deflector_alias
|
854
878
|
log.debug("Index alias #{deflector_alias} already exists (cached)")
|
879
|
+
elsif @template_names.include? template_name
|
880
|
+
log.debug("Template name #{template_name} already exists (cached)")
|
855
881
|
else
|
856
882
|
retry_operate(@max_retry_putting_template, @fail_on_putting_template_retry_exceed) do
|
857
|
-
if
|
858
|
-
template_custom_install(
|
883
|
+
if customize_template
|
884
|
+
template_custom_install(template_name, @template_file, @template_overwrite, customize_template, @enable_ilm, deflector_alias, @ilm_policy_id, host)
|
859
885
|
else
|
860
|
-
template_install(
|
886
|
+
template_install(template_name, @template_file, @template_overwrite, @enable_ilm, deflector_alias, @ilm_policy_id, host)
|
861
887
|
end
|
862
|
-
create_rollover_alias(target_index, @rollover_index, deflector_alias, application_name, @index_date_pattern, @index_separator, @enable_ilm, @ilm_policy_id, @ilm_policy, host)
|
888
|
+
create_rollover_alias(target_index, @rollover_index, deflector_alias, application_name, @index_date_pattern, @index_separator, @enable_ilm, @ilm_policy_id, @ilm_policy, @ilm_policy_overwrite, host)
|
863
889
|
end
|
864
890
|
@alias_indexes << deflector_alias unless deflector_alias.nil?
|
891
|
+
@template_names << template_name unless template_name.nil?
|
865
892
|
end
|
866
893
|
end
|
867
894
|
end
|
@@ -869,11 +896,11 @@ EOC
|
|
869
896
|
# send_bulk given a specific bulk request, the original tag,
|
870
897
|
# chunk, and bulk_message_count
|
871
898
|
def send_bulk(data, tag, chunk, bulk_message_count, extracted_values, info)
|
872
|
-
logstash_prefix, index_name, _type_name, deflector_alias, application_name, _pipeline = extracted_values
|
899
|
+
logstash_prefix, index_name, _type_name, template_name, customize_template, deflector_alias, application_name, _pipeline = extracted_values
|
873
900
|
if deflector_alias
|
874
|
-
template_installation(deflector_alias, application_name, index_name, info.host)
|
901
|
+
template_installation(deflector_alias, template_name, customize_template, application_name, index_name, info.host)
|
875
902
|
else
|
876
|
-
template_installation(info.ilm_index, application_name, @logstash_format ? logstash_prefix : index_name, info.host)
|
903
|
+
template_installation(info.ilm_index, template_name, customize_template, application_name, @logstash_format ? logstash_prefix : index_name, info.host)
|
877
904
|
end
|
878
905
|
|
879
906
|
begin
|
@@ -307,36 +307,96 @@ class ElasticsearchOutput < Test::Unit::TestCase
|
|
307
307
|
}
|
308
308
|
end
|
309
309
|
|
310
|
-
|
311
|
-
|
312
|
-
|
310
|
+
sub_test_case 'ILM default config' do
|
311
|
+
setup do
|
312
|
+
begin
|
313
|
+
require "elasticsearch/xpack"
|
314
|
+
rescue LoadError
|
315
|
+
omit "ILM testcase needs elasticsearch-xpack gem."
|
316
|
+
end
|
317
|
+
end
|
313
318
|
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
template_file #{template_file}
|
318
|
-
}
|
319
|
-
stub_request(:get, "http://localhost:9200/_template/fluentd").
|
320
|
-
to_return(status: 200, body: "", headers: {})
|
321
|
-
stub_request(:head, "http://localhost:9200/_alias/fluentd").
|
322
|
-
to_return(status: 404, body: "", headers: {})
|
323
|
-
stub_request(:put, "http://localhost:9200/%3Cfluentd-default-%7Bnow%2Fd%7D-000001%3E/_alias/fluentd").
|
324
|
-
with(body: "{\"aliases\":{\"fluentd\":{\"is_write_index\":true}}}").
|
325
|
-
to_return(status: 200, body: "", headers: {})
|
326
|
-
stub_request(:put, "http://localhost:9200/%3Cfluentd-default-%7Bnow%2Fd%7D-000001%3E").
|
327
|
-
to_return(status: 200, body: "", headers: {})
|
328
|
-
stub_request(:get, "http://localhost:9200/_xpack").
|
329
|
-
to_return(:status => 200, :body => '{"features":{"ilm":{"available":true,"enabled":true}}}',
|
330
|
-
:headers => {"Content-Type"=> "application/json"})
|
331
|
-
stub_request(:get, "http://localhost:9200/_ilm/policy/logstash-policy").
|
332
|
-
to_return(status: 404, body: "", headers: {})
|
333
|
-
stub_request(:put, "http://localhost:9200/_ilm/policy/logstash-policy").
|
334
|
-
with(body: "{\"policy\":{\"phases\":{\"hot\":{\"actions\":{\"rollover\":{\"max_size\":\"50gb\",\"max_age\":\"30d\"}}}}}}").
|
335
|
-
to_return(status: 200, body: "", headers: {})
|
319
|
+
test 'valid configuration of index lifecycle management' do
|
320
|
+
cwd = File.dirname(__FILE__)
|
321
|
+
template_file = File.join(cwd, 'test_template.json')
|
336
322
|
|
337
|
-
|
338
|
-
|
339
|
-
|
323
|
+
config = %{
|
324
|
+
enable_ilm true
|
325
|
+
template_name logstash
|
326
|
+
template_file #{template_file}
|
327
|
+
}
|
328
|
+
stub_request(:get, "http://localhost:9200/_template/fluentd").
|
329
|
+
to_return(status: 200, body: "", headers: {})
|
330
|
+
stub_request(:head, "http://localhost:9200/_alias/fluentd").
|
331
|
+
to_return(status: 404, body: "", headers: {})
|
332
|
+
stub_request(:put, "http://localhost:9200/%3Cfluentd-default-%7Bnow%2Fd%7D-000001%3E/_alias/fluentd").
|
333
|
+
with(body: "{\"aliases\":{\"fluentd\":{\"is_write_index\":true}}}").
|
334
|
+
to_return(status: 200, body: "", headers: {})
|
335
|
+
stub_request(:put, "http://localhost:9200/%3Cfluentd-default-%7Bnow%2Fd%7D-000001%3E").
|
336
|
+
to_return(status: 200, body: "", headers: {})
|
337
|
+
stub_request(:get, "http://localhost:9200/_xpack").
|
338
|
+
to_return(:status => 200, :body => '{"features":{"ilm":{"available":true,"enabled":true}}}',
|
339
|
+
:headers => {"Content-Type"=> "application/json"})
|
340
|
+
stub_request(:get, "http://localhost:9200/_ilm/policy/logstash-policy").
|
341
|
+
to_return(status: 404, body: "", headers: {})
|
342
|
+
stub_request(:put, "http://localhost:9200/_ilm/policy/logstash-policy").
|
343
|
+
with(body: "{\"policy\":{\"phases\":{\"hot\":{\"actions\":{\"rollover\":{\"max_size\":\"50gb\",\"max_age\":\"30d\"}}}}}}").
|
344
|
+
to_return(status: 200, body: "", headers: {})
|
345
|
+
|
346
|
+
assert_nothing_raised {
|
347
|
+
driver(config)
|
348
|
+
}
|
349
|
+
end
|
350
|
+
|
351
|
+
test 'valid configuration of overwriting ilm_policy' do
|
352
|
+
cwd = File.dirname(__FILE__)
|
353
|
+
template_file = File.join(cwd, 'test_template.json')
|
354
|
+
|
355
|
+
config = %{
|
356
|
+
enable_ilm true
|
357
|
+
template_name logstash
|
358
|
+
template_file #{template_file}
|
359
|
+
ilm_policy_overwrite true
|
360
|
+
ilm_policy {"policy":{"phases":{"hot":{"actions":{"rollover":{"max_size":"75gb","max_age": "50d"}}}}}}
|
361
|
+
}
|
362
|
+
stub_request(:get, "http://localhost:9200/_template/fluentd").
|
363
|
+
to_return(status: 200, body: "", headers: {})
|
364
|
+
stub_request(:head, "http://localhost:9200/_alias/fluentd").
|
365
|
+
to_return(status: 404, body: "", headers: {})
|
366
|
+
stub_request(:put, "http://localhost:9200/%3Cfluentd-default-%7Bnow%2Fd%7D-000001%3E/_alias/fluentd").
|
367
|
+
with(body: "{\"aliases\":{\"fluentd\":{\"is_write_index\":true}}}").
|
368
|
+
to_return(status: 200, body: "", headers: {})
|
369
|
+
stub_request(:put, "http://localhost:9200/%3Cfluentd-default-%7Bnow%2Fd%7D-000001%3E").
|
370
|
+
to_return(status: 200, body: "", headers: {})
|
371
|
+
stub_request(:get, "http://localhost:9200/_xpack").
|
372
|
+
to_return(:status => 200, :body => '{"features":{"ilm":{"available":true,"enabled":true}}}',
|
373
|
+
:headers => {"Content-Type"=> "application/json"})
|
374
|
+
stub_request(:get, "http://localhost:9200/_ilm/policy/logstash-policy").
|
375
|
+
to_return(status: 200, body: "", headers: {})
|
376
|
+
stub_request(:put, "http://localhost:9200/_ilm/policy/logstash-policy").
|
377
|
+
with(body: "{\"policy\":{\"phases\":{\"hot\":{\"actions\":{\"rollover\":{\"max_size\":\"75gb\",\"max_age\":\"50d\"}}}}}}").
|
378
|
+
to_return(status: 200, body: "", headers: {})
|
379
|
+
|
380
|
+
assert_nothing_raised {
|
381
|
+
driver(config)
|
382
|
+
}
|
383
|
+
end
|
384
|
+
|
385
|
+
test 'invalid configuration of overwriting ilm_policy' do
|
386
|
+
cwd = File.dirname(__FILE__)
|
387
|
+
template_file = File.join(cwd, 'test_template.json')
|
388
|
+
|
389
|
+
config = %{
|
390
|
+
enable_ilm true
|
391
|
+
template_name logstash
|
392
|
+
template_file #{template_file}
|
393
|
+
ilm_policy_overwrite true
|
394
|
+
}
|
395
|
+
|
396
|
+
assert_raise(Fluent::ConfigError) {
|
397
|
+
driver(config)
|
398
|
+
}
|
399
|
+
end
|
340
400
|
end
|
341
401
|
|
342
402
|
test 'Detected Elasticsearch 7' do
|
@@ -399,6 +459,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
|
|
399
459
|
|
400
460
|
sub_test_case "placeholder substitution needed?" do
|
401
461
|
data("host placeholder" => ["host", "host-${tag}.google.com"],
|
462
|
+
"index_name_placeholder" => ["index_name", "logstash-${tag}"],
|
463
|
+
"template_name_placeholder" => ["template_name", "logstash-${tag}"],
|
464
|
+
"customize_template" => ["customize_template", '{"<<TAG>>":"${tag}"}'],
|
402
465
|
"logstash_prefix_placeholder" => ["logstash_prefix", "fluentd-${tag}"],
|
403
466
|
"deflector_alias_placeholder" => ["deflector_alias", "fluentd-${tag}"],
|
404
467
|
"application_name_placeholder" => ["application_name", "fluentd-${tag}"],
|
@@ -419,6 +482,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
|
|
419
482
|
|
420
483
|
|
421
484
|
data("host placeholder" => ["host", "host-%Y%m%d.google.com"],
|
485
|
+
"index_name_placeholder" => ["index_name", "logstash-%Y%m%d"],
|
486
|
+
"template_name_placeholder" => ["template_name", "logstash-%Y%m%d"],
|
487
|
+
"customize_template" => ["customize_template", '{"<<TAG>>":"fluentd-%Y%m%d"}'],
|
422
488
|
"logstash_prefix_placeholder" => ["logstash_prefix", "fluentd-%Y%m%d"],
|
423
489
|
"deflector_alias_placeholder" => ["deflector_alias", "fluentd-%Y%m%d"],
|
424
490
|
"application_name_placeholder" => ["application_name", "fluentd-%Y%m%d"],
|
@@ -440,6 +506,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
|
|
440
506
|
end
|
441
507
|
|
442
508
|
data("host placeholder" => ["host", "host-${mykey}.google.com"],
|
509
|
+
"index_name_placeholder" => ["index_name", "logstash-${mykey}"],
|
510
|
+
"template_name_placeholder" => ["template_name", "logstash-${mykey}"],
|
511
|
+
"customize_template" => ["customize_template", '{"<<TAG>>":"${mykey}"}'],
|
443
512
|
"logstash_prefix_placeholder" => ["logstash_prefix", "fluentd-${mykey}"],
|
444
513
|
"deflector_alias_placeholder" => ["deflector_alias", "fluentd-${mykey}"],
|
445
514
|
"application_name_placeholder" => ["application_name", "fluentd-${mykey}"],
|
@@ -460,6 +529,31 @@ class ElasticsearchOutput < Test::Unit::TestCase
|
|
460
529
|
|
461
530
|
assert_true driver.instance.placeholder_substitution_needed_for_template?
|
462
531
|
end
|
532
|
+
|
533
|
+
data("host placeholder" => ["host", "host-${tag}.google.com"],
|
534
|
+
"index_name_placeholder" => ["index_name", "logstash-${es_index}-%Y%m%d"],
|
535
|
+
"template_name_placeholder" => ["template_name", "logstash-${tag}-%Y%m%d"],
|
536
|
+
"customize_template" => ["customize_template", '{"<<TAG>>":"${es_index}"}'],
|
537
|
+
"logstash_prefix_placeholder" => ["logstash_prefix", "fluentd-${es_index}-%Y%m%d"],
|
538
|
+
"deflector_alias_placeholder" => ["deflector_alias", "fluentd-%Y%m%d"],
|
539
|
+
"application_name_placeholder" => ["application_name", "fluentd-${tag}-${es_index}-%Y%m%d"],
|
540
|
+
)
|
541
|
+
test 'mixed placeholder' do |data|
|
542
|
+
param, value = data
|
543
|
+
config = Fluent::Config::Element.new(
|
544
|
+
'ROOT', '', {
|
545
|
+
'@type' => 'elasticsearch',
|
546
|
+
param => value
|
547
|
+
}, [
|
548
|
+
Fluent::Config::Element.new('buffer', 'tag,time,es_index', {
|
549
|
+
'chunk_keys' => 'es_index',
|
550
|
+
'timekey' => '1d',
|
551
|
+
}, [])
|
552
|
+
])
|
553
|
+
driver(config)
|
554
|
+
|
555
|
+
assert_true driver.instance.placeholder_substitution_needed_for_template?
|
556
|
+
end
|
463
557
|
end
|
464
558
|
|
465
559
|
sub_test_case 'chunk_keys requirement' do
|
@@ -650,6 +744,63 @@ class ElasticsearchOutput < Test::Unit::TestCase
|
|
650
744
|
assert_requested(:put, "https://logs.google.com:777/es//_template/logstash", times: 1)
|
651
745
|
end
|
652
746
|
|
747
|
+
def test_template_create_with_rollover_index_and_template_related_placeholders
|
748
|
+
cwd = File.dirname(__FILE__)
|
749
|
+
template_file = File.join(cwd, 'test_template.json')
|
750
|
+
config = %{
|
751
|
+
host logs.google.com
|
752
|
+
port 777
|
753
|
+
scheme https
|
754
|
+
path /es/
|
755
|
+
user john
|
756
|
+
password doe
|
757
|
+
template_name logstash-${tag}
|
758
|
+
template_file #{template_file}
|
759
|
+
rollover_index true
|
760
|
+
index_date_pattern ""
|
761
|
+
index_name fluentd-${tag}
|
762
|
+
deflector_alias myapp_deflector-${tag}
|
763
|
+
}
|
764
|
+
|
765
|
+
# connection start
|
766
|
+
stub_request(:head, "https://logs.google.com:777/es//").
|
767
|
+
with(basic_auth: ['john', 'doe']).
|
768
|
+
to_return(:status => 200, :body => "", :headers => {})
|
769
|
+
# check if template exists
|
770
|
+
stub_request(:get, "https://logs.google.com:777/es//_template/logstash-test.template").
|
771
|
+
with(basic_auth: ['john', 'doe']).
|
772
|
+
to_return(:status => 404, :body => "", :headers => {})
|
773
|
+
# create template
|
774
|
+
stub_request(:put, "https://logs.google.com:777/es//_template/logstash-test.template").
|
775
|
+
with(basic_auth: ['john', 'doe']).
|
776
|
+
to_return(:status => 200, :body => "", :headers => {})
|
777
|
+
# check if alias exists
|
778
|
+
stub_request(:head, "https://logs.google.com:777/es//_alias/myapp_deflector-test.template").
|
779
|
+
with(basic_auth: ['john', 'doe']).
|
780
|
+
to_return(:status => 404, :body => "", :headers => {})
|
781
|
+
# put the alias for the index
|
782
|
+
stub_request(:put, "https://logs.google.com:777/es//%3Cfluentd-test.template-default-000001%3E").
|
783
|
+
with(basic_auth: ['john', 'doe']).
|
784
|
+
to_return(status: 200, body: "", headers: {})
|
785
|
+
stub_request(:put, "https://logs.google.com:777/es//%3Cfluentd-test.template-default-000001%3E/_alias/myapp_deflector-test.template").
|
786
|
+
with(basic_auth: ['john', 'doe'],
|
787
|
+
body: "{\"aliases\":{\"myapp_deflector-test.template\":{\"is_write_index\":true}}}").
|
788
|
+
to_return(:status => 200, :body => "", :headers => {})
|
789
|
+
|
790
|
+
driver(config)
|
791
|
+
|
792
|
+
elastic_request = stub_elastic("https://logs.google.com:777/es//_bulk")
|
793
|
+
driver.run(default_tag: 'test.template') do
|
794
|
+
driver.feed(sample_record)
|
795
|
+
end
|
796
|
+
assert_equal('fluentd-test.template', index_cmds.first['index']['_index'])
|
797
|
+
|
798
|
+
assert_equal ["myapp_deflector-test.template"], driver.instance.alias_indexes
|
799
|
+
assert_equal ["logstash-test.template"], driver.instance.template_names
|
800
|
+
|
801
|
+
assert_requested(elastic_request)
|
802
|
+
end
|
803
|
+
|
653
804
|
class TemplateIndexLifecycleManagementTest < self
|
654
805
|
def setup
|
655
806
|
begin
|
@@ -724,6 +875,73 @@ class ElasticsearchOutput < Test::Unit::TestCase
|
|
724
875
|
assert_requested(:put, "https://logs.google.com:777/es//_template/logstash", times: 1)
|
725
876
|
end
|
726
877
|
|
878
|
+
def test_template_create_with_rollover_index_and_default_ilm_and_ilm_policy_overwrite
|
879
|
+
cwd = File.dirname(__FILE__)
|
880
|
+
template_file = File.join(cwd, 'test_template.json')
|
881
|
+
|
882
|
+
config = %{
|
883
|
+
host logs.google.com
|
884
|
+
port 777
|
885
|
+
scheme https
|
886
|
+
path /es/
|
887
|
+
user john
|
888
|
+
password doe
|
889
|
+
template_name logstash
|
890
|
+
template_file #{template_file}
|
891
|
+
index_date_pattern now/w{xxxx.ww}
|
892
|
+
index_name logstash
|
893
|
+
enable_ilm true
|
894
|
+
ilm_policy_overwrite true
|
895
|
+
ilm_policy {"policy":{"phases":{"hot":{"actions":{"rollover":{"max_size":"60gb","max_age": "45d"}}}}}}
|
896
|
+
}
|
897
|
+
|
898
|
+
# connection start
|
899
|
+
stub_request(:head, "https://logs.google.com:777/es//").
|
900
|
+
with(basic_auth: ['john', 'doe']).
|
901
|
+
to_return(:status => 200, :body => "", :headers => {})
|
902
|
+
# check if template exists
|
903
|
+
stub_request(:get, "https://logs.google.com:777/es//_template/logstash").
|
904
|
+
with(basic_auth: ['john', 'doe']).
|
905
|
+
to_return(:status => 404, :body => "", :headers => {})
|
906
|
+
# creation
|
907
|
+
stub_request(:put, "https://logs.google.com:777/es//_template/logstash").
|
908
|
+
with(basic_auth: ['john', 'doe']).
|
909
|
+
to_return(:status => 200, :body => "", :headers => {})
|
910
|
+
# check if alias exists
|
911
|
+
stub_request(:head, "https://logs.google.com:777/es//_alias/logstash").
|
912
|
+
with(basic_auth: ['john', 'doe']).
|
913
|
+
to_return(:status => 404, :body => "", :headers => {})
|
914
|
+
stub_request(:get, "https://logs.google.com:777/es//_template/logstash").
|
915
|
+
with(basic_auth: ['john', 'doe']).
|
916
|
+
to_return(status: 404, body: "", headers: {})
|
917
|
+
stub_request(:put, "https://logs.google.com:777/es//_template/logstash").
|
918
|
+
with(basic_auth: ['john', 'doe'],
|
919
|
+
body: "{\"settings\":{\"number_of_shards\":1,\"index.lifecycle.name\":\"logstash-policy\",\"index.lifecycle.rollover_alias\":\"logstash\"},\"mappings\":{\"type1\":{\"_source\":{\"enabled\":false},\"properties\":{\"host_name\":{\"type\":\"string\",\"index\":\"not_analyzed\"},\"created_at\":{\"type\":\"date\",\"format\":\"EEE MMM dd HH:mm:ss Z YYYY\"}}}},\"index_patterns\":\"logstash-*\",\"order\":51}").
|
920
|
+
to_return(status: 200, body: "", headers: {})
|
921
|
+
# put the alias for the index
|
922
|
+
stub_request(:put, "https://logs.google.com:777/es//%3Clogstash-default-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E").
|
923
|
+
with(basic_auth: ['john', 'doe']).
|
924
|
+
to_return(:status => 200, :body => "", :headers => {})
|
925
|
+
stub_request(:put, "https://logs.google.com:777/es//%3Clogstash-default-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E/_alias/logstash").
|
926
|
+
with(basic_auth: ['john', 'doe'],
|
927
|
+
:body => "{\"aliases\":{\"logstash\":{\"is_write_index\":true}}}").
|
928
|
+
to_return(:status => 200, :body => "", :headers => {})
|
929
|
+
stub_request(:get, "https://logs.google.com:777/es//_xpack").
|
930
|
+
with(basic_auth: ['john', 'doe']).
|
931
|
+
to_return(:status => 200, :body => '{"features":{"ilm":{"available":true,"enabled":true}}}', :headers => {"Content-Type"=> "application/json"})
|
932
|
+
stub_request(:get, "https://logs.google.com:777/es//_ilm/policy/logstash-policy").
|
933
|
+
with(basic_auth: ['john', 'doe']).
|
934
|
+
to_return(:status => 200, :body => "", :headers => {})
|
935
|
+
stub_request(:put, "https://logs.google.com:777/es//_ilm/policy/logstash-policy").
|
936
|
+
with(basic_auth: ['john', 'doe'],
|
937
|
+
:body => "{\"policy\":{\"phases\":{\"hot\":{\"actions\":{\"rollover\":{\"max_size\":\"60gb\",\"max_age\":\"45d\"}}}}}}").
|
938
|
+
to_return(:status => 200, :body => "", :headers => {})
|
939
|
+
|
940
|
+
driver(config)
|
941
|
+
|
942
|
+
assert_requested(:put, "https://logs.google.com:777/es//_template/logstash", times: 1)
|
943
|
+
end
|
944
|
+
|
727
945
|
def test_template_create_with_rollover_index_and_default_ilm_with_deflector_alias
|
728
946
|
cwd = File.dirname(__FILE__)
|
729
947
|
template_file = File.join(cwd, 'test_template.json')
|
@@ -1029,6 +1247,48 @@ class ElasticsearchOutput < Test::Unit::TestCase
|
|
1029
1247
|
assert_requested(:put, "https://logs.google.com:777/es//_template/myapp_alias_template", times: 1)
|
1030
1248
|
end
|
1031
1249
|
|
1250
|
+
def test_custom_template_create_with_customize_template_related_placeholders
|
1251
|
+
cwd = File.dirname(__FILE__)
|
1252
|
+
template_file = File.join(cwd, 'test_alias_template.json')
|
1253
|
+
|
1254
|
+
config = %{
|
1255
|
+
host logs.google.com
|
1256
|
+
port 777
|
1257
|
+
scheme https
|
1258
|
+
path /es/
|
1259
|
+
user john
|
1260
|
+
password doe
|
1261
|
+
template_name myapp_alias_template-${tag}
|
1262
|
+
template_file #{template_file}
|
1263
|
+
customize_template {"--appid--": "${tag}-logs","--index_prefix--":"${tag}"}
|
1264
|
+
}
|
1265
|
+
|
1266
|
+
# connection start
|
1267
|
+
stub_request(:head, "https://logs.google.com:777/es//").
|
1268
|
+
with(basic_auth: ['john', 'doe']).
|
1269
|
+
to_return(:status => 200, :body => "", :headers => {})
|
1270
|
+
# check if template exists
|
1271
|
+
stub_request(:get, "https://logs.google.com:777/es//_template/myapp_alias_template-test.template").
|
1272
|
+
with(basic_auth: ['john', 'doe']).
|
1273
|
+
to_return(:status => 404, :body => "", :headers => {})
|
1274
|
+
# creation
|
1275
|
+
stub_request(:put, "https://logs.google.com:777/es//_template/myapp_alias_template-test.template").
|
1276
|
+
with(basic_auth: ['john', 'doe']).
|
1277
|
+
to_return(:status => 200, :body => "", :headers => {})
|
1278
|
+
|
1279
|
+
stub_request(:put, "https://logs.google.com:777/es//%3Cfluentd-test-default-000001%3E").
|
1280
|
+
to_return(status: 200, body: "", headers: {})
|
1281
|
+
|
1282
|
+
driver(config)
|
1283
|
+
|
1284
|
+
stub_elastic("https://logs.google.com:777/es//_bulk")
|
1285
|
+
driver.run(default_tag: 'test.template') do
|
1286
|
+
driver.feed(sample_record)
|
1287
|
+
end
|
1288
|
+
|
1289
|
+
assert_requested(:put, "https://logs.google.com:777/es//_template/myapp_alias_template-test.template", times: 1)
|
1290
|
+
end
|
1291
|
+
|
1032
1292
|
def test_custom_template_installation_for_host_placeholder
|
1033
1293
|
cwd = File.dirname(__FILE__)
|
1034
1294
|
template_file = File.join(cwd, 'test_template.json')
|
@@ -1302,6 +1562,77 @@ class ElasticsearchOutput < Test::Unit::TestCase
|
|
1302
1562
|
assert_requested(:put, "https://logs.google.com:777/es//_template/mylogs", times: 1)
|
1303
1563
|
end
|
1304
1564
|
|
1565
|
+
def test_custom_template_with_rollover_index_create_and_default_ilm_and_ilm_policy_overwrite
|
1566
|
+
cwd = File.dirname(__FILE__)
|
1567
|
+
template_file = File.join(cwd, 'test_alias_template.json')
|
1568
|
+
|
1569
|
+
config = %{
|
1570
|
+
host logs.google.com
|
1571
|
+
port 777
|
1572
|
+
scheme https
|
1573
|
+
path /es/
|
1574
|
+
user john
|
1575
|
+
password doe
|
1576
|
+
template_name myapp_alias_template
|
1577
|
+
template_file #{template_file}
|
1578
|
+
customize_template {"--appid--": "myapp-logs","--index_prefix--":"mylogs"}
|
1579
|
+
index_date_pattern now/w{xxxx.ww}
|
1580
|
+
index_name mylogs
|
1581
|
+
application_name myapp
|
1582
|
+
ilm_policy_id fluentd-policy
|
1583
|
+
enable_ilm true
|
1584
|
+
ilm_policy_overwrite true
|
1585
|
+
ilm_policy {"policy":{"phases":{"hot":{"actions":{"rollover":{"max_size":"60gb","max_age": "45d"}}}}}}
|
1586
|
+
}
|
1587
|
+
|
1588
|
+
# connection start
|
1589
|
+
stub_request(:head, "https://logs.google.com:777/es//").
|
1590
|
+
with(basic_auth: ['john', 'doe']).
|
1591
|
+
to_return(:status => 200, :body => "", :headers => {})
|
1592
|
+
# check if template exists
|
1593
|
+
stub_request(:get, "https://logs.google.com:777/es//_template/myapp_alias_template").
|
1594
|
+
with(basic_auth: ['john', 'doe']).
|
1595
|
+
to_return(:status => 404, :body => "", :headers => {})
|
1596
|
+
# creation
|
1597
|
+
stub_request(:put, "https://logs.google.com:777/es//_template/myapp_alias_template").
|
1598
|
+
with(basic_auth: ['john', 'doe']).
|
1599
|
+
to_return(:status => 200, :body => "", :headers => {})
|
1600
|
+
# creation of index which can rollover
|
1601
|
+
stub_request(:put, "https://logs.google.com:777/es//%3Cmylogs-myapp-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E").
|
1602
|
+
with(basic_auth: ['john', 'doe']).
|
1603
|
+
to_return(:status => 200, :body => "", :headers => {})
|
1604
|
+
# check if alias exists
|
1605
|
+
stub_request(:head, "https://logs.google.com:777/es//_alias/mylogs").
|
1606
|
+
with(basic_auth: ['john', 'doe']).
|
1607
|
+
to_return(:status => 404, :body => "", :headers => {})
|
1608
|
+
stub_request(:get, "https://logs.google.com:777/es//_template/mylogs").
|
1609
|
+
with(basic_auth: ['john', 'doe']).
|
1610
|
+
to_return(status: 404, body: "", headers: {})
|
1611
|
+
stub_request(:put, "https://logs.google.com:777/es//_template/mylogs").
|
1612
|
+
with(basic_auth: ['john', 'doe'],
|
1613
|
+
body: "{\"order\":6,\"settings\":{\"index.lifecycle.name\":\"fluentd-policy\",\"index.lifecycle.rollover_alias\":\"mylogs\"},\"mappings\":{},\"aliases\":{\"myapp-logs-alias\":{}},\"index_patterns\":\"mylogs-*\"}").
|
1614
|
+
to_return(status: 200, body: "", headers: {})
|
1615
|
+
# put the alias for the index
|
1616
|
+
stub_request(:put, "https://logs.google.com:777/es//%3Cmylogs-myapp-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E/_alias/mylogs").
|
1617
|
+
with(basic_auth: ['john', 'doe'],
|
1618
|
+
:body => "{\"aliases\":{\"mylogs\":{\"is_write_index\":true}}}").
|
1619
|
+
to_return(:status => 200, :body => "", :headers => {})
|
1620
|
+
stub_request(:get, "https://logs.google.com:777/es//_xpack").
|
1621
|
+
with(basic_auth: ['john', 'doe']).
|
1622
|
+
to_return(:status => 200, :body => '{"features":{"ilm":{"available":true,"enabled":true}}}', :headers => {"Content-Type"=> "application/json"})
|
1623
|
+
stub_request(:get, "https://logs.google.com:777/es//_ilm/policy/fluentd-policy").
|
1624
|
+
with(basic_auth: ['john', 'doe']).
|
1625
|
+
to_return(:status => 200, :body => "", :headers => {})
|
1626
|
+
stub_request(:put, "https://logs.google.com:777/es//_ilm/policy/fluentd-policy").
|
1627
|
+
with(basic_auth: ['john', 'doe'],
|
1628
|
+
:body => "{\"policy\":{\"phases\":{\"hot\":{\"actions\":{\"rollover\":{\"max_size\":\"60gb\",\"max_age\":\"45d\"}}}}}}").
|
1629
|
+
to_return(:status => 200, :body => "", :headers => {})
|
1630
|
+
|
1631
|
+
driver(config)
|
1632
|
+
|
1633
|
+
assert_requested(:put, "https://logs.google.com:777/es//_template/mylogs", times: 1)
|
1634
|
+
end
|
1635
|
+
|
1305
1636
|
def test_custom_template_with_rollover_index_create_and_default_ilm_with_deflector_alias
|
1306
1637
|
cwd = File.dirname(__FILE__)
|
1307
1638
|
template_file = File.join(cwd, 'test_alias_template.json')
|
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: 4.0.
|
4
|
+
version: 4.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- diogo
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2020-01-
|
13
|
+
date: 2020-01-31 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: fluentd
|
@@ -185,7 +185,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
185
185
|
requirements:
|
186
186
|
- - ">="
|
187
187
|
- !ruby/object:Gem::Version
|
188
|
-
version: '2.
|
188
|
+
version: '2.3'
|
189
189
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
190
190
|
requirements:
|
191
191
|
- - ">="
|