fluent-plugin-elasticsearch 1.18.2 → 2.0.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  require 'helper'
2
2
  require 'date'
3
- require 'json'
3
+ require 'fluent/test/driver/output'
4
4
  require 'flexmock/test_unit'
5
5
 
6
6
  class ElasticsearchOutput < Test::Unit::TestCase
@@ -16,8 +16,8 @@ class ElasticsearchOutput < Test::Unit::TestCase
16
16
  log.out.logs.slice!(0, log.out.logs.length)
17
17
  end
18
18
 
19
- def driver(tag='test', conf='')
20
- @driver ||= Fluent::Test::BufferedOutputTestDriver.new(Fluent::ElasticsearchOutput, tag) {
19
+ def driver(conf='')
20
+ @driver ||= Fluent::Test::Driver::Output.new(Fluent::Plugin::ElasticsearchOutput) {
21
21
  # v0.12's test driver assume format definition. This simulates ObjectBufferedOutput format
22
22
  if !defined?(Fluent::Plugin::Output)
23
23
  def format(tag, time, record)
@@ -27,8 +27,8 @@ class ElasticsearchOutput < Test::Unit::TestCase
27
27
  }.configure(conf)
28
28
  end
29
29
 
30
- def sample_record(content={})
31
- {'age' => 26, 'request_id' => '42', 'parent_id' => 'parent', 'routing_id' => 'routing'}.merge(content)
30
+ def sample_record
31
+ {'age' => 26, 'request_id' => '42', 'parent_id' => 'parent', 'routing_id' => 'routing'}
32
32
  end
33
33
 
34
34
  def stub_elastic_ping(url="http://localhost:9200")
@@ -37,7 +37,7 @@ class ElasticsearchOutput < Test::Unit::TestCase
37
37
 
38
38
  def stub_elastic(url="http://localhost:9200/_bulk")
39
39
  stub_request(:post, url).with do |req|
40
- @index_cmds = req.body.split("\n").map {|r| JSON.parse(r) }
40
+ @index_cmds = req.body.split("\n").map {|r| JSON.parse(r) }
41
41
  end
42
42
  end
43
43
 
@@ -57,112 +57,6 @@ class ElasticsearchOutput < Test::Unit::TestCase
57
57
  end
58
58
  end
59
59
 
60
- def make_response_body(req, error_el = nil, error_status = nil, error = nil)
61
- req_index_cmds = req.body.split("\n").map { |r| JSON.parse(r) }
62
- items = []
63
- count = 0
64
- ids = 1
65
- op = nil
66
- index = nil
67
- type = nil
68
- id = nil
69
- req_index_cmds.each do |cmd|
70
- if count.even?
71
- op = cmd.keys[0]
72
- index = cmd[op]['_index']
73
- type = cmd[op]['_type']
74
- if cmd[op].has_key?('_id')
75
- id = cmd[op]['_id']
76
- else
77
- # Note: this appears to be an undocumented feature of Elasticsearch
78
- # https://www.elastic.co/guide/en/elasticsearch/reference/2.4/docs-bulk.html
79
- # When you submit an "index" write_operation, with no "_id" field in the
80
- # metadata header, Elasticsearch will turn this into a "create"
81
- # operation in the response.
82
- if "index" == op
83
- op = "create"
84
- end
85
- id = ids
86
- ids += 1
87
- end
88
- else
89
- item = {
90
- op => {
91
- '_index' => index, '_type' => type, '_id' => id, '_version' => 1,
92
- '_shards' => { 'total' => 1, 'successful' => 1, 'failed' => 0 },
93
- 'status' => op == 'create' ? 201 : 200
94
- }
95
- }
96
- items.push(item)
97
- end
98
- count += 1
99
- end
100
- if !error_el.nil? && !error_status.nil? && !error.nil?
101
- op = items[error_el].keys[0]
102
- items[error_el][op].delete('_version')
103
- items[error_el][op].delete('_shards')
104
- items[error_el][op]['error'] = error
105
- items[error_el][op]['status'] = error_status
106
- errors = true
107
- else
108
- errors = false
109
- end
110
- @index_cmds = items
111
- body = { 'took' => 6, 'errors' => errors, 'items' => items }
112
- return body.to_json
113
- end
114
-
115
- def stub_elastic_bad_argument(url="http://localhost:9200/_bulk")
116
- error = {
117
- "type" => "mapper_parsing_exception",
118
- "reason" => "failed to parse [...]",
119
- "caused_by" => {
120
- "type" => "illegal_argument_exception",
121
- "reason" => "Invalid format: \"...\""
122
- }
123
- }
124
- stub_request(:post, url).to_return(lambda { |req| { :status => 200, :body => make_response_body(req, 1, 400, error), :headers => { 'Content-Type' => 'json' } } })
125
- end
126
-
127
- def stub_elastic_bulk_error(url="http://localhost:9200/_bulk")
128
- error = {
129
- "type" => "some-unrecognized-error",
130
- "reason" => "some message printed here ...",
131
- }
132
- stub_request(:post, url).to_return(lambda { |req| { :status => 200, :body => make_response_body(req, 1, 500, error), :headers => { 'Content-Type' => 'json' } } })
133
- end
134
-
135
- def stub_elastic_bulk_rejected(url="http://localhost:9200/_bulk")
136
- error = {
137
- "status" => 500,
138
- "type" => "es_rejected_execution_exception",
139
- "reason" => "rejected execution of org.elasticsearch.transport.TransportService$4@1a34d37a on EsThreadPoolExecutor[bulk, queue capacity = 50, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@312a2162[Running, pool size = 32, active threads = 32, queued tasks = 50, completed tasks = 327053]]"
140
- }
141
- stub_request(:post, url).to_return(lambda { |req| { :status => 200, :body => make_response_body(req, 1, 429, error), :headers => { 'Content-Type' => 'json' } } })
142
- end
143
-
144
- def stub_elastic_out_of_memory(url="http://localhost:9200/_bulk")
145
- error = {
146
- "status" => 500,
147
- "type" => "out_of_memory_error",
148
- "reason" => "Java heap space"
149
- }
150
- stub_request(:post, url).to_return(lambda { |req| { :status => 200, :body => make_response_body(req, 1, 500, error), :headers => { 'Content-Type' => 'json' } } })
151
- end
152
-
153
- def stub_elastic_unexpected_response_op(url="http://localhost:9200/_bulk")
154
- error = {
155
- "category" => "some-other-type",
156
- "reason" => "some-other-reason"
157
- }
158
- stub_request(:post, url).to_return(lambda { |req| bodystr = make_response_body(req, 0, 500, error); body = JSON.parse(bodystr); body['items'][0]['unknown'] = body['items'][0].delete('create'); { :status => 200, :body => body.to_json, :headers => { 'Content-Type' => 'json' } } })
159
- end
160
-
161
- def assert_logs_include(logs, msg, exp_matches=1)
162
- matches = logs.grep /#{msg}/
163
- assert_equal(exp_matches, matches.length, "Logs do not contain '#{msg}' '#{logs}'")
164
- end
165
-
166
60
  def test_configure
167
61
  config = %{
168
62
  host logs.google.com
@@ -172,19 +66,34 @@ class ElasticsearchOutput < Test::Unit::TestCase
172
66
  user john
173
67
  password doe
174
68
  }
175
- instance = driver('test', config).instance
69
+ instance = driver(config).instance
176
70
 
177
71
  assert_equal 'logs.google.com', instance.host
178
72
  assert_equal 777, instance.port
179
- assert_equal :https, instance.scheme
73
+ assert_equal 'https', instance.scheme
180
74
  assert_equal '/es/', instance.path
181
75
  assert_equal 'john', instance.user
182
76
  assert_equal 'doe', instance.password
183
- assert_equal :TLSv1, instance.ssl_version
184
- assert_nil instance.client_key
185
- assert_nil instance.client_cert
186
- assert_nil instance.client_key_pass
187
- assert_false instance.with_transporter_log
77
+ end
78
+
79
+ test 'lack of tag in chunk_keys' do
80
+ assert_raise_message(/'tag' in chunk_keys is required./) do
81
+ driver(Fluent::Config::Element.new(
82
+ 'ROOT', '', {
83
+ '@type' => 'elasticsearch',
84
+ 'host' => 'log.google.com',
85
+ 'port' => 777,
86
+ 'scheme' => 'https',
87
+ 'path' => '/es/',
88
+ 'user' => 'john',
89
+ 'pasword' => 'doe',
90
+ }, [
91
+ Fluent::Config::Element.new('buffer', 'mykey', {
92
+ 'chunk_keys' => 'mykey'
93
+ }, [])
94
+ ]
95
+ ))
96
+ end
188
97
  end
189
98
 
190
99
  def test_template_already_present
@@ -206,9 +115,7 @@ class ElasticsearchOutput < Test::Unit::TestCase
206
115
  stub_request(:get, "https://john:doe@logs.google.com:777/es//_template/logstash").
207
116
  to_return(:status => 200, :body => "", :headers => {})
208
117
 
209
- driver('test', config)
210
-
211
- assert_not_requested(:put, "https://john:doe@logs.google.com:777/es//_template/logstash")
118
+ driver(config)
212
119
  end
213
120
 
214
121
  def test_template_create
@@ -236,40 +143,7 @@ class ElasticsearchOutput < Test::Unit::TestCase
236
143
  stub_request(:put, "https://john:doe@logs.google.com:777/es//_template/logstash").
237
144
  to_return(:status => 200, :body => "", :headers => {})
238
145
 
239
- driver('test', config)
240
-
241
- assert_requested(:put, "https://john:doe@logs.google.com:777/es//_template/logstash", times: 1)
242
- end
243
-
244
- def test_template_overwrite
245
- cwd = File.dirname(__FILE__)
246
- template_file = File.join(cwd, 'test_template.json')
247
-
248
- config = %{
249
- host logs.google.com
250
- port 777
251
- scheme https
252
- path /es/
253
- user john
254
- password doe
255
- template_name logstash
256
- template_file #{template_file}
257
- template_overwrite true
258
- }
259
-
260
- # connection start
261
- stub_request(:head, "https://john:doe@logs.google.com:777/es//").
262
- to_return(:status => 200, :body => "", :headers => {})
263
- # check if template exists
264
- stub_request(:get, "https://john:doe@logs.google.com:777/es//_template/logstash").
265
- to_return(:status => 200, :body => "", :headers => {})
266
- # creation
267
- stub_request(:put, "https://john:doe@logs.google.com:777/es//_template/logstash").
268
- to_return(:status => 200, :body => "", :headers => {})
269
-
270
- driver('test', config)
271
-
272
- assert_requested(:put, "https://john:doe@logs.google.com:777/es//_template/logstash", times: 1)
146
+ driver(config)
273
147
  end
274
148
 
275
149
 
@@ -293,7 +167,7 @@ class ElasticsearchOutput < Test::Unit::TestCase
293
167
  to_return(:status => 404, :body => "", :headers => {})
294
168
 
295
169
  assert_raise(RuntimeError) {
296
- driver('test', config)
170
+ driver(config)
297
171
  }
298
172
  end
299
173
 
@@ -328,51 +202,13 @@ class ElasticsearchOutput < Test::Unit::TestCase
328
202
  stub_request(:put, "https://john:doe@logs.google.com:777/es//_template/logstash3").
329
203
  to_return(:status => 200, :body => "", :headers => {})
330
204
 
331
- driver('test', config)
205
+ driver(config)
332
206
 
333
207
  assert_requested( :put, "https://john:doe@logs.google.com:777/es//_template/logstash1", times: 1)
334
208
  assert_requested( :put, "https://john:doe@logs.google.com:777/es//_template/logstash2", times: 1)
335
209
  assert_not_requested(:put, "https://john:doe@logs.google.com:777/es//_template/logstash3") #exists
336
210
  end
337
211
 
338
- def test_templates_overwrite
339
- cwd = File.dirname(__FILE__)
340
- template_file = File.join(cwd, 'test_template.json')
341
- config = %{
342
- host logs.google.com
343
- port 777
344
- scheme https
345
- path /es/
346
- user john
347
- password doe
348
- templates {"logstash1":"#{template_file}", "logstash2":"#{template_file}","logstash3":"#{template_file}" }
349
- template_overwrite true
350
- }
351
-
352
- stub_request(:head, "https://john:doe@logs.google.com:777/es//").
353
- to_return(:status => 200, :body => "", :headers => {})
354
- # check if template exists
355
- stub_request(:get, "https://john:doe@logs.google.com:777/es//_template/logstash1").
356
- to_return(:status => 200, :body => "", :headers => {})
357
- stub_request(:get, "https://john:doe@logs.google.com:777/es//_template/logstash2").
358
- to_return(:status => 200, :body => "", :headers => {})
359
- stub_request(:get, "https://john:doe@logs.google.com:777/es//_template/logstash3").
360
- to_return(:status => 200, :body => "", :headers => {}) #exists
361
-
362
- stub_request(:put, "https://john:doe@logs.google.com:777/es//_template/logstash1").
363
- to_return(:status => 200, :body => "", :headers => {})
364
- stub_request(:put, "https://john:doe@logs.google.com:777/es//_template/logstash2").
365
- to_return(:status => 200, :body => "", :headers => {})
366
- stub_request(:put, "https://john:doe@logs.google.com:777/es//_template/logstash3").
367
- to_return(:status => 200, :body => "", :headers => {})
368
-
369
- driver('test', config)
370
-
371
- assert_requested(:put, "https://john:doe@logs.google.com:777/es//_template/logstash1", times: 1)
372
- assert_requested(:put, "https://john:doe@logs.google.com:777/es//_template/logstash2", times: 1)
373
- assert_requested(:put, "https://john:doe@logs.google.com:777/es//_template/logstash3", times: 1)
374
- end
375
-
376
212
  def test_templates_not_used
377
213
  cwd = File.dirname(__FILE__)
378
214
  template_file = File.join(cwd, 'test_template.json')
@@ -406,7 +242,7 @@ class ElasticsearchOutput < Test::Unit::TestCase
406
242
  stub_request(:put, "https://john:doe@logs.google.com:777/es//_template/logstash2").
407
243
  to_return(:status => 200, :body => "", :headers => {})
408
244
 
409
- driver('test', config)
245
+ driver(config)
410
246
 
411
247
  assert_requested(:put, "https://john:doe@logs.google.com:777/es//_template/logstash", times: 1)
412
248
 
@@ -440,7 +276,7 @@ class ElasticsearchOutput < Test::Unit::TestCase
440
276
  to_return(:status => 200, :body => "", :headers => {})
441
277
 
442
278
  assert_raise(RuntimeError) {
443
- driver('test', config)
279
+ driver(config)
444
280
  }
445
281
 
446
282
  assert_requested(:put, "https://john:doe@logs.google.com:777/es//_template/logstash1", times: 1)
@@ -454,7 +290,7 @@ class ElasticsearchOutput < Test::Unit::TestCase
454
290
  path /es/
455
291
  port 123
456
292
  }
457
- instance = driver('test', config).instance
293
+ instance = driver(config).instance
458
294
 
459
295
  assert_equal 3, instance.get_connection_options[:hosts].length
460
296
  host1, host2, host3 = instance.get_connection_options[:hosts]
@@ -476,7 +312,7 @@ class ElasticsearchOutput < Test::Unit::TestCase
476
312
  user default_user
477
313
  password default_password
478
314
  }
479
- instance = driver('test', config).instance
315
+ instance = driver(config).instance
480
316
 
481
317
  assert_equal 2, instance.get_connection_options[:hosts].length
482
318
  host1, host2 = instance.get_connection_options[:hosts]
@@ -495,39 +331,13 @@ class ElasticsearchOutput < Test::Unit::TestCase
495
331
  assert_equal '/default_path', host2[:path]
496
332
  end
497
333
 
498
- def test_hosts_list_with_escape_placeholders
499
- config = %{
500
- hosts https://%{j+hn}:%{passw@rd}@host1:443/elastic/,http://host2
501
- path /default_path
502
- user default_user
503
- password default_password
504
- }
505
- instance = driver('test', config).instance
506
-
507
- assert_equal 2, instance.get_connection_options[:hosts].length
508
- host1, host2 = instance.get_connection_options[:hosts]
509
-
510
- assert_equal 'host1', host1[:host]
511
- assert_equal 443, host1[:port]
512
- assert_equal 'https', host1[:scheme]
513
- assert_equal 'j%2Bhn', host1[:user]
514
- assert_equal 'passw%40rd', host1[:password]
515
- assert_equal '/elastic/', host1[:path]
516
-
517
- assert_equal 'host2', host2[:host]
518
- assert_equal 'http', host2[:scheme]
519
- assert_equal 'default_user', host2[:user]
520
- assert_equal 'default_password', host2[:password]
521
- assert_equal '/default_path', host2[:path]
522
- end
523
-
524
334
  def test_single_host_params_and_defaults
525
335
  config = %{
526
336
  host logs.google.com
527
337
  user john
528
338
  password doe
529
339
  }
530
- instance = driver('test', config).instance
340
+ instance = driver(config).instance
531
341
 
532
342
  assert_equal 1, instance.get_connection_options[:hosts].length
533
343
  host1 = instance.get_connection_options[:hosts][0]
@@ -540,63 +350,32 @@ class ElasticsearchOutput < Test::Unit::TestCase
540
350
  assert_equal nil, host1[:path]
541
351
  end
542
352
 
543
- def test_single_host_params_and_defaults_with_escape_placeholders
544
- config = %{
545
- host logs.google.com
546
- user %{j+hn}
547
- password %{d@e}
548
- }
549
- instance = driver('test', config).instance
550
-
551
- assert_equal 1, instance.get_connection_options[:hosts].length
552
- host1 = instance.get_connection_options[:hosts][0]
553
-
554
- assert_equal 'logs.google.com', host1[:host]
555
- assert_equal 9200, host1[:port]
556
- assert_equal 'http', host1[:scheme]
557
- assert_equal 'j%2Bhn', host1[:user]
558
- assert_equal 'd%40e', host1[:password]
559
- assert_equal nil, host1[:path]
560
- end
561
-
562
353
  def test_content_type_header
563
354
  stub_request(:head, "http://localhost:9200/").
564
355
  to_return(:status => 200, :body => "", :headers => {})
565
- if Elasticsearch::VERSION >= "6.0.2"
566
- elastic_request = stub_request(:post, "http://localhost:9200/_bulk").
567
- with(headers: { "Content-Type" => "application/x-ndjson" })
568
- else
569
- elastic_request = stub_request(:post, "http://localhost:9200/_bulk").
570
- with(headers: { "Content-Type" => "application/json" })
571
- end
572
- driver.emit(sample_record)
573
- driver.run
356
+ elastic_request = stub_request(:post, "http://localhost:9200/_bulk").
357
+ with(headers: { "Content-Type" => "application/json" })
358
+ driver.run(default_tag: 'test') do
359
+ driver.feed(sample_record)
360
+ end
574
361
  assert_requested(elastic_request)
575
362
  end
576
363
 
577
- def test_write_message_with_bad_chunk
578
- driver.configure("target_index_key bad_value\n")
579
- log = driver.instance.router.emit_error_handler.log
580
- stub_elastic_ping
581
- stub_elastic
582
- driver.emit({'bad_value'=>"\255"})
583
- driver.run
584
- assert_logs_include(log.out.logs, /(input string invalid)|(invalid byte sequence in UTF-8)/)
585
- end
586
-
587
364
  def test_writes_to_default_index
588
365
  stub_elastic_ping
589
366
  stub_elastic
590
- driver.emit(sample_record)
591
- driver.run
367
+ driver.run(default_tag: 'test') do
368
+ driver.feed(sample_record)
369
+ end
592
370
  assert_equal('fluentd', index_cmds.first['index']['_index'])
593
371
  end
594
372
 
595
373
  def test_writes_to_default_type
596
374
  stub_elastic_ping
597
375
  stub_elastic
598
- driver.emit(sample_record)
599
- driver.run
376
+ driver.run(default_tag: 'test') do
377
+ driver.feed(sample_record)
378
+ end
600
379
  assert_equal('fluentd', index_cmds.first['index']['_type'])
601
380
  end
602
381
 
@@ -604,8 +383,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
604
383
  driver.configure("index_name myindex\n")
605
384
  stub_elastic_ping
606
385
  stub_elastic
607
- driver.emit(sample_record)
608
- driver.run
386
+ driver.run(default_tag: 'test') do
387
+ driver.feed(sample_record)
388
+ end
609
389
  assert_equal('myindex', index_cmds.first['index']['_index'])
610
390
  end
611
391
 
@@ -613,8 +393,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
613
393
  driver.configure("index_name MyIndex\n")
614
394
  stub_elastic_ping
615
395
  stub_elastic
616
- driver.emit(sample_record)
617
- driver.run
396
+ driver.run(default_tag: 'test') do
397
+ driver.feed(sample_record)
398
+ end
618
399
  # Allthough index_name has upper-case characters,
619
400
  # it should be set as lower-case when sent to elasticsearch.
620
401
  assert_equal('myindex', index_cmds.first['index']['_index'])
@@ -625,8 +406,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
625
406
  stub_elastic_ping
626
407
  stub_elastic
627
408
  record = sample_record.clone
628
- driver.emit(sample_record.merge('@target_index' => 'local-override'))
629
- driver.run
409
+ driver.run(default_tag: 'test') do
410
+ driver.feed(sample_record.merge('@target_index' => 'local-override'))
411
+ end
630
412
  assert_equal('local-override', index_cmds.first['index']['_index'])
631
413
  assert_nil(index_cmds[1]['@target_index'])
632
414
  end
@@ -634,55 +416,49 @@ class ElasticsearchOutput < Test::Unit::TestCase
634
416
  def test_writes_to_target_index_key_logstash
635
417
  driver.configure("target_index_key @target_index
636
418
  logstash_format true")
637
- time = Time.parse Date.today.iso8601
419
+ time = Time.parse Date.today.to_s
638
420
  stub_elastic_ping
639
421
  stub_elastic
640
- driver.emit(sample_record.merge('@target_index' => 'local-override'), time.to_i)
641
- driver.run
422
+ driver.run(default_tag: 'test') do
423
+ driver.feed(time.to_i, sample_record.merge('@target_index' => 'local-override'))
424
+ end
642
425
  assert_equal('local-override', index_cmds.first['index']['_index'])
643
426
  end
644
427
 
645
428
  def test_writes_to_target_index_key_logstash_uppercase
646
429
  driver.configure("target_index_key @target_index
647
430
  logstash_format true")
648
- time = Time.parse Date.today.iso8601
431
+ time = Time.parse Date.today.to_s
649
432
  stub_elastic_ping
650
433
  stub_elastic
651
- driver.emit(sample_record.merge('@target_index' => 'Local-Override'), time.to_i)
652
- driver.run
434
+ driver.run(default_tag: 'test') do
435
+ driver.feed(time.to_i, sample_record.merge('@target_index' => 'local-override'))
436
+ end
653
437
  # Allthough @target_index has upper-case characters,
654
438
  # it should be set as lower-case when sent to elasticsearch.
655
439
  assert_equal('local-override', index_cmds.first['index']['_index'])
656
440
  end
657
441
 
658
- def test_writes_to_default_index_with_pipeline
659
- pipeline = "fluentd"
660
- driver.configure("pipeline #{pipeline}")
661
- stub_elastic_ping
662
- stub_elastic
663
- driver.emit(sample_record)
664
- driver.run
665
- assert_equal(pipeline, index_cmds.first['index']['pipeline'])
666
- end
667
-
668
442
  def test_writes_to_target_index_key_fallack
669
443
  driver.configure("target_index_key @target_index\n")
670
444
  stub_elastic_ping
671
445
  stub_elastic
672
- driver.emit(sample_record)
673
- driver.run
446
+ driver.run(default_tag: 'test') do
447
+ driver.feed(sample_record)
448
+ end
674
449
  assert_equal('fluentd', index_cmds.first['index']['_index'])
675
450
  end
676
451
 
677
452
  def test_writes_to_target_index_key_fallack_logstash
678
453
  driver.configure("target_index_key @target_index\n
679
454
  logstash_format true")
680
- time = Time.parse Date.today.iso8601
455
+ time = Time.parse Date.today.to_s
681
456
  logstash_index = "logstash-#{time.getutc.strftime("%Y.%m.%d")}"
682
457
  stub_elastic_ping
683
458
  stub_elastic
684
- driver.emit(sample_record, time.to_i)
685
- driver.run
459
+ driver.run(default_tag: 'test') do
460
+ driver.feed(time.to_i, sample_record)
461
+ end
686
462
  assert_equal(logstash_index, index_cmds.first['index']['_index'])
687
463
  end
688
464
 
@@ -690,8 +466,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
690
466
  driver.configure("type_name mytype\n")
691
467
  stub_elastic_ping
692
468
  stub_elastic
693
- driver.emit(sample_record)
694
- driver.run
469
+ driver.run(default_tag: 'test') do
470
+ driver.feed(sample_record)
471
+ end
695
472
  assert_equal('mytype', index_cmds.first['index']['_type'])
696
473
  end
697
474
 
@@ -700,8 +477,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
700
477
  stub_elastic_ping
701
478
  stub_elastic
702
479
  record = sample_record.clone
703
- driver.emit(sample_record.merge('@target_type' => 'local-override'))
704
- driver.run
480
+ driver.run(default_tag: 'test') do
481
+ driver.feed(sample_record.merge('@target_type' => 'local-override'))
482
+ end
705
483
  assert_equal('local-override', index_cmds.first['index']['_type'])
706
484
  assert_nil(index_cmds[1]['@target_type'])
707
485
  end
@@ -710,8 +488,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
710
488
  driver.configure("target_type_key @target_type\n")
711
489
  stub_elastic_ping
712
490
  stub_elastic
713
- driver.emit(sample_record)
714
- driver.run
491
+ driver.run(default_tag: 'test') do
492
+ driver.feed(sample_record)
493
+ end
715
494
  assert_equal('fluentd', index_cmds.first['index']['_type'])
716
495
  end
717
496
 
@@ -720,8 +499,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
720
499
  type_name mytype")
721
500
  stub_elastic_ping
722
501
  stub_elastic
723
- driver.emit(sample_record)
724
- driver.run
502
+ driver.run(default_tag: 'test') do
503
+ driver.feed(sample_record)
504
+ end
725
505
  assert_equal('mytype', index_cmds.first['index']['_type'])
726
506
  end
727
507
 
@@ -729,12 +509,13 @@ class ElasticsearchOutput < Test::Unit::TestCase
729
509
  driver.configure("target_type_key kubernetes.labels.log_type\n")
730
510
  stub_elastic_ping
731
511
  stub_elastic
732
- driver.emit(sample_record.merge('kubernetes' => {
733
- 'labels' => {
734
- 'log_type' => 'local-override'
735
- }
736
- }))
737
- driver.run
512
+ driver.run(default_tag: 'test') do
513
+ driver.feed(sample_record.merge('kubernetes' => {
514
+ 'labels' => {
515
+ 'log_type' => 'local-override'
516
+ }
517
+ }))
518
+ end
738
519
  assert_equal('local-override', index_cmds.first['index']['_type'])
739
520
  assert_nil(index_cmds[1]['kubernetes']['labels']['log_type'])
740
521
  end
@@ -743,12 +524,13 @@ class ElasticsearchOutput < Test::Unit::TestCase
743
524
  driver.configure("target_type_key kubernetes.labels.log_type\n")
744
525
  stub_elastic_ping
745
526
  stub_elastic
746
- driver.emit(sample_record.merge('kubernetes' => {
747
- 'labels' => {
748
- 'other_labels' => 'test'
749
- }
750
- }))
751
- driver.run
527
+ driver.run(default_tag: 'test') do
528
+ driver.feed(sample_record.merge('kubernetes' => {
529
+ 'labels' => {
530
+ 'other_labels' => 'test'
531
+ }
532
+ }))
533
+ end
752
534
  assert_equal('fluentd', index_cmds.first['index']['_type'])
753
535
  end
754
536
 
@@ -756,8 +538,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
756
538
  driver.configure("host 192.168.33.50\n")
757
539
  stub_elastic_ping("http://192.168.33.50:9200")
758
540
  elastic_request = stub_elastic("http://192.168.33.50:9200/_bulk")
759
- driver.emit(sample_record)
760
- driver.run
541
+ driver.run(default_tag: 'test') do
542
+ driver.feed(sample_record)
543
+ end
761
544
  assert_requested(elastic_request)
762
545
  end
763
546
 
@@ -765,8 +548,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
765
548
  driver.configure("port 9201\n")
766
549
  stub_elastic_ping("http://localhost:9201")
767
550
  elastic_request = stub_elastic("http://localhost:9201/_bulk")
768
- driver.emit(sample_record)
769
- driver.run
551
+ driver.run(default_tag: 'test') do
552
+ driver.feed(sample_record)
553
+ end
770
554
  assert_requested(elastic_request)
771
555
  end
772
556
 
@@ -782,12 +566,12 @@ class ElasticsearchOutput < Test::Unit::TestCase
782
566
  stub_elastic_with_store_index_command_counts("http://#{host}:#{port}/_bulk")
783
567
  end
784
568
 
785
- 1000.times do
786
- driver.emit(sample_record.merge('age'=>rand(100)))
569
+ driver.run(default_tag: 'test') do
570
+ 1000.times do
571
+ driver.feed(sample_record.merge('age'=>rand(100)))
572
+ end
787
573
  end
788
574
 
789
- driver.run
790
-
791
575
  # @note: we cannot make multi chunks with options (flush_interval, buffer_chunk_limit)
792
576
  # it's Fluentd test driver's constraint
793
577
  # so @index_command_counts.size is always 1
@@ -817,8 +601,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
817
601
 
818
602
  stub_elastic_ping
819
603
  stub_elastic
820
- driver.emit(original_hash)
821
- driver.run
604
+ driver.run(default_tag: 'test') do
605
+ driver.feed(original_hash)
606
+ end
822
607
  assert_equal expected_output, index_cmds[1]
823
608
  end
824
609
 
@@ -830,26 +615,29 @@ class ElasticsearchOutput < Test::Unit::TestCase
830
615
 
831
616
  stub_elastic_ping
832
617
  stub_elastic
833
- driver.emit(original_hash)
834
- driver.run
618
+ driver.run(default_tag: 'test') do
619
+ driver.feed(original_hash)
620
+ end
835
621
  assert_equal expected_output, index_cmds[1]
836
622
  end
837
623
 
838
624
  def test_makes_bulk_request
839
625
  stub_elastic_ping
840
626
  stub_elastic
841
- driver.emit(sample_record)
842
- driver.emit(sample_record.merge('age' => 27))
843
- driver.run
627
+ driver.run(default_tag: 'test') do
628
+ driver.feed(sample_record)
629
+ driver.feed(sample_record.merge('age' => 27))
630
+ end
844
631
  assert_equal(4, index_cmds.count)
845
632
  end
846
633
 
847
634
  def test_all_records_are_preserved_in_bulk
848
635
  stub_elastic_ping
849
636
  stub_elastic
850
- driver.emit(sample_record)
851
- driver.emit(sample_record.merge('age' => 27))
852
- driver.run
637
+ driver.run(default_tag: 'test') do
638
+ driver.feed(sample_record)
639
+ driver.feed(sample_record.merge('age' => 27))
640
+ end
853
641
  assert_equal(26, index_cmds[1]['age'])
854
642
  assert_equal(27, index_cmds[3]['age'])
855
643
  end
@@ -862,8 +650,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
862
650
  logstash_index = "logstash-2015.05.31"
863
651
  stub_elastic_ping
864
652
  stub_elastic
865
- driver.emit(sample_record, dt.to_time.to_i)
866
- driver.run
653
+ driver.run(default_tag: 'test') do
654
+ driver.feed(dt.to_time.to_i, sample_record)
655
+ end
867
656
  assert_equal(logstash_index, index_cmds.first['index']['_index'])
868
657
  end
869
658
 
@@ -876,46 +665,35 @@ class ElasticsearchOutput < Test::Unit::TestCase
876
665
  index = "logstash-#{time.strftime("%Y.%m.%d")}"
877
666
  stub_elastic_ping
878
667
  stub_elastic
879
- driver.emit(sample_record, time.to_i)
880
- driver.run
668
+ driver.run(default_tag: 'test') do
669
+ driver.feed(time.to_i, sample_record)
670
+ end
881
671
  assert_equal(index, index_cmds.first['index']['_index'])
882
672
  end
883
673
 
884
674
  def test_writes_to_logstash_index_with_specified_prefix
885
675
  driver.configure("logstash_format true
886
676
  logstash_prefix myprefix")
887
- time = Time.parse Date.today.iso8601
677
+ time = Time.parse Date.today.to_s
888
678
  logstash_index = "myprefix-#{time.getutc.strftime("%Y.%m.%d")}"
889
679
  stub_elastic_ping
890
680
  stub_elastic
891
- driver.emit(sample_record, time.to_i)
892
- driver.run
893
- assert_equal(logstash_index, index_cmds.first['index']['_index'])
894
- end
895
-
896
- def test_writes_to_logstash_index_with_specified_prefix_and_separator
897
- separator = '_'
898
- driver.configure("logstash_format true
899
- logstash_prefix_separator #{separator}
900
- logstash_prefix myprefix")
901
- time = Time.parse Date.today.iso8601
902
- logstash_index = "myprefix#{separator}#{time.getutc.strftime("%Y.%m.%d")}"
903
- stub_elastic_ping
904
- stub_elastic
905
- driver.emit(sample_record, time.to_i)
906
- driver.run
681
+ driver.run(default_tag: 'test') do
682
+ driver.feed(time.to_i, sample_record)
683
+ end
907
684
  assert_equal(logstash_index, index_cmds.first['index']['_index'])
908
685
  end
909
686
 
910
687
  def test_writes_to_logstash_index_with_specified_prefix_uppercase
911
688
  driver.configure("logstash_format true
912
689
  logstash_prefix MyPrefix")
913
- time = Time.parse Date.today.iso8601
690
+ time = Time.parse Date.today.to_s
914
691
  logstash_index = "myprefix-#{time.getutc.strftime("%Y.%m.%d")}"
915
692
  stub_elastic_ping
916
693
  stub_elastic
917
- driver.emit(sample_record, time.to_i)
918
- driver.run
694
+ driver.run(default_tag: 'test') do
695
+ driver.feed(time.to_i, sample_record)
696
+ end
919
697
  # Allthough logstash_prefix has upper-case characters,
920
698
  # it should be set as lower-case when sent to elasticsearch.
921
699
  assert_equal(logstash_index, index_cmds.first['index']['_index'])
@@ -924,12 +702,13 @@ class ElasticsearchOutput < Test::Unit::TestCase
924
702
  def test_writes_to_logstash_index_with_specified_dateformat
925
703
  driver.configure("logstash_format true
926
704
  logstash_dateformat %Y.%m")
927
- time = Time.parse Date.today.iso8601
705
+ time = Time.parse Date.today.to_s
928
706
  logstash_index = "logstash-#{time.getutc.strftime("%Y.%m")}"
929
707
  stub_elastic_ping
930
708
  stub_elastic
931
- driver.emit(sample_record, time.to_i)
932
- driver.run
709
+ driver.run(default_tag: 'test') do
710
+ driver.feed(time.to_i, sample_record)
711
+ end
933
712
  assert_equal(logstash_index, index_cmds.first['index']['_index'])
934
713
  end
935
714
 
@@ -937,64 +716,66 @@ class ElasticsearchOutput < Test::Unit::TestCase
937
716
  driver.configure("logstash_format true
938
717
  logstash_prefix myprefix
939
718
  logstash_dateformat %Y.%m")
940
- time = Time.parse Date.today.iso8601
719
+ time = Time.parse Date.today.to_s
941
720
  logstash_index = "myprefix-#{time.getutc.strftime("%Y.%m")}"
942
721
  stub_elastic_ping
943
722
  stub_elastic
944
- driver.emit(sample_record, time.to_i)
945
- driver.run
723
+ driver.run(default_tag: 'test') do
724
+ driver.feed(time.to_i, sample_record)
725
+ end
946
726
  assert_equal(logstash_index, index_cmds.first['index']['_index'])
947
727
  end
948
728
 
729
+ def test_error_if_tag_not_in_chunk_keys
730
+ assert_raise(Fluent::ConfigError) {
731
+ config = %{
732
+ <buffer foo>
733
+ </buffer>
734
+ }
735
+ driver.configure(config)
736
+ }
737
+ end
738
+
739
+ def test_can_use_custom_chunk_along_with_tag
740
+ config = %{
741
+ <buffer tag, foo>
742
+ </buffer>
743
+ }
744
+ driver.configure(config)
745
+ end
746
+
949
747
  def test_doesnt_add_logstash_timestamp_by_default
950
748
  stub_elastic_ping
951
749
  stub_elastic
952
- driver.emit(sample_record)
953
- driver.run
750
+ driver.run(default_tag: 'test') do
751
+ driver.feed(sample_record)
752
+ end
954
753
  assert_nil(index_cmds[1]['@timestamp'])
955
754
  end
956
755
 
957
- def test_adds_timestamp_when_logstash
756
+ def test_adds_logstash_timestamp_when_configured
958
757
  driver.configure("logstash_format true\n")
959
758
  stub_elastic_ping
960
759
  stub_elastic
961
- ts = DateTime.now.iso8601
962
- driver.emit(sample_record)
963
- driver.run
964
- assert(index_cmds[1].has_key? '@timestamp')
965
- assert_equal(index_cmds[1]['@timestamp'], ts)
966
- end
967
-
968
- def test_adds_timestamp_when_include_timestamp
969
- driver.configure("include_timestamp true\n")
970
- stub_elastic_ping
971
- stub_elastic
972
760
  ts = DateTime.now
973
- time = ts.to_time
974
- driver.emit(sample_record, time)
975
- driver.run
761
+ time = Fluent::EventTime.from_time(ts.to_time)
762
+ driver.run(default_tag: 'test') do
763
+ driver.feed(time, sample_record)
764
+ end
765
+ tf = "%Y-%m-%dT%H:%M:%S%:z"
766
+ timef = Fluent::TimeFormatter.new(tf, true, ENV["TZ"])
976
767
  assert(index_cmds[1].has_key? '@timestamp')
977
- assert_equal(index_cmds[1]['@timestamp'], ts.iso8601)
768
+ assert_equal(timef.format(Time.parse(index_cmds[1]['@timestamp'])).to_s, ts.to_s)
978
769
  end
979
770
 
980
771
  def test_uses_custom_timestamp_when_included_in_record
981
772
  driver.configure("logstash_format true\n")
982
773
  stub_elastic_ping
983
774
  stub_elastic
984
- ts = DateTime.new(2001,2,3).iso8601
985
- driver.emit(sample_record.merge!('@timestamp' => ts))
986
- driver.run
987
- assert(index_cmds[1].has_key? '@timestamp')
988
- assert_equal(index_cmds[1]['@timestamp'], ts)
989
- end
990
-
991
- def test_uses_custom_timestamp_when_included_in_record_without_logstash
992
- driver.configure("include_timestamp true\n")
993
- stub_elastic_ping
994
- stub_elastic
995
- ts = DateTime.new(2001,2,3).iso8601
996
- driver.emit(sample_record.merge!('@timestamp' => ts))
997
- driver.run
775
+ ts = DateTime.new(2001,2,3).to_s
776
+ driver.run(default_tag: 'test') do
777
+ driver.feed(sample_record.merge!('@timestamp' => ts))
778
+ end
998
779
  assert(index_cmds[1].has_key? '@timestamp')
999
780
  assert_equal(index_cmds[1]['@timestamp'], ts)
1000
781
  end
@@ -1004,40 +785,12 @@ class ElasticsearchOutput < Test::Unit::TestCase
1004
785
  time_key vtm\n")
1005
786
  stub_elastic_ping
1006
787
  stub_elastic
1007
- ts = DateTime.new(2001,2,3).iso8601
1008
- driver.emit(sample_record.merge!('vtm' => ts))
1009
- driver.run
1010
- assert(index_cmds[1].has_key? '@timestamp')
1011
- assert_equal(index_cmds[1]['@timestamp'], ts)
1012
- end
1013
-
1014
- def test_uses_custom_time_key_with_format
1015
- driver.configure("logstash_format true
1016
- time_key_format %Y-%m-%d %H:%M:%S.%N%z
1017
- time_key vtm\n")
1018
- stub_elastic_ping
1019
- stub_elastic
1020
- ts = "2001-02-03 13:14:01.673+02:00"
1021
- driver.emit(sample_record.merge!('vtm' => ts))
1022
- driver.run
1023
- assert(index_cmds[1].has_key? '@timestamp')
1024
- assert_equal(index_cmds[1]['@timestamp'], ts)
1025
- assert_equal("logstash-2001.02.03", index_cmds[0]['index']['_index'])
1026
- end
1027
-
1028
- def test_uses_custom_time_key_with_format_without_logstash
1029
- driver.configure("include_timestamp true
1030
- index_name test
1031
- time_key_format %Y-%m-%d %H:%M:%S.%N%z
1032
- time_key vtm\n")
1033
- stub_elastic_ping
1034
- stub_elastic
1035
- ts = "2001-02-03 13:14:01.673+02:00"
1036
- driver.emit(sample_record.merge!('vtm' => ts))
1037
- driver.run
788
+ ts = DateTime.new(2001,2,3).to_s
789
+ driver.run(default_tag: 'test') do
790
+ driver.feed(sample_record.merge!('vtm' => ts))
791
+ end
1038
792
  assert(index_cmds[1].has_key? '@timestamp')
1039
793
  assert_equal(index_cmds[1]['@timestamp'], ts)
1040
- assert_equal("test", index_cmds[0]['index']['_index'])
1041
794
  end
1042
795
 
1043
796
  def test_uses_custom_time_key_exclude_timekey
@@ -1046,9 +799,10 @@ class ElasticsearchOutput < Test::Unit::TestCase
1046
799
  time_key_exclude_timestamp true\n")
1047
800
  stub_elastic_ping
1048
801
  stub_elastic
1049
- ts = DateTime.new(2001,2,3).iso8601
1050
- driver.emit(sample_record.merge!('vtm' => ts))
1051
- driver.run
802
+ ts = DateTime.new(2001,2,3).to_s
803
+ driver.run(default_tag: 'test') do
804
+ driver.feed(sample_record.merge!('vtm' => ts))
805
+ end
1052
806
  assert(!index_cmds[1].key?('@timestamp'), '@timestamp should be messing')
1053
807
  end
1054
808
 
@@ -1058,27 +812,14 @@ class ElasticsearchOutput < Test::Unit::TestCase
1058
812
  stub_elastic_ping
1059
813
  stub_elastic
1060
814
  ts = "2001-02-03T13:14:01.673+02:00"
1061
- driver.emit(sample_record.merge!('@timestamp' => ts))
1062
- driver.run
815
+ driver.run(default_tag: 'test') do
816
+ driver.feed(sample_record.merge!('@timestamp' => ts))
817
+ end
1063
818
  assert_equal("logstash-2001.02.03", index_cmds[0]['index']['_index'])
1064
819
  assert(index_cmds[1].has_key? '@timestamp')
1065
820
  assert_equal(index_cmds[1]['@timestamp'], ts)
1066
821
  end
1067
822
 
1068
- def test_uses_custom_time_key_format_without_logstash
1069
- driver.configure("include_timestamp true
1070
- index_name test
1071
- time_key_format %Y-%m-%dT%H:%M:%S.%N%z\n")
1072
- stub_elastic_ping
1073
- stub_elastic
1074
- ts = "2001-02-03T13:14:01.673+02:00"
1075
- driver.emit(sample_record.merge!('@timestamp' => ts))
1076
- driver.run
1077
- assert_equal("test", index_cmds[0]['index']['_index'])
1078
- assert(index_cmds[1].has_key? '@timestamp')
1079
- assert_equal(index_cmds[1]['@timestamp'], ts)
1080
- end
1081
-
1082
823
  data(:default => nil,
1083
824
  :custom_tag => 'es_plugin.output.time.error')
1084
825
  def test_uses_custom_time_key_format_logs_an_error(tag_for_error)
@@ -1092,12 +833,11 @@ class ElasticsearchOutput < Test::Unit::TestCase
1092
833
  ts = "2001/02/03 13:14:01,673+02:00"
1093
834
  index = "logstash-#{Date.today.strftime("%Y.%m.%d")}"
1094
835
 
1095
- driver.emit(sample_record.merge!('@timestamp' => ts))
1096
- driver.run
1097
-
1098
- log = driver.instance.router.emit_error_handler.log
1099
- errors = log.out.logs.grep /tag="#{tag_for_error}"/
1100
- assert_equal(1, errors.length, "Error was logged for timestamp parse failure")
836
+ flexmock(driver.instance.router).should_receive(:emit_error_event)
837
+ .with(tag_for_error, Fluent::EventTime, Hash, ArgumentError).once
838
+ driver.run(default_tag: 'test') do
839
+ driver.feed(sample_record.merge!('@timestamp' => ts))
840
+ end
1101
841
 
1102
842
  assert_equal(index, index_cmds[0]['index']['_index'])
1103
843
  assert(index_cmds[1].has_key? '@timestamp')
@@ -1111,14 +851,15 @@ class ElasticsearchOutput < Test::Unit::TestCase
1111
851
  stub_elastic_ping
1112
852
  stub_elastic
1113
853
  ts = "Thu Nov 29 14:33:20 GMT 2001"
1114
- driver.emit(sample_record.merge!('@timestamp' => ts))
1115
- driver.run
854
+ driver.run(default_tag: 'test') do
855
+ driver.feed(sample_record.merge!('@timestamp' => ts))
856
+ end
1116
857
  assert_equal("logstash-2001.11.29", index_cmds[0]['index']['_index'])
1117
858
  assert(index_cmds[1].has_key? '@timestamp')
1118
859
  assert_equal(index_cmds[1]['@timestamp'], ts)
1119
860
  end
1120
861
 
1121
- def test_uses_no_subsecond_precision_by_default
862
+ def test_uses_nanosecond_precision_by_default
1122
863
  driver.configure("logstash_format true\n")
1123
864
  stub_elastic_ping
1124
865
  stub_elastic
@@ -1127,10 +868,11 @@ class ElasticsearchOutput < Test::Unit::TestCase
1127
868
  rescue
1128
869
  time = Fluent::Engine.now
1129
870
  end
1130
- driver.emit(sample_record, time)
1131
- driver.run
871
+ driver.run(default_tag: 'test') do
872
+ driver.feed(time.to_i, sample_record)
873
+ end
1132
874
  assert(index_cmds[1].has_key? '@timestamp')
1133
- assert_equal(index_cmds[1]['@timestamp'], Time.at(time).iso8601)
875
+ assert_equal(index_cmds[1]['@timestamp'], Time.at(time).iso8601(9))
1134
876
  end
1135
877
 
1136
878
  def test_uses_subsecond_precision_when_configured
@@ -1143,8 +885,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1143
885
  rescue
1144
886
  time = Fluent::Engine.now
1145
887
  end
1146
- driver.emit(sample_record, time)
1147
- driver.run
888
+ driver.run(default_tag: 'test') do
889
+ driver.feed(time.to_i, sample_record)
890
+ end
1148
891
  assert(index_cmds[1].has_key? '@timestamp')
1149
892
  assert_equal(index_cmds[1]['@timestamp'], Time.at(time).iso8601(3))
1150
893
  end
@@ -1152,17 +895,19 @@ class ElasticsearchOutput < Test::Unit::TestCase
1152
895
  def test_doesnt_add_tag_key_by_default
1153
896
  stub_elastic_ping
1154
897
  stub_elastic
1155
- driver.emit(sample_record)
1156
- driver.run
898
+ driver.run(default_tag: 'test') do
899
+ driver.feed(sample_record)
900
+ end
1157
901
  assert_nil(index_cmds[1]['tag'])
1158
902
  end
1159
903
 
1160
904
  def test_adds_tag_key_when_configured
1161
- driver('mytag').configure("include_tag_key true\n")
905
+ driver.configure("include_tag_key true\n")
1162
906
  stub_elastic_ping
1163
907
  stub_elastic
1164
- driver.emit(sample_record)
1165
- driver.run
908
+ driver.run(default_tag: 'mytag') do
909
+ driver.feed(sample_record)
910
+ end
1166
911
  assert(index_cmds[1].has_key?('tag'))
1167
912
  assert_equal(index_cmds[1]['tag'], 'mytag')
1168
913
  end
@@ -1171,8 +916,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1171
916
  driver.configure("id_key request_id\n")
1172
917
  stub_elastic_ping
1173
918
  stub_elastic
1174
- driver.emit(sample_record)
1175
- driver.run
919
+ driver.run(default_tag: 'test') do
920
+ driver.feed(sample_record)
921
+ end
1176
922
  assert_equal(index_cmds[0]['index']['_id'], '42')
1177
923
  end
1178
924
 
@@ -1180,16 +926,18 @@ class ElasticsearchOutput < Test::Unit::TestCase
1180
926
  driver.configure("id_key another_request_id\n")
1181
927
  stub_elastic_ping
1182
928
  stub_elastic
1183
- driver.emit(sample_record)
1184
- driver.run
929
+ driver.run(default_tag: 'test') do
930
+ driver.feed(sample_record)
931
+ end
1185
932
  assert(!index_cmds[0]['index'].has_key?('_id'))
1186
933
  end
1187
934
 
1188
935
  def test_adds_id_key_when_not_configured
1189
936
  stub_elastic_ping
1190
937
  stub_elastic
1191
- driver.emit(sample_record)
1192
- driver.run
938
+ driver.run(default_tag: 'test') do
939
+ driver.feed(sample_record)
940
+ end
1193
941
  assert(!index_cmds[0]['index'].has_key?('_id'))
1194
942
  end
1195
943
 
@@ -1197,8 +945,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1197
945
  driver.configure("parent_key parent_id\n")
1198
946
  stub_elastic_ping
1199
947
  stub_elastic
1200
- driver.emit(sample_record)
1201
- driver.run
948
+ driver.run(default_tag: 'test') do
949
+ driver.feed(sample_record)
950
+ end
1202
951
  assert_equal(index_cmds[0]['index']['_parent'], 'parent')
1203
952
  end
1204
953
 
@@ -1206,16 +955,18 @@ class ElasticsearchOutput < Test::Unit::TestCase
1206
955
  driver.configure("parent_key another_parent_id\n")
1207
956
  stub_elastic_ping
1208
957
  stub_elastic
1209
- driver.emit(sample_record)
1210
- driver.run
958
+ driver.run(default_tag: 'test') do
959
+ driver.feed(sample_record)
960
+ end
1211
961
  assert(!index_cmds[0]['index'].has_key?('_parent'))
1212
962
  end
1213
963
 
1214
964
  def test_adds_parent_key_when_not_configured
1215
965
  stub_elastic_ping
1216
966
  stub_elastic
1217
- driver.emit(sample_record)
1218
- driver.run
967
+ driver.run(default_tag: 'test') do
968
+ driver.feed(sample_record)
969
+ end
1219
970
  assert(!index_cmds[0]['index'].has_key?('_parent'))
1220
971
  end
1221
972
 
@@ -1223,8 +974,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1223
974
  driver.configure("routing_key routing_id\n")
1224
975
  stub_elastic_ping
1225
976
  stub_elastic
1226
- driver.emit(sample_record)
1227
- driver.run
977
+ driver.run(default_tag: 'test') do
978
+ driver.feed(sample_record)
979
+ end
1228
980
  assert_equal(index_cmds[0]['index']['_routing'], 'routing')
1229
981
  end
1230
982
 
@@ -1232,16 +984,18 @@ class ElasticsearchOutput < Test::Unit::TestCase
1232
984
  driver.configure("routing_key another_routing_id\n")
1233
985
  stub_elastic_ping
1234
986
  stub_elastic
1235
- driver.emit(sample_record)
1236
- driver.run
987
+ driver.run(default_tag: 'test') do
988
+ driver.feed(sample_record)
989
+ end
1237
990
  assert(!index_cmds[0]['index'].has_key?('_routing'))
1238
991
  end
1239
992
 
1240
993
  def test_adds_routing_key_when_not_configured
1241
994
  stub_elastic_ping
1242
995
  stub_elastic
1243
- driver.emit(sample_record)
1244
- driver.run
996
+ driver.run(default_tag: 'test') do
997
+ driver.feed(sample_record)
998
+ end
1245
999
  assert(!index_cmds[0]['index'].has_key?('_routing'))
1246
1000
  end
1247
1001
 
@@ -1249,8 +1003,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1249
1003
  driver.configure("remove_keys key1\n")
1250
1004
  stub_elastic_ping
1251
1005
  stub_elastic
1252
- driver.emit(sample_record.merge('key1' => 'v1', 'key2' => 'v2'))
1253
- driver.run
1006
+ driver.run(default_tag: 'test') do
1007
+ driver.feed(sample_record.merge('key1' => 'v1', 'key2' => 'v2'))
1008
+ end
1254
1009
  assert(!index_cmds[1].has_key?('key1'))
1255
1010
  assert(index_cmds[1].has_key?('key2'))
1256
1011
  end
@@ -1259,8 +1014,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1259
1014
  driver.configure("remove_keys key1, key2\n")
1260
1015
  stub_elastic_ping
1261
1016
  stub_elastic
1262
- driver.emit(sample_record.merge('key1' => 'v1', 'key2' => 'v2'))
1263
- driver.run
1017
+ driver.run(default_tag: 'test') do
1018
+ driver.feed(sample_record.merge('key1' => 'v1', 'key2' => 'v2'))
1019
+ end
1264
1020
  assert(!index_cmds[1].has_key?('key1'))
1265
1021
  assert(!index_cmds[1].has_key?('key2'))
1266
1022
  end
@@ -1268,19 +1024,13 @@ class ElasticsearchOutput < Test::Unit::TestCase
1268
1024
  def test_request_error
1269
1025
  stub_elastic_ping
1270
1026
  stub_elastic_unavailable
1271
- driver.emit(sample_record)
1272
1027
  assert_raise(Elasticsearch::Transport::Transport::Errors::ServiceUnavailable) {
1273
- driver.run
1028
+ driver.run(default_tag: 'test') do
1029
+ driver.feed(sample_record)
1030
+ end
1274
1031
  }
1275
1032
  end
1276
1033
 
1277
- def test_garbage_record_error
1278
- stub_elastic_ping
1279
- stub_elastic
1280
- driver.emit("some garbage string")
1281
- driver.run
1282
- end
1283
-
1284
1034
  def test_connection_failed_retry
1285
1035
  connection_resets = 0
1286
1036
 
@@ -1292,11 +1042,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1292
1042
  raise Faraday::ConnectionFailed, "Test message"
1293
1043
  end
1294
1044
 
1295
- driver.emit(sample_record)
1296
-
1297
- assert_raise(Fluent::ElasticsearchOutput::ConnectionFailure) {
1298
- driver.run
1299
- }
1045
+ driver.run(default_tag: 'test') do
1046
+ driver.feed(sample_record)
1047
+ end
1300
1048
  assert_equal(connection_resets, 3)
1301
1049
  end
1302
1050
 
@@ -1312,16 +1060,21 @@ class ElasticsearchOutput < Test::Unit::TestCase
1312
1060
  end
1313
1061
 
1314
1062
  driver.configure("reconnect_on_error true\n")
1315
- driver.emit(sample_record)
1316
1063
 
1317
1064
  assert_raise(ZeroDivisionError) {
1318
- driver.run
1065
+ driver.run(default_tag: 'test', shutdown: false) do
1066
+ driver.feed(sample_record)
1067
+ end
1319
1068
  }
1320
1069
 
1321
- assert_raise(ZeroDivisionError) {
1322
- driver.run
1070
+ assert_raise(Timeout::Error) {
1071
+ driver.run(default_tag: 'test', shutdown: false) do
1072
+ driver.feed(sample_record)
1073
+ end
1323
1074
  }
1324
- assert_equal(connection_resets, 2)
1075
+ # FIXME: Consider keywords arguments in #run and how to test this later.
1076
+ # Because v0.14 test driver does not have 1 to 1 correspondence between #run and #flush in tests.
1077
+ assert_equal(connection_resets, 1)
1325
1078
  end
1326
1079
 
1327
1080
  def test_reconnect_on_error_disabled
@@ -1336,219 +1089,28 @@ class ElasticsearchOutput < Test::Unit::TestCase
1336
1089
  end
1337
1090
 
1338
1091
  driver.configure("reconnect_on_error false\n")
1339
- driver.emit(sample_record)
1340
1092
 
1341
1093
  assert_raise(ZeroDivisionError) {
1342
- driver.run
1094
+ driver.run(default_tag: 'test', shutdown: false) do
1095
+ driver.feed(sample_record)
1096
+ end
1343
1097
  }
1344
1098
 
1345
- assert_raise(ZeroDivisionError) {
1346
- driver.run
1099
+ assert_raise(Timeout::Error) {
1100
+ driver.run(default_tag: 'test', shutdown: false) do
1101
+ driver.feed(sample_record)
1102
+ end
1347
1103
  }
1348
1104
  assert_equal(connection_resets, 1)
1349
1105
  end
1350
1106
 
1351
- def test_bulk_error_retags_when_configured
1352
- driver.configure("retry_tag retry\n")
1353
- stub_elastic_ping
1354
- stub_request(:post, 'http://localhost:9200/_bulk')
1355
- .to_return(lambda do |req|
1356
- { :status => 200,
1357
- :headers => { 'Content-Type' => 'json' },
1358
- :body => %({
1359
- "took" : 1,
1360
- "errors" : true,
1361
- "items" : [
1362
- {
1363
- "create" : {
1364
- "_index" : "foo",
1365
- "_type" : "bar",
1366
- "_id" : "abc",
1367
- "status" : 500,
1368
- "error" : {
1369
- "type" : "some unrecognized type",
1370
- "reason":"some error to cause version mismatch"
1371
- }
1372
- }
1373
- }
1374
- ]
1375
- })
1376
- }
1377
- end)
1378
- driver.emit(sample_record, 1)
1379
-
1380
- driver.expect_emit('retry', 1, sample_record)
1381
- driver.run
1382
- end
1383
-
1384
- def test_create_should_write_records_with_ids_and_skip_those_without
1385
- driver.configure("write_operation create\nid_key my_id\nlog_level debug")
1386
- log = driver.instance.router.emit_error_handler.log
1387
- stub_elastic_ping
1388
- stub_request(:post, 'http://localhost:9200/_bulk')
1389
- .to_return(lambda do |req|
1390
- { :status => 200,
1391
- :headers => { 'Content-Type' => 'json' },
1392
- :body => %({
1393
- "took" : 1,
1394
- "errors" : true,
1395
- "items" : [
1396
- {
1397
- "create" : {
1398
- "_index" : "foo",
1399
- "_type" : "bar",
1400
- "_id" : "abc"
1401
- }
1402
- },
1403
- {
1404
- "create" : {
1405
- "_index" : "foo",
1406
- "_type" : "bar",
1407
- "_id" : "xyz",
1408
- "status" : 500,
1409
- "error" : {
1410
- "type" : "some unrecognized type",
1411
- "reason":"some error to cause version mismatch"
1412
- }
1413
- }
1414
- }
1415
- ]
1416
- })
1417
- }
1418
- end)
1419
- sample_record1 = sample_record('my_id' => 'abc')
1420
- sample_record4 = sample_record('my_id' => 'xyz')
1421
- driver.emit(sample_record1, 1)
1422
- driver.emit(sample_record, 2)
1423
- driver.emit(sample_record, 3)
1424
- driver.emit(sample_record4, 4)
1425
-
1426
- # one record succeeded while the other should be 'retried'
1427
- driver.expect_emit('test', 4, sample_record4)
1428
- driver.run
1429
- assert_logs_include(log.out.logs, /(Dropping record)/, 2)
1430
- end
1431
-
1432
- def test_create_should_write_records_with_ids_and_emit_those_without
1433
- driver.configure("write_operation create\nid_key my_id\nemit_error_for_missing_id true")
1434
- log = driver.instance.router.emit_error_handler.log
1435
- stub_elastic_ping
1436
- stub_request(:post, 'http://localhost:9200/_bulk')
1437
- .to_return(lambda do |req|
1438
- { :status => 200,
1439
- :headers => { 'Content-Type' => 'json' },
1440
- :body => %({
1441
- "took" : 1,
1442
- "errors" : true,
1443
- "items" : [
1444
- {
1445
- "create" : {
1446
- "_index" : "foo",
1447
- "_type" : "bar",
1448
- "_id" : "abc"
1449
- }
1450
- },
1451
- {
1452
- "create" : {
1453
- "_index" : "foo",
1454
- "_type" : "bar",
1455
- "_id" : "xyz",
1456
- "status" : 500,
1457
- "error" : {
1458
- "type" : "some unrecognized type",
1459
- "reason":"some error to cause version mismatch"
1460
- }
1461
- }
1462
- }
1463
- ]
1464
- })
1465
- }
1466
- end)
1467
- sample_record1 = sample_record('my_id' => 'abc')
1468
- sample_record4 = sample_record('my_id' => 'xyz')
1469
- driver.emit(sample_record1, 1)
1470
- driver.emit(sample_record, 2)
1471
- driver.emit(sample_record, 3)
1472
- driver.emit(sample_record4, 4)
1473
-
1474
- # one record succeeded while the other should be 'retried'
1475
- driver.expect_emit('test', 4, sample_record4)
1476
- driver.run
1477
- assert_logs_include(log.out.logs, /(Missing '_id' field)/, 2)
1478
- end
1479
-
1480
- def test_bulk_error
1481
- stub_elastic_ping
1482
- stub_request(:post, 'http://localhost:9200/_bulk')
1483
- .to_return(lambda do |req|
1484
- { :status => 200,
1485
- :headers => { 'Content-Type' => 'json' },
1486
- :body => %({
1487
- "took" : 1,
1488
- "errors" : true,
1489
- "items" : [
1490
- {
1491
- "create" : {
1492
- "_index" : "foo",
1493
- "_type" : "bar",
1494
- "_id" : "abc",
1495
- "status" : 500,
1496
- "error" : {
1497
- "type" : "some unrecognized type",
1498
- "reason":"some error to cause version mismatch"
1499
- }
1500
- }
1501
- },
1502
- {
1503
- "create" : {
1504
- "_index" : "foo",
1505
- "_type" : "bar",
1506
- "_id" : "abc",
1507
- "status" : 201
1508
- }
1509
- },
1510
- {
1511
- "create" : {
1512
- "_index" : "foo",
1513
- "_type" : "bar",
1514
- "_id" : "abc",
1515
- "status" : 500,
1516
- "error" : {
1517
- "type" : "some unrecognized type",
1518
- "reason":"some error to cause version mismatch"
1519
- }
1520
- }
1521
- },
1522
- {
1523
- "create" : {
1524
- "_index" : "foo",
1525
- "_type" : "bar",
1526
- "_id" : "abc",
1527
- "_id" : "abc",
1528
- "status" : 409
1529
- }
1530
- }
1531
- ]
1532
- })
1533
- }
1534
- end)
1535
-
1536
- driver.emit(sample_record, 1)
1537
- driver.emit(sample_record, 2)
1538
- driver.emit(sample_record, 3)
1539
- driver.emit(sample_record, 4)
1540
-
1541
- driver.expect_emit('test', 1, sample_record)
1542
- driver.expect_emit('test', 3, sample_record)
1543
- driver.run
1544
- end
1545
-
1546
1107
  def test_update_should_not_write_if_theres_no_id
1547
1108
  driver.configure("write_operation update\n")
1548
1109
  stub_elastic_ping
1549
1110
  stub_elastic
1550
- driver.emit(sample_record)
1551
- driver.run
1111
+ driver.run(default_tag: 'test') do
1112
+ driver.feed(sample_record)
1113
+ end
1552
1114
  assert_nil(index_cmds)
1553
1115
  end
1554
1116
 
@@ -1556,8 +1118,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1556
1118
  driver.configure("write_operation upsert\n")
1557
1119
  stub_elastic_ping
1558
1120
  stub_elastic
1559
- driver.emit(sample_record)
1560
- driver.run
1121
+ driver.run(default_tag: 'test') do
1122
+ driver.feed(sample_record)
1123
+ end
1561
1124
  assert_nil(index_cmds)
1562
1125
  end
1563
1126
 
@@ -1565,8 +1128,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1565
1128
  driver.configure("write_operation create\n")
1566
1129
  stub_elastic_ping
1567
1130
  stub_elastic
1568
- driver.emit(sample_record)
1569
- driver.run
1131
+ driver.run(default_tag: 'test') do
1132
+ driver.feed(sample_record)
1133
+ end
1570
1134
  assert_nil(index_cmds)
1571
1135
  end
1572
1136
 
@@ -1575,8 +1139,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1575
1139
  id_key request_id")
1576
1140
  stub_elastic_ping
1577
1141
  stub_elastic
1578
- driver.emit(sample_record)
1579
- driver.run
1142
+ driver.run(default_tag: 'test') do
1143
+ driver.feed(sample_record)
1144
+ end
1580
1145
  assert(index_cmds[0].has_key?("update"))
1581
1146
  assert(!index_cmds[1]["doc_as_upsert"])
1582
1147
  assert(!index_cmds[1]["upsert"])
@@ -1588,8 +1153,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1588
1153
  remove_keys_on_update parent_id")
1589
1154
  stub_elastic_ping
1590
1155
  stub_elastic
1591
- driver.emit(sample_record)
1592
- driver.run
1156
+ driver.run(default_tag: 'test') do
1157
+ driver.feed(sample_record)
1158
+ end
1593
1159
  assert(index_cmds[1]["doc"])
1594
1160
  assert(!index_cmds[1]["doc"]["parent_id"])
1595
1161
  end
@@ -1599,8 +1165,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1599
1165
  id_key request_id")
1600
1166
  stub_elastic_ping
1601
1167
  stub_elastic
1602
- driver.emit(sample_record)
1603
- driver.run
1168
+ driver.run(default_tag: 'test') do
1169
+ driver.feed(sample_record)
1170
+ end
1604
1171
  assert(index_cmds[0].has_key?("update"))
1605
1172
  assert(index_cmds[1]["doc_as_upsert"])
1606
1173
  assert(!index_cmds[1]["upsert"])
@@ -1612,8 +1179,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1612
1179
  remove_keys_on_update parent_id")
1613
1180
  stub_elastic_ping
1614
1181
  stub_elastic
1615
- driver.emit(sample_record)
1616
- driver.run
1182
+ driver.run(default_tag: 'test') do
1183
+ driver.feed(sample_record)
1184
+ end
1617
1185
  assert(index_cmds[0].has_key?("update"))
1618
1186
  assert(!index_cmds[1]["doc_as_upsert"])
1619
1187
  assert(index_cmds[1]["upsert"])
@@ -1626,8 +1194,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1626
1194
  remove_keys_on_update parent_id")
1627
1195
  stub_elastic_ping
1628
1196
  stub_elastic
1629
- driver.emit(sample_record)
1630
- driver.run
1197
+ driver.run(default_tag: 'test') do
1198
+ driver.feed(sample_record)
1199
+ end
1631
1200
  assert(index_cmds[1]["upsert"] != index_cmds[1]["doc"])
1632
1201
  assert(!index_cmds[1]["doc"]["parent_id"])
1633
1202
  assert(index_cmds[1]["upsert"]["parent_id"])
@@ -1639,8 +1208,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1639
1208
  remove_keys_on_update foo,baz")
1640
1209
  stub_elastic_ping
1641
1210
  stub_elastic
1642
- driver.emit("id" => 1, "foo" => "bar", "baz" => "quix", "zip" => "zam")
1643
- driver.run
1211
+ driver.run(default_tag: 'test') do
1212
+ driver.feed("id" => 1, "foo" => "bar", "baz" => "quix", "zip" => "zam")
1213
+ end
1644
1214
  assert(
1645
1215
  index_cmds[1]["doc"] == {
1646
1216
  "id" => 1,
@@ -1663,8 +1233,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1663
1233
  remove_keys_on_update_key keys_to_skip")
1664
1234
  stub_elastic_ping
1665
1235
  stub_elastic
1666
- driver.emit("id" => 1, "foo" => "bar", "baz" => "quix", "keys_to_skip" => ["baz"])
1667
- driver.run
1236
+ driver.run(default_tag: 'test') do
1237
+ driver.feed("id" => 1, "foo" => "bar", "baz" => "quix", "keys_to_skip" => ["baz"])
1238
+ end
1668
1239
  assert(
1669
1240
  index_cmds[1]["doc"] == {
1670
1241
  "id" => 1,
@@ -1687,8 +1258,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1687
1258
  remove_keys_on_update_key keys_to_skip")
1688
1259
  stub_elastic_ping
1689
1260
  stub_elastic
1690
- driver.emit("id" => 1, "foo" => "bar", "baz" => "quix", "keys_to_skip" => ["baz"])
1691
- driver.run
1261
+ driver.run(default_tag: 'test') do
1262
+ driver.feed("id" => 1, "foo" => "bar", "baz" => "quix", "keys_to_skip" => ["baz"])
1263
+ end
1692
1264
  assert(
1693
1265
  index_cmds[1]["doc"] == {
1694
1266
  "id" => 1,
@@ -1711,84 +1283,9 @@ class ElasticsearchOutput < Test::Unit::TestCase
1711
1283
  id_key request_id")
1712
1284
  stub_elastic_ping
1713
1285
  stub_elastic
1714
- driver.emit(sample_record)
1715
- driver.run
1286
+ driver.run(default_tag: 'test') do
1287
+ driver.feed(sample_record)
1288
+ end
1716
1289
  assert(index_cmds[0].has_key?("create"))
1717
1290
  end
1718
-
1719
- def test_use_simple_sniffer
1720
- require 'fluent/plugin/elasticsearch_simple_sniffer'
1721
- driver.configure("sniffer_class_name Fluent::ElasticsearchSimpleSniffer
1722
- log_level debug
1723
- with_transporter_log true
1724
- reload_connections true
1725
- reload_after 1")
1726
- stub_elastic_ping
1727
- stub_elastic
1728
- driver.emit(sample_record)
1729
- driver.run
1730
- log = driver.instance.router.emit_error_handler.log
1731
- # 2 - one for the ping, one for the _bulk
1732
- assert_logs_include(log.out.logs, /In Fluent::ElasticsearchSimpleSniffer hosts/, 2)
1733
- end
1734
-
1735
- def test_suppress_doc_wrap
1736
- driver.configure('write_operation update
1737
- id_key id
1738
- remove_keys id
1739
- suppress_doc_wrap true')
1740
- stub_elastic_ping
1741
- stub_elastic
1742
- doc_body = {'field' => 'value'}
1743
- doc_record = {'id' => 1, 'doc' => doc_body}
1744
- script_body = {'source' => 'ctx._source.counter += params.param1',
1745
- 'lang' => 'painless',
1746
- 'params' => {'param1' => 1}}
1747
- upsert_body = {'counter' => 1}
1748
- script_record = {'id' => 2, 'script' => script_body, 'upsert' => upsert_body}
1749
- driver.emit(doc_record, 1)
1750
- driver.emit(script_record, 2)
1751
- driver.run
1752
- assert(
1753
- index_cmds[1] == {'doc' => doc_body}
1754
- )
1755
- assert(
1756
- index_cmds[3] == {
1757
- 'script' => script_body,
1758
- 'upsert' => upsert_body
1759
- }
1760
- )
1761
- end
1762
-
1763
- def test_suppress_doc_wrap_should_handle_record_as_is_at_upsert
1764
- driver.configure('write_operation upsert
1765
- id_key id
1766
- remove_keys id
1767
- suppress_doc_wrap true')
1768
- stub_elastic_ping
1769
- stub_elastic
1770
- doc_body = {'field' => 'value'}
1771
- doc_record = {'id' => 1, 'doc' => doc_body, 'doc_as_upsert' => true}
1772
- script_body = {'source' => 'ctx._source.counter += params.param1',
1773
- 'lang' => 'painless',
1774
- 'params' => {'param1' => 1}}
1775
- upsert_body = {'counter' => 1}
1776
- script_record = {'id' => 2, 'script' => script_body, 'upsert' => upsert_body}
1777
- driver.emit(doc_record, 1)
1778
- driver.emit(script_record, 2)
1779
- driver.run
1780
- assert(
1781
- index_cmds[1] == {
1782
- 'doc' => doc_body,
1783
- 'doc_as_upsert' => true
1784
- }
1785
- )
1786
- assert(
1787
- index_cmds[3] == {
1788
- 'script' => script_body,
1789
- 'upsert' => upsert_body
1790
- }
1791
- )
1792
- end
1793
-
1794
1291
  end