fluentd 0.14.4-x64-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.

Files changed (328) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE.md +6 -0
  3. data/.gitignore +26 -0
  4. data/.travis.yml +45 -0
  5. data/AUTHORS +2 -0
  6. data/CONTRIBUTING.md +35 -0
  7. data/COPYING +14 -0
  8. data/ChangeLog +276 -0
  9. data/Gemfile +9 -0
  10. data/README.md +51 -0
  11. data/Rakefile +53 -0
  12. data/Vagrantfile +17 -0
  13. data/appveyor.yml +41 -0
  14. data/bin/fluent-debug +5 -0
  15. data/example/copy_roundrobin.conf +39 -0
  16. data/example/filter_stdout.conf +22 -0
  17. data/example/in_forward.conf +11 -0
  18. data/example/in_http.conf +14 -0
  19. data/example/in_out_forward.conf +17 -0
  20. data/example/in_syslog.conf +15 -0
  21. data/example/in_tail.conf +14 -0
  22. data/example/in_tcp.conf +13 -0
  23. data/example/in_udp.conf +13 -0
  24. data/example/multi_filters.conf +61 -0
  25. data/example/out_buffered_null.conf +32 -0
  26. data/example/out_copy.conf +20 -0
  27. data/example/out_file.conf +13 -0
  28. data/example/out_forward.conf +35 -0
  29. data/example/out_forward_buf_file.conf +23 -0
  30. data/example/v0_12_filter.conf +78 -0
  31. data/example/v1_literal_example.conf +36 -0
  32. data/fluent.conf +139 -0
  33. data/fluentd.gemspec +51 -0
  34. data/lib/fluent/agent.rb +194 -0
  35. data/lib/fluent/command/bundler_injection.rb +45 -0
  36. data/lib/fluent/command/cat.rb +319 -0
  37. data/lib/fluent/command/debug.rb +102 -0
  38. data/lib/fluent/command/fluentd.rb +273 -0
  39. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  40. data/lib/fluent/compat/exec_util.rb +129 -0
  41. data/lib/fluent/compat/file_util.rb +54 -0
  42. data/lib/fluent/compat/filter.rb +68 -0
  43. data/lib/fluent/compat/formatter.rb +111 -0
  44. data/lib/fluent/compat/formatter_utils.rb +85 -0
  45. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  46. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  47. data/lib/fluent/compat/input.rb +49 -0
  48. data/lib/fluent/compat/output.rb +677 -0
  49. data/lib/fluent/compat/output_chain.rb +60 -0
  50. data/lib/fluent/compat/parser.rb +180 -0
  51. data/lib/fluent/compat/parser_utils.rb +40 -0
  52. data/lib/fluent/compat/propagate_default.rb +62 -0
  53. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  54. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  55. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  56. data/lib/fluent/compat/socket_util.rb +165 -0
  57. data/lib/fluent/compat/string_util.rb +34 -0
  58. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  59. data/lib/fluent/compat/type_converter.rb +90 -0
  60. data/lib/fluent/config.rb +56 -0
  61. data/lib/fluent/config/basic_parser.rb +123 -0
  62. data/lib/fluent/config/configure_proxy.rb +366 -0
  63. data/lib/fluent/config/dsl.rb +149 -0
  64. data/lib/fluent/config/element.rb +218 -0
  65. data/lib/fluent/config/error.rb +26 -0
  66. data/lib/fluent/config/literal_parser.rb +251 -0
  67. data/lib/fluent/config/parser.rb +107 -0
  68. data/lib/fluent/config/section.rb +212 -0
  69. data/lib/fluent/config/types.rb +136 -0
  70. data/lib/fluent/config/v1_parser.rb +190 -0
  71. data/lib/fluent/configurable.rb +176 -0
  72. data/lib/fluent/daemon.rb +15 -0
  73. data/lib/fluent/engine.rb +220 -0
  74. data/lib/fluent/env.rb +27 -0
  75. data/lib/fluent/event.rb +287 -0
  76. data/lib/fluent/event_router.rb +259 -0
  77. data/lib/fluent/filter.rb +21 -0
  78. data/lib/fluent/formatter.rb +23 -0
  79. data/lib/fluent/input.rb +21 -0
  80. data/lib/fluent/label.rb +38 -0
  81. data/lib/fluent/load.rb +36 -0
  82. data/lib/fluent/log.rb +445 -0
  83. data/lib/fluent/match.rb +141 -0
  84. data/lib/fluent/mixin.rb +31 -0
  85. data/lib/fluent/msgpack_factory.rb +62 -0
  86. data/lib/fluent/output.rb +26 -0
  87. data/lib/fluent/output_chain.rb +23 -0
  88. data/lib/fluent/parser.rb +23 -0
  89. data/lib/fluent/plugin.rb +161 -0
  90. data/lib/fluent/plugin/bare_output.rb +63 -0
  91. data/lib/fluent/plugin/base.rb +130 -0
  92. data/lib/fluent/plugin/buf_file.rb +154 -0
  93. data/lib/fluent/plugin/buf_memory.rb +34 -0
  94. data/lib/fluent/plugin/buffer.rb +603 -0
  95. data/lib/fluent/plugin/buffer/chunk.rb +160 -0
  96. data/lib/fluent/plugin/buffer/file_chunk.rb +323 -0
  97. data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
  98. data/lib/fluent/plugin/exec_util.rb +22 -0
  99. data/lib/fluent/plugin/file_util.rb +22 -0
  100. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  101. data/lib/fluent/plugin/filter.rb +93 -0
  102. data/lib/fluent/plugin/filter_grep.rb +75 -0
  103. data/lib/fluent/plugin/filter_record_transformer.rb +342 -0
  104. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  105. data/lib/fluent/plugin/formatter.rb +45 -0
  106. data/lib/fluent/plugin/formatter_csv.rb +47 -0
  107. data/lib/fluent/plugin/formatter_hash.rb +29 -0
  108. data/lib/fluent/plugin/formatter_json.rb +44 -0
  109. data/lib/fluent/plugin/formatter_ltsv.rb +41 -0
  110. data/lib/fluent/plugin/formatter_msgpack.rb +29 -0
  111. data/lib/fluent/plugin/formatter_out_file.rb +78 -0
  112. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  113. data/lib/fluent/plugin/formatter_stdout.rb +74 -0
  114. data/lib/fluent/plugin/in_debug_agent.rb +64 -0
  115. data/lib/fluent/plugin/in_dummy.rb +135 -0
  116. data/lib/fluent/plugin/in_exec.rb +149 -0
  117. data/lib/fluent/plugin/in_forward.rb +366 -0
  118. data/lib/fluent/plugin/in_gc_stat.rb +52 -0
  119. data/lib/fluent/plugin/in_http.rb +422 -0
  120. data/lib/fluent/plugin/in_monitor_agent.rb +401 -0
  121. data/lib/fluent/plugin/in_object_space.rb +90 -0
  122. data/lib/fluent/plugin/in_syslog.rb +204 -0
  123. data/lib/fluent/plugin/in_tail.rb +838 -0
  124. data/lib/fluent/plugin/in_tcp.rb +41 -0
  125. data/lib/fluent/plugin/in_udp.rb +37 -0
  126. data/lib/fluent/plugin/in_unix.rb +201 -0
  127. data/lib/fluent/plugin/input.rb +33 -0
  128. data/lib/fluent/plugin/multi_output.rb +95 -0
  129. data/lib/fluent/plugin/out_buffered_null.rb +59 -0
  130. data/lib/fluent/plugin/out_buffered_stdout.rb +70 -0
  131. data/lib/fluent/plugin/out_copy.rb +42 -0
  132. data/lib/fluent/plugin/out_exec.rb +114 -0
  133. data/lib/fluent/plugin/out_exec_filter.rb +393 -0
  134. data/lib/fluent/plugin/out_file.rb +167 -0
  135. data/lib/fluent/plugin/out_forward.rb +646 -0
  136. data/lib/fluent/plugin/out_null.rb +27 -0
  137. data/lib/fluent/plugin/out_relabel.rb +28 -0
  138. data/lib/fluent/plugin/out_roundrobin.rb +80 -0
  139. data/lib/fluent/plugin/out_stdout.rb +48 -0
  140. data/lib/fluent/plugin/out_stream.rb +130 -0
  141. data/lib/fluent/plugin/output.rb +1020 -0
  142. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  143. data/lib/fluent/plugin/parser.rb +175 -0
  144. data/lib/fluent/plugin/parser_apache.rb +28 -0
  145. data/lib/fluent/plugin/parser_apache2.rb +84 -0
  146. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  147. data/lib/fluent/plugin/parser_csv.rb +33 -0
  148. data/lib/fluent/plugin/parser_json.rb +79 -0
  149. data/lib/fluent/plugin/parser_ltsv.rb +50 -0
  150. data/lib/fluent/plugin/parser_multiline.rb +104 -0
  151. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  152. data/lib/fluent/plugin/parser_none.rb +36 -0
  153. data/lib/fluent/plugin/parser_regexp.rb +73 -0
  154. data/lib/fluent/plugin/parser_syslog.rb +82 -0
  155. data/lib/fluent/plugin/parser_tsv.rb +37 -0
  156. data/lib/fluent/plugin/socket_util.rb +22 -0
  157. data/lib/fluent/plugin/storage.rb +84 -0
  158. data/lib/fluent/plugin/storage_local.rb +132 -0
  159. data/lib/fluent/plugin/string_util.rb +22 -0
  160. data/lib/fluent/plugin_helper.rb +42 -0
  161. data/lib/fluent/plugin_helper/child_process.rb +298 -0
  162. data/lib/fluent/plugin_helper/compat_parameters.rb +224 -0
  163. data/lib/fluent/plugin_helper/event_emitter.rb +80 -0
  164. data/lib/fluent/plugin_helper/event_loop.rb +118 -0
  165. data/lib/fluent/plugin_helper/formatter.rb +149 -0
  166. data/lib/fluent/plugin_helper/inject.rb +125 -0
  167. data/lib/fluent/plugin_helper/parser.rb +147 -0
  168. data/lib/fluent/plugin_helper/retry_state.rb +177 -0
  169. data/lib/fluent/plugin_helper/storage.rb +331 -0
  170. data/lib/fluent/plugin_helper/thread.rb +147 -0
  171. data/lib/fluent/plugin_helper/timer.rb +90 -0
  172. data/lib/fluent/plugin_id.rb +63 -0
  173. data/lib/fluent/process.rb +504 -0
  174. data/lib/fluent/registry.rb +99 -0
  175. data/lib/fluent/root_agent.rb +314 -0
  176. data/lib/fluent/rpc.rb +94 -0
  177. data/lib/fluent/supervisor.rb +680 -0
  178. data/lib/fluent/system_config.rb +122 -0
  179. data/lib/fluent/test.rb +56 -0
  180. data/lib/fluent/test/base.rb +85 -0
  181. data/lib/fluent/test/driver/base.rb +179 -0
  182. data/lib/fluent/test/driver/base_owned.rb +70 -0
  183. data/lib/fluent/test/driver/base_owner.rb +125 -0
  184. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  185. data/lib/fluent/test/driver/filter.rb +57 -0
  186. data/lib/fluent/test/driver/formatter.rb +30 -0
  187. data/lib/fluent/test/driver/input.rb +31 -0
  188. data/lib/fluent/test/driver/multi_output.rb +52 -0
  189. data/lib/fluent/test/driver/output.rb +76 -0
  190. data/lib/fluent/test/driver/parser.rb +30 -0
  191. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  192. data/lib/fluent/test/filter_test.rb +77 -0
  193. data/lib/fluent/test/formatter_test.rb +65 -0
  194. data/lib/fluent/test/helpers.rb +79 -0
  195. data/lib/fluent/test/input_test.rb +172 -0
  196. data/lib/fluent/test/log.rb +73 -0
  197. data/lib/fluent/test/output_test.rb +156 -0
  198. data/lib/fluent/test/parser_test.rb +70 -0
  199. data/lib/fluent/time.rb +175 -0
  200. data/lib/fluent/timezone.rb +133 -0
  201. data/lib/fluent/unique_id.rb +39 -0
  202. data/lib/fluent/version.rb +21 -0
  203. data/lib/fluent/winsvc.rb +71 -0
  204. data/test/compat/test_calls_super.rb +166 -0
  205. data/test/compat/test_parser.rb +82 -0
  206. data/test/config/assertions.rb +42 -0
  207. data/test/config/test_config_parser.rb +507 -0
  208. data/test/config/test_configurable.rb +1194 -0
  209. data/test/config/test_configure_proxy.rb +386 -0
  210. data/test/config/test_dsl.rb +415 -0
  211. data/test/config/test_element.rb +403 -0
  212. data/test/config/test_literal_parser.rb +297 -0
  213. data/test/config/test_section.rb +184 -0
  214. data/test/config/test_system_config.rb +120 -0
  215. data/test/config/test_types.rb +171 -0
  216. data/test/helper.rb +119 -0
  217. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  218. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  219. data/test/plugin/data/2010/01/20100102.log +0 -0
  220. data/test/plugin/data/log/bar +0 -0
  221. data/test/plugin/data/log/foo/bar.log +0 -0
  222. data/test/plugin/data/log/test.log +0 -0
  223. data/test/plugin/test_bare_output.rb +118 -0
  224. data/test/plugin/test_base.rb +75 -0
  225. data/test/plugin/test_buf_file.rb +571 -0
  226. data/test/plugin/test_buf_memory.rb +42 -0
  227. data/test/plugin/test_buffer.rb +1200 -0
  228. data/test/plugin/test_buffer_chunk.rb +168 -0
  229. data/test/plugin/test_buffer_file_chunk.rb +771 -0
  230. data/test/plugin/test_buffer_memory_chunk.rb +265 -0
  231. data/test/plugin/test_file_util.rb +96 -0
  232. data/test/plugin/test_filter.rb +353 -0
  233. data/test/plugin/test_filter_grep.rb +119 -0
  234. data/test/plugin/test_filter_record_transformer.rb +600 -0
  235. data/test/plugin/test_filter_stdout.rb +211 -0
  236. data/test/plugin/test_formatter_csv.rb +94 -0
  237. data/test/plugin/test_formatter_json.rb +30 -0
  238. data/test/plugin/test_formatter_ltsv.rb +52 -0
  239. data/test/plugin/test_formatter_msgpack.rb +28 -0
  240. data/test/plugin/test_formatter_out_file.rb +95 -0
  241. data/test/plugin/test_formatter_single_value.rb +38 -0
  242. data/test/plugin/test_in_debug_agent.rb +28 -0
  243. data/test/plugin/test_in_dummy.rb +188 -0
  244. data/test/plugin/test_in_exec.rb +133 -0
  245. data/test/plugin/test_in_forward.rb +635 -0
  246. data/test/plugin/test_in_gc_stat.rb +39 -0
  247. data/test/plugin/test_in_http.rb +442 -0
  248. data/test/plugin/test_in_monitor_agent.rb +329 -0
  249. data/test/plugin/test_in_object_space.rb +64 -0
  250. data/test/plugin/test_in_syslog.rb +205 -0
  251. data/test/plugin/test_in_tail.rb +1001 -0
  252. data/test/plugin/test_in_tcp.rb +102 -0
  253. data/test/plugin/test_in_udp.rb +121 -0
  254. data/test/plugin/test_in_unix.rb +126 -0
  255. data/test/plugin/test_input.rb +122 -0
  256. data/test/plugin/test_multi_output.rb +180 -0
  257. data/test/plugin/test_out_buffered_null.rb +79 -0
  258. data/test/plugin/test_out_buffered_stdout.rb +122 -0
  259. data/test/plugin/test_out_copy.rb +160 -0
  260. data/test/plugin/test_out_exec.rb +155 -0
  261. data/test/plugin/test_out_exec_filter.rb +262 -0
  262. data/test/plugin/test_out_file.rb +383 -0
  263. data/test/plugin/test_out_forward.rb +590 -0
  264. data/test/plugin/test_out_null.rb +29 -0
  265. data/test/plugin/test_out_relabel.rb +28 -0
  266. data/test/plugin/test_out_roundrobin.rb +146 -0
  267. data/test/plugin/test_out_stdout.rb +92 -0
  268. data/test/plugin/test_out_stream.rb +93 -0
  269. data/test/plugin/test_output.rb +568 -0
  270. data/test/plugin/test_output_as_buffered.rb +1604 -0
  271. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  272. data/test/plugin/test_output_as_buffered_retries.rb +839 -0
  273. data/test/plugin/test_output_as_buffered_secondary.rb +817 -0
  274. data/test/plugin/test_output_as_standard.rb +374 -0
  275. data/test/plugin/test_owned_by.rb +35 -0
  276. data/test/plugin/test_parser_apache.rb +42 -0
  277. data/test/plugin/test_parser_apache2.rb +38 -0
  278. data/test/plugin/test_parser_apache_error.rb +45 -0
  279. data/test/plugin/test_parser_base.rb +32 -0
  280. data/test/plugin/test_parser_csv.rb +104 -0
  281. data/test/plugin/test_parser_json.rb +107 -0
  282. data/test/plugin/test_parser_labeled_tsv.rb +129 -0
  283. data/test/plugin/test_parser_multiline.rb +100 -0
  284. data/test/plugin/test_parser_nginx.rb +48 -0
  285. data/test/plugin/test_parser_none.rb +53 -0
  286. data/test/plugin/test_parser_regexp.rb +277 -0
  287. data/test/plugin/test_parser_syslog.rb +66 -0
  288. data/test/plugin/test_parser_time.rb +46 -0
  289. data/test/plugin/test_parser_tsv.rb +121 -0
  290. data/test/plugin/test_storage.rb +167 -0
  291. data/test/plugin/test_storage_local.rb +8 -0
  292. data/test/plugin/test_string_util.rb +26 -0
  293. data/test/plugin_helper/test_child_process.rb +608 -0
  294. data/test/plugin_helper/test_compat_parameters.rb +242 -0
  295. data/test/plugin_helper/test_event_emitter.rb +51 -0
  296. data/test/plugin_helper/test_event_loop.rb +52 -0
  297. data/test/plugin_helper/test_formatter.rb +252 -0
  298. data/test/plugin_helper/test_inject.rb +487 -0
  299. data/test/plugin_helper/test_parser.rb +263 -0
  300. data/test/plugin_helper/test_retry_state.rb +399 -0
  301. data/test/plugin_helper/test_storage.rb +521 -0
  302. data/test/plugin_helper/test_thread.rb +164 -0
  303. data/test/plugin_helper/test_timer.rb +131 -0
  304. data/test/scripts/exec_script.rb +32 -0
  305. data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
  306. data/test/scripts/fluent/plugin/out_test.rb +81 -0
  307. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  308. data/test/scripts/fluent/plugin/parser_known.rb +4 -0
  309. data/test/test_config.rb +179 -0
  310. data/test/test_configdsl.rb +148 -0
  311. data/test/test_event.rb +329 -0
  312. data/test/test_event_router.rb +331 -0
  313. data/test/test_event_time.rb +184 -0
  314. data/test/test_filter.rb +121 -0
  315. data/test/test_formatter.rb +319 -0
  316. data/test/test_input.rb +31 -0
  317. data/test/test_log.rb +572 -0
  318. data/test/test_match.rb +137 -0
  319. data/test/test_mixin.rb +351 -0
  320. data/test/test_output.rb +214 -0
  321. data/test/test_plugin_classes.rb +136 -0
  322. data/test/test_plugin_helper.rb +81 -0
  323. data/test/test_process.rb +48 -0
  324. data/test/test_root_agent.rb +278 -0
  325. data/test/test_supervisor.rb +339 -0
  326. data/test/test_time_formatter.rb +186 -0
  327. data/test/test_unique_id.rb +47 -0
  328. 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