fluentd 0.14.4-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 +7 -0
- data/.github/ISSUE_TEMPLATE.md +6 -0
- data/.gitignore +26 -0
- data/.travis.yml +45 -0
- data/AUTHORS +2 -0
- data/CONTRIBUTING.md +35 -0
- data/COPYING +14 -0
- data/ChangeLog +276 -0
- data/Gemfile +9 -0
- data/README.md +51 -0
- data/Rakefile +53 -0
- data/Vagrantfile +17 -0
- data/appveyor.yml +41 -0
- data/bin/fluent-debug +5 -0
- data/example/copy_roundrobin.conf +39 -0
- data/example/filter_stdout.conf +22 -0
- data/example/in_forward.conf +11 -0
- data/example/in_http.conf +14 -0
- data/example/in_out_forward.conf +17 -0
- data/example/in_syslog.conf +15 -0
- data/example/in_tail.conf +14 -0
- data/example/in_tcp.conf +13 -0
- data/example/in_udp.conf +13 -0
- data/example/multi_filters.conf +61 -0
- data/example/out_buffered_null.conf +32 -0
- data/example/out_copy.conf +20 -0
- data/example/out_file.conf +13 -0
- data/example/out_forward.conf +35 -0
- data/example/out_forward_buf_file.conf +23 -0
- data/example/v0_12_filter.conf +78 -0
- data/example/v1_literal_example.conf +36 -0
- data/fluent.conf +139 -0
- data/fluentd.gemspec +51 -0
- data/lib/fluent/agent.rb +194 -0
- data/lib/fluent/command/bundler_injection.rb +45 -0
- data/lib/fluent/command/cat.rb +319 -0
- data/lib/fluent/command/debug.rb +102 -0
- data/lib/fluent/command/fluentd.rb +273 -0
- data/lib/fluent/compat/call_super_mixin.rb +67 -0
- data/lib/fluent/compat/exec_util.rb +129 -0
- data/lib/fluent/compat/file_util.rb +54 -0
- data/lib/fluent/compat/filter.rb +68 -0
- data/lib/fluent/compat/formatter.rb +111 -0
- data/lib/fluent/compat/formatter_utils.rb +85 -0
- data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
- data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
- data/lib/fluent/compat/input.rb +49 -0
- data/lib/fluent/compat/output.rb +677 -0
- data/lib/fluent/compat/output_chain.rb +60 -0
- data/lib/fluent/compat/parser.rb +180 -0
- data/lib/fluent/compat/parser_utils.rb +40 -0
- data/lib/fluent/compat/propagate_default.rb +62 -0
- data/lib/fluent/compat/record_filter_mixin.rb +34 -0
- data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
- data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
- data/lib/fluent/compat/socket_util.rb +165 -0
- data/lib/fluent/compat/string_util.rb +34 -0
- data/lib/fluent/compat/structured_format_mixin.rb +26 -0
- data/lib/fluent/compat/type_converter.rb +90 -0
- data/lib/fluent/config.rb +56 -0
- data/lib/fluent/config/basic_parser.rb +123 -0
- data/lib/fluent/config/configure_proxy.rb +366 -0
- data/lib/fluent/config/dsl.rb +149 -0
- data/lib/fluent/config/element.rb +218 -0
- data/lib/fluent/config/error.rb +26 -0
- data/lib/fluent/config/literal_parser.rb +251 -0
- data/lib/fluent/config/parser.rb +107 -0
- data/lib/fluent/config/section.rb +212 -0
- data/lib/fluent/config/types.rb +136 -0
- data/lib/fluent/config/v1_parser.rb +190 -0
- data/lib/fluent/configurable.rb +176 -0
- data/lib/fluent/daemon.rb +15 -0
- data/lib/fluent/engine.rb +220 -0
- data/lib/fluent/env.rb +27 -0
- data/lib/fluent/event.rb +287 -0
- data/lib/fluent/event_router.rb +259 -0
- data/lib/fluent/filter.rb +21 -0
- data/lib/fluent/formatter.rb +23 -0
- data/lib/fluent/input.rb +21 -0
- data/lib/fluent/label.rb +38 -0
- data/lib/fluent/load.rb +36 -0
- data/lib/fluent/log.rb +445 -0
- data/lib/fluent/match.rb +141 -0
- data/lib/fluent/mixin.rb +31 -0
- data/lib/fluent/msgpack_factory.rb +62 -0
- data/lib/fluent/output.rb +26 -0
- data/lib/fluent/output_chain.rb +23 -0
- data/lib/fluent/parser.rb +23 -0
- data/lib/fluent/plugin.rb +161 -0
- data/lib/fluent/plugin/bare_output.rb +63 -0
- data/lib/fluent/plugin/base.rb +130 -0
- data/lib/fluent/plugin/buf_file.rb +154 -0
- data/lib/fluent/plugin/buf_memory.rb +34 -0
- data/lib/fluent/plugin/buffer.rb +603 -0
- data/lib/fluent/plugin/buffer/chunk.rb +160 -0
- data/lib/fluent/plugin/buffer/file_chunk.rb +323 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
- data/lib/fluent/plugin/exec_util.rb +22 -0
- data/lib/fluent/plugin/file_util.rb +22 -0
- data/lib/fluent/plugin/file_wrapper.rb +120 -0
- data/lib/fluent/plugin/filter.rb +93 -0
- data/lib/fluent/plugin/filter_grep.rb +75 -0
- data/lib/fluent/plugin/filter_record_transformer.rb +342 -0
- data/lib/fluent/plugin/filter_stdout.rb +53 -0
- data/lib/fluent/plugin/formatter.rb +45 -0
- data/lib/fluent/plugin/formatter_csv.rb +47 -0
- data/lib/fluent/plugin/formatter_hash.rb +29 -0
- data/lib/fluent/plugin/formatter_json.rb +44 -0
- data/lib/fluent/plugin/formatter_ltsv.rb +41 -0
- data/lib/fluent/plugin/formatter_msgpack.rb +29 -0
- data/lib/fluent/plugin/formatter_out_file.rb +78 -0
- data/lib/fluent/plugin/formatter_single_value.rb +34 -0
- data/lib/fluent/plugin/formatter_stdout.rb +74 -0
- data/lib/fluent/plugin/in_debug_agent.rb +64 -0
- data/lib/fluent/plugin/in_dummy.rb +135 -0
- data/lib/fluent/plugin/in_exec.rb +149 -0
- data/lib/fluent/plugin/in_forward.rb +366 -0
- data/lib/fluent/plugin/in_gc_stat.rb +52 -0
- data/lib/fluent/plugin/in_http.rb +422 -0
- data/lib/fluent/plugin/in_monitor_agent.rb +401 -0
- data/lib/fluent/plugin/in_object_space.rb +90 -0
- data/lib/fluent/plugin/in_syslog.rb +204 -0
- data/lib/fluent/plugin/in_tail.rb +838 -0
- data/lib/fluent/plugin/in_tcp.rb +41 -0
- data/lib/fluent/plugin/in_udp.rb +37 -0
- data/lib/fluent/plugin/in_unix.rb +201 -0
- data/lib/fluent/plugin/input.rb +33 -0
- data/lib/fluent/plugin/multi_output.rb +95 -0
- data/lib/fluent/plugin/out_buffered_null.rb +59 -0
- data/lib/fluent/plugin/out_buffered_stdout.rb +70 -0
- data/lib/fluent/plugin/out_copy.rb +42 -0
- data/lib/fluent/plugin/out_exec.rb +114 -0
- data/lib/fluent/plugin/out_exec_filter.rb +393 -0
- data/lib/fluent/plugin/out_file.rb +167 -0
- data/lib/fluent/plugin/out_forward.rb +646 -0
- data/lib/fluent/plugin/out_null.rb +27 -0
- data/lib/fluent/plugin/out_relabel.rb +28 -0
- data/lib/fluent/plugin/out_roundrobin.rb +80 -0
- data/lib/fluent/plugin/out_stdout.rb +48 -0
- data/lib/fluent/plugin/out_stream.rb +130 -0
- data/lib/fluent/plugin/output.rb +1020 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
- data/lib/fluent/plugin/parser.rb +175 -0
- data/lib/fluent/plugin/parser_apache.rb +28 -0
- data/lib/fluent/plugin/parser_apache2.rb +84 -0
- data/lib/fluent/plugin/parser_apache_error.rb +26 -0
- data/lib/fluent/plugin/parser_csv.rb +33 -0
- data/lib/fluent/plugin/parser_json.rb +79 -0
- data/lib/fluent/plugin/parser_ltsv.rb +50 -0
- data/lib/fluent/plugin/parser_multiline.rb +104 -0
- data/lib/fluent/plugin/parser_nginx.rb +28 -0
- data/lib/fluent/plugin/parser_none.rb +36 -0
- data/lib/fluent/plugin/parser_regexp.rb +73 -0
- data/lib/fluent/plugin/parser_syslog.rb +82 -0
- data/lib/fluent/plugin/parser_tsv.rb +37 -0
- data/lib/fluent/plugin/socket_util.rb +22 -0
- data/lib/fluent/plugin/storage.rb +84 -0
- data/lib/fluent/plugin/storage_local.rb +132 -0
- data/lib/fluent/plugin/string_util.rb +22 -0
- data/lib/fluent/plugin_helper.rb +42 -0
- data/lib/fluent/plugin_helper/child_process.rb +298 -0
- data/lib/fluent/plugin_helper/compat_parameters.rb +224 -0
- data/lib/fluent/plugin_helper/event_emitter.rb +80 -0
- data/lib/fluent/plugin_helper/event_loop.rb +118 -0
- data/lib/fluent/plugin_helper/formatter.rb +149 -0
- data/lib/fluent/plugin_helper/inject.rb +125 -0
- data/lib/fluent/plugin_helper/parser.rb +147 -0
- data/lib/fluent/plugin_helper/retry_state.rb +177 -0
- data/lib/fluent/plugin_helper/storage.rb +331 -0
- data/lib/fluent/plugin_helper/thread.rb +147 -0
- data/lib/fluent/plugin_helper/timer.rb +90 -0
- data/lib/fluent/plugin_id.rb +63 -0
- data/lib/fluent/process.rb +504 -0
- data/lib/fluent/registry.rb +99 -0
- data/lib/fluent/root_agent.rb +314 -0
- data/lib/fluent/rpc.rb +94 -0
- data/lib/fluent/supervisor.rb +680 -0
- data/lib/fluent/system_config.rb +122 -0
- data/lib/fluent/test.rb +56 -0
- data/lib/fluent/test/base.rb +85 -0
- data/lib/fluent/test/driver/base.rb +179 -0
- data/lib/fluent/test/driver/base_owned.rb +70 -0
- data/lib/fluent/test/driver/base_owner.rb +125 -0
- data/lib/fluent/test/driver/event_feeder.rb +98 -0
- data/lib/fluent/test/driver/filter.rb +57 -0
- data/lib/fluent/test/driver/formatter.rb +30 -0
- data/lib/fluent/test/driver/input.rb +31 -0
- data/lib/fluent/test/driver/multi_output.rb +52 -0
- data/lib/fluent/test/driver/output.rb +76 -0
- data/lib/fluent/test/driver/parser.rb +30 -0
- data/lib/fluent/test/driver/test_event_router.rb +45 -0
- data/lib/fluent/test/filter_test.rb +77 -0
- data/lib/fluent/test/formatter_test.rb +65 -0
- data/lib/fluent/test/helpers.rb +79 -0
- data/lib/fluent/test/input_test.rb +172 -0
- data/lib/fluent/test/log.rb +73 -0
- data/lib/fluent/test/output_test.rb +156 -0
- data/lib/fluent/test/parser_test.rb +70 -0
- data/lib/fluent/time.rb +175 -0
- data/lib/fluent/timezone.rb +133 -0
- data/lib/fluent/unique_id.rb +39 -0
- data/lib/fluent/version.rb +21 -0
- data/lib/fluent/winsvc.rb +71 -0
- data/test/compat/test_calls_super.rb +166 -0
- data/test/compat/test_parser.rb +82 -0
- data/test/config/assertions.rb +42 -0
- data/test/config/test_config_parser.rb +507 -0
- data/test/config/test_configurable.rb +1194 -0
- data/test/config/test_configure_proxy.rb +386 -0
- data/test/config/test_dsl.rb +415 -0
- data/test/config/test_element.rb +403 -0
- data/test/config/test_literal_parser.rb +297 -0
- data/test/config/test_section.rb +184 -0
- data/test/config/test_system_config.rb +120 -0
- data/test/config/test_types.rb +171 -0
- data/test/helper.rb +119 -0
- data/test/plugin/data/2010/01/20100102-030405.log +0 -0
- data/test/plugin/data/2010/01/20100102-030406.log +0 -0
- data/test/plugin/data/2010/01/20100102.log +0 -0
- data/test/plugin/data/log/bar +0 -0
- data/test/plugin/data/log/foo/bar.log +0 -0
- data/test/plugin/data/log/test.log +0 -0
- data/test/plugin/test_bare_output.rb +118 -0
- data/test/plugin/test_base.rb +75 -0
- data/test/plugin/test_buf_file.rb +571 -0
- data/test/plugin/test_buf_memory.rb +42 -0
- data/test/plugin/test_buffer.rb +1200 -0
- data/test/plugin/test_buffer_chunk.rb +168 -0
- data/test/plugin/test_buffer_file_chunk.rb +771 -0
- data/test/plugin/test_buffer_memory_chunk.rb +265 -0
- data/test/plugin/test_file_util.rb +96 -0
- data/test/plugin/test_filter.rb +353 -0
- data/test/plugin/test_filter_grep.rb +119 -0
- data/test/plugin/test_filter_record_transformer.rb +600 -0
- data/test/plugin/test_filter_stdout.rb +211 -0
- data/test/plugin/test_formatter_csv.rb +94 -0
- data/test/plugin/test_formatter_json.rb +30 -0
- data/test/plugin/test_formatter_ltsv.rb +52 -0
- data/test/plugin/test_formatter_msgpack.rb +28 -0
- data/test/plugin/test_formatter_out_file.rb +95 -0
- data/test/plugin/test_formatter_single_value.rb +38 -0
- data/test/plugin/test_in_debug_agent.rb +28 -0
- data/test/plugin/test_in_dummy.rb +188 -0
- data/test/plugin/test_in_exec.rb +133 -0
- data/test/plugin/test_in_forward.rb +635 -0
- data/test/plugin/test_in_gc_stat.rb +39 -0
- data/test/plugin/test_in_http.rb +442 -0
- data/test/plugin/test_in_monitor_agent.rb +329 -0
- data/test/plugin/test_in_object_space.rb +64 -0
- data/test/plugin/test_in_syslog.rb +205 -0
- data/test/plugin/test_in_tail.rb +1001 -0
- data/test/plugin/test_in_tcp.rb +102 -0
- data/test/plugin/test_in_udp.rb +121 -0
- data/test/plugin/test_in_unix.rb +126 -0
- data/test/plugin/test_input.rb +122 -0
- data/test/plugin/test_multi_output.rb +180 -0
- data/test/plugin/test_out_buffered_null.rb +79 -0
- data/test/plugin/test_out_buffered_stdout.rb +122 -0
- data/test/plugin/test_out_copy.rb +160 -0
- data/test/plugin/test_out_exec.rb +155 -0
- data/test/plugin/test_out_exec_filter.rb +262 -0
- data/test/plugin/test_out_file.rb +383 -0
- data/test/plugin/test_out_forward.rb +590 -0
- data/test/plugin/test_out_null.rb +29 -0
- data/test/plugin/test_out_relabel.rb +28 -0
- data/test/plugin/test_out_roundrobin.rb +146 -0
- data/test/plugin/test_out_stdout.rb +92 -0
- data/test/plugin/test_out_stream.rb +93 -0
- data/test/plugin/test_output.rb +568 -0
- data/test/plugin/test_output_as_buffered.rb +1604 -0
- data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
- data/test/plugin/test_output_as_buffered_retries.rb +839 -0
- data/test/plugin/test_output_as_buffered_secondary.rb +817 -0
- data/test/plugin/test_output_as_standard.rb +374 -0
- data/test/plugin/test_owned_by.rb +35 -0
- data/test/plugin/test_parser_apache.rb +42 -0
- data/test/plugin/test_parser_apache2.rb +38 -0
- data/test/plugin/test_parser_apache_error.rb +45 -0
- data/test/plugin/test_parser_base.rb +32 -0
- data/test/plugin/test_parser_csv.rb +104 -0
- data/test/plugin/test_parser_json.rb +107 -0
- data/test/plugin/test_parser_labeled_tsv.rb +129 -0
- data/test/plugin/test_parser_multiline.rb +100 -0
- data/test/plugin/test_parser_nginx.rb +48 -0
- data/test/plugin/test_parser_none.rb +53 -0
- data/test/plugin/test_parser_regexp.rb +277 -0
- data/test/plugin/test_parser_syslog.rb +66 -0
- data/test/plugin/test_parser_time.rb +46 -0
- data/test/plugin/test_parser_tsv.rb +121 -0
- data/test/plugin/test_storage.rb +167 -0
- data/test/plugin/test_storage_local.rb +8 -0
- data/test/plugin/test_string_util.rb +26 -0
- data/test/plugin_helper/test_child_process.rb +608 -0
- data/test/plugin_helper/test_compat_parameters.rb +242 -0
- data/test/plugin_helper/test_event_emitter.rb +51 -0
- data/test/plugin_helper/test_event_loop.rb +52 -0
- data/test/plugin_helper/test_formatter.rb +252 -0
- data/test/plugin_helper/test_inject.rb +487 -0
- data/test/plugin_helper/test_parser.rb +263 -0
- data/test/plugin_helper/test_retry_state.rb +399 -0
- data/test/plugin_helper/test_storage.rb +521 -0
- data/test/plugin_helper/test_thread.rb +164 -0
- data/test/plugin_helper/test_timer.rb +131 -0
- data/test/scripts/exec_script.rb +32 -0
- data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
- data/test/scripts/fluent/plugin/out_test.rb +81 -0
- data/test/scripts/fluent/plugin/out_test2.rb +80 -0
- data/test/scripts/fluent/plugin/parser_known.rb +4 -0
- data/test/test_config.rb +179 -0
- data/test/test_configdsl.rb +148 -0
- data/test/test_event.rb +329 -0
- data/test/test_event_router.rb +331 -0
- data/test/test_event_time.rb +184 -0
- data/test/test_filter.rb +121 -0
- data/test/test_formatter.rb +319 -0
- data/test/test_input.rb +31 -0
- data/test/test_log.rb +572 -0
- data/test/test_match.rb +137 -0
- data/test/test_mixin.rb +351 -0
- data/test/test_output.rb +214 -0
- data/test/test_plugin_classes.rb +136 -0
- data/test/test_plugin_helper.rb +81 -0
- data/test/test_process.rb +48 -0
- data/test/test_root_agent.rb +278 -0
- data/test/test_supervisor.rb +339 -0
- data/test/test_time_formatter.rb +186 -0
- data/test/test_unique_id.rb +47 -0
- metadata +823 -0
@@ -0,0 +1,590 @@
|
|
1
|
+
require_relative '../helper'
|
2
|
+
require 'fluent/test'
|
3
|
+
require 'fluent/plugin/out_forward'
|
4
|
+
|
5
|
+
class ForwardOutputTest < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
Fluent::Test.setup
|
8
|
+
end
|
9
|
+
|
10
|
+
TARGET_HOST = '127.0.0.1'
|
11
|
+
TARGET_PORT = 13999
|
12
|
+
CONFIG = %[
|
13
|
+
send_timeout 51
|
14
|
+
heartbeat_type udp
|
15
|
+
<server>
|
16
|
+
name test
|
17
|
+
host #{TARGET_HOST}
|
18
|
+
port #{TARGET_PORT}
|
19
|
+
</server>
|
20
|
+
]
|
21
|
+
|
22
|
+
TARGET_CONFIG = %[
|
23
|
+
port #{TARGET_PORT}
|
24
|
+
bind #{TARGET_HOST}
|
25
|
+
]
|
26
|
+
|
27
|
+
def create_driver(conf=CONFIG)
|
28
|
+
Fluent::Test::BufferedOutputTestDriver.new(Fluent::ForwardOutput) {
|
29
|
+
attr_reader :responses, :exceptions
|
30
|
+
|
31
|
+
def initialize
|
32
|
+
super
|
33
|
+
@responses = []
|
34
|
+
@exceptions = []
|
35
|
+
end
|
36
|
+
|
37
|
+
def send_data(node, tag, chunk)
|
38
|
+
# Original #send_data returns nil when it does not wait for responses or when on response timeout.
|
39
|
+
@responses << super(node, tag, chunk)
|
40
|
+
rescue => e
|
41
|
+
@exceptions << e
|
42
|
+
raise e
|
43
|
+
end
|
44
|
+
}.configure(conf)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_configure
|
48
|
+
d = create_driver(%[
|
49
|
+
<server>
|
50
|
+
name test
|
51
|
+
host #{TARGET_HOST}
|
52
|
+
port #{TARGET_PORT}
|
53
|
+
</server>
|
54
|
+
])
|
55
|
+
nodes = d.instance.nodes
|
56
|
+
assert_equal 60, d.instance.send_timeout
|
57
|
+
assert_equal :tcp, d.instance.heartbeat_type
|
58
|
+
assert_equal 1, nodes.length
|
59
|
+
node = nodes.first
|
60
|
+
assert_equal "test", node.name
|
61
|
+
assert_equal '127.0.0.1', node.host
|
62
|
+
assert_equal 13999, node.port
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_configure_udp_heartbeat
|
66
|
+
d = create_driver(CONFIG + "\nheartbeat_type udp")
|
67
|
+
assert_equal :udp, d.instance.heartbeat_type
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_configure_none_heartbeat
|
71
|
+
d = create_driver(CONFIG + "\nheartbeat_type none")
|
72
|
+
assert_equal :none, d.instance.heartbeat_type
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_configure_dns_round_robin
|
76
|
+
assert_raise(Fluent::ConfigError) do
|
77
|
+
create_driver(CONFIG + "\nheartbeat_type udp\ndns_round_robin true")
|
78
|
+
end
|
79
|
+
|
80
|
+
d = create_driver(CONFIG + "\nheartbeat_type tcp\ndns_round_robin true")
|
81
|
+
assert_equal true, d.instance.dns_round_robin
|
82
|
+
assert_equal true, d.instance.nodes.first.conf.dns_round_robin
|
83
|
+
|
84
|
+
d = create_driver(CONFIG + "\nheartbeat_type none\ndns_round_robin true")
|
85
|
+
assert_equal true, d.instance.dns_round_robin
|
86
|
+
assert_equal true, d.instance.nodes.first.conf.dns_round_robin
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_configure_no_server
|
90
|
+
assert_raise(Fluent::ConfigError, 'forward output plugin requires at least one <server> is required') do
|
91
|
+
create_driver('')
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_phi_failure_detector
|
96
|
+
d = create_driver(CONFIG + %[phi_failure_detector false \n phi_threshold 0])
|
97
|
+
node = d.instance.nodes.first
|
98
|
+
stub(node.failure).phi { raise 'Should not be called' }
|
99
|
+
node.tick
|
100
|
+
assert_equal node.available, true
|
101
|
+
|
102
|
+
d = create_driver(CONFIG + %[phi_failure_detector true \n phi_threshold 0])
|
103
|
+
node = d.instance.nodes.first
|
104
|
+
node.tick
|
105
|
+
assert_equal node.available, false
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_wait_response_timeout_config
|
109
|
+
d = create_driver(CONFIG)
|
110
|
+
assert_equal false, d.instance.require_ack_response
|
111
|
+
assert_equal 190, d.instance.ack_response_timeout
|
112
|
+
|
113
|
+
d = create_driver(CONFIG + %[
|
114
|
+
require_ack_response true
|
115
|
+
ack_response_timeout 2s
|
116
|
+
])
|
117
|
+
assert d.instance.require_ack_response
|
118
|
+
assert_equal 2, d.instance.ack_response_timeout
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_sending_contains_with_ack
|
122
|
+
target_input_driver = create_target_input_driver(true)
|
123
|
+
|
124
|
+
d = create_driver(CONFIG + %[
|
125
|
+
ack_response_timeout 1s
|
126
|
+
])
|
127
|
+
|
128
|
+
time = Time.parse("2011-01-02 13:14:15 UTC").to_i
|
129
|
+
|
130
|
+
records = [
|
131
|
+
{"a" => 1},
|
132
|
+
{"a" => 2}
|
133
|
+
]
|
134
|
+
d.register_run_post_condition do
|
135
|
+
d.instance.responses.length == 1
|
136
|
+
end
|
137
|
+
|
138
|
+
target_input_driver.run do
|
139
|
+
d.run do
|
140
|
+
records.each do |record|
|
141
|
+
d.emit record, time
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
emits = target_input_driver.emits
|
147
|
+
assert_equal ['test', time, records[0]], emits[0]
|
148
|
+
assert_equal ['test', time, records[1]], emits[1]
|
149
|
+
|
150
|
+
assert_equal target_input_driver.instance.received_options[0]['size'], 2
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_sending_contains_without_ack
|
154
|
+
target_input_driver = create_target_input_driver(true)
|
155
|
+
|
156
|
+
d = create_driver(CONFIG + %[
|
157
|
+
ack_response_timeout 1s
|
158
|
+
])
|
159
|
+
|
160
|
+
time = Time.parse("2011-01-02 13:14:15 UTC").to_i
|
161
|
+
|
162
|
+
records = [
|
163
|
+
{"a" => 1},
|
164
|
+
{"a" => 2}
|
165
|
+
]
|
166
|
+
d.register_run_post_condition do
|
167
|
+
d.instance.responses.length == 1
|
168
|
+
end
|
169
|
+
|
170
|
+
target_input_driver.run do
|
171
|
+
d.run do
|
172
|
+
records.each do |record|
|
173
|
+
d.emit record, time
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
emits = target_input_driver.emits
|
179
|
+
assert_equal ['test', time, records[0]], emits[0]
|
180
|
+
assert_equal ['test', time, records[1]], emits[1]
|
181
|
+
|
182
|
+
assert_equal target_input_driver.instance.received_options[0]['size'], 2
|
183
|
+
end
|
184
|
+
|
185
|
+
def test_send_with_time_as_integer
|
186
|
+
target_input_driver = create_target_input_driver
|
187
|
+
|
188
|
+
d = create_driver(CONFIG + %[flush_interval 1s])
|
189
|
+
|
190
|
+
time = Fluent::EventTime.parse("2011-01-02 13:14:15 UTC")
|
191
|
+
|
192
|
+
records = [
|
193
|
+
{"a" => 1},
|
194
|
+
{"a" => 2}
|
195
|
+
]
|
196
|
+
d.register_run_post_condition do
|
197
|
+
d.instance.responses.length == 1
|
198
|
+
end
|
199
|
+
|
200
|
+
target_input_driver.run do
|
201
|
+
d.run do
|
202
|
+
records.each do |record|
|
203
|
+
d.emit record, time
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
emits = target_input_driver.emits
|
209
|
+
assert_equal ['test', time, records[0]], emits[0]
|
210
|
+
assert_equal ['test', time, records[1]], emits[1]
|
211
|
+
assert(emits[0][1].is_a?(Integer))
|
212
|
+
assert(emits[1][1].is_a?(Integer))
|
213
|
+
|
214
|
+
assert_equal [nil], d.instance.responses # not attempt to receive responses, so nil is returned
|
215
|
+
assert_empty d.instance.exceptions
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_send_without_time_as_integer
|
219
|
+
target_input_driver = create_target_input_driver
|
220
|
+
|
221
|
+
d = create_driver(CONFIG + %[
|
222
|
+
flush_interval 1s
|
223
|
+
time_as_integer false
|
224
|
+
])
|
225
|
+
|
226
|
+
time = Fluent::EventTime.parse("2011-01-02 13:14:15 UTC")
|
227
|
+
|
228
|
+
records = [
|
229
|
+
{"a" => 1},
|
230
|
+
{"a" => 2}
|
231
|
+
]
|
232
|
+
d.register_run_post_condition do
|
233
|
+
d.instance.responses.length == 1
|
234
|
+
end
|
235
|
+
|
236
|
+
target_input_driver.run do
|
237
|
+
d.run do
|
238
|
+
records.each do |record|
|
239
|
+
d.emit record, time
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
emits = target_input_driver.emits
|
245
|
+
assert_equal ['test', time, records[0]], emits[0]
|
246
|
+
assert_equal ['test', time, records[1]], emits[1]
|
247
|
+
assert_equal_event_time(time, emits[0][1])
|
248
|
+
assert_equal_event_time(time, emits[1][1])
|
249
|
+
|
250
|
+
assert_equal [nil], d.instance.responses # not attempt to receive responses, so nil is returned
|
251
|
+
assert_empty d.instance.exceptions
|
252
|
+
end
|
253
|
+
|
254
|
+
def test_send_to_a_node_supporting_responses
|
255
|
+
target_input_driver = create_target_input_driver(true)
|
256
|
+
|
257
|
+
d = create_driver(CONFIG + %[flush_interval 1s])
|
258
|
+
|
259
|
+
time = Time.parse("2011-01-02 13:14:15 UTC").to_i
|
260
|
+
|
261
|
+
records = [
|
262
|
+
{"a" => 1},
|
263
|
+
{"a" => 2}
|
264
|
+
]
|
265
|
+
d.register_run_post_condition do
|
266
|
+
d.instance.responses.length == 1
|
267
|
+
end
|
268
|
+
|
269
|
+
target_input_driver.run do
|
270
|
+
d.run do
|
271
|
+
records.each do |record|
|
272
|
+
d.emit record, time
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
emits = target_input_driver.emits
|
278
|
+
assert_equal ['test', time, records[0]], emits[0]
|
279
|
+
assert_equal ['test', time, records[1]], emits[1]
|
280
|
+
|
281
|
+
assert_equal [nil], d.instance.responses # not attempt to receive responses, so nil is returned
|
282
|
+
assert_empty d.instance.exceptions
|
283
|
+
end
|
284
|
+
|
285
|
+
def test_send_to_a_node_not_supporting_responses
|
286
|
+
target_input_driver = create_target_input_driver
|
287
|
+
|
288
|
+
d = create_driver(CONFIG + %[flush_interval 1s])
|
289
|
+
|
290
|
+
time = Time.parse("2011-01-02 13:14:15 UTC").to_i
|
291
|
+
|
292
|
+
records = [
|
293
|
+
{"a" => 1},
|
294
|
+
{"a" => 2}
|
295
|
+
]
|
296
|
+
d.register_run_post_condition do
|
297
|
+
d.instance.responses.length == 1
|
298
|
+
end
|
299
|
+
|
300
|
+
target_input_driver.run do
|
301
|
+
d.run do
|
302
|
+
records.each do |record|
|
303
|
+
d.emit record, time
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
emits = target_input_driver.emits
|
309
|
+
assert_equal ['test', time, records[0]], emits[0]
|
310
|
+
assert_equal ['test', time, records[1]], emits[1]
|
311
|
+
|
312
|
+
assert_equal [nil], d.instance.responses # not attempt to receive responses, so nil is returned
|
313
|
+
assert_empty d.instance.exceptions
|
314
|
+
end
|
315
|
+
|
316
|
+
def test_require_a_node_supporting_responses_to_respond_with_ack
|
317
|
+
target_input_driver = create_target_input_driver(true)
|
318
|
+
|
319
|
+
d = create_driver(CONFIG + %[
|
320
|
+
flush_interval 1s
|
321
|
+
require_ack_response true
|
322
|
+
ack_response_timeout 1s
|
323
|
+
])
|
324
|
+
|
325
|
+
time = Time.parse("2011-01-02 13:14:15 UTC").to_i
|
326
|
+
|
327
|
+
records = [
|
328
|
+
{"a" => 1},
|
329
|
+
{"a" => 2}
|
330
|
+
]
|
331
|
+
d.register_run_post_condition do
|
332
|
+
d.instance.responses.length == 1
|
333
|
+
end
|
334
|
+
|
335
|
+
target_input_driver.run do
|
336
|
+
d.run do
|
337
|
+
records.each do |record|
|
338
|
+
d.emit record, time
|
339
|
+
end
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
343
|
+
emits = target_input_driver.emits
|
344
|
+
assert_equal ['test', time, records[0]], emits[0]
|
345
|
+
assert_equal ['test', time, records[1]], emits[1]
|
346
|
+
|
347
|
+
assert_equal 1, d.instance.responses.length
|
348
|
+
assert d.instance.responses[0].has_key?('ack')
|
349
|
+
assert_empty d.instance.exceptions
|
350
|
+
end
|
351
|
+
|
352
|
+
def test_require_a_node_not_supporting_responses_to_respond_with_ack
|
353
|
+
# in_forward, that doesn't support ack feature, and keep connection alive
|
354
|
+
target_input_driver = create_target_input_driver
|
355
|
+
|
356
|
+
d = create_driver(CONFIG + %[
|
357
|
+
flush_interval 1s
|
358
|
+
require_ack_response true
|
359
|
+
ack_response_timeout 1s
|
360
|
+
])
|
361
|
+
|
362
|
+
time = Time.parse("2011-01-02 13:14:15 UTC").to_i
|
363
|
+
|
364
|
+
records = [
|
365
|
+
{"a" => 1},
|
366
|
+
{"a" => 2}
|
367
|
+
]
|
368
|
+
d.register_run_post_condition do
|
369
|
+
d.instance.responses.length == 1
|
370
|
+
end
|
371
|
+
d.run_timeout = 2
|
372
|
+
|
373
|
+
assert_raise Fluent::ForwardOutputACKTimeoutError do
|
374
|
+
target_input_driver.run do
|
375
|
+
d.run do
|
376
|
+
records.each do |record|
|
377
|
+
d.emit record, time
|
378
|
+
end
|
379
|
+
end
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
emits = target_input_driver.emits
|
384
|
+
assert_equal ['test', time, records[0]], emits[0]
|
385
|
+
assert_equal ['test', time, records[1]], emits[1]
|
386
|
+
|
387
|
+
node = d.instance.nodes.first
|
388
|
+
assert_equal false, node.available # node is regarded as unavailable when timeout
|
389
|
+
|
390
|
+
assert_empty d.instance.responses # send_data() raises exception, so response is missing
|
391
|
+
assert_equal 1, d.instance.exceptions.size
|
392
|
+
end
|
393
|
+
|
394
|
+
# bdf1f4f104c00a791aa94dc20087fe2011e1fd83
|
395
|
+
def test_require_a_node_not_supporting_responses_2_to_respond_with_ack
|
396
|
+
# in_forward, that doesn't support ack feature, and disconnect immediately
|
397
|
+
target_input_driver = create_target_input_driver(false, true)
|
398
|
+
|
399
|
+
d = create_driver(CONFIG + %[
|
400
|
+
flush_interval 1s
|
401
|
+
require_ack_response true
|
402
|
+
ack_response_timeout 5s
|
403
|
+
])
|
404
|
+
|
405
|
+
time = Time.parse("2011-01-02 13:14:15 UTC").to_i
|
406
|
+
|
407
|
+
records = [
|
408
|
+
{"a" => 1},
|
409
|
+
{"a" => 2}
|
410
|
+
]
|
411
|
+
d.register_run_post_condition do
|
412
|
+
d.instance.responses.length == 1
|
413
|
+
end
|
414
|
+
d.run_timeout = 2
|
415
|
+
|
416
|
+
assert_raise Fluent::ForwardOutputConnectionClosedError do
|
417
|
+
target_input_driver.run do
|
418
|
+
d.run do
|
419
|
+
records.each do |record|
|
420
|
+
d.emit record, time
|
421
|
+
end
|
422
|
+
end
|
423
|
+
end
|
424
|
+
end
|
425
|
+
|
426
|
+
emits = target_input_driver.emits
|
427
|
+
assert_equal ['test', time, records[0]], emits[0]
|
428
|
+
assert_equal ['test', time, records[1]], emits[1]
|
429
|
+
|
430
|
+
assert_equal 0, d.instance.responses.size
|
431
|
+
assert_equal 1, d.instance.exceptions.size # send_data() fails and to be retried
|
432
|
+
|
433
|
+
node = d.instance.nodes.first
|
434
|
+
assert_equal false, node.available # node is regarded as unavailable when unexpected EOF
|
435
|
+
end
|
436
|
+
|
437
|
+
def create_target_input_driver(do_respond=false, disconnect=false, conf=TARGET_CONFIG)
|
438
|
+
require 'fluent/plugin/in_forward'
|
439
|
+
|
440
|
+
# TODO: Support actual TCP heartbeat test
|
441
|
+
DummyEngineDriver.new(Fluent::ForwardInput) {
|
442
|
+
handler_class = Class.new(Fluent::ForwardInput::Handler) { |klass|
|
443
|
+
attr_reader :chunk_counter # for checking if received data is successfully deserialized
|
444
|
+
attr_reader :received_options
|
445
|
+
|
446
|
+
def initialize(sock, log, on_message)
|
447
|
+
@sock = sock
|
448
|
+
@log = log
|
449
|
+
@chunk_counter = 0
|
450
|
+
@received_options = []
|
451
|
+
@on_message = ->(msg, chunk_size, source) {
|
452
|
+
option = on_message.call(msg, chunk_size, source)
|
453
|
+
@received_options << option
|
454
|
+
option
|
455
|
+
}
|
456
|
+
@source = nil
|
457
|
+
@peeraddr = nil
|
458
|
+
end
|
459
|
+
|
460
|
+
if do_respond
|
461
|
+
def write(data)
|
462
|
+
@sock.write data
|
463
|
+
rescue
|
464
|
+
@sock.close_write
|
465
|
+
@sock.close
|
466
|
+
end
|
467
|
+
else
|
468
|
+
def write(data)
|
469
|
+
# do nothing
|
470
|
+
end
|
471
|
+
end
|
472
|
+
|
473
|
+
def close
|
474
|
+
unless @sock.closed?
|
475
|
+
@sock.close_write
|
476
|
+
@sock.close
|
477
|
+
end
|
478
|
+
end
|
479
|
+
}
|
480
|
+
|
481
|
+
define_method(:_start) do
|
482
|
+
@thread = Thread.new do
|
483
|
+
Socket.tcp_server_loop(@bind, @port) do |sock, client_addrinfo|
|
484
|
+
begin
|
485
|
+
handler = handler_class.new(sock, @log, method(:on_message))
|
486
|
+
loop do
|
487
|
+
raw_data = sock.recv(1024)
|
488
|
+
handler.on_read(raw_data)
|
489
|
+
# chunk_counter is reset to zero only after all the data have been received and successfully deserialized.
|
490
|
+
break if handler.chunk_counter == 0
|
491
|
+
break if sock.closed?
|
492
|
+
end
|
493
|
+
if disconnect
|
494
|
+
handler.close
|
495
|
+
sock = nil
|
496
|
+
end
|
497
|
+
sleep # wait for connection to be closed by client
|
498
|
+
ensure
|
499
|
+
if sock && !sock.closed?
|
500
|
+
sock.close_write
|
501
|
+
sock.close
|
502
|
+
end
|
503
|
+
@received_options = handler.received_options
|
504
|
+
end
|
505
|
+
end
|
506
|
+
end
|
507
|
+
end
|
508
|
+
|
509
|
+
attr_reader :received_options
|
510
|
+
|
511
|
+
def _shutdown
|
512
|
+
@thread.kill
|
513
|
+
@thread.join
|
514
|
+
end
|
515
|
+
}.configure(conf).inject_router()
|
516
|
+
end
|
517
|
+
|
518
|
+
def test_heartbeat_type_none
|
519
|
+
d = create_driver(CONFIG + "\nheartbeat_type none")
|
520
|
+
node = d.instance.nodes.first
|
521
|
+
assert_equal Fluent::ForwardOutput::NoneHeartbeatNode, node.class
|
522
|
+
|
523
|
+
d.instance.start
|
524
|
+
assert_nil d.instance.instance_variable_get(:@loop) # no HeartbeatHandler, or HeartbeatRequestTimer
|
525
|
+
assert_nil d.instance.instance_variable_get(:@thread) # no HeartbeatHandler, or HeartbeatRequestTimer
|
526
|
+
|
527
|
+
stub(node.failure).phi { raise 'Should not be called' }
|
528
|
+
node.tick
|
529
|
+
assert_equal node.available, true
|
530
|
+
end
|
531
|
+
|
532
|
+
# To suppress calling `ForwardInput#start` in `DummyEngineDriver`,
|
533
|
+
# `DummyEnigneDriver` should avoid calling CallSuperMixin.prepend at `Fluent::Compat::Input#initialize`.
|
534
|
+
module SuppressCallSuperMixin
|
535
|
+
def start
|
536
|
+
_start
|
537
|
+
end
|
538
|
+
|
539
|
+
def before_shutdown
|
540
|
+
# nothing
|
541
|
+
end
|
542
|
+
|
543
|
+
def shutdown
|
544
|
+
_shutdown
|
545
|
+
end
|
546
|
+
end
|
547
|
+
|
548
|
+
class DummyEngineDriver < Fluent::Test::TestDriver
|
549
|
+
def initialize(klass, &block)
|
550
|
+
super(klass, &block)
|
551
|
+
@instance.class.prepend(SuppressCallSuperMixin)
|
552
|
+
@engine = DummyEngineClass.new
|
553
|
+
end
|
554
|
+
|
555
|
+
def inject_router
|
556
|
+
@instance.router = @engine
|
557
|
+
self
|
558
|
+
end
|
559
|
+
|
560
|
+
def run(&block)
|
561
|
+
super(&block)
|
562
|
+
end
|
563
|
+
|
564
|
+
def emits
|
565
|
+
all = []
|
566
|
+
@engine.emit_streams.each {|tag,events|
|
567
|
+
events.each {|time,record|
|
568
|
+
all << [tag, time, record]
|
569
|
+
}
|
570
|
+
}
|
571
|
+
all
|
572
|
+
end
|
573
|
+
|
574
|
+
class DummyEngineClass
|
575
|
+
attr_reader :emit_streams
|
576
|
+
|
577
|
+
def initialize
|
578
|
+
@emit_streams ||= []
|
579
|
+
end
|
580
|
+
|
581
|
+
def clear!
|
582
|
+
@emit_streams = []
|
583
|
+
end
|
584
|
+
|
585
|
+
def emit_stream(tag, es)
|
586
|
+
@emit_streams << [tag, es.to_a]
|
587
|
+
end
|
588
|
+
end
|
589
|
+
end
|
590
|
+
end
|