fluent-plugin-elasticsearch 4.0.7 → 4.1.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.
@@ -62,8 +62,8 @@ class TestElasticsearchTLS < Test::Unit::TestCase
62
62
  d = driver('')
63
63
  ssl_version_options = d.instance.set_tls_minmax_version_config(d.instance.ssl_version, nil, nil)
64
64
  if @use_tls_minmax_version
65
- assert_equal({max_version: OpenSSL::SSL::TLS1_VERSION,
66
- min_version: OpenSSL::SSL::TLS1_VERSION}, ssl_version_options)
65
+ assert_equal({max_version: OpenSSL::SSL::TLS1_3_VERSION,
66
+ min_version: OpenSSL::SSL::TLS1_2_VERSION}, ssl_version_options)
67
67
  else
68
68
  assert_equal({version: Fluent::Plugin::ElasticsearchTLS::DEFAULT_VERSION}, ssl_version_options)
69
69
  end
@@ -18,6 +18,12 @@ class ElasticsearchGenidFilterTest < Test::Unit::TestCase
18
18
  Fluent::Test::Driver::Filter.new(Fluent::Plugin::ElasticsearchGenidFilter).configure(conf)
19
19
  end
20
20
 
21
+ test "invalid configuration" do
22
+ assert_raise(Fluent::ConfigError) do
23
+ create_driver("use_record_as_seed true")
24
+ end
25
+ end
26
+
21
27
  def sample_record
22
28
  {'age' => 26, 'request_id' => '42', 'parent_id' => 'parent', 'routing_id' => 'routing'}
23
29
  end
@@ -41,4 +47,169 @@ class ElasticsearchGenidFilterTest < Test::Unit::TestCase
41
47
  assert_equal(Base64.strict_encode64(SecureRandom.uuid),
42
48
  d.filtered.map {|e| e.last}.first[d.instance.hash_id_key])
43
49
  end
50
+
51
+ class UseRecordAsSeedTest < self
52
+ data("md5" => ["md5", "PPg+zmH1ASUCpNzMUcTzqw=="],
53
+ "sha1" => ["sha1", "JKfCrEAxeAyRSdcKqkw4unC9xZ8="],
54
+ "sha256" => ["sha256", "9Z9i+897bGivSItD/6i0vye9uRwq/sLwWkxOwydtTJY="],
55
+ "sha512" => ["sha512", "KWI5OdZPaCFW9/CEY3NoGrvueMtjZJdmGdqIVGJP8vgI4uW+0gHExZVaHerw+RhbtIdLCtVZ43xBgMKH+KliQg=="],
56
+ )
57
+ def test_simple(data)
58
+ hash_type, expected = data
59
+ d = create_driver(%[
60
+ use_record_as_seed true
61
+ record_keys age,parent_id,routing_id,custom_key
62
+ hash_type #{hash_type}
63
+ ])
64
+ time = event_time("2017-10-15 15:00:23.34567890 UTC")
65
+ d.run(default_tag: 'test') do
66
+ d.feed(time, sample_record.merge("custom_key" => "This is also encoded value."))
67
+ end
68
+ assert_equal(expected,
69
+ d.filtered.map {|e| e.last}.first[d.instance.hash_id_key])
70
+ end
71
+
72
+ data("md5" => ["md5", "qUO/xqWiOJq4D0ApdoHVEQ=="],
73
+ "sha1" => ["sha1", "v3UWYr90zIH2veGQBVwUH586TuI="],
74
+ "sha256" => ["sha256", "4hwh10qfw9B24NtNFoEFF8wCiImvgIy1Vk4gzcKt5Pw="],
75
+ "sha512" => ["sha512", "TY3arcmC8mhYClDIjQxH8ePRLnHK01Cj5QQL8FxbwNtPQBY3IZ4qJY9CpOusmdWBYwm1golRVQCmURiAhlnWIQ=="],)
76
+ def test_record_with_tag(data)
77
+ hash_type, expected = data
78
+ d = create_driver(%[
79
+ use_record_as_seed true
80
+ record_keys age,parent_id,routing_id,custom_key
81
+ hash_type #{hash_type}
82
+ include_tag_in_seed true
83
+ ])
84
+ time = event_time("2017-10-15 15:00:23.34567890 UTC")
85
+ d.run(default_tag: 'test.fluentd') do
86
+ d.feed(time, sample_record.merge("custom_key" => "This is also encoded value."))
87
+ end
88
+ assert_equal(expected,
89
+ d.filtered.map {|e| e.last}.first[d.instance.hash_id_key])
90
+ end
91
+
92
+ data("md5" => ["md5", "oHo+PoC5I4KC+XCfXvyf9w=="],
93
+ "sha1" => ["sha1", "50Nwarm2225gLy1ka8d9i+W6cKA="],
94
+ "sha256" => ["sha256", "ReX1XgizcrHjBc0sQwx9Sjuf2QBFll2njYf4ee+XSIc="],
95
+ "sha512" => ["sha512", "8bcpZrqNUQIz6opdoVZz0MwxP8r9SCqOEPkWF6xGLlFwPCJVqk2SQp99m8rPufr0xPIgvZyOMejA5slBV9xrdg=="],)
96
+ def test_record_with_time(data)
97
+ hash_type, expected = data
98
+ d = create_driver(%[
99
+ use_record_as_seed true
100
+ record_keys age,parent_id,routing_id,custom_key
101
+ hash_type #{hash_type}
102
+ include_time_in_seed true
103
+ ])
104
+ time = event_time("2017-10-15 15:00:23.34567890 UTC")
105
+ d.run(default_tag: 'test.fluentd') do
106
+ d.feed(time, sample_record.merge("custom_key" => "This is also encoded value."))
107
+ end
108
+ assert_equal(expected,
109
+ d.filtered.map {|e| e.last}.first[d.instance.hash_id_key])
110
+ end
111
+
112
+ data("md5" => ["md5", "u7/hr09gDC9CM5DI7tLc2Q=="],
113
+ "sha1" => ["sha1", "1WgptcTnVSHtTAlNUwNcoiaY3oM="],
114
+ "sha256" => ["sha256", "1iWZHI19m/A1VH8iFK7H2KFoyLdszpJRiVeKBv1Ndis="],
115
+ "sha512" => ["sha512", "NM+ui0lUmeDaEJsT7c9EyTc+lQBbRf1x6MQXXYdxp21CX3jZvHy3IT8Xp9ZdIKevZwhoo3Suo/tIBlfyLFXJXw=="],)
116
+ def test_record_with_tag_and_time
117
+ hash_type, expected = data
118
+ d = create_driver(%[
119
+ use_record_as_seed true
120
+ record_keys age,parent_id,routing_id,custom_key
121
+ hash_type #{hash_type}
122
+ include_tag_in_seed true
123
+ include_time_in_seed true
124
+ ])
125
+ time = event_time("2017-10-15 15:00:23.34567890 UTC")
126
+ d.run(default_tag: 'test.fluentd') do
127
+ d.feed(time, sample_record.merge("custom_key" => "This is also encoded value."))
128
+ end
129
+ assert_equal(expected,
130
+ d.filtered.map {|e| e.last}.first[d.instance.hash_id_key])
131
+ end
132
+ end
133
+
134
+ class UseEntireRecordAsSeedTest < self
135
+ data("md5" => ["md5", "MuMU0gHOP1cWvvg/J4aEFg=="],
136
+ "sha1" => ["sha1", "GZ6Iup9Ywyk5spCWtPQbtZnfK0U="],
137
+ "sha256" => ["sha256", "O4YN0RiXCUAYeaR97UUULRLxgra/R2dvTV47viir5l4="],
138
+ "sha512" => ["sha512", "FtbwO1xsLUq0KcO0mj0l80rbwFH5rGE3vL+Vgh90+4R/9j+/Ni/ipwhiOoUcetDxj1r5Vf/92B54La+QTu3eMA=="],)
139
+ def test_record
140
+ hash_type, expected = data
141
+ d = create_driver(%[
142
+ use_record_as_seed true
143
+ use_entire_record true
144
+ hash_type #{hash_type}
145
+ ])
146
+ time = event_time("2017-10-15 15:00:23.34567890 UTC")
147
+ d.run(default_tag: 'test.fluentd') do
148
+ d.feed(time, sample_record.merge("custom_key" => "This is also encoded value."))
149
+ end
150
+ assert_equal(expected,
151
+ d.filtered.map {|e| e.last}.first[d.instance.hash_id_key])
152
+ end
153
+
154
+ data("md5" => ["md5", "GJfpWe8ofiGzn97bc9Gh0Q=="],
155
+ "sha1" => ["sha1", "AVaK67Tz0bEJ8xNEzjOQ6r9fAu4="],
156
+ "sha256" => ["sha256", "WIXWAuf/Z94Uw95mudloo2bgjhSsSduQIwkKTQsNFgU="],
157
+ "sha512" => ["sha512", "yjMGGxy8uc7gCrPgm8W6MzJGLFk0GtUwJ6w/91laf6WNywuvG/7T6kNHLagAV8rSW8xzxmtEfyValBO5scuoKw=="],)
158
+ def test_record_with_tag
159
+ hash_type, expected = data
160
+ d = create_driver(%[
161
+ use_record_as_seed true
162
+ use_entire_record true
163
+ hash_type #{hash_type}
164
+ include_tag_in_seed true
165
+ ])
166
+ time = event_time("2017-10-15 15:00:23.34567890 UTC")
167
+ d.run(default_tag: 'test.fluentd') do
168
+ d.feed(time, sample_record.merge("custom_key" => "This is also encoded value."))
169
+ end
170
+ assert_equal(expected,
171
+ d.filtered.map {|e| e.last}.first[d.instance.hash_id_key])
172
+ end
173
+
174
+ data("md5" => ["md5", "5nQSaJ4F1p9rDFign13Lfg=="],
175
+ "sha1" => ["sha1", "hyo9+0ZFBpizKl2NShs3C8yQcGw="],
176
+ "sha256" => ["sha256", "romVsZSIksbqYsOSnUzolZQw76ankcy0DgvDZ3CayTo="],
177
+ "sha512" => ["sha512", "RPU7K2Pt0iVyvV7p5usqcUIIOmfTajD1aa7pkR9qZ89UARH/lpm6ESY9iwuYJj92lxOUuF5OxlEwvV7uXJ07iA=="],)
178
+ def test_record_with_time
179
+ hash_type, expected = data
180
+ d = create_driver(%[
181
+ use_record_as_seed true
182
+ use_entire_record true
183
+ hash_type #{hash_type}
184
+ include_time_in_seed true
185
+ ])
186
+ time = event_time("2017-10-15 15:00:23.34567890 UTC")
187
+ d.run(default_tag: 'test.fluentd') do
188
+ d.feed(time, sample_record.merge("custom_key" => "This is also encoded value."))
189
+ end
190
+ assert_equal(expected,
191
+ d.filtered.map {|e| e.last}.first[d.instance.hash_id_key])
192
+ end
193
+
194
+ data("md5" => ["md5", "zGQF35KlMUibJAcgkgQDtw=="],
195
+ "sha1" => ["sha1", "1x9RZO1xEuWps090qq4DUIsU9x8="],
196
+ "sha256" => ["sha256", "eulMz0eF56lBEf31aIs0OG2TGCH/aoPfZbRqfEOkAwk="],
197
+ "sha512" => ["sha512", "mIiYATtpdUFEFCIZg1FdKssIs7oWY0gJjhSSbet0ddUmqB+CiQAcAMTmrXO6AVSH0vsMvao/8vtC8AsIPfF1fA=="],)
198
+ def test_record_with_tag_and_time
199
+ hash_type, expected = data
200
+ d = create_driver(%[
201
+ use_record_as_seed true
202
+ use_entire_record true
203
+ hash_type #{hash_type}
204
+ include_tag_in_seed true
205
+ include_time_in_seed true
206
+ ])
207
+ time = event_time("2017-10-15 15:00:23.34567890 UTC")
208
+ d.run(default_tag: 'test.fluentd') do
209
+ d.feed(time, sample_record.merge("custom_key" => "This is also encoded value."))
210
+ end
211
+ assert_equal(expected,
212
+ d.filtered.map {|e| e.last}.first[d.instance.hash_id_key])
213
+ end
214
+ end
44
215
  end
@@ -230,7 +230,7 @@ class ElasticsearchOutputTest < Test::Unit::TestCase
230
230
  assert_nil instance.ssl_max_version
231
231
  assert_nil instance.ssl_min_version
232
232
  if Fluent::Plugin::ElasticsearchTLS::USE_TLS_MINMAX_VERSION
233
- assert_equal({max_version: OpenSSL::SSL::TLS1_VERSION, min_version: OpenSSL::SSL::TLS1_VERSION},
233
+ assert_equal({max_version: OpenSSL::SSL::TLS1_3_VERSION, min_version: OpenSSL::SSL::TLS1_2_VERSION},
234
234
  instance.ssl_version_options)
235
235
  else
236
236
  assert_equal({version: Fluent::Plugin::ElasticsearchTLS::DEFAULT_VERSION},
@@ -284,7 +284,16 @@ class ElasticsearchOutputTest < Test::Unit::TestCase
284
284
  }
285
285
  instance = driver(config).instance
286
286
 
287
- assert_equal "gzip", instance.client.transport.options[:transport_options][:headers]["Content-Encoding"]
287
+ assert_equal nil, instance.client.transport.options[:transport_options][:headers]["Content-Encoding"]
288
+
289
+ stub_request(:post, "http://localhost:9200/_bulk").
290
+ to_return(status: 200, body: "", headers: {})
291
+ driver.run(default_tag: 'test') do
292
+ driver.feed(sample_record)
293
+ end
294
+ compressable = instance.compressable_connection
295
+
296
+ assert_equal "gzip", instance.client(nil, compressable).transport.options[:transport_options][:headers]["Content-Encoding"]
288
297
  end
289
298
 
290
299
  test 'check compression option is passed to transport' do
@@ -295,7 +304,16 @@ class ElasticsearchOutputTest < Test::Unit::TestCase
295
304
  }
296
305
  instance = driver(config).instance
297
306
 
298
- assert_equal true, instance.client.transport.options[:compression]
307
+ assert_equal false, instance.client.transport.options[:compression]
308
+
309
+ stub_request(:post, "http://localhost:9200/_bulk").
310
+ to_return(status: 200, body: "", headers: {})
311
+ driver.run(default_tag: 'test') do
312
+ driver.feed(sample_record)
313
+ end
314
+ compressable = instance.compressable_connection
315
+
316
+ assert_equal true, instance.client(nil, compressable).transport.options[:compression]
299
317
  end
300
318
 
301
319
  test 'configure Content-Type' do
@@ -1035,6 +1053,80 @@ class ElasticsearchOutputTest < Test::Unit::TestCase
1035
1053
  assert_requested(:put, "https://logs.google.com:777/es//_template/logstash", times: 1)
1036
1054
  end
1037
1055
 
1056
+ def test_template_create_with_rollover_index_and_default_ilm_on_logstash_format
1057
+ cwd = File.dirname(__FILE__)
1058
+ template_file = File.join(cwd, 'test_template.json')
1059
+
1060
+ config = %{
1061
+ host logs.google.com
1062
+ port 777
1063
+ scheme https
1064
+ path /es/
1065
+ user john
1066
+ password doe
1067
+ template_name logstash
1068
+ template_file #{template_file}
1069
+ index_date_pattern now/w{xxxx.ww}
1070
+ enable_ilm true
1071
+ logstash_format true
1072
+ application_name log
1073
+ }
1074
+
1075
+ date_str = Time.now.strftime("%Y.%m.%d")
1076
+ # connection start
1077
+ stub_request(:head, "https://logs.google.com:777/es//").
1078
+ with(basic_auth: ['john', 'doe']).
1079
+ to_return(:status => 200, :body => "", :headers => {})
1080
+ # check if template exists
1081
+ stub_request(:get, "https://logs.google.com:777/es//_template/logstash-log-#{date_str}").
1082
+ with(basic_auth: ['john', 'doe']).
1083
+ to_return(:status => 404, :body => "", :headers => {})
1084
+ # creation
1085
+ stub_request(:put, "https://logs.google.com:777/es//_template/logstash-log-#{date_str}").
1086
+ with(basic_auth: ['john', 'doe']).
1087
+ to_return(:status => 200, :body => "", :headers => {})
1088
+ # check if alias exists
1089
+ stub_request(:head, "https://logs.google.com:777/es//_alias/logstash-log-#{date_str}").
1090
+ with(basic_auth: ['john', 'doe']).
1091
+ to_return(:status => 404, :body => "", :headers => {})
1092
+ stub_request(:get, "https://logs.google.com:777/es//_template/logstash-log-#{date_str}").
1093
+ with(basic_auth: ['john', 'doe']).
1094
+ to_return(status: 404, body: "", headers: {})
1095
+ stub_request(:put, "https://logs.google.com:777/es//_template/logstash-log-#{date_str}").
1096
+ with(basic_auth: ['john', 'doe'],
1097
+ body: "{\"settings\":{\"number_of_shards\":1,\"index.lifecycle.name\":\"logstash-policy\",\"index.lifecycle.rollover_alias\":\"logstash-log-#{date_str}\"},\"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-log-#{date_str}-*\",\"order\":53}").
1098
+ to_return(status: 200, body: "", headers: {})
1099
+ # put the alias for the index
1100
+ stub_request(:put, "https://logs.google.com:777/es//%3Clogstash-log-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E").
1101
+ with(basic_auth: ['john', 'doe']).
1102
+ to_return(:status => 200, :body => "", :headers => {})
1103
+
1104
+ stub_request(:put, "https://logs.google.com:777/es//%3Clogstash-log-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E/#{alias_endpoint}/logstash-log-#{date_str}").
1105
+ with(basic_auth: ['john', 'doe'],
1106
+ body: "{\"aliases\":{\"logstash-log-#{date_str}\":{\"is_write_index\":true}}}").
1107
+ to_return(status: 200, body: "", headers: {})
1108
+ stub_request(:get, "https://logs.google.com:777/es//_xpack").
1109
+ with(basic_auth: ['john', 'doe']).
1110
+ to_return(:status => 200, :body => '{"features":{"ilm":{"available":true,"enabled":true}}}', :headers => {"Content-Type"=> "application/json"})
1111
+ stub_request(:get, "https://logs.google.com:777/es//_ilm/policy/logstash-policy").
1112
+ with(basic_auth: ['john', 'doe']).
1113
+ to_return(:status => 404, :body => "", :headers => {})
1114
+ stub_request(:put, "https://logs.google.com:777/es//_ilm/policy/logstash-policy").
1115
+ with(basic_auth: ['john', 'doe'],
1116
+ :body => "{\"policy\":{\"phases\":{\"hot\":{\"actions\":{\"rollover\":{\"max_size\":\"50gb\",\"max_age\":\"30d\"}}}}}}").
1117
+ to_return(:status => 200, :body => "", :headers => {})
1118
+
1119
+ driver(config)
1120
+
1121
+ elastic_request = stub_elastic("https://logs.google.com:777/es//_bulk")
1122
+ driver.run(default_tag: 'test') do
1123
+ driver.feed(sample_record)
1124
+ end
1125
+ assert_requested(:put, "https://logs.google.com:777/es//_template/logstash-log-#{date_str}", times: 1)
1126
+
1127
+ assert_requested(elastic_request)
1128
+ end
1129
+
1038
1130
  def test_template_create_with_rollover_index_and_default_ilm_and_ilm_policy_overwrite
1039
1131
  cwd = File.dirname(__FILE__)
1040
1132
  template_file = File.join(cwd, 'test_template.json')
@@ -1299,6 +1391,224 @@ class ElasticsearchOutputTest < Test::Unit::TestCase
1299
1391
  assert_requested(:put, "https://logs.google.com:777/es//_template/logstash", times: 1)
1300
1392
  end
1301
1393
 
1394
+ def test_template_create_with_rollover_index_and_ilm_policies_and_placeholders
1395
+ cwd = File.dirname(__FILE__)
1396
+ template_file = File.join(cwd, 'test_template.json')
1397
+
1398
+ config = %{
1399
+ host logs.google.com
1400
+ port 777
1401
+ scheme https
1402
+ path /es/
1403
+ user john
1404
+ password doe
1405
+ template_name logstash
1406
+ template_file #{template_file}
1407
+ index_date_pattern now/w{xxxx.ww}
1408
+ ilm_policy_id fluentd-policy
1409
+ enable_ilm true
1410
+ index_name logstash
1411
+ ilm_policies {"fluentd-policy":{"policy":{"phases":{"hot":{"actions":{"rollover":{"max_size":"70gb", "max_age":"30d"}}}}}}}
1412
+ }
1413
+
1414
+ # connection start
1415
+ stub_request(:head, "https://logs.google.com:777/es//").
1416
+ with(basic_auth: ['john', 'doe']).
1417
+ to_return(:status => 200, :body => "", :headers => {})
1418
+ # check if template exists
1419
+ stub_request(:get, "https://logs.google.com:777/es//_template/logstash").
1420
+ with(basic_auth: ['john', 'doe']).
1421
+ to_return(:status => 404, :body => "", :headers => {})
1422
+ # creation
1423
+ stub_request(:put, "https://logs.google.com:777/es//_template/logstash").
1424
+ with(basic_auth: ['john', 'doe']).
1425
+ to_return(:status => 200, :body => "", :headers => {})
1426
+ # check if alias exists
1427
+ stub_request(:head, "https://logs.google.com:777/es//_alias/logstash").
1428
+ with(basic_auth: ['john', 'doe']).
1429
+ to_return(:status => 404, :body => "", :headers => {})
1430
+ stub_request(:get, "https://logs.google.com:777/es//_template/logstash").
1431
+ with(basic_auth: ['john', 'doe']).
1432
+ to_return(status: 404, body: "", headers: {})
1433
+ stub_request(:put, "https://logs.google.com:777/es//_template/logstash").
1434
+ with(basic_auth: ['john', 'doe'],
1435
+ body: "{\"settings\":{\"number_of_shards\":1,\"index.lifecycle.name\":\"fluentd-policy\",\"index.lifecycle.rollover_alias\":\"myalogs\"},\"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\":\"mylogs-*\",\"order\":51}").
1436
+ to_return(status: 200, body: "", headers: {})
1437
+ # put the alias for the index
1438
+ stub_request(:put, "https://logs.google.com:777/es//%3Clogstash-default-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E").
1439
+ with(basic_auth: ['john', 'doe']).
1440
+ to_return(:status => 200, :body => "", :headers => {})
1441
+ stub_request(:put, "https://logs.google.com:777/es//%3Clogstash-default-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E/#{alias_endpoint}/logstash").
1442
+ with(body: "{\"aliases\":{\"logstash\":{\"is_write_index\":true}}}").
1443
+ to_return(status: 200, body: "", headers: {})
1444
+ stub_request(:get, "https://logs.google.com:777/es//_xpack").
1445
+ with(basic_auth: ['john', 'doe']).
1446
+ to_return(:status => 200, :body => '{"features":{"ilm":{"available":true,"enabled":true}}}', :headers => {"Content-Type"=> "application/json"})
1447
+ stub_request(:get, "https://logs.google.com:777/es//_ilm/policy/fluentd-policy").
1448
+ with(basic_auth: ['john', 'doe']).
1449
+ to_return(:status => 404, :body => "", :headers => {})
1450
+ stub_request(:put, "https://logs.google.com:777/es//_ilm/policy/fluentd-policy").
1451
+ with(basic_auth: ['john', 'doe'],
1452
+ :body => "{\"policy\":{\"phases\":{\"hot\":{\"actions\":{\"rollover\":{\"max_size\":\"70gb\",\"max_age\":\"30d\"}}}}}}").
1453
+ to_return(:status => 200, :body => "", :headers => {})
1454
+
1455
+ driver(config)
1456
+
1457
+ elastic_request = stub_elastic("https://logs.google.com:777/es//_bulk")
1458
+ driver.run(default_tag: 'test') do
1459
+ driver.feed(sample_record)
1460
+ end
1461
+ assert_requested(:put, "https://logs.google.com:777/es//_template/logstash", times: 1)
1462
+
1463
+ assert_requested(elastic_request)
1464
+ end
1465
+
1466
+ class TemplateCreateWithRolloverIndexAndILMPoliciesWithPlaceholdersTest < self
1467
+ def test_tag_placeholder
1468
+ cwd = File.dirname(__FILE__)
1469
+ template_file = File.join(cwd, 'test_template.json')
1470
+
1471
+ config = %{
1472
+ host logs.google.com
1473
+ port 777
1474
+ scheme https
1475
+ path /es/
1476
+ user john
1477
+ password doe
1478
+ template_name logstash
1479
+ template_file #{template_file}
1480
+ index_date_pattern now/w{xxxx.ww}
1481
+ ilm_policy_id ${tag}
1482
+ enable_ilm true
1483
+ index_name logstash
1484
+ ilm_policies {"fluentd-policy":{"policy":{"phases":{"hot":{"actions":{"rollover":{"max_size":"70gb", "max_age":"30d"}}}}}}}
1485
+ }
1486
+
1487
+ # connection start
1488
+ stub_request(:head, "https://logs.google.com:777/es//").
1489
+ with(basic_auth: ['john', 'doe']).
1490
+ to_return(:status => 200, :body => "", :headers => {})
1491
+ # check if template exists
1492
+ stub_request(:get, "https://logs.google.com:777/es//_template/logstash").
1493
+ with(basic_auth: ['john', 'doe']).
1494
+ to_return(:status => 404, :body => "", :headers => {})
1495
+ # creation
1496
+ stub_request(:put, "https://logs.google.com:777/es//_template/logstash").
1497
+ with(basic_auth: ['john', 'doe']).
1498
+ to_return(:status => 200, :body => "", :headers => {})
1499
+ # check if alias exists
1500
+ stub_request(:head, "https://logs.google.com:777/es//_alias/logstash").
1501
+ with(basic_auth: ['john', 'doe']).
1502
+ to_return(:status => 404, :body => "", :headers => {})
1503
+ stub_request(:get, "https://logs.google.com:777/es//_template/logstash").
1504
+ with(basic_auth: ['john', 'doe']).
1505
+ to_return(status: 404, body: "", headers: {})
1506
+ stub_request(:put, "https://logs.google.com:777/es//_template/logstash").
1507
+ with(basic_auth: ['john', 'doe'],
1508
+ body: "{\"settings\":{\"number_of_shards\":1,\"index.lifecycle.name\":\"fluentd-policy\",\"index.lifecycle.rollover_alias\":\"myalogs\"},\"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\":\"mylogs-*\",\"order\":51}").
1509
+ to_return(status: 200, body: "", headers: {})
1510
+ # put the alias for the index
1511
+ stub_request(:put, "https://logs.google.com:777/es//%3Clogstash-default-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E").
1512
+ with(basic_auth: ['john', 'doe']).
1513
+ to_return(:status => 200, :body => "", :headers => {})
1514
+ stub_request(:put, "https://logs.google.com:777/es//%3Clogstash-default-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E/#{alias_endpoint}/logstash").
1515
+ with(body: "{\"aliases\":{\"logstash\":{\"is_write_index\":true}}}").
1516
+ to_return(status: 200, body: "", headers: {})
1517
+ stub_request(:get, "https://logs.google.com:777/es//_xpack").
1518
+ with(basic_auth: ['john', 'doe']).
1519
+ to_return(:status => 200, :body => '{"features":{"ilm":{"available":true,"enabled":true}}}', :headers => {"Content-Type"=> "application/json"})
1520
+ stub_request(:get, "https://logs.google.com:777/es//_ilm/policy/fluentd-policy").
1521
+ with(basic_auth: ['john', 'doe']).
1522
+ to_return(:status => 404, :body => "", :headers => {})
1523
+ stub_request(:put, "https://logs.google.com:777/es//_ilm/policy/fluentd-policy").
1524
+ with(basic_auth: ['john', 'doe'],
1525
+ body: "{\"policy\":{\"phases\":{\"hot\":{\"actions\":{\"rollover\":{\"max_size\":\"70gb\",\"max_age\":\"30d\"}}}}}}").
1526
+ to_return(:status => 200, :body => "", :headers => {})
1527
+
1528
+ driver(config)
1529
+
1530
+ elastic_request = stub_elastic("https://logs.google.com:777/es//_bulk")
1531
+ driver.run(default_tag: 'fluentd-policy') do
1532
+ driver.feed(sample_record)
1533
+ end
1534
+ assert_requested(:put, "https://logs.google.com:777/es//_template/logstash", times: 1)
1535
+
1536
+ assert_requested(elastic_request)
1537
+ end
1538
+
1539
+ def test_tag_placeholder_with_multiple_policies
1540
+ cwd = File.dirname(__FILE__)
1541
+ template_file = File.join(cwd, 'test_template.json')
1542
+
1543
+ config = %{
1544
+ host logs.google.com
1545
+ port 777
1546
+ scheme https
1547
+ path /es/
1548
+ user john
1549
+ password doe
1550
+ template_name logstash
1551
+ template_file #{template_file}
1552
+ index_date_pattern now/w{xxxx.ww}
1553
+ ilm_policy_id ${tag}
1554
+ enable_ilm true
1555
+ index_name logstash
1556
+ ilm_policies {"fluentd-policy":{"policy":{"phases":{"hot":{"actions":{"rollover":{"max_size":"70gb", "max_age":"30d"}}}}}}, "fluentd-policy2":{"policy":{"phases":{"hot":{"actions":{"rollover":{"max_size":"80gb", "max_age":"20d"}}}}}}}
1557
+ }
1558
+
1559
+ # connection start
1560
+ stub_request(:head, "https://logs.google.com:777/es//").
1561
+ with(basic_auth: ['john', 'doe']).
1562
+ to_return(:status => 200, :body => "", :headers => {})
1563
+ # check if template exists
1564
+ stub_request(:get, "https://logs.google.com:777/es//_template/logstash").
1565
+ with(basic_auth: ['john', 'doe']).
1566
+ to_return(:status => 404, :body => "", :headers => {})
1567
+ # creation
1568
+ stub_request(:put, "https://logs.google.com:777/es//_template/logstash").
1569
+ with(basic_auth: ['john', 'doe']).
1570
+ to_return(:status => 200, :body => "", :headers => {})
1571
+ # check if alias exists
1572
+ stub_request(:head, "https://logs.google.com:777/es//_alias/logstash").
1573
+ with(basic_auth: ['john', 'doe']).
1574
+ to_return(:status => 404, :body => "", :headers => {})
1575
+ stub_request(:get, "https://logs.google.com:777/es//_template/logstash").
1576
+ with(basic_auth: ['john', 'doe']).
1577
+ to_return(status: 404, body: "", headers: {})
1578
+ stub_request(:put, "https://logs.google.com:777/es//_template/logstash").
1579
+ with(basic_auth: ['john', 'doe'],
1580
+ body: "{\"settings\":{\"number_of_shards\":1,\"index.lifecycle.name\":\"fluentd-policy\",\"index.lifecycle.rollover_alias\":\"myalogs\"},\"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\":\"mylogs-*\",\"order\":51}").
1581
+ to_return(status: 200, body: "", headers: {})
1582
+ # put the alias for the index
1583
+ stub_request(:put, "https://logs.google.com:777/es//%3Clogstash-default-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E").
1584
+ with(basic_auth: ['john', 'doe']).
1585
+ to_return(:status => 200, :body => "", :headers => {})
1586
+ stub_request(:put, "https://logs.google.com:777/es//%3Clogstash-default-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E/#{alias_endpoint}/logstash").
1587
+ with(body: "{\"aliases\":{\"logstash\":{\"is_write_index\":true}}}").
1588
+ to_return(status: 200, body: "", headers: {})
1589
+ stub_request(:get, "https://logs.google.com:777/es//_xpack").
1590
+ with(basic_auth: ['john', 'doe']).
1591
+ to_return(:status => 200, :body => '{"features":{"ilm":{"available":true,"enabled":true}}}', :headers => {"Content-Type"=> "application/json"})
1592
+ stub_request(:get, "https://logs.google.com:777/es//_ilm/policy/fluentd-policy2").
1593
+ with(basic_auth: ['john', 'doe']).
1594
+ to_return(:status => 404, :body => "", :headers => {})
1595
+ stub_request(:put, "https://logs.google.com:777/es//_ilm/policy/fluentd-policy2").
1596
+ with(basic_auth: ['john', 'doe'],
1597
+ body: "{\"policy\":{\"phases\":{\"hot\":{\"actions\":{\"rollover\":{\"max_size\":\"80gb\",\"max_age\":\"20d\"}}}}}}").
1598
+ to_return(:status => 200, :body => "", :headers => {})
1599
+
1600
+ driver(config)
1601
+
1602
+ elastic_request = stub_elastic("https://logs.google.com:777/es//_bulk")
1603
+ driver.run(default_tag: 'fluentd-policy2') do
1604
+ driver.feed(sample_record)
1605
+ end
1606
+ assert_requested(:put, "https://logs.google.com:777/es//_template/logstash", times: 1)
1607
+
1608
+ assert_requested(elastic_request)
1609
+ end
1610
+ end
1611
+
1302
1612
  def test_template_create_with_rollover_index_and_default_ilm_and_placeholders
1303
1613
  cwd = File.dirname(__FILE__)
1304
1614
  template_file = File.join(cwd, 'test_template.json')
@@ -1371,6 +1681,83 @@ class ElasticsearchOutputTest < Test::Unit::TestCase
1371
1681
 
1372
1682
  assert_requested(elastic_request)
1373
1683
  end
1684
+
1685
+ def test_template_create_with_rollover_index_and_default_ilm_and_custom_and_time_placeholders
1686
+ cwd = File.dirname(__FILE__)
1687
+ template_file = File.join(cwd, 'test_template.json')
1688
+
1689
+ config = Fluent::Config::Element.new(
1690
+ 'ROOT', '', {
1691
+ '@type' => 'elasticsearch',
1692
+ 'host' => 'logs.google.com',
1693
+ 'port' => 777,
1694
+ 'scheme' => "https",
1695
+ 'path' => "/es/",
1696
+ 'user' => 'john',
1697
+ 'password' => 'doe',
1698
+ 'template_name' => 'logstash',
1699
+ 'template_file' => "#{template_file}",
1700
+ 'index_date_pattern' => 'now/w{xxxx.ww}',
1701
+ 'index_name' => "${taskDef}-%Y.%m",
1702
+ 'enable_ilm' => true,
1703
+ }, [
1704
+ Fluent::Config::Element.new('buffer', 'tag, time, taskDef', {
1705
+ 'chunk_keys' => ['tag', 'time', 'taskDef'],
1706
+ 'timekey' => 3600,
1707
+ }, [])
1708
+ ]
1709
+ )
1710
+
1711
+ task_def_value = "task_definition"
1712
+ date_str = Time.now.strftime("%Y.%m")
1713
+ # connection start
1714
+ stub_request(:head, "https://logs.google.com:777/es//").
1715
+ with(basic_auth: ['john', 'doe']).
1716
+ to_return(:status => 200, :body => "", :headers => {})
1717
+ # check if template exists
1718
+ stub_request(:get, "https://logs.google.com:777/es//_template/#{task_def_value}-#{date_str}").
1719
+ with(basic_auth: ['john', 'doe']).
1720
+ to_return(:status => 404, :body => "", :headers => {})
1721
+ # creation
1722
+ stub_request(:put, "https://logs.google.com:777/es//_template/#{task_def_value}-#{date_str}").
1723
+ with(basic_auth: ['john', 'doe'],
1724
+ body: "{\"settings\":{\"number_of_shards\":1,\"index.lifecycle.name\":\"logstash-policy\",\"index.lifecycle.rollover_alias\":\"#{task_def_value}-#{date_str}\"},\"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\":\"#{task_def_value}-#{date_str}-*\",\"order\":52}").
1725
+ to_return(:status => 200, :body => "", :headers => {})
1726
+ # check if alias exists
1727
+ stub_request(:head, "https://logs.google.com:777/es//_alias/#{task_def_value}-#{date_str}").
1728
+ with(basic_auth: ['john', 'doe']).
1729
+ to_return(:status => 404, :body => "", :headers => {})
1730
+ # put the alias for the index
1731
+ stub_request(:put, "https://logs.google.com:777/es//%3C#{task_def_value}-#{date_str}-default-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E").
1732
+ with(basic_auth: ['john', 'doe']).
1733
+ to_return(:status => 200, :body => "", :headers => {})
1734
+ stub_request(:put, "https://logs.google.com:777/es//%3C#{task_def_value}-#{date_str}-default-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E/#{alias_endpoint}/#{task_def_value}-#{date_str}").
1735
+ with(basic_auth: ['john', 'doe'],
1736
+ :body => "{\"aliases\":{\"#{task_def_value}-#{date_str}\":{\"is_write_index\":true}}}").
1737
+ to_return(:status => 200, :body => "", :headers => {})
1738
+ stub_request(:get, "https://logs.google.com:777/es//_xpack").
1739
+ with(basic_auth: ['john', 'doe']).
1740
+ to_return(:status => 200, :body => '{"features":{"ilm":{"available":true,"enabled":true}}}', :headers => {"Content-Type"=> "application/json"})
1741
+ stub_request(:get, "https://logs.google.com:777/es//_ilm/policy/logstash-policy").
1742
+ with(basic_auth: ['john', 'doe']).
1743
+ to_return(:status => 404, :body => "", :headers => {})
1744
+ stub_request(:put, "https://logs.google.com:777/es//_ilm/policy/logstash-policy").
1745
+ with(basic_auth: ['john', 'doe'],
1746
+ :body => "{\"policy\":{\"phases\":{\"hot\":{\"actions\":{\"rollover\":{\"max_size\":\"50gb\",\"max_age\":\"30d\"}}}}}}").
1747
+ to_return(:status => 200, :body => "", :headers => {})
1748
+
1749
+ driver(config)
1750
+
1751
+ elastic_request = stub_elastic("https://logs.google.com:777/es//_bulk")
1752
+ driver.run(default_tag: 'test') do
1753
+ driver.feed(sample_record.merge("taskDef" => task_def_value))
1754
+ end
1755
+ assert_equal("#{task_def_value}-#{date_str}", index_cmds.first['index']['_index'])
1756
+
1757
+ assert_equal ["#{task_def_value}-#{date_str}"], driver.instance.alias_indexes
1758
+
1759
+ assert_requested(elastic_request)
1760
+ end
1374
1761
  end
1375
1762
 
1376
1763
  def test_custom_template_create
@@ -1627,11 +2014,11 @@ class ElasticsearchOutputTest < Test::Unit::TestCase
1627
2014
  to_return(:status => 200, :body => "", :headers => {})
1628
2015
  # check if alias exists
1629
2016
  timestr = Time.now.strftime("%Y.%m.%d")
1630
- stub_request(:head, "https://logs.google.com:777/es//_alias/mylogs-#{timestr}").
2017
+ stub_request(:head, "https://logs.google.com:777/es//_alias/mylogs-myapp-#{timestr}").
1631
2018
  with(basic_auth: ['john', 'doe']).
1632
2019
  to_return(:status => 404, :body => "", :headers => {})
1633
2020
  # put the alias for the index
1634
- stub_request(:put, "https://logs.google.com:777/es//%3Cmylogs-myapp-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E/#{alias_endpoint}/mylogs-#{timestr}").
2021
+ stub_request(:put, "https://logs.google.com:777/es//%3Cmylogs-myapp-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E/#{alias_endpoint}/mylogs-myapp-#{timestr}").
1635
2022
  with(basic_auth: ['john', 'doe']).
1636
2023
  to_return(:status => 200, :body => "", :headers => {})
1637
2024
 
@@ -2911,6 +3298,7 @@ class ElasticsearchOutputTest < Test::Unit::TestCase
2911
3298
 
2912
3299
  data("border" => {"es_version" => 6, "_type" => "mytype"},
2913
3300
  "fixed_behavior"=> {"es_version" => 7, "_type" => "_doc"},
3301
+ "to be nil" => {"es_version" => 8, "_type" => nil},
2914
3302
  )
2915
3303
  def test_writes_to_speficied_type(data)
2916
3304
  driver('', data["es_version"]).configure("type_name mytype\n")
@@ -2923,6 +3311,7 @@ class ElasticsearchOutputTest < Test::Unit::TestCase
2923
3311
 
2924
3312
  data("border" => {"es_version" => 6, "_type" => "mytype.test"},
2925
3313
  "fixed_behavior"=> {"es_version" => 7, "_type" => "_doc"},
3314
+ "to be nil" => {"es_version" => 8, "_type" => nil},
2926
3315
  )
2927
3316
  def test_writes_to_speficied_type_with_placeholders(data)
2928
3317
  driver('', data["es_version"]).configure("type_name mytype.${tag}\n")
@@ -2933,6 +3322,20 @@ class ElasticsearchOutputTest < Test::Unit::TestCase
2933
3322
  assert_equal(data['_type'], index_cmds.first['index']['_type'])
2934
3323
  end
2935
3324
 
3325
+ data("border" => {"es_version" => 6, "_type" => "mytype.test"},
3326
+ "fixed_behavior"=> {"es_version" => 7, "_type" => nil},
3327
+ "to be nil" => {"es_version" => 8, "_type" => nil},
3328
+ )
3329
+ def test_writes_to_speficied_type_with_suppress_type_name(data)
3330
+ driver('', data["es_version"])
3331
+ .configure("type_name mytype.${tag}\nsuppress_type_name true")
3332
+ stub_elastic
3333
+ driver.run(default_tag: 'test') do
3334
+ driver.feed(sample_record)
3335
+ end
3336
+ assert_equal(data['_type'], index_cmds.first['index']['_type'])
3337
+ end
3338
+
2936
3339
  data("old" => {"es_version" => 2, "_type" => "local-override"},
2937
3340
  "old_behavior" => {"es_version" => 5, "_type" => "local-override"},
2938
3341
  "border" => {"es_version" => 6, "_type" => "fluentd"},