fluentd 1.11.4-x86-mingw32 → 1.12.3-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of fluentd might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.deepsource.toml +13 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
- data/.github/ISSUE_TEMPLATE/config.yml +5 -0
- data/.github/workflows/linux-test.yaml +36 -0
- data/.github/workflows/macos-test.yaml +30 -0
- data/.github/workflows/stale-actions.yml +22 -0
- data/.github/workflows/windows-test.yaml +35 -0
- data/.gitlab-ci.yml +41 -19
- data/CHANGELOG.md +166 -0
- data/MAINTAINERS.md +5 -2
- data/README.md +7 -4
- data/bin/fluent-cap-ctl +7 -0
- data/bin/fluent-ctl +7 -0
- data/fluentd.gemspec +7 -5
- data/lib/fluent/capability.rb +87 -0
- data/lib/fluent/command/bundler_injection.rb +1 -1
- data/lib/fluent/command/ca_generate.rb +6 -3
- data/lib/fluent/command/cap_ctl.rb +174 -0
- data/lib/fluent/command/cat.rb +0 -1
- data/lib/fluent/command/ctl.rb +177 -0
- data/lib/fluent/command/fluentd.rb +4 -0
- data/lib/fluent/command/plugin_config_formatter.rb +18 -2
- data/lib/fluent/command/plugin_generator.rb +31 -1
- data/lib/fluent/compat/parser.rb +2 -2
- data/lib/fluent/config/section.rb +2 -2
- data/lib/fluent/config/types.rb +2 -2
- data/lib/fluent/env.rb +4 -0
- data/lib/fluent/event.rb +3 -13
- data/lib/fluent/load.rb +0 -1
- data/lib/fluent/plugin.rb +5 -0
- data/lib/fluent/plugin/buffer.rb +2 -21
- data/lib/fluent/plugin/file_wrapper.rb +39 -3
- data/lib/fluent/plugin/formatter.rb +24 -0
- data/lib/fluent/plugin/formatter_csv.rb +1 -1
- data/lib/fluent/plugin/formatter_hash.rb +3 -1
- data/lib/fluent/plugin/formatter_json.rb +3 -1
- data/lib/fluent/plugin/formatter_ltsv.rb +7 -5
- data/lib/fluent/plugin/formatter_out_file.rb +6 -4
- data/lib/fluent/plugin/formatter_single_value.rb +4 -2
- data/lib/fluent/plugin/formatter_tsv.rb +4 -2
- data/lib/fluent/plugin/in_http.rb +24 -3
- data/lib/fluent/plugin/in_monitor_agent.rb +1 -1
- data/lib/fluent/plugin/in_tail.rb +129 -41
- data/lib/fluent/plugin/in_tail/position_file.rb +39 -14
- data/lib/fluent/plugin/in_tcp.rb +1 -0
- data/lib/fluent/plugin/out_copy.rb +18 -5
- data/lib/fluent/plugin/out_exec_filter.rb +3 -3
- data/lib/fluent/plugin/out_forward.rb +61 -28
- data/lib/fluent/plugin/out_http.rb +28 -3
- data/lib/fluent/plugin/output.rb +18 -10
- data/lib/fluent/plugin/parser_csv.rb +2 -2
- data/lib/fluent/plugin/parser_syslog.rb +2 -2
- data/lib/fluent/plugin/storage_local.rb +4 -4
- data/lib/fluent/plugin_helper/http_server/compat/server.rb +1 -1
- data/lib/fluent/plugin_helper/inject.rb +4 -2
- data/lib/fluent/plugin_helper/retry_state.rb +4 -0
- data/lib/fluent/plugin_helper/server.rb +4 -2
- data/lib/fluent/plugin_helper/socket_option.rb +2 -2
- data/lib/fluent/supervisor.rb +153 -48
- data/lib/fluent/system_config.rb +2 -1
- data/lib/fluent/time.rb +58 -1
- data/lib/fluent/version.rb +1 -1
- data/lib/fluent/winsvc.rb +22 -4
- data/templates/new_gem/fluent-plugin.gemspec.erb +3 -3
- data/templates/plugin_config_formatter/param.md-table.erb +10 -0
- data/test/command/test_binlog_reader.rb +22 -6
- data/test/command/test_cap_ctl.rb +100 -0
- data/test/command/test_ctl.rb +57 -0
- data/test/command/test_fluentd.rb +38 -0
- data/test/command/test_plugin_config_formatter.rb +124 -2
- data/test/config/test_configurable.rb +1 -1
- data/test/plugin/in_tail/test_position_file.rb +46 -26
- data/test/plugin/test_file_wrapper.rb +105 -0
- data/test/plugin/test_filter_stdout.rb +6 -1
- data/test/plugin/test_formatter_hash.rb +6 -3
- data/test/plugin/test_formatter_json.rb +14 -4
- data/test/plugin/test_formatter_ltsv.rb +13 -5
- data/test/plugin/test_formatter_out_file.rb +35 -14
- data/test/plugin/test_formatter_single_value.rb +12 -6
- data/test/plugin/test_formatter_tsv.rb +12 -4
- data/test/plugin/test_in_exec.rb +1 -1
- data/test/plugin/test_in_http.rb +25 -0
- data/test/plugin/test_in_tail.rb +503 -42
- data/test/plugin/test_out_copy.rb +87 -0
- data/test/plugin/test_out_file.rb +23 -18
- data/test/plugin/test_out_forward.rb +94 -6
- data/test/plugin/test_out_http.rb +20 -1
- data/test/plugin/test_output.rb +15 -3
- data/test/plugin/test_output_as_buffered_backup.rb +2 -0
- data/test/plugin/test_parser_csv.rb +14 -0
- data/test/plugin/test_parser_syslog.rb +16 -2
- data/test/plugin/test_sd_file.rb +1 -1
- data/test/plugin_helper/service_discovery/test_manager.rb +1 -1
- data/test/plugin_helper/test_child_process.rb +5 -2
- data/test/plugin_helper/test_compat_parameters.rb +7 -2
- data/test/plugin_helper/test_http_server_helper.rb +4 -2
- data/test/plugin_helper/test_inject.rb +29 -0
- data/test/plugin_helper/test_server.rb +26 -7
- data/test/test_capability.rb +74 -0
- data/test/test_event.rb +16 -0
- data/test/test_formatter.rb +64 -10
- data/test/test_output.rb +8 -3
- data/test/test_supervisor.rb +150 -1
- data/test/test_time_parser.rb +109 -0
- metadata +87 -33
- data/.travis.yml +0 -57
- data/appveyor.yml +0 -28
@@ -2,8 +2,11 @@ require_relative '../helper'
|
|
2
2
|
require 'fluent/test/driver/multi_output'
|
3
3
|
require 'fluent/plugin/out_copy'
|
4
4
|
require 'fluent/event'
|
5
|
+
require 'flexmock/test_unit'
|
5
6
|
|
6
7
|
class CopyOutputTest < Test::Unit::TestCase
|
8
|
+
include FlexMock::TestCase
|
9
|
+
|
7
10
|
class << self
|
8
11
|
def startup
|
9
12
|
$LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'scripts'))
|
@@ -54,6 +57,48 @@ class CopyOutputTest < Test::Unit::TestCase
|
|
54
57
|
assert_equal :no_copy, d.instance.copy_mode
|
55
58
|
end
|
56
59
|
|
60
|
+
ERRORNEOUS_IGNORE_IF_PREV_SUCCESS_CONFIG = %[
|
61
|
+
<store ignore_if_prev_success ignore_error>
|
62
|
+
@type test
|
63
|
+
name c0
|
64
|
+
</store>
|
65
|
+
<store ignore_if_prev_success ignore_error>
|
66
|
+
@type test
|
67
|
+
name c1
|
68
|
+
</store>
|
69
|
+
<store ignore_if_prev_success>
|
70
|
+
@type test
|
71
|
+
name c2
|
72
|
+
</store>
|
73
|
+
]
|
74
|
+
def test_configure_with_errorneus_ignore_if_prev_success
|
75
|
+
assert_raise(Fluent::ConfigError) do
|
76
|
+
create_driver(ERRORNEOUS_IGNORE_IF_PREV_SUCCESS_CONFIG)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
ALL_IGNORE_ERROR_WITHOUT_IGNORE_IF_PREV_SUCCESS_CONFIG = %[
|
81
|
+
@log_level info
|
82
|
+
<store ignore_error>
|
83
|
+
@type test
|
84
|
+
name c0
|
85
|
+
</store>
|
86
|
+
<store ignore_error>
|
87
|
+
@type test
|
88
|
+
name c1
|
89
|
+
</store>
|
90
|
+
<store ignore_error>
|
91
|
+
@type test
|
92
|
+
name c2
|
93
|
+
</store>
|
94
|
+
]
|
95
|
+
def test_configure_all_ignore_errors_without_ignore_if_prev_success
|
96
|
+
d = create_driver(ALL_IGNORE_ERROR_WITHOUT_IGNORE_IF_PREV_SUCCESS_CONFIG)
|
97
|
+
expected = /ignore_errors are specified in all <store>, but ignore_if_prev_success is not specified./
|
98
|
+
matches = d.logs.grep(expected)
|
99
|
+
assert_equal(1, matches.length, "Logs do not contain '#{expected}' '#{d.logs}'")
|
100
|
+
end
|
101
|
+
|
57
102
|
def test_configure_with_deep_copy_and_use_shallow_copy_mode
|
58
103
|
d = create_driver(%[
|
59
104
|
deep_copy true
|
@@ -217,5 +262,47 @@ class CopyOutputTest < Test::Unit::TestCase
|
|
217
262
|
end
|
218
263
|
end
|
219
264
|
end
|
265
|
+
|
266
|
+
IGNORE_IF_PREV_SUCCESS_CONFIG = %[
|
267
|
+
<store ignore_error>
|
268
|
+
@type test
|
269
|
+
name c0
|
270
|
+
</store>
|
271
|
+
<store ignore_if_prev_success ignore_error>
|
272
|
+
@type test
|
273
|
+
name c1
|
274
|
+
</store>
|
275
|
+
<store ignore_if_prev_success>
|
276
|
+
@type test
|
277
|
+
name c2
|
278
|
+
</store>
|
279
|
+
]
|
280
|
+
|
281
|
+
def test_ignore_if_prev_success
|
282
|
+
d = create_driver(IGNORE_IF_PREV_SUCCESS_CONFIG)
|
283
|
+
|
284
|
+
# override to raise an error
|
285
|
+
d.instance.outputs[0].define_singleton_method(:process) do |tag, es|
|
286
|
+
raise ArgumentError, 'Failed'
|
287
|
+
end
|
288
|
+
|
289
|
+
# check ingore_if_prev_success functionality:
|
290
|
+
# 1. output 2 is succeeded.
|
291
|
+
# 2. output 3 is not called.
|
292
|
+
flexstub(d.instance.outputs[1]) do |output|
|
293
|
+
output.should_receive(:process).once
|
294
|
+
end
|
295
|
+
flexstub(d.instance.outputs[2]) do |output|
|
296
|
+
output.should_receive(:process).never
|
297
|
+
end
|
298
|
+
|
299
|
+
time = Time.parse("2011-01-02 13:14:15 UTC").to_i
|
300
|
+
assert_nothing_raised do
|
301
|
+
d.run(default_tag: 'test') do
|
302
|
+
d.feed(time, {"a"=>1})
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
220
307
|
end
|
221
308
|
|
@@ -11,6 +11,11 @@ class FileOutputTest < Test::Unit::TestCase
|
|
11
11
|
Fluent::Test.setup
|
12
12
|
FileUtils.rm_rf(TMP_DIR)
|
13
13
|
FileUtils.mkdir_p(TMP_DIR)
|
14
|
+
@default_newline = if Fluent.windows?
|
15
|
+
"\r\n"
|
16
|
+
else
|
17
|
+
"\n"
|
18
|
+
end
|
14
19
|
end
|
15
20
|
|
16
21
|
TMP_DIR = File.expand_path(File.dirname(__FILE__) + "/../tmp/out_file#{ENV['TEST_ENV_NUMBER']}")
|
@@ -91,7 +96,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
91
96
|
end
|
92
97
|
end
|
93
98
|
assert_equal 1, d.formatted.size
|
94
|
-
assert_equal %[2011-01-02T21:14:15+08:00\ttest\t{"a":1}
|
99
|
+
assert_equal %[2011-01-02T21:14:15+08:00\ttest\t{"a":1}#{@default_newline}], d.formatted[0]
|
95
100
|
end
|
96
101
|
|
97
102
|
test 'no configuration error raised for basic configuration using "*" (v0.12 style)' do
|
@@ -296,11 +301,11 @@ class FileOutputTest < Test::Unit::TestCase
|
|
296
301
|
|
297
302
|
assert_equal 5, d.formatted.size
|
298
303
|
|
299
|
-
r1 = %!2016-10-03 23:58:09 +0000,my.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"my.data","time":"2016/10/04 08:58:09 +0900"}
|
300
|
-
r2 = %!2016-10-03 23:59:33 +0000,my.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"my.data","time":"2016/10/04 08:59:33 +0900"}
|
301
|
-
r3 = %!2016-10-03 23:59:57 +0000,your.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"your.data","time":"2016/10/04 08:59:57 +0900"}
|
302
|
-
r4 = %!2016-10-04 00:00:17 +0000,my.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"my.data","time":"2016/10/04 09:00:17 +0900"}
|
303
|
-
r5 = %!2016-10-04 00:01:59 +0000,your.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"your.data","time":"2016/10/04 09:01:59 +0900"}
|
304
|
+
r1 = %!2016-10-03 23:58:09 +0000,my.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"my.data","time":"2016/10/04 08:58:09 +0900"}#{@default_newline}!
|
305
|
+
r2 = %!2016-10-03 23:59:33 +0000,my.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"my.data","time":"2016/10/04 08:59:33 +0900"}#{@default_newline}!
|
306
|
+
r3 = %!2016-10-03 23:59:57 +0000,your.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"your.data","time":"2016/10/04 08:59:57 +0900"}#{@default_newline}!
|
307
|
+
r4 = %!2016-10-04 00:00:17 +0000,my.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"my.data","time":"2016/10/04 09:00:17 +0900"}#{@default_newline}!
|
308
|
+
r5 = %!2016-10-04 00:01:59 +0000,your.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"your.data","time":"2016/10/04 09:01:59 +0900"}#{@default_newline}!
|
304
309
|
assert_equal r1, d.formatted[0]
|
305
310
|
assert_equal r2, d.formatted[1]
|
306
311
|
assert_equal r3, d.formatted[2]
|
@@ -329,8 +334,8 @@ class FileOutputTest < Test::Unit::TestCase
|
|
329
334
|
d.feed(time, {"a"=>2})
|
330
335
|
end
|
331
336
|
assert_equal 2, d.formatted.size
|
332
|
-
assert_equal %[2011-01-02T13:14:15Z\ttest\t{"a":1}
|
333
|
-
assert_equal %[2011-01-02T13:14:15Z\ttest\t{"a":2}
|
337
|
+
assert_equal %[2011-01-02T13:14:15Z\ttest\t{"a":1}#{@default_newline}], d.formatted[0]
|
338
|
+
assert_equal %[2011-01-02T13:14:15Z\ttest\t{"a":2}#{@default_newline}], d.formatted[1]
|
334
339
|
end
|
335
340
|
|
336
341
|
test 'time formatted with specified timezone, using area name' do
|
@@ -344,7 +349,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
344
349
|
d.feed(time, {"a"=>1})
|
345
350
|
end
|
346
351
|
assert_equal 1, d.formatted.size
|
347
|
-
assert_equal %[2011-01-02T21:14:15+08:00\ttest\t{"a":1}
|
352
|
+
assert_equal %[2011-01-02T21:14:15+08:00\ttest\t{"a":1}#{@default_newline}], d.formatted[0]
|
348
353
|
end
|
349
354
|
|
350
355
|
test 'time formatted with specified timezone, using offset' do
|
@@ -358,7 +363,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
358
363
|
d.feed(time, {"a"=>1})
|
359
364
|
end
|
360
365
|
assert_equal 1, d.formatted.size
|
361
|
-
assert_equal %[2011-01-02T09:44:15-03:30\ttest\t{"a":1}
|
366
|
+
assert_equal %[2011-01-02T09:44:15-03:30\ttest\t{"a":1}#{@default_newline}], d.formatted[0]
|
362
367
|
end
|
363
368
|
|
364
369
|
test 'configuration error raised for invalid timezone' do
|
@@ -402,7 +407,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
402
407
|
end
|
403
408
|
|
404
409
|
assert File.exist?("#{TMP_DIR}/out_file_test.20110102_0.log.gz")
|
405
|
-
check_gzipped_result("#{TMP_DIR}/out_file_test.20110102_0.log.gz", %[2011-01-02T13:14:15Z\ttest\t{"a":1}
|
410
|
+
check_gzipped_result("#{TMP_DIR}/out_file_test.20110102_0.log.gz", %[2011-01-02T13:14:15Z\ttest\t{"a":1}#{@default_newline}] + %[2011-01-02T13:14:15Z\ttest\t{"a":2}#{@default_newline}])
|
406
411
|
end
|
407
412
|
end
|
408
413
|
|
@@ -469,7 +474,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
469
474
|
end
|
470
475
|
|
471
476
|
path = d.instance.last_written_path
|
472
|
-
check_gzipped_result(path, %[#{Yajl.dump({"a" => 1, 'time' => time.to_i})}
|
477
|
+
check_gzipped_result(path, %[#{Yajl.dump({"a" => 1, 'time' => time.to_i})}#{@default_newline}] + %[#{Yajl.dump({"a" => 2, 'time' => time.to_i})}#{@default_newline}])
|
473
478
|
end
|
474
479
|
|
475
480
|
test 'ltsv' do
|
@@ -482,7 +487,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
482
487
|
end
|
483
488
|
|
484
489
|
path = d.instance.last_written_path
|
485
|
-
check_gzipped_result(path, %[a:1\ttime:2011-01-02T13:14:15Z
|
490
|
+
check_gzipped_result(path, %[a:1\ttime:2011-01-02T13:14:15Z#{@default_newline}] + %[a:2\ttime:2011-01-02T13:14:15Z#{@default_newline}])
|
486
491
|
end
|
487
492
|
|
488
493
|
test 'single_value' do
|
@@ -495,13 +500,13 @@ class FileOutputTest < Test::Unit::TestCase
|
|
495
500
|
end
|
496
501
|
|
497
502
|
path = d.instance.last_written_path
|
498
|
-
check_gzipped_result(path, %[1
|
503
|
+
check_gzipped_result(path, %[1#{@default_newline}] + %[2#{@default_newline}])
|
499
504
|
end
|
500
505
|
end
|
501
506
|
|
502
507
|
test 'path with index number' do
|
503
508
|
time = event_time("2011-01-02 13:14:15 UTC")
|
504
|
-
formatted_lines = %[2011-01-02T13:14:15Z\ttest\t{"a":1}
|
509
|
+
formatted_lines = %[2011-01-02T13:14:15Z\ttest\t{"a":1}#{@default_newline}] + %[2011-01-02T13:14:15Z\ttest\t{"a":2}#{@default_newline}]
|
505
510
|
|
506
511
|
write_once = ->(){
|
507
512
|
d = create_driver
|
@@ -532,7 +537,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
532
537
|
|
533
538
|
test 'append' do
|
534
539
|
time = event_time("2011-01-02 13:14:15 UTC")
|
535
|
-
formatted_lines = %[2011-01-02T13:14:15Z\ttest\t{"a":1}
|
540
|
+
formatted_lines = %[2011-01-02T13:14:15Z\ttest\t{"a":1}#{@default_newline}] + %[2011-01-02T13:14:15Z\ttest\t{"a":2}#{@default_newline}]
|
536
541
|
|
537
542
|
write_once = ->(){
|
538
543
|
d = create_driver %[
|
@@ -567,7 +572,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
567
572
|
test 'append when JST' do
|
568
573
|
with_timezone(Fluent.windows? ? "JST-9" : "Asia/Tokyo") do
|
569
574
|
time = event_time("2011-01-02 03:14:15+09:00")
|
570
|
-
formatted_lines = %[2011-01-02T03:14:15+09:00\ttest\t{"a":1}
|
575
|
+
formatted_lines = %[2011-01-02T03:14:15+09:00\ttest\t{"a":1}#{@default_newline}] + %[2011-01-02T03:14:15+09:00\ttest\t{"a":2}#{@default_newline}]
|
571
576
|
|
572
577
|
write_once = ->(){
|
573
578
|
d = create_driver %[
|
@@ -603,7 +608,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
603
608
|
test 'append when UTC-02 but timekey_zone is +0900' do
|
604
609
|
with_timezone("UTC-02") do # +0200
|
605
610
|
time = event_time("2011-01-02 17:14:15+02:00")
|
606
|
-
formatted_lines = %[2011-01-02T17:14:15+02:00\ttest\t{"a":1}
|
611
|
+
formatted_lines = %[2011-01-02T17:14:15+02:00\ttest\t{"a":1}#{@default_newline}] + %[2011-01-02T17:14:15+02:00\ttest\t{"a":2}#{@default_newline}]
|
607
612
|
|
608
613
|
write_once = ->(){
|
609
614
|
d = create_driver %[
|
@@ -367,10 +367,31 @@ EOL
|
|
367
367
|
require_ack_response true
|
368
368
|
ack_response_timeout 2s
|
369
369
|
])
|
370
|
+
d.instance_start
|
370
371
|
assert d.instance.require_ack_response
|
371
372
|
assert_equal 2, d.instance.ack_response_timeout
|
372
373
|
end
|
373
374
|
|
375
|
+
test 'suspend_flush is disable before before_shutdown' do
|
376
|
+
@d = d = create_driver(CONFIG + %[
|
377
|
+
require_ack_response true
|
378
|
+
ack_response_timeout 2s
|
379
|
+
])
|
380
|
+
d.instance_start
|
381
|
+
assert_false d.instance.instance_variable_get(:@suspend_flush)
|
382
|
+
end
|
383
|
+
|
384
|
+
test 'suspend_flush should be enabled and try_flush returns nil after before_shutdown' do
|
385
|
+
@d = d = create_driver(CONFIG + %[
|
386
|
+
require_ack_response true
|
387
|
+
ack_response_timeout 2s
|
388
|
+
])
|
389
|
+
d.instance_start
|
390
|
+
d.instance.before_shutdown
|
391
|
+
assert_true d.instance.instance_variable_get(:@suspend_flush)
|
392
|
+
assert_nil d.instance.try_flush
|
393
|
+
end
|
394
|
+
|
374
395
|
test 'verify_connection_at_startup is disabled in default' do
|
375
396
|
@d = d = create_driver(CONFIG)
|
376
397
|
assert_false d.instance.verify_connection_at_startup
|
@@ -566,31 +587,88 @@ EOL
|
|
566
587
|
flush_mode immediate
|
567
588
|
retry_type periodic
|
568
589
|
retry_wait 30s
|
569
|
-
flush_at_shutdown
|
590
|
+
flush_at_shutdown true
|
570
591
|
</buffer>
|
571
592
|
])
|
572
593
|
|
573
594
|
time = event_time("2011-01-02 13:14:15 UTC")
|
574
595
|
|
575
596
|
acked_chunk_ids = []
|
597
|
+
nacked = false
|
576
598
|
mock.proxy(d.instance.ack_handler).read_ack_from_sock(anything) do |info, success|
|
577
599
|
if success
|
578
600
|
acked_chunk_ids << info.chunk_id
|
601
|
+
else
|
602
|
+
nacked = true
|
579
603
|
end
|
580
|
-
[
|
604
|
+
[info, success]
|
581
605
|
end
|
582
606
|
|
583
607
|
records = [
|
584
608
|
{"a" => 1},
|
585
609
|
{"a" => 2}
|
586
610
|
]
|
587
|
-
target_input_driver.run(expect_records: 2) do
|
588
|
-
d.end_if { acked_chunk_ids.size > 0 }
|
611
|
+
target_input_driver.run(expect_records: 2, timeout: 5) do
|
612
|
+
d.end_if { acked_chunk_ids.size > 0 || nacked }
|
589
613
|
d.run(default_tag: 'test', wait_flush_completion: false, shutdown: false) do
|
590
614
|
d.feed([[time, records[0]], [time,records[1]]])
|
591
615
|
end
|
592
616
|
end
|
593
617
|
|
618
|
+
assert(!nacked, d.instance.log.logs.join)
|
619
|
+
|
620
|
+
events = target_input_driver.events
|
621
|
+
assert_equal ['test', time, records[0]], events[0]
|
622
|
+
assert_equal ['test', time, records[1]], events[1]
|
623
|
+
|
624
|
+
assert_equal 1, acked_chunk_ids.size
|
625
|
+
assert_equal d.instance.sent_chunk_ids.first, acked_chunk_ids.first
|
626
|
+
end
|
627
|
+
|
628
|
+
test 'a node supporting responses after stop' do
|
629
|
+
target_input_driver = create_target_input_driver
|
630
|
+
|
631
|
+
@d = d = create_driver(CONFIG + %[
|
632
|
+
require_ack_response true
|
633
|
+
ack_response_timeout 1s
|
634
|
+
<buffer tag>
|
635
|
+
flush_mode immediate
|
636
|
+
retry_type periodic
|
637
|
+
retry_wait 30s
|
638
|
+
flush_at_shutdown true
|
639
|
+
</buffer>
|
640
|
+
])
|
641
|
+
|
642
|
+
time = event_time("2011-01-02 13:14:15 UTC")
|
643
|
+
|
644
|
+
acked_chunk_ids = []
|
645
|
+
nacked = false
|
646
|
+
mock.proxy(d.instance.ack_handler).read_ack_from_sock(anything) do |info, success|
|
647
|
+
if success
|
648
|
+
acked_chunk_ids << info.chunk_id
|
649
|
+
else
|
650
|
+
nacked = true
|
651
|
+
end
|
652
|
+
[info, success]
|
653
|
+
end
|
654
|
+
|
655
|
+
records = [
|
656
|
+
{"a" => 1},
|
657
|
+
{"a" => 2}
|
658
|
+
]
|
659
|
+
target_input_driver.run(expect_records: 2, timeout: 5) do
|
660
|
+
d.end_if { acked_chunk_ids.size > 0 || nacked }
|
661
|
+
d.run(default_tag: 'test', wait_flush_completion: false, shutdown: false) do
|
662
|
+
d.instance.stop
|
663
|
+
d.feed([[time, records[0]], [time,records[1]]])
|
664
|
+
d.instance.before_shutdown
|
665
|
+
d.instance.shutdown
|
666
|
+
d.instance.after_shutdown
|
667
|
+
end
|
668
|
+
end
|
669
|
+
|
670
|
+
assert(!nacked, d.instance.log.logs.join)
|
671
|
+
|
594
672
|
events = target_input_driver.events
|
595
673
|
assert_equal ['test', time, records[0]], events[0]
|
596
674
|
assert_equal ['test', time, records[1]], events[1]
|
@@ -995,7 +1073,7 @@ EOL
|
|
995
1073
|
test 'when out_forward has @id' do
|
996
1074
|
# cancel https://github.com/fluent/fluentd/blob/077508ac817b7637307434d0c978d7cdc3d1c534/lib/fluent/plugin_id.rb#L43-L53
|
997
1075
|
# it always return true in test
|
998
|
-
mock.proxy(Fluent::Plugin).new_sd(:static, anything) { |v|
|
1076
|
+
mock.proxy(Fluent::Plugin).new_sd(:static, parent: anything) { |v|
|
999
1077
|
stub(v).plugin_id_for_test? { false }
|
1000
1078
|
}.once
|
1001
1079
|
|
@@ -1137,6 +1215,8 @@ EOL
|
|
1137
1215
|
end
|
1138
1216
|
|
1139
1217
|
test 'Create new connection per send_data' do
|
1218
|
+
omit "Proxy of RR doesn't support kwargs of Ruby 3 yet" if RUBY_VERSION.split('.')[0].to_i >= 3
|
1219
|
+
|
1140
1220
|
target_input_driver = create_target_input_driver(conf: TARGET_CONFIG)
|
1141
1221
|
output_conf = CONFIG
|
1142
1222
|
d = create_driver(output_conf)
|
@@ -1175,6 +1255,8 @@ EOL
|
|
1175
1255
|
|
1176
1256
|
sub_test_case 'keepalive' do
|
1177
1257
|
test 'Do not create connection per send_data' do
|
1258
|
+
omit "Proxy of RR doesn't support kwargs of Ruby 3 yet" if RUBY_VERSION.split('.')[0].to_i >= 3
|
1259
|
+
|
1178
1260
|
target_input_driver = create_target_input_driver(conf: TARGET_CONFIG)
|
1179
1261
|
output_conf = CONFIG + %[
|
1180
1262
|
keepalive true
|
@@ -1222,7 +1304,13 @@ EOL
|
|
1222
1304
|
|
1223
1305
|
begin
|
1224
1306
|
chunk = Fluent::Plugin::Buffer::MemoryChunk.new(Fluent::Plugin::Buffer::Metadata.new(nil, nil, nil))
|
1225
|
-
mock.proxy(d.instance).socket_create_tcp(TARGET_HOST, TARGET_PORT,
|
1307
|
+
mock.proxy(d.instance).socket_create_tcp(TARGET_HOST, TARGET_PORT,
|
1308
|
+
linger_timeout: anything,
|
1309
|
+
send_timeout: anything,
|
1310
|
+
recv_timeout: anything,
|
1311
|
+
connect_timeout: anything) { |sock|
|
1312
|
+
mock(sock).close.once; sock
|
1313
|
+
}.twice
|
1226
1314
|
|
1227
1315
|
target_input_driver.run(timeout: 15) do
|
1228
1316
|
d.run(shutdown: false) do
|
@@ -127,7 +127,7 @@ class HTTPOutputTest < Test::Unit::TestCase
|
|
127
127
|
now = Time.now
|
128
128
|
started = false
|
129
129
|
until started
|
130
|
-
raise "Server not started" if (now -
|
130
|
+
raise "Server not started" if (Time.now - now > 10.0)
|
131
131
|
begin
|
132
132
|
http_client { |c| c.request_get('/') }
|
133
133
|
started = true
|
@@ -280,6 +280,25 @@ class HTTPOutputTest < Test::Unit::TestCase
|
|
280
280
|
assert_equal "fluentd!", result.headers['test_header']
|
281
281
|
end
|
282
282
|
|
283
|
+
def test_write_with_headers_from_placeholders
|
284
|
+
d = create_driver(config + %[
|
285
|
+
headers_from_placeholders {"x-test":"${$.foo.bar}-test","x-tag":"${tag}"}
|
286
|
+
<buffer tag,$.foo.bar>
|
287
|
+
</buffer>
|
288
|
+
])
|
289
|
+
d.run(default_tag: 'test.http') do
|
290
|
+
test_events.each { |event|
|
291
|
+
ev = event.dup
|
292
|
+
ev['foo'] = {'bar' => 'abcd'}
|
293
|
+
d.feed(ev)
|
294
|
+
}
|
295
|
+
end
|
296
|
+
|
297
|
+
result = @@result
|
298
|
+
assert_equal "abcd-test", result.headers['x-test']
|
299
|
+
assert_equal "test.http", result.headers['x-tag']
|
300
|
+
end
|
301
|
+
|
283
302
|
def test_write_with_retryable_response
|
284
303
|
old_report_on_exception = Thread.report_on_exception
|
285
304
|
Thread.report_on_exception = false # thread finished as invalid state since RetryableResponse raises.
|
data/test/plugin/test_output.rb
CHANGED
@@ -390,6 +390,18 @@ class OutputTest < Test::Unit::TestCase
|
|
390
390
|
assert { logs.none? { |log| log.include?("${chunk_id}") } }
|
391
391
|
end
|
392
392
|
|
393
|
+
test '#extract_placeholders does not log for ${chunk_id} placeholder (with @chunk_keys)' do
|
394
|
+
@i.configure(config_element('ROOT', '', {}, [config_element('buffer', 'key1')]))
|
395
|
+
tmpl = "/mypath/${chunk_id}/${key1}/tail"
|
396
|
+
t = event_time('2016-04-11 20:30:00 +0900')
|
397
|
+
v = {key1: "value1", key2: "value2"}
|
398
|
+
c = create_chunk(timekey: t, tag: 'fluentd.test.output', variables: v)
|
399
|
+
@i.log.out.logs.clear
|
400
|
+
@i.extract_placeholders(tmpl, c)
|
401
|
+
logs = @i.log.out.logs
|
402
|
+
assert { logs.none? { |log| log.include?("${chunk_id}") } }
|
403
|
+
end
|
404
|
+
|
393
405
|
test '#extract_placeholders logs warn message with not replaced key' do
|
394
406
|
@i.configure(config_element('ROOT', '', {}, [config_element('buffer', '')]))
|
395
407
|
tmpl = "/mypath/${key1}/test"
|
@@ -868,7 +880,7 @@ class OutputTest < Test::Unit::TestCase
|
|
868
880
|
test "Warn if primary type is different from secondary type and either primary or secondary has custom_format" do
|
869
881
|
o = create_output(:buffered)
|
870
882
|
mock(o.log).warn("Use different plugin for secondary. Check the plugin works with primary like secondary_file",
|
871
|
-
|
883
|
+
primary: o.class.to_s, secondary: "Fluent::Plugin::TestOutput")
|
872
884
|
|
873
885
|
o.configure(config_element('ROOT','',{},[config_element('secondary','',{'@type'=>'test', 'name' => "cool"})]))
|
874
886
|
assert_not_nil o.instance_variable_get(:@secondary)
|
@@ -877,7 +889,7 @@ class OutputTest < Test::Unit::TestCase
|
|
877
889
|
test "don't warn if primary type is the same as secondary type" do
|
878
890
|
o = Fluent::Plugin::TestOutput.new
|
879
891
|
mock(o.log).warn("Use different plugin for secondary. Check the plugin works with primary like secondary_file",
|
880
|
-
|
892
|
+
primary: o.class.to_s, secondary: "Fluent::Plugin::TestOutput" ).never
|
881
893
|
|
882
894
|
o.configure(config_element('ROOT','',{'name' => "cool2"},
|
883
895
|
[config_element('secondary','',{'@type'=>'test', 'name' => "cool"}),
|
@@ -889,7 +901,7 @@ class OutputTest < Test::Unit::TestCase
|
|
889
901
|
test "don't warn if primary type is different from secondary type and both don't have custom_format" do
|
890
902
|
o = create_output(:standard)
|
891
903
|
mock(o.log).warn("Use different plugin for secondary. Check the plugin works with primary like secondary_file",
|
892
|
-
|
904
|
+
primary: o.class.to_s, secondary: "Fluent::Plugin::TestOutput").never
|
893
905
|
|
894
906
|
o.configure(config_element('ROOT','',{},[config_element('secondary','',{'@type'=>'test', 'name' => "cool"})]))
|
895
907
|
assert_not_nil o.instance_variable_get(:@secondary)
|