fluentd 1.14.4-x64-mingw-ucrt

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 (558) hide show
  1. checksums.yaml +7 -0
  2. data/.deepsource.toml +13 -0
  3. data/.drone.yml +35 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.yaml +70 -0
  5. data/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. data/.github/ISSUE_TEMPLATE/feature_request.yaml +38 -0
  7. data/.github/ISSUE_TEMPLATE.md +17 -0
  8. data/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  9. data/.github/workflows/issue-auto-closer.yml +12 -0
  10. data/.github/workflows/linux-test.yaml +36 -0
  11. data/.github/workflows/macos-test.yaml +30 -0
  12. data/.github/workflows/stale-actions.yml +22 -0
  13. data/.github/workflows/windows-test.yaml +46 -0
  14. data/.gitignore +30 -0
  15. data/.gitlab-ci.yml +103 -0
  16. data/ADOPTERS.md +5 -0
  17. data/AUTHORS +2 -0
  18. data/CHANGELOG.md +2409 -0
  19. data/CONTRIBUTING.md +45 -0
  20. data/GOVERNANCE.md +55 -0
  21. data/Gemfile +9 -0
  22. data/GithubWorkflow.md +78 -0
  23. data/LICENSE +202 -0
  24. data/MAINTAINERS.md +11 -0
  25. data/README.md +97 -0
  26. data/Rakefile +79 -0
  27. data/SECURITY.md +18 -0
  28. data/bin/fluent-binlog-reader +7 -0
  29. data/bin/fluent-ca-generate +6 -0
  30. data/bin/fluent-cap-ctl +7 -0
  31. data/bin/fluent-cat +5 -0
  32. data/bin/fluent-ctl +7 -0
  33. data/bin/fluent-debug +5 -0
  34. data/bin/fluent-gem +9 -0
  35. data/bin/fluent-plugin-config-format +5 -0
  36. data/bin/fluent-plugin-generate +5 -0
  37. data/bin/fluentd +15 -0
  38. data/code-of-conduct.md +3 -0
  39. data/docs/SECURITY_AUDIT.pdf +0 -0
  40. data/example/copy_roundrobin.conf +39 -0
  41. data/example/counter.conf +18 -0
  42. data/example/filter_stdout.conf +22 -0
  43. data/example/in_forward.conf +14 -0
  44. data/example/in_forward_client.conf +37 -0
  45. data/example/in_forward_shared_key.conf +15 -0
  46. data/example/in_forward_tls.conf +14 -0
  47. data/example/in_forward_users.conf +24 -0
  48. data/example/in_forward_workers.conf +21 -0
  49. data/example/in_http.conf +16 -0
  50. data/example/in_out_forward.conf +17 -0
  51. data/example/in_sample_blocks.conf +17 -0
  52. data/example/in_sample_with_compression.conf +23 -0
  53. data/example/in_syslog.conf +15 -0
  54. data/example/in_tail.conf +14 -0
  55. data/example/in_tcp.conf +13 -0
  56. data/example/in_udp.conf +13 -0
  57. data/example/logevents.conf +25 -0
  58. data/example/multi_filters.conf +61 -0
  59. data/example/out_copy.conf +20 -0
  60. data/example/out_exec_filter.conf +42 -0
  61. data/example/out_file.conf +13 -0
  62. data/example/out_forward.conf +35 -0
  63. data/example/out_forward_buf_file.conf +23 -0
  64. data/example/out_forward_client.conf +109 -0
  65. data/example/out_forward_heartbeat_none.conf +16 -0
  66. data/example/out_forward_sd.conf +17 -0
  67. data/example/out_forward_shared_key.conf +36 -0
  68. data/example/out_forward_tls.conf +18 -0
  69. data/example/out_forward_users.conf +65 -0
  70. data/example/out_null.conf +36 -0
  71. data/example/sd.yaml +8 -0
  72. data/example/secondary_file.conf +42 -0
  73. data/example/suppress_config_dump.conf +7 -0
  74. data/example/v0_12_filter.conf +78 -0
  75. data/example/v1_literal_example.conf +36 -0
  76. data/example/worker_section.conf +36 -0
  77. data/fluent.conf +139 -0
  78. data/fluentd.gemspec +55 -0
  79. data/lib/fluent/agent.rb +168 -0
  80. data/lib/fluent/capability.rb +87 -0
  81. data/lib/fluent/clock.rb +66 -0
  82. data/lib/fluent/command/binlog_reader.rb +244 -0
  83. data/lib/fluent/command/bundler_injection.rb +45 -0
  84. data/lib/fluent/command/ca_generate.rb +184 -0
  85. data/lib/fluent/command/cap_ctl.rb +174 -0
  86. data/lib/fluent/command/cat.rb +365 -0
  87. data/lib/fluent/command/ctl.rb +177 -0
  88. data/lib/fluent/command/debug.rb +103 -0
  89. data/lib/fluent/command/fluentd.rb +374 -0
  90. data/lib/fluent/command/plugin_config_formatter.rb +308 -0
  91. data/lib/fluent/command/plugin_generator.rb +365 -0
  92. data/lib/fluent/compat/call_super_mixin.rb +76 -0
  93. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  94. data/lib/fluent/compat/exec_util.rb +129 -0
  95. data/lib/fluent/compat/file_util.rb +54 -0
  96. data/lib/fluent/compat/filter.rb +68 -0
  97. data/lib/fluent/compat/formatter.rb +111 -0
  98. data/lib/fluent/compat/formatter_utils.rb +85 -0
  99. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  100. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  101. data/lib/fluent/compat/input.rb +49 -0
  102. data/lib/fluent/compat/output.rb +721 -0
  103. data/lib/fluent/compat/output_chain.rb +60 -0
  104. data/lib/fluent/compat/parser.rb +310 -0
  105. data/lib/fluent/compat/parser_utils.rb +40 -0
  106. data/lib/fluent/compat/propagate_default.rb +62 -0
  107. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  108. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  109. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  110. data/lib/fluent/compat/socket_util.rb +165 -0
  111. data/lib/fluent/compat/string_util.rb +34 -0
  112. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  113. data/lib/fluent/compat/type_converter.rb +90 -0
  114. data/lib/fluent/config/basic_parser.rb +123 -0
  115. data/lib/fluent/config/configure_proxy.rb +424 -0
  116. data/lib/fluent/config/dsl.rb +152 -0
  117. data/lib/fluent/config/element.rb +265 -0
  118. data/lib/fluent/config/error.rb +32 -0
  119. data/lib/fluent/config/literal_parser.rb +286 -0
  120. data/lib/fluent/config/parser.rb +107 -0
  121. data/lib/fluent/config/section.rb +272 -0
  122. data/lib/fluent/config/types.rb +249 -0
  123. data/lib/fluent/config/v1_parser.rb +192 -0
  124. data/lib/fluent/config.rb +76 -0
  125. data/lib/fluent/configurable.rb +201 -0
  126. data/lib/fluent/counter/base_socket.rb +44 -0
  127. data/lib/fluent/counter/client.rb +297 -0
  128. data/lib/fluent/counter/error.rb +86 -0
  129. data/lib/fluent/counter/mutex_hash.rb +163 -0
  130. data/lib/fluent/counter/server.rb +273 -0
  131. data/lib/fluent/counter/store.rb +205 -0
  132. data/lib/fluent/counter/validator.rb +145 -0
  133. data/lib/fluent/counter.rb +23 -0
  134. data/lib/fluent/daemon.rb +15 -0
  135. data/lib/fluent/daemonizer.rb +88 -0
  136. data/lib/fluent/engine.rb +253 -0
  137. data/lib/fluent/env.rb +40 -0
  138. data/lib/fluent/error.rb +34 -0
  139. data/lib/fluent/event.rb +326 -0
  140. data/lib/fluent/event_router.rb +297 -0
  141. data/lib/fluent/ext_monitor_require.rb +28 -0
  142. data/lib/fluent/filter.rb +21 -0
  143. data/lib/fluent/fluent_log_event_router.rb +141 -0
  144. data/lib/fluent/formatter.rb +23 -0
  145. data/lib/fluent/input.rb +21 -0
  146. data/lib/fluent/label.rb +46 -0
  147. data/lib/fluent/load.rb +34 -0
  148. data/lib/fluent/log.rb +713 -0
  149. data/lib/fluent/match.rb +187 -0
  150. data/lib/fluent/mixin.rb +31 -0
  151. data/lib/fluent/msgpack_factory.rb +106 -0
  152. data/lib/fluent/oj_options.rb +62 -0
  153. data/lib/fluent/output.rb +29 -0
  154. data/lib/fluent/output_chain.rb +23 -0
  155. data/lib/fluent/parser.rb +23 -0
  156. data/lib/fluent/plugin/bare_output.rb +104 -0
  157. data/lib/fluent/plugin/base.rb +197 -0
  158. data/lib/fluent/plugin/buf_file.rb +213 -0
  159. data/lib/fluent/plugin/buf_file_single.rb +225 -0
  160. data/lib/fluent/plugin/buf_memory.rb +34 -0
  161. data/lib/fluent/plugin/buffer/chunk.rb +240 -0
  162. data/lib/fluent/plugin/buffer/file_chunk.rb +413 -0
  163. data/lib/fluent/plugin/buffer/file_single_chunk.rb +311 -0
  164. data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
  165. data/lib/fluent/plugin/buffer.rb +918 -0
  166. data/lib/fluent/plugin/compressable.rb +96 -0
  167. data/lib/fluent/plugin/exec_util.rb +22 -0
  168. data/lib/fluent/plugin/file_util.rb +22 -0
  169. data/lib/fluent/plugin/file_wrapper.rb +187 -0
  170. data/lib/fluent/plugin/filter.rb +127 -0
  171. data/lib/fluent/plugin/filter_grep.rb +189 -0
  172. data/lib/fluent/plugin/filter_parser.rb +130 -0
  173. data/lib/fluent/plugin/filter_record_transformer.rb +324 -0
  174. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  175. data/lib/fluent/plugin/formatter.rb +75 -0
  176. data/lib/fluent/plugin/formatter_csv.rb +78 -0
  177. data/lib/fluent/plugin/formatter_hash.rb +35 -0
  178. data/lib/fluent/plugin/formatter_json.rb +59 -0
  179. data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
  180. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  181. data/lib/fluent/plugin/formatter_out_file.rb +53 -0
  182. data/lib/fluent/plugin/formatter_single_value.rb +36 -0
  183. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  184. data/lib/fluent/plugin/formatter_tsv.rb +40 -0
  185. data/lib/fluent/plugin/in_debug_agent.rb +71 -0
  186. data/lib/fluent/plugin/in_dummy.rb +18 -0
  187. data/lib/fluent/plugin/in_exec.rb +110 -0
  188. data/lib/fluent/plugin/in_forward.rb +473 -0
  189. data/lib/fluent/plugin/in_gc_stat.rb +72 -0
  190. data/lib/fluent/plugin/in_http.rb +667 -0
  191. data/lib/fluent/plugin/in_monitor_agent.rb +412 -0
  192. data/lib/fluent/plugin/in_object_space.rb +93 -0
  193. data/lib/fluent/plugin/in_sample.rb +141 -0
  194. data/lib/fluent/plugin/in_syslog.rb +276 -0
  195. data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
  196. data/lib/fluent/plugin/in_tail.rb +1228 -0
  197. data/lib/fluent/plugin/in_tcp.rb +181 -0
  198. data/lib/fluent/plugin/in_udp.rb +92 -0
  199. data/lib/fluent/plugin/in_unix.rb +195 -0
  200. data/lib/fluent/plugin/input.rb +75 -0
  201. data/lib/fluent/plugin/metrics.rb +119 -0
  202. data/lib/fluent/plugin/metrics_local.rb +96 -0
  203. data/lib/fluent/plugin/multi_output.rb +195 -0
  204. data/lib/fluent/plugin/out_copy.rb +120 -0
  205. data/lib/fluent/plugin/out_exec.rb +105 -0
  206. data/lib/fluent/plugin/out_exec_filter.rb +319 -0
  207. data/lib/fluent/plugin/out_file.rb +334 -0
  208. data/lib/fluent/plugin/out_forward/ack_handler.rb +161 -0
  209. data/lib/fluent/plugin/out_forward/connection_manager.rb +113 -0
  210. data/lib/fluent/plugin/out_forward/error.rb +28 -0
  211. data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
  212. data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
  213. data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
  214. data/lib/fluent/plugin/out_forward/socket_cache.rb +140 -0
  215. data/lib/fluent/plugin/out_forward.rb +826 -0
  216. data/lib/fluent/plugin/out_http.rb +275 -0
  217. data/lib/fluent/plugin/out_null.rb +74 -0
  218. data/lib/fluent/plugin/out_relabel.rb +32 -0
  219. data/lib/fluent/plugin/out_roundrobin.rb +84 -0
  220. data/lib/fluent/plugin/out_secondary_file.rb +131 -0
  221. data/lib/fluent/plugin/out_stdout.rb +74 -0
  222. data/lib/fluent/plugin/out_stream.rb +130 -0
  223. data/lib/fluent/plugin/output.rb +1556 -0
  224. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  225. data/lib/fluent/plugin/parser.rb +275 -0
  226. data/lib/fluent/plugin/parser_apache.rb +28 -0
  227. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  228. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  229. data/lib/fluent/plugin/parser_csv.rb +114 -0
  230. data/lib/fluent/plugin/parser_json.rb +96 -0
  231. data/lib/fluent/plugin/parser_ltsv.rb +51 -0
  232. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  233. data/lib/fluent/plugin/parser_multiline.rb +152 -0
  234. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  235. data/lib/fluent/plugin/parser_none.rb +36 -0
  236. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  237. data/lib/fluent/plugin/parser_syslog.rb +496 -0
  238. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  239. data/lib/fluent/plugin/sd_file.rb +156 -0
  240. data/lib/fluent/plugin/sd_srv.rb +135 -0
  241. data/lib/fluent/plugin/sd_static.rb +58 -0
  242. data/lib/fluent/plugin/service_discovery.rb +65 -0
  243. data/lib/fluent/plugin/socket_util.rb +22 -0
  244. data/lib/fluent/plugin/storage.rb +84 -0
  245. data/lib/fluent/plugin/storage_local.rb +162 -0
  246. data/lib/fluent/plugin/string_util.rb +22 -0
  247. data/lib/fluent/plugin.rb +206 -0
  248. data/lib/fluent/plugin_helper/cert_option.rb +191 -0
  249. data/lib/fluent/plugin_helper/child_process.rb +366 -0
  250. data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
  251. data/lib/fluent/plugin_helper/counter.rb +51 -0
  252. data/lib/fluent/plugin_helper/event_emitter.rb +100 -0
  253. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  254. data/lib/fluent/plugin_helper/extract.rb +104 -0
  255. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  256. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  257. data/lib/fluent/plugin_helper/http_server/compat/server.rb +92 -0
  258. data/lib/fluent/plugin_helper/http_server/compat/ssl_context_extractor.rb +52 -0
  259. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  260. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  261. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  262. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  263. data/lib/fluent/plugin_helper/http_server/server.rb +93 -0
  264. data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
  265. data/lib/fluent/plugin_helper/http_server.rb +135 -0
  266. data/lib/fluent/plugin_helper/inject.rb +154 -0
  267. data/lib/fluent/plugin_helper/metrics.rb +129 -0
  268. data/lib/fluent/plugin_helper/parser.rb +147 -0
  269. data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
  270. data/lib/fluent/plugin_helper/retry_state.rb +209 -0
  271. data/lib/fluent/plugin_helper/server.rb +801 -0
  272. data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
  273. data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
  274. data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
  275. data/lib/fluent/plugin_helper/socket.rb +277 -0
  276. data/lib/fluent/plugin_helper/socket_option.rb +98 -0
  277. data/lib/fluent/plugin_helper/storage.rb +349 -0
  278. data/lib/fluent/plugin_helper/thread.rb +180 -0
  279. data/lib/fluent/plugin_helper/timer.rb +92 -0
  280. data/lib/fluent/plugin_helper.rb +75 -0
  281. data/lib/fluent/plugin_id.rb +93 -0
  282. data/lib/fluent/process.rb +22 -0
  283. data/lib/fluent/registry.rb +116 -0
  284. data/lib/fluent/root_agent.rb +372 -0
  285. data/lib/fluent/rpc.rb +94 -0
  286. data/lib/fluent/static_config_analysis.rb +194 -0
  287. data/lib/fluent/supervisor.rb +1054 -0
  288. data/lib/fluent/system_config.rb +187 -0
  289. data/lib/fluent/test/base.rb +78 -0
  290. data/lib/fluent/test/driver/base.rb +225 -0
  291. data/lib/fluent/test/driver/base_owned.rb +83 -0
  292. data/lib/fluent/test/driver/base_owner.rb +135 -0
  293. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  294. data/lib/fluent/test/driver/filter.rb +57 -0
  295. data/lib/fluent/test/driver/formatter.rb +30 -0
  296. data/lib/fluent/test/driver/input.rb +31 -0
  297. data/lib/fluent/test/driver/multi_output.rb +53 -0
  298. data/lib/fluent/test/driver/output.rb +102 -0
  299. data/lib/fluent/test/driver/parser.rb +30 -0
  300. data/lib/fluent/test/driver/storage.rb +30 -0
  301. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  302. data/lib/fluent/test/filter_test.rb +77 -0
  303. data/lib/fluent/test/formatter_test.rb +65 -0
  304. data/lib/fluent/test/helpers.rb +134 -0
  305. data/lib/fluent/test/input_test.rb +174 -0
  306. data/lib/fluent/test/log.rb +79 -0
  307. data/lib/fluent/test/output_test.rb +156 -0
  308. data/lib/fluent/test/parser_test.rb +70 -0
  309. data/lib/fluent/test/startup_shutdown.rb +46 -0
  310. data/lib/fluent/test.rb +58 -0
  311. data/lib/fluent/time.rb +512 -0
  312. data/lib/fluent/timezone.rb +171 -0
  313. data/lib/fluent/tls.rb +81 -0
  314. data/lib/fluent/unique_id.rb +39 -0
  315. data/lib/fluent/variable_store.rb +40 -0
  316. data/lib/fluent/version.rb +21 -0
  317. data/lib/fluent/winsvc.rb +103 -0
  318. data/templates/new_gem/Gemfile +3 -0
  319. data/templates/new_gem/README.md.erb +43 -0
  320. data/templates/new_gem/Rakefile +13 -0
  321. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  322. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  323. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  324. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  325. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  326. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  327. data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
  328. data/templates/new_gem/test/helper.rb.erb +8 -0
  329. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  330. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  331. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  332. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  333. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  334. data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
  335. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  336. data/templates/plugin_config_formatter/param.md-table.erb +10 -0
  337. data/templates/plugin_config_formatter/param.md.erb +34 -0
  338. data/templates/plugin_config_formatter/section.md.erb +12 -0
  339. data/test/command/test_binlog_reader.rb +362 -0
  340. data/test/command/test_ca_generate.rb +70 -0
  341. data/test/command/test_cap_ctl.rb +100 -0
  342. data/test/command/test_cat.rb +128 -0
  343. data/test/command/test_ctl.rb +57 -0
  344. data/test/command/test_fluentd.rb +1106 -0
  345. data/test/command/test_plugin_config_formatter.rb +398 -0
  346. data/test/command/test_plugin_generator.rb +109 -0
  347. data/test/compat/test_calls_super.rb +166 -0
  348. data/test/compat/test_parser.rb +92 -0
  349. data/test/config/assertions.rb +42 -0
  350. data/test/config/test_config_parser.rb +551 -0
  351. data/test/config/test_configurable.rb +1784 -0
  352. data/test/config/test_configure_proxy.rb +604 -0
  353. data/test/config/test_dsl.rb +415 -0
  354. data/test/config/test_element.rb +518 -0
  355. data/test/config/test_literal_parser.rb +309 -0
  356. data/test/config/test_plugin_configuration.rb +56 -0
  357. data/test/config/test_section.rb +191 -0
  358. data/test/config/test_system_config.rb +199 -0
  359. data/test/config/test_types.rb +408 -0
  360. data/test/counter/test_client.rb +563 -0
  361. data/test/counter/test_error.rb +44 -0
  362. data/test/counter/test_mutex_hash.rb +179 -0
  363. data/test/counter/test_server.rb +589 -0
  364. data/test/counter/test_store.rb +258 -0
  365. data/test/counter/test_validator.rb +137 -0
  366. data/test/helper.rb +155 -0
  367. data/test/helpers/fuzzy_assert.rb +89 -0
  368. data/test/helpers/process_extenstion.rb +33 -0
  369. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  370. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  371. data/test/plugin/data/2010/01/20100102.log +0 -0
  372. data/test/plugin/data/log/bar +0 -0
  373. data/test/plugin/data/log/foo/bar.log +0 -0
  374. data/test/plugin/data/log/foo/bar2 +0 -0
  375. data/test/plugin/data/log/test.log +0 -0
  376. data/test/plugin/data/sd_file/config +11 -0
  377. data/test/plugin/data/sd_file/config.json +17 -0
  378. data/test/plugin/data/sd_file/config.yaml +11 -0
  379. data/test/plugin/data/sd_file/config.yml +11 -0
  380. data/test/plugin/data/sd_file/invalid_config.yml +7 -0
  381. data/test/plugin/in_tail/test_fifo.rb +121 -0
  382. data/test/plugin/in_tail/test_io_handler.rb +140 -0
  383. data/test/plugin/in_tail/test_position_file.rb +379 -0
  384. data/test/plugin/out_forward/test_ack_handler.rb +101 -0
  385. data/test/plugin/out_forward/test_connection_manager.rb +145 -0
  386. data/test/plugin/out_forward/test_handshake_protocol.rb +112 -0
  387. data/test/plugin/out_forward/test_load_balancer.rb +106 -0
  388. data/test/plugin/out_forward/test_socket_cache.rb +149 -0
  389. data/test/plugin/test_bare_output.rb +131 -0
  390. data/test/plugin/test_base.rb +115 -0
  391. data/test/plugin/test_buf_file.rb +1275 -0
  392. data/test/plugin/test_buf_file_single.rb +833 -0
  393. data/test/plugin/test_buf_memory.rb +42 -0
  394. data/test/plugin/test_buffer.rb +1383 -0
  395. data/test/plugin/test_buffer_chunk.rb +198 -0
  396. data/test/plugin/test_buffer_file_chunk.rb +871 -0
  397. data/test/plugin/test_buffer_file_single_chunk.rb +611 -0
  398. data/test/plugin/test_buffer_memory_chunk.rb +339 -0
  399. data/test/plugin/test_compressable.rb +87 -0
  400. data/test/plugin/test_file_util.rb +96 -0
  401. data/test/plugin/test_file_wrapper.rb +126 -0
  402. data/test/plugin/test_filter.rb +368 -0
  403. data/test/plugin/test_filter_grep.rb +697 -0
  404. data/test/plugin/test_filter_parser.rb +731 -0
  405. data/test/plugin/test_filter_record_transformer.rb +577 -0
  406. data/test/plugin/test_filter_stdout.rb +207 -0
  407. data/test/plugin/test_formatter_csv.rb +136 -0
  408. data/test/plugin/test_formatter_hash.rb +38 -0
  409. data/test/plugin/test_formatter_json.rb +61 -0
  410. data/test/plugin/test_formatter_ltsv.rb +70 -0
  411. data/test/plugin/test_formatter_msgpack.rb +28 -0
  412. data/test/plugin/test_formatter_out_file.rb +116 -0
  413. data/test/plugin/test_formatter_single_value.rb +44 -0
  414. data/test/plugin/test_formatter_tsv.rb +76 -0
  415. data/test/plugin/test_in_debug_agent.rb +49 -0
  416. data/test/plugin/test_in_exec.rb +261 -0
  417. data/test/plugin/test_in_forward.rb +1180 -0
  418. data/test/plugin/test_in_gc_stat.rb +62 -0
  419. data/test/plugin/test_in_http.rb +1080 -0
  420. data/test/plugin/test_in_monitor_agent.rb +923 -0
  421. data/test/plugin/test_in_object_space.rb +60 -0
  422. data/test/plugin/test_in_sample.rb +190 -0
  423. data/test/plugin/test_in_syslog.rb +505 -0
  424. data/test/plugin/test_in_tail.rb +2363 -0
  425. data/test/plugin/test_in_tcp.rb +243 -0
  426. data/test/plugin/test_in_udp.rb +268 -0
  427. data/test/plugin/test_in_unix.rb +181 -0
  428. data/test/plugin/test_input.rb +137 -0
  429. data/test/plugin/test_metadata.rb +89 -0
  430. data/test/plugin/test_metrics.rb +294 -0
  431. data/test/plugin/test_metrics_local.rb +96 -0
  432. data/test/plugin/test_multi_output.rb +204 -0
  433. data/test/plugin/test_out_copy.rb +308 -0
  434. data/test/plugin/test_out_exec.rb +312 -0
  435. data/test/plugin/test_out_exec_filter.rb +606 -0
  436. data/test/plugin/test_out_file.rb +1037 -0
  437. data/test/plugin/test_out_forward.rb +1348 -0
  438. data/test/plugin/test_out_http.rb +428 -0
  439. data/test/plugin/test_out_null.rb +105 -0
  440. data/test/plugin/test_out_relabel.rb +28 -0
  441. data/test/plugin/test_out_roundrobin.rb +146 -0
  442. data/test/plugin/test_out_secondary_file.rb +458 -0
  443. data/test/plugin/test_out_stdout.rb +205 -0
  444. data/test/plugin/test_out_stream.rb +103 -0
  445. data/test/plugin/test_output.rb +1065 -0
  446. data/test/plugin/test_output_as_buffered.rb +2024 -0
  447. data/test/plugin/test_output_as_buffered_backup.rb +363 -0
  448. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  449. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  450. data/test/plugin/test_output_as_buffered_retries.rb +919 -0
  451. data/test/plugin/test_output_as_buffered_secondary.rb +882 -0
  452. data/test/plugin/test_output_as_standard.rb +374 -0
  453. data/test/plugin/test_owned_by.rb +35 -0
  454. data/test/plugin/test_parser.rb +399 -0
  455. data/test/plugin/test_parser_apache.rb +42 -0
  456. data/test/plugin/test_parser_apache2.rb +47 -0
  457. data/test/plugin/test_parser_apache_error.rb +45 -0
  458. data/test/plugin/test_parser_csv.rb +200 -0
  459. data/test/plugin/test_parser_json.rb +138 -0
  460. data/test/plugin/test_parser_labeled_tsv.rb +160 -0
  461. data/test/plugin/test_parser_multiline.rb +111 -0
  462. data/test/plugin/test_parser_nginx.rb +88 -0
  463. data/test/plugin/test_parser_none.rb +52 -0
  464. data/test/plugin/test_parser_regexp.rb +289 -0
  465. data/test/plugin/test_parser_syslog.rb +650 -0
  466. data/test/plugin/test_parser_tsv.rb +122 -0
  467. data/test/plugin/test_sd_file.rb +228 -0
  468. data/test/plugin/test_sd_srv.rb +230 -0
  469. data/test/plugin/test_storage.rb +167 -0
  470. data/test/plugin/test_storage_local.rb +335 -0
  471. data/test/plugin/test_string_util.rb +26 -0
  472. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  473. data/test/plugin_helper/data/cert/cert-with-CRLF.pem +19 -0
  474. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  475. data/test/plugin_helper/data/cert/cert.pem +19 -0
  476. data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +27 -0
  477. data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +20 -0
  478. data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +27 -0
  479. data/test/plugin_helper/data/cert/cert_chains/cert.pem +40 -0
  480. data/test/plugin_helper/data/cert/empty.pem +0 -0
  481. data/test/plugin_helper/data/cert/generate_cert.rb +125 -0
  482. data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +30 -0
  483. data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +27 -0
  484. data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +20 -0
  485. data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +20 -0
  486. data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +30 -0
  487. data/test/plugin_helper/data/cert/with_ca/cert-key.pem +27 -0
  488. data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +21 -0
  489. data/test/plugin_helper/data/cert/with_ca/cert.pem +21 -0
  490. data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +30 -0
  491. data/test/plugin_helper/data/cert/without_ca/cert-key.pem +27 -0
  492. data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +20 -0
  493. data/test/plugin_helper/data/cert/without_ca/cert.pem +20 -0
  494. data/test/plugin_helper/http_server/test_app.rb +65 -0
  495. data/test/plugin_helper/http_server/test_route.rb +32 -0
  496. data/test/plugin_helper/service_discovery/test_manager.rb +93 -0
  497. data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +21 -0
  498. data/test/plugin_helper/test_cert_option.rb +25 -0
  499. data/test/plugin_helper/test_child_process.rb +840 -0
  500. data/test/plugin_helper/test_compat_parameters.rb +358 -0
  501. data/test/plugin_helper/test_event_emitter.rb +80 -0
  502. data/test/plugin_helper/test_event_loop.rb +52 -0
  503. data/test/plugin_helper/test_extract.rb +194 -0
  504. data/test/plugin_helper/test_formatter.rb +255 -0
  505. data/test/plugin_helper/test_http_server_helper.rb +372 -0
  506. data/test/plugin_helper/test_inject.rb +561 -0
  507. data/test/plugin_helper/test_metrics.rb +137 -0
  508. data/test/plugin_helper/test_parser.rb +264 -0
  509. data/test/plugin_helper/test_record_accessor.rb +238 -0
  510. data/test/plugin_helper/test_retry_state.rb +442 -0
  511. data/test/plugin_helper/test_server.rb +1823 -0
  512. data/test/plugin_helper/test_service_discovery.rb +165 -0
  513. data/test/plugin_helper/test_socket.rb +146 -0
  514. data/test/plugin_helper/test_storage.rb +542 -0
  515. data/test/plugin_helper/test_thread.rb +164 -0
  516. data/test/plugin_helper/test_timer.rb +130 -0
  517. data/test/scripts/exec_script.rb +32 -0
  518. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  519. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  520. data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
  521. data/test/scripts/fluent/plugin/out_test.rb +81 -0
  522. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  523. data/test/scripts/fluent/plugin/parser_known.rb +4 -0
  524. data/test/test_capability.rb +74 -0
  525. data/test/test_clock.rb +164 -0
  526. data/test/test_config.rb +202 -0
  527. data/test/test_configdsl.rb +148 -0
  528. data/test/test_daemonizer.rb +91 -0
  529. data/test/test_engine.rb +203 -0
  530. data/test/test_event.rb +531 -0
  531. data/test/test_event_router.rb +331 -0
  532. data/test/test_event_time.rb +199 -0
  533. data/test/test_filter.rb +121 -0
  534. data/test/test_fluent_log_event_router.rb +99 -0
  535. data/test/test_formatter.rb +366 -0
  536. data/test/test_input.rb +31 -0
  537. data/test/test_log.rb +994 -0
  538. data/test/test_logger_initializer.rb +46 -0
  539. data/test/test_match.rb +148 -0
  540. data/test/test_mixin.rb +351 -0
  541. data/test/test_msgpack_factory.rb +18 -0
  542. data/test/test_oj_options.rb +55 -0
  543. data/test/test_output.rb +278 -0
  544. data/test/test_plugin.rb +251 -0
  545. data/test/test_plugin_classes.rb +370 -0
  546. data/test/test_plugin_helper.rb +81 -0
  547. data/test/test_plugin_id.rb +119 -0
  548. data/test/test_process.rb +14 -0
  549. data/test/test_root_agent.rb +951 -0
  550. data/test/test_static_config_analysis.rb +177 -0
  551. data/test/test_supervisor.rb +601 -0
  552. data/test/test_test_drivers.rb +136 -0
  553. data/test/test_time_formatter.rb +301 -0
  554. data/test/test_time_parser.rb +362 -0
  555. data/test/test_tls.rb +65 -0
  556. data/test/test_unique_id.rb +47 -0
  557. data/test/test_variable_store.rb +65 -0
  558. metadata +1261 -0
@@ -0,0 +1,1348 @@
1
+ require_relative '../helper'
2
+ require 'fluent/test/driver/output'
3
+ require 'fluent/plugin/out_forward'
4
+ require 'flexmock/test_unit'
5
+
6
+ require 'fluent/test/driver/input'
7
+ require 'fluent/plugin/in_forward'
8
+
9
+ class ForwardOutputTest < Test::Unit::TestCase
10
+ def setup
11
+ Fluent::Test.setup
12
+ FileUtils.rm_rf(TMP_DIR)
13
+ FileUtils.mkdir_p(TMP_DIR)
14
+ @d = nil
15
+ @target_port = unused_port
16
+ end
17
+
18
+ def teardown
19
+ @d.instance_shutdown if @d
20
+ @port = nil
21
+ end
22
+
23
+ TMP_DIR = File.join(__dir__, "../tmp/out_forward#{ENV['TEST_ENV_NUMBER']}")
24
+
25
+ TARGET_HOST = '127.0.0.1'
26
+
27
+ def config
28
+ %[
29
+ send_timeout 51
30
+ heartbeat_type udp
31
+ <server>
32
+ name test
33
+ host #{TARGET_HOST}
34
+ port #{@target_port}
35
+ </server>
36
+ ]
37
+ end
38
+
39
+ def target_config
40
+ %[
41
+ port #{@target_port}
42
+ bind #{TARGET_HOST}
43
+ ]
44
+ end
45
+
46
+ def create_driver(conf=config)
47
+ Fluent::Test::Driver::Output.new(Fluent::Plugin::ForwardOutput) {
48
+ attr_reader :sent_chunk_ids, :ack_handler, :discovery_manager
49
+
50
+ def initialize
51
+ super
52
+ @sent_chunk_ids = []
53
+ end
54
+
55
+ def try_write(chunk)
56
+ retval = super
57
+ @sent_chunk_ids << chunk.unique_id
58
+ retval
59
+ end
60
+ }.configure(conf)
61
+ end
62
+
63
+ test 'configure' do
64
+ @d = d = create_driver(%[
65
+ self_hostname localhost
66
+ <server>
67
+ name test
68
+ host #{TARGET_HOST}
69
+ port #{@target_port}
70
+ </server>
71
+ ])
72
+ nodes = d.instance.nodes
73
+ assert_equal 60, d.instance.send_timeout
74
+ assert_equal :transport, d.instance.heartbeat_type
75
+ assert_equal 1, nodes.length
76
+ assert_nil d.instance.connect_timeout
77
+ node = nodes.first
78
+ assert_equal "test", node.name
79
+ assert_equal '127.0.0.1', node.host
80
+ assert_equal @target_port, node.port
81
+ end
82
+
83
+ test 'configure_traditional' do
84
+ @d = d = create_driver(<<EOL)
85
+ self_hostname localhost
86
+ <server>
87
+ name test
88
+ host #{TARGET_HOST}
89
+ port #{@target_port}
90
+ </server>
91
+ buffer_chunk_limit 10m
92
+ EOL
93
+ instance = d.instance
94
+ assert instance.chunk_key_tag
95
+ assert !instance.chunk_key_time
96
+ assert_equal [], instance.chunk_keys
97
+ assert{ instance.buffer.is_a?(Fluent::Plugin::MemoryBuffer) }
98
+ assert_equal( 10*1024*1024, instance.buffer.chunk_limit_size )
99
+ end
100
+
101
+ test 'configure timeouts' do
102
+ @d = d = create_driver(%[
103
+ send_timeout 30
104
+ connect_timeout 10
105
+ hard_timeout 15
106
+ ack_response_timeout 20
107
+ <server>
108
+ host #{TARGET_HOST}
109
+ port #{@target_port}
110
+ </server>
111
+ ])
112
+ assert_equal 30, d.instance.send_timeout
113
+ assert_equal 10, d.instance.connect_timeout
114
+ assert_equal 15, d.instance.hard_timeout
115
+ assert_equal 20, d.instance.ack_response_timeout
116
+ end
117
+
118
+ test 'configure_udp_heartbeat' do
119
+ @d = d = create_driver(config + "\nheartbeat_type udp")
120
+ assert_equal :udp, d.instance.heartbeat_type
121
+ end
122
+
123
+ test 'configure_none_heartbeat' do
124
+ @d = d = create_driver(config + "\nheartbeat_type none")
125
+ assert_equal :none, d.instance.heartbeat_type
126
+ end
127
+
128
+ test 'configure_expire_dns_cache' do
129
+ @d = d = create_driver(config + "\nexpire_dns_cache 5")
130
+ assert_equal 5, d.instance.expire_dns_cache
131
+ end
132
+
133
+ test 'configure_dns_round_robin udp' do
134
+ assert_raise(Fluent::ConfigError) do
135
+ create_driver(config + "\nheartbeat_type udp\ndns_round_robin true")
136
+ end
137
+ end
138
+
139
+ test 'configure_dns_round_robin transport' do
140
+ @d = d = create_driver(config + "\nheartbeat_type transport\ndns_round_robin true")
141
+ assert_equal true, d.instance.dns_round_robin
142
+ end
143
+
144
+ test 'configure_dns_round_robin none' do
145
+ @d = d = create_driver(config + "\nheartbeat_type none\ndns_round_robin true")
146
+ assert_equal true, d.instance.dns_round_robin
147
+ end
148
+
149
+ test 'configure_no_server' do
150
+ assert_raise(Fluent::ConfigError, 'forward output plugin requires at least one <server> is required') do
151
+ create_driver('')
152
+ end
153
+ end
154
+
155
+ test 'configure with ignore_network_errors_at_startup' do
156
+ normal_conf = config_element('match', '**', {}, [
157
+ config_element('server', '', {'name' => 'test', 'host' => 'unexisting.yaaaaaaaaaaaaaay.host.example.com'})
158
+ ])
159
+ assert_raise SocketError do
160
+ create_driver(normal_conf)
161
+ end
162
+
163
+ conf = config_element('match', '**', {'ignore_network_errors_at_startup' => 'true'}, [
164
+ config_element('server', '', {'name' => 'test', 'host' => 'unexisting.yaaaaaaaaaaaaaay.host.example.com'})
165
+ ])
166
+ @d = d = create_driver(conf)
167
+ expected_log = "failed to resolve node name when configured"
168
+ expected_detail = 'server="test" error_class=SocketError'
169
+ logs = d.logs
170
+ assert{ logs.any?{|log| log.include?(expected_log) && log.include?(expected_detail) } }
171
+ end
172
+
173
+ data('CA cert' => 'tls_ca_cert_path',
174
+ 'non CA cert' => 'tls_cert_path')
175
+ test 'configure tls_cert_path/tls_ca_cert_path' do |param|
176
+ dummy_cert_path = File.join(TMP_DIR, "dummy_cert.pem")
177
+ FileUtils.touch(dummy_cert_path)
178
+ conf = %[
179
+ send_timeout 5
180
+ transport tls
181
+ tls_insecure_mode true
182
+ #{param} #{dummy_cert_path}
183
+ <server>
184
+ host #{TARGET_HOST}
185
+ port #{@target_port}
186
+ </server>
187
+ ]
188
+
189
+ @d = d = create_driver(conf)
190
+ # In the plugin, tls_ca_cert_path is used for both cases
191
+ assert_equal([dummy_cert_path], d.instance.tls_ca_cert_path)
192
+ end
193
+
194
+ sub_test_case "certstore loading parameters for Windows" do
195
+ test 'certstore related config parameters' do
196
+ omit "certstore related values raise error on not Windows" if Fluent.windows?
197
+ conf = %[
198
+ send_timeout 5
199
+ transport tls
200
+ tls_cert_logical_store_name Root
201
+ tls_cert_thumbprint a909502dd82ae41433e6f83886b00d4277a32a7b
202
+ <server>
203
+ host #{TARGET_HOST}
204
+ port #{@target_port}
205
+ </server>
206
+ ]
207
+
208
+ assert_raise(Fluent::ConfigError) do
209
+ create_driver(conf)
210
+ end
211
+ end
212
+
213
+ test 'cert_logical_store_name and tls_cert_thumbprint default values' do
214
+ conf = %[
215
+ send_timeout 5
216
+ transport tls
217
+ <server>
218
+ host #{TARGET_HOST}
219
+ port #{@target_port}
220
+ </server>
221
+ ]
222
+
223
+ @d = d = create_driver(conf)
224
+ assert_nil d.instance.tls_cert_logical_store_name
225
+ assert_nil d.instance.tls_cert_thumbprint
226
+ end
227
+
228
+ data('CA cert' => 'tls_ca_cert_path',
229
+ 'non CA cert' => 'tls_cert_path')
230
+ test 'specify tls_cert_logical_store_name and tls_cert_path should raise error' do |param|
231
+ omit "Loading CertStore feature works only Windows" unless Fluent.windows?
232
+ dummy_cert_path = File.join(TMP_DIR, "dummy_cert.pem")
233
+ FileUtils.touch(dummy_cert_path)
234
+ conf = %[
235
+ send_timeout 5
236
+ transport tls
237
+ #{param} #{dummy_cert_path}
238
+ tls_cert_logical_store_name Root
239
+ <server>
240
+ host #{TARGET_HOST}
241
+ port #{@target_port}
242
+ </server>
243
+ ]
244
+
245
+ assert_raise(Fluent::ConfigError) do
246
+ create_driver(conf)
247
+ end
248
+ end
249
+
250
+ test 'configure cert_logical_store_name and tls_cert_thumbprint' do
251
+ omit "Loading CertStore feature works only Windows" unless Fluent.windows?
252
+ conf = %[
253
+ send_timeout 5
254
+ transport tls
255
+ tls_cert_logical_store_name Root
256
+ tls_cert_thumbprint a909502dd82ae41433e6f83886b00d4277a32a7b
257
+ <server>
258
+ host #{TARGET_HOST}
259
+ port #{@target_port}
260
+ </server>
261
+ ]
262
+
263
+ @d = d = create_driver(conf)
264
+ assert_equal "Root", d.instance.tls_cert_logical_store_name
265
+ assert_equal "a909502dd82ae41433e6f83886b00d4277a32a7b", d.instance.tls_cert_thumbprint
266
+ end
267
+ end
268
+
269
+ test 'server is an abbreviation of static type of service_discovery' do
270
+ @d = d = create_driver(%[
271
+ <server>
272
+ host 127.0.0.1
273
+ port 1234
274
+ </server>
275
+
276
+ <service_discovery>
277
+ @type static
278
+
279
+ <service>
280
+ host 127.0.0.1
281
+ port 1235
282
+ </service>
283
+ </service_discovery>
284
+ ])
285
+
286
+
287
+ assert_equal(
288
+ [
289
+ { host: '127.0.0.1', port: 1234 },
290
+ { host: '127.0.0.1', port: 1235 },
291
+ ],
292
+ d.instance.discovery_manager.services.collect do |service|
293
+ { host: service.host, port: service.port }
294
+ end
295
+ )
296
+ end
297
+
298
+ test 'pass username and password as empty string to HandshakeProtocol' do
299
+ config_path = File.join(TMP_DIR, "sd_file.conf")
300
+ File.open(config_path, 'w') do |file|
301
+ file.write(%[
302
+ - 'host': 127.0.0.1
303
+ 'port': 1234
304
+ 'weight': 1
305
+ ])
306
+ end
307
+
308
+ mock(Fluent::Plugin::ForwardOutput::HandshakeProtocol).new(log: anything, hostname: nil, shared_key: anything, password: '', username: '')
309
+ @d = d = create_driver(%[
310
+ <service_discovery>
311
+ @type file
312
+ path #{config_path}
313
+ </service_discovery>
314
+ ])
315
+
316
+ assert_equal 1, d.instance.discovery_manager.services.size
317
+ assert_equal '127.0.0.1', d.instance.discovery_manager.services[0].host
318
+ assert_equal 1234, d.instance.discovery_manager.services[0].port
319
+ end
320
+
321
+ test 'compress_default_value' do
322
+ @d = d = create_driver
323
+ assert_equal :text, d.instance.compress
324
+
325
+ node = d.instance.nodes.first
326
+ assert_equal :text, node.instance_variable_get(:@compress)
327
+ end
328
+
329
+ test 'set_compress_is_gzip' do
330
+ @d = d = create_driver(config + %[compress gzip])
331
+ assert_equal :gzip, d.instance.compress
332
+ assert_equal :gzip, d.instance.buffer.compress
333
+
334
+ node = d.instance.nodes.first
335
+ assert_equal :gzip, node.instance_variable_get(:@compress)
336
+ end
337
+
338
+ test 'set_compress_is_gzip_in_buffer_section' do
339
+ mock = flexmock($log)
340
+ mock.should_receive(:log).with("buffer is compressed. If you also want to save the bandwidth of a network, Add `compress` configuration in <match>")
341
+
342
+ @d = d = create_driver(config + %[
343
+ <buffer>
344
+ type memory
345
+ compress gzip
346
+ </buffer>
347
+ ])
348
+ assert_equal :text, d.instance.compress
349
+ assert_equal :gzip, d.instance.buffer.compress
350
+
351
+ node = d.instance.nodes.first
352
+ assert_equal :text, node.instance_variable_get(:@compress)
353
+ end
354
+
355
+ test 'phi_failure_detector disabled' do
356
+ @d = d = create_driver(config + %[phi_failure_detector false \n phi_threshold 0])
357
+ node = d.instance.nodes.first
358
+ stub(node.failure).phi { raise 'Should not be called' }
359
+ node.tick
360
+ assert_true node.available?
361
+ end
362
+
363
+ test 'phi_failure_detector enabled' do
364
+ @d = d = create_driver(config + %[phi_failure_detector true \n phi_threshold 0])
365
+ node = d.instance.nodes.first
366
+ node.tick
367
+ assert_false node.available?
368
+ end
369
+
370
+ test 'require_ack_response is disabled in default' do
371
+ @d = d = create_driver(config)
372
+ assert_equal false, d.instance.require_ack_response
373
+ assert_equal 190, d.instance.ack_response_timeout
374
+ end
375
+
376
+ test 'require_ack_response can be enabled' do
377
+ @d = d = create_driver(config + %[
378
+ require_ack_response true
379
+ ack_response_timeout 2s
380
+ ])
381
+ d.instance_start
382
+ assert d.instance.require_ack_response
383
+ assert_equal 2, d.instance.ack_response_timeout
384
+ end
385
+
386
+ test 'suspend_flush is disable before before_shutdown' do
387
+ @d = d = create_driver(config + %[
388
+ require_ack_response true
389
+ ack_response_timeout 2s
390
+ ])
391
+ d.instance_start
392
+ assert_false d.instance.instance_variable_get(:@suspend_flush)
393
+ end
394
+
395
+ test 'suspend_flush should be enabled and try_flush returns nil after before_shutdown' do
396
+ @d = d = create_driver(config + %[
397
+ require_ack_response true
398
+ ack_response_timeout 2s
399
+ ])
400
+ d.instance_start
401
+ d.instance.before_shutdown
402
+ assert_true d.instance.instance_variable_get(:@suspend_flush)
403
+ assert_nil d.instance.try_flush
404
+ end
405
+
406
+ test 'verify_connection_at_startup is disabled in default' do
407
+ @d = d = create_driver(config)
408
+ assert_false d.instance.verify_connection_at_startup
409
+ end
410
+
411
+ test 'verify_connection_at_startup can be enabled' do
412
+ @d = d = create_driver(config + %[
413
+ verify_connection_at_startup true
414
+ ])
415
+ assert_true d.instance.verify_connection_at_startup
416
+ end
417
+
418
+ test 'send tags in str (utf-8 strings)' do
419
+ target_input_driver = create_target_input_driver
420
+
421
+ @d = d = create_driver(config + %[flush_interval 1s])
422
+
423
+ time = event_time("2011-01-02 13:14:15 UTC")
424
+
425
+ tag_in_utf8 = "test.utf8".encode("utf-8")
426
+ tag_in_ascii = "test.ascii".encode("ascii-8bit")
427
+
428
+ emit_events = [
429
+ [tag_in_utf8, time, {"a" => 1}],
430
+ [tag_in_ascii, time, {"a" => 2}],
431
+ ]
432
+
433
+ stub(d.instance.ack_handler).read_ack_from_sock(anything).never
434
+ target_input_driver.run(expect_records: 2) do
435
+ d.run do
436
+ emit_events.each do |tag, t, record|
437
+ d.feed(tag, t, record)
438
+ end
439
+ end
440
+ end
441
+
442
+ events = target_input_driver.events
443
+ assert_equal_event_time(time, events[0][1])
444
+ assert_equal ['test.utf8', time, emit_events[0][2]], events[0]
445
+ assert_equal Encoding::UTF_8, events[0][0].encoding
446
+ assert_equal_event_time(time, events[1][1])
447
+ assert_equal ['test.ascii', time, emit_events[1][2]], events[1]
448
+ assert_equal Encoding::UTF_8, events[1][0].encoding
449
+ end
450
+
451
+ test 'send_with_time_as_integer' do
452
+ target_input_driver = create_target_input_driver
453
+
454
+ @d = d = create_driver(config + %[flush_interval 1s])
455
+
456
+ time = event_time("2011-01-02 13:14:15 UTC")
457
+
458
+ records = [
459
+ {"a" => 1},
460
+ {"a" => 2}
461
+ ]
462
+
463
+ stub(d.instance.ack_handler).read_ack_from_sock(anything).never
464
+ target_input_driver.run(expect_records: 2) do
465
+ d.run(default_tag: 'test') do
466
+ records.each do |record|
467
+ d.feed(time, record)
468
+ end
469
+ end
470
+ end
471
+
472
+ events = target_input_driver.events
473
+ assert_equal_event_time(time, events[0][1])
474
+ assert_equal ['test', time, records[0]], events[0]
475
+ assert_equal_event_time(time, events[1][1])
476
+ assert_equal ['test', time, records[1]], events[1]
477
+ end
478
+
479
+ test 'send_without_time_as_integer' do
480
+ target_input_driver = create_target_input_driver
481
+
482
+ @d = d = create_driver(config + %[
483
+ flush_interval 1s
484
+ time_as_integer false
485
+ ])
486
+
487
+ time = event_time("2011-01-02 13:14:15 UTC")
488
+
489
+ records = [
490
+ {"a" => 1},
491
+ {"a" => 2}
492
+ ]
493
+ stub(d.instance.ack_handler).read_ack_from_sock(anything).never
494
+ target_input_driver.run(expect_records: 2) do
495
+ d.run(default_tag: 'test') do
496
+ records.each do |record|
497
+ d.feed(time, record)
498
+ end
499
+ end
500
+ end
501
+
502
+ events = target_input_driver.events
503
+ assert_equal_event_time(time, events[0][1])
504
+ assert_equal ['test', time, records[0]], events[0]
505
+ assert_equal_event_time(time, events[1][1])
506
+ assert_equal ['test', time, records[1]], events[1]
507
+ end
508
+
509
+ test 'send_comprssed_message_pack_stream_if_compress_is_gzip' do
510
+ target_input_driver = create_target_input_driver
511
+
512
+ @d = d = create_driver(config + %[
513
+ flush_interval 1s
514
+ compress gzip
515
+ ])
516
+
517
+ time = event_time('2011-01-02 13:14:15 UTC')
518
+
519
+ records = [
520
+ {"a" => 1},
521
+ {"a" => 2}
522
+ ]
523
+ target_input_driver.run(expect_records: 2) do
524
+ d.run(default_tag: 'test') do
525
+ records.each do |record|
526
+ d.feed(time, record)
527
+ end
528
+ end
529
+ end
530
+
531
+ event_streams = target_input_driver.event_streams
532
+ assert_true event_streams[0][1].is_a?(Fluent::CompressedMessagePackEventStream)
533
+
534
+ events = target_input_driver.events
535
+ assert_equal ['test', time, records[0]], events[0]
536
+ assert_equal ['test', time, records[1]], events[1]
537
+ end
538
+
539
+ test 'send_to_a_node_supporting_responses' do
540
+ target_input_driver = create_target_input_driver
541
+
542
+ @d = d = create_driver(config + %[flush_interval 1s])
543
+
544
+ time = event_time("2011-01-02 13:14:15 UTC")
545
+
546
+ records = [
547
+ {"a" => 1},
548
+ {"a" => 2}
549
+ ]
550
+ # not attempt to receive responses
551
+ stub(d.instance.ack_handler).read_ack_from_sock(anything).never
552
+ target_input_driver.run(expect_records: 2) do
553
+ d.run(default_tag: 'test') do
554
+ records.each do |record|
555
+ d.feed(time, record)
556
+ end
557
+ end
558
+ end
559
+
560
+ events = target_input_driver.events
561
+ assert_equal ['test', time, records[0]], events[0]
562
+ assert_equal ['test', time, records[1]], events[1]
563
+ end
564
+
565
+ test 'send_to_a_node_not_supporting_responses' do
566
+ target_input_driver = create_target_input_driver
567
+
568
+ @d = d = create_driver(config + %[flush_interval 1s])
569
+
570
+ time = event_time("2011-01-02 13:14:15 UTC")
571
+
572
+ records = [
573
+ {"a" => 1},
574
+ {"a" => 2}
575
+ ]
576
+ # not attempt to receive responses
577
+ stub(d.instance.ack_handler).read_ack_from_sock(anything).never
578
+ target_input_driver.run(expect_records: 2) do
579
+ d.run(default_tag: 'test') do
580
+ records.each do |record|
581
+ d.feed(time, record)
582
+ end
583
+ end
584
+ end
585
+
586
+ events = target_input_driver.events
587
+ assert_equal ['test', time, records[0]], events[0]
588
+ assert_equal ['test', time, records[1]], events[1]
589
+ end
590
+
591
+ test 'a node supporting responses' do
592
+ target_input_driver = create_target_input_driver
593
+
594
+ @d = d = create_driver(config + %[
595
+ require_ack_response true
596
+ ack_response_timeout 1s
597
+ <buffer tag>
598
+ flush_mode immediate
599
+ retry_type periodic
600
+ retry_wait 30s
601
+ flush_at_shutdown true
602
+ </buffer>
603
+ ])
604
+
605
+ time = event_time("2011-01-02 13:14:15 UTC")
606
+
607
+ acked_chunk_ids = []
608
+ nacked = false
609
+ mock.proxy(d.instance.ack_handler).read_ack_from_sock(anything) do |info, success|
610
+ if success
611
+ acked_chunk_ids << info.chunk_id
612
+ else
613
+ nacked = true
614
+ end
615
+ [info, success]
616
+ end
617
+
618
+ records = [
619
+ {"a" => 1},
620
+ {"a" => 2}
621
+ ]
622
+ target_input_driver.run(expect_records: 2, timeout: 5) do
623
+ d.end_if { acked_chunk_ids.size > 0 || nacked }
624
+ d.run(default_tag: 'test', wait_flush_completion: false, shutdown: false) do
625
+ d.feed([[time, records[0]], [time,records[1]]])
626
+ end
627
+ end
628
+
629
+ assert(!nacked, d.instance.log.logs.join)
630
+
631
+ events = target_input_driver.events
632
+ assert_equal ['test', time, records[0]], events[0]
633
+ assert_equal ['test', time, records[1]], events[1]
634
+
635
+ assert_equal 1, acked_chunk_ids.size
636
+ assert_equal d.instance.sent_chunk_ids.first, acked_chunk_ids.first
637
+ end
638
+
639
+ test 'a node supporting responses after stop' do
640
+ target_input_driver = create_target_input_driver
641
+
642
+ @d = d = create_driver(config + %[
643
+ require_ack_response true
644
+ ack_response_timeout 10s
645
+ <buffer tag>
646
+ flush_mode immediate
647
+ retry_type periodic
648
+ retry_wait 30s
649
+ flush_at_shutdown true
650
+ </buffer>
651
+ ])
652
+
653
+ time = event_time("2011-01-02 13:14:15 UTC")
654
+
655
+ acked_chunk_ids = []
656
+ nacked = false
657
+ mock.proxy(d.instance.ack_handler).read_ack_from_sock(anything) do |info, success|
658
+ if success
659
+ acked_chunk_ids << info.chunk_id
660
+ else
661
+ nacked = true
662
+ end
663
+ [info, success]
664
+ end
665
+
666
+ records = [
667
+ {"a" => 1},
668
+ {"a" => 2}
669
+ ]
670
+ target_input_driver.run(expect_records: 2, timeout: 5) do
671
+ d.end_if { acked_chunk_ids.size > 0 || nacked }
672
+ d.run(default_tag: 'test', wait_flush_completion: false, shutdown: false) do
673
+ d.instance.stop
674
+ d.feed([[time, records[0]], [time,records[1]]])
675
+ d.instance.before_shutdown
676
+ d.instance.shutdown
677
+ d.instance.after_shutdown
678
+ end
679
+ end
680
+
681
+ assert(!nacked, d.instance.log.logs.join)
682
+
683
+ events = target_input_driver.events
684
+ assert_equal ['test', time, records[0]], events[0]
685
+ assert_equal ['test', time, records[1]], events[1]
686
+
687
+ assert_equal 1, acked_chunk_ids.size
688
+ assert_equal d.instance.sent_chunk_ids.first, acked_chunk_ids.first
689
+ end
690
+
691
+ data('ack true' => true,
692
+ 'ack false' => false)
693
+ test 'TLS transport and ack parameter combination' do |ack|
694
+ omit "TLS and 'ack false' always fails on AppVeyor. Need to debug" if Fluent.windows? && !ack
695
+
696
+ input_conf = target_config + %[
697
+ <transport tls>
698
+ insecure true
699
+ </transport>
700
+ ]
701
+ target_input_driver = create_target_input_driver(conf: input_conf)
702
+
703
+ output_conf = %[
704
+ send_timeout 5
705
+ require_ack_response #{ack}
706
+ transport tls
707
+ tls_insecure_mode true
708
+ <server>
709
+ host #{TARGET_HOST}
710
+ port #{@target_port}
711
+ </server>
712
+ <buffer>
713
+ #flush_mode immediate
714
+ flush_interval 0s
715
+ flush_at_shutdown false # suppress errors in d.instance_shutdown
716
+ </buffer>
717
+ ]
718
+ @d = d = create_driver(output_conf)
719
+
720
+ time = event_time("2011-01-02 13:14:15 UTC")
721
+ records = [{"a" => 1}, {"a" => 2}]
722
+ target_input_driver.run(expect_records: 2, timeout: 3) do
723
+ d.run(default_tag: 'test', wait_flush_completion: false, shutdown: false) do
724
+ records.each do |record|
725
+ d.feed(time, record)
726
+ end
727
+ end
728
+ end
729
+
730
+ events = target_input_driver.events
731
+ assert{ events != [] }
732
+ assert_equal(['test', time, records[0]], events[0])
733
+ assert_equal(['test', time, records[1]], events[1])
734
+ end
735
+
736
+ test 'a destination node not supporting responses by just ignoring' do
737
+ target_input_driver = create_target_input_driver(response_stub: ->(_option) { nil }, disconnect: false)
738
+
739
+ @d = d = create_driver(config + %[
740
+ require_ack_response true
741
+ ack_response_timeout 1s
742
+ <buffer tag>
743
+ flush_mode immediate
744
+ retry_type periodic
745
+ retry_wait 30s
746
+ flush_at_shutdown false # suppress errors in d.instance_shutdown
747
+ flush_thread_interval 30s
748
+ </buffer>
749
+ ])
750
+
751
+ node = d.instance.nodes.first
752
+ delayed_commit_timeout_value = nil
753
+
754
+ time = event_time("2011-01-02 13:14:15 UTC")
755
+
756
+ records = [
757
+ {"a" => 1},
758
+ {"a" => 2}
759
+ ]
760
+ target_input_driver.end_if{ d.instance.rollback_count > 0 }
761
+ target_input_driver.end_if{ !node.available? }
762
+ target_input_driver.run(expect_records: 2, timeout: 25) do
763
+ d.run(default_tag: 'test', timeout: 20, wait_flush_completion: false, shutdown: false, flush: false) do
764
+ delayed_commit_timeout_value = d.instance.delayed_commit_timeout
765
+ d.feed([[time, records[0]], [time,records[1]]])
766
+ end
767
+ end
768
+
769
+ assert_equal (1 + 2), delayed_commit_timeout_value
770
+
771
+ events = target_input_driver.events
772
+ assert_equal ['test', time, records[0]], events[0]
773
+ assert_equal ['test', time, records[1]], events[1]
774
+
775
+ assert{ d.instance.rollback_count > 0 }
776
+
777
+ logs = d.instance.log.logs
778
+ assert{ logs.any?{|log| log.include?("no response from node. regard it as unavailable.") } }
779
+ end
780
+
781
+ test 'a destination node not supporting responses by disconnection' do
782
+ target_input_driver = create_target_input_driver(response_stub: ->(_option) { nil }, disconnect: true)
783
+
784
+ @d = d = create_driver(config + %[
785
+ require_ack_response true
786
+ ack_response_timeout 1s
787
+ <buffer tag>
788
+ flush_mode immediate
789
+ retry_type periodic
790
+ retry_wait 30s
791
+ flush_at_shutdown false # suppress errors in d.instance_shutdown
792
+ flush_thread_interval 30s
793
+ </buffer>
794
+ ])
795
+
796
+ node = d.instance.nodes.first
797
+ delayed_commit_timeout_value = nil
798
+
799
+ time = event_time("2011-01-02 13:14:15 UTC")
800
+
801
+ records = [
802
+ {"a" => 1},
803
+ {"a" => 2}
804
+ ]
805
+ target_input_driver.end_if{ d.instance.rollback_count > 0 }
806
+ target_input_driver.end_if{ !node.available? }
807
+ target_input_driver.run(expect_records: 2, timeout: 25) do
808
+ d.run(default_tag: 'test', timeout: 20, wait_flush_completion: false, shutdown: false, flush: false) do
809
+ delayed_commit_timeout_value = d.instance.delayed_commit_timeout
810
+ d.feed([[time, records[0]], [time,records[1]]])
811
+ end
812
+ end
813
+
814
+ assert_equal (1 + 2), delayed_commit_timeout_value
815
+
816
+ events = target_input_driver.events
817
+ assert_equal ['test', time, records[0]], events[0]
818
+ assert_equal ['test', time, records[1]], events[1]
819
+
820
+ assert{ d.instance.rollback_count > 0 }
821
+
822
+ logs = d.instance.log.logs
823
+ assert{ logs.any?{|log| log.include?("no response from node. regard it as unavailable.") } }
824
+ end
825
+
826
+ test 'authentication_with_shared_key' do
827
+ input_conf = target_config + %[
828
+ <security>
829
+ self_hostname in.localhost
830
+ shared_key fluentd-sharedkey
831
+ <client>
832
+ host 127.0.0.1
833
+ </client>
834
+ </security>
835
+ ]
836
+ target_input_driver = create_target_input_driver(conf: input_conf)
837
+
838
+ output_conf = %[
839
+ send_timeout 51
840
+ <security>
841
+ self_hostname localhost
842
+ shared_key fluentd-sharedkey
843
+ </security>
844
+ <server>
845
+ name test
846
+ host #{TARGET_HOST}
847
+ port #{@target_port}
848
+ shared_key fluentd-sharedkey
849
+ </server>
850
+ ]
851
+ @d = d = create_driver(output_conf)
852
+
853
+ time = event_time("2011-01-02 13:14:15 UTC")
854
+ records = [
855
+ {"a" => 1},
856
+ {"a" => 2}
857
+ ]
858
+
859
+ target_input_driver.run(expect_records: 2, timeout: 15) do
860
+ d.run(default_tag: 'test') do
861
+ records.each do |record|
862
+ d.feed(time, record)
863
+ end
864
+ end
865
+ end
866
+
867
+ events = target_input_driver.events
868
+ assert{ events != [] }
869
+ assert_equal(['test', time, records[0]], events[0])
870
+ assert_equal(['test', time, records[1]], events[1])
871
+ end
872
+
873
+ test 'keepalive + shared_key' do
874
+ input_conf = target_config + %[
875
+ <security>
876
+ self_hostname in.localhost
877
+ shared_key fluentd-sharedkey
878
+ </security>
879
+ ]
880
+ target_input_driver = create_target_input_driver(conf: input_conf)
881
+
882
+ output_conf = %[
883
+ send_timeout 51
884
+ keepalive true
885
+ <security>
886
+ self_hostname localhost
887
+ shared_key fluentd-sharedkey
888
+ </security>
889
+ <server>
890
+ name test
891
+ host #{TARGET_HOST}
892
+ port #{@target_port}
893
+ </server>
894
+ ]
895
+ @d = d = create_driver(output_conf)
896
+
897
+ time = event_time('2011-01-02 13:14:15 UTC')
898
+ records = [{ 'a' => 1 }, { 'a' => 2 }]
899
+ records2 = [{ 'b' => 1}, { 'b' => 2}]
900
+ target_input_driver.run(expect_records: 4, timeout: 15) do
901
+ d.run(default_tag: 'test') do
902
+ records.each do |record|
903
+ d.feed(time, record)
904
+ end
905
+
906
+ d.flush # emit buffer to reuse same socket later
907
+ records2.each do |record|
908
+ d.feed(time, record)
909
+ end
910
+ end
911
+ end
912
+
913
+ events = target_input_driver.events
914
+ assert{ events != [] }
915
+ assert_equal(['test', time, records[0]], events[0])
916
+ assert_equal(['test', time, records[1]], events[1])
917
+ assert_equal(['test', time, records2[0]], events[2])
918
+ assert_equal(['test', time, records2[1]], events[3])
919
+ end
920
+
921
+ test 'authentication_with_user_auth' do
922
+ input_conf = target_config + %[
923
+ <security>
924
+ self_hostname in.localhost
925
+ shared_key fluentd-sharedkey
926
+ user_auth true
927
+ <user>
928
+ username fluentd
929
+ password fluentd
930
+ </user>
931
+ <client>
932
+ host 127.0.0.1
933
+ </client>
934
+ </security>
935
+ ]
936
+ target_input_driver = create_target_input_driver(conf: input_conf)
937
+
938
+ output_conf = %[
939
+ send_timeout 51
940
+ <security>
941
+ self_hostname localhost
942
+ shared_key fluentd-sharedkey
943
+ </security>
944
+ <server>
945
+ name test
946
+ host #{TARGET_HOST}
947
+ port #{@target_port}
948
+ shared_key fluentd-sharedkey
949
+ username fluentd
950
+ password fluentd
951
+ </server>
952
+ ]
953
+ @d = d = create_driver(output_conf)
954
+
955
+ time = event_time("2011-01-02 13:14:15 UTC")
956
+ records = [
957
+ {"a" => 1},
958
+ {"a" => 2}
959
+ ]
960
+
961
+ target_input_driver.run(expect_records: 2, timeout: 15) do
962
+ d.run(default_tag: 'test') do
963
+ records.each do |record|
964
+ d.feed(time, record)
965
+ end
966
+ end
967
+ end
968
+
969
+ events = target_input_driver.events
970
+ assert{ events != [] }
971
+ assert_equal(['test', time, records[0]], events[0])
972
+ assert_equal(['test', time, records[1]], events[1])
973
+ end
974
+
975
+ # This test is not 100% but test failed with previous Node implementation which has race condition
976
+ test 'Node with security is thread-safe on multi threads' do
977
+ input_conf = target_config + %[
978
+ <security>
979
+ self_hostname in.localhost
980
+ shared_key fluentd-sharedkey
981
+ <client>
982
+ host 127.0.0.1
983
+ </client>
984
+ </security>
985
+ ]
986
+ target_input_driver = create_target_input_driver(conf: input_conf)
987
+ output_conf = %[
988
+ send_timeout 51
989
+ <security>
990
+ self_hostname localhost
991
+ shared_key fluentd-sharedkey
992
+ </security>
993
+ <server>
994
+ name test
995
+ host #{TARGET_HOST}
996
+ port #{@target_port}
997
+ shared_key fluentd-sharedkey
998
+ </server>
999
+ ]
1000
+ @d = d = create_driver(output_conf)
1001
+
1002
+ chunk = Fluent::Plugin::Buffer::MemoryChunk.new(Fluent::Plugin::Buffer::Metadata.new(nil, nil, nil))
1003
+ target_input_driver.run(timeout: 15) do
1004
+ d.run(shutdown: false) do
1005
+ node = d.instance.nodes.first
1006
+ arr = []
1007
+ 4.times {
1008
+ arr << Thread.new {
1009
+ node.send_data('test', chunk) rescue nil
1010
+ }
1011
+ }
1012
+ arr.each { |a| a.join }
1013
+ end
1014
+ end
1015
+
1016
+ logs = d.logs
1017
+ assert_false(logs.any? { |log|
1018
+ log.include?("invalid format for PONG message") || log.include?("shared key mismatch")
1019
+ }, "Actual log:\n#{logs.join}")
1020
+ end
1021
+
1022
+ def create_target_input_driver(response_stub: nil, disconnect: false, conf: target_config)
1023
+ require 'fluent/plugin/in_forward'
1024
+
1025
+ # TODO: Support actual TCP heartbeat test
1026
+ Fluent::Test::Driver::Input.new(Fluent::Plugin::ForwardInput) {
1027
+ if response_stub.nil?
1028
+ # do nothing because in_forward responds for ack option in default
1029
+ else
1030
+ define_method(:response) do |options|
1031
+ return response_stub.(options)
1032
+ end
1033
+ end
1034
+ }.configure(conf)
1035
+ end
1036
+
1037
+ test 'heartbeat_type_none' do
1038
+ @d = d = create_driver(config + "\nheartbeat_type none")
1039
+ node = d.instance.nodes.first
1040
+ assert_equal Fluent::Plugin::ForwardOutput::NoneHeartbeatNode, node.class
1041
+
1042
+ d.instance_start
1043
+ assert_nil d.instance.instance_variable_get(:@loop) # no HeartbeatHandler, or HeartbeatRequestTimer
1044
+ assert_nil d.instance.instance_variable_get(:@thread) # no HeartbeatHandler, or HeartbeatRequestTimer
1045
+
1046
+ stub(node.failure).phi { raise 'Should not be called' }
1047
+ node.tick
1048
+ assert_true node.available?
1049
+ end
1050
+
1051
+ test 'heartbeat_type_udp' do
1052
+ @d = d = create_driver(config + "\nheartbeat_type udp")
1053
+
1054
+ d.instance_start
1055
+ usock = d.instance.instance_variable_get(:@usock)
1056
+ servers = d.instance.instance_variable_get(:@_servers)
1057
+ timers = d.instance.instance_variable_get(:@_timers)
1058
+ assert_equal Fluent::PluginHelper::Socket::WrappedSocket::UDP, usock.class
1059
+ assert_kind_of UDPSocket, usock
1060
+ assert servers.find{|s| s.title == :out_forward_heartbeat_receiver }
1061
+ assert timers.include?(:out_forward_heartbeat_request)
1062
+
1063
+ mock(usock).send("\0", 0, Socket.pack_sockaddr_in(@target_port, '127.0.0.1')).once
1064
+ d.instance.send(:on_heartbeat_timer)
1065
+ end
1066
+
1067
+ test 'acts_as_secondary' do
1068
+ i = Fluent::Plugin::ForwardOutput.new
1069
+ conf = config_element(
1070
+ 'match',
1071
+ 'primary.**',
1072
+ {'@type' => 'forward'},
1073
+ [
1074
+ config_element('server', '', {'host' => '127.0.0.1'}),
1075
+ config_element('secondary', '', {}, [
1076
+ config_element('server', '', {'host' => '192.168.1.2'}),
1077
+ config_element('server', '', {'host' => '192.168.1.3'})
1078
+ ]),
1079
+ ]
1080
+ )
1081
+ assert_nothing_raised do
1082
+ i.configure(conf)
1083
+ end
1084
+ end
1085
+
1086
+ test 'when out_forward has @id' do
1087
+ # cancel https://github.com/fluent/fluentd/blob/077508ac817b7637307434d0c978d7cdc3d1c534/lib/fluent/plugin_id.rb#L43-L53
1088
+ # it always return true in test
1089
+ mock.proxy(Fluent::Plugin).new_sd('static', parent: anything) { |v|
1090
+ stub(v).plugin_id_for_test? { false }
1091
+ }.once
1092
+
1093
+ output = Fluent::Test::Driver::Output.new(Fluent::Plugin::ForwardOutput) {
1094
+ def plugin_id_for_test?
1095
+ false
1096
+ end
1097
+ }
1098
+
1099
+ assert_nothing_raised do
1100
+ output.configure(config + %[
1101
+ @id unique_out_forward
1102
+ ])
1103
+ end
1104
+ end
1105
+
1106
+ sub_test_case 'verify_connection_at_startup' do
1107
+ test 'nodes are not available' do
1108
+ @d = d = create_driver(config + %[
1109
+ verify_connection_at_startup true
1110
+ ])
1111
+ e = assert_raise Fluent::UnrecoverableError do
1112
+ d.instance_start
1113
+ end
1114
+ if Fluent.windows?
1115
+ assert_match(/No connection could be made because the target machine actively refused it/, e.message)
1116
+ else
1117
+ assert_match(/Connection refused/, e.message)
1118
+ end
1119
+
1120
+ d.instance_shutdown
1121
+ end
1122
+
1123
+ test 'nodes_shared_key_miss_match' do
1124
+ input_conf = target_config + %[
1125
+ <security>
1126
+ self_hostname in.localhost
1127
+ shared_key fluentd-sharedkey
1128
+ </security>
1129
+ ]
1130
+ target_input_driver = create_target_input_driver(conf: input_conf)
1131
+ output_conf = %[
1132
+ transport tcp
1133
+ verify_connection_at_startup true
1134
+ <security>
1135
+ self_hostname localhost
1136
+ shared_key key_miss_match
1137
+ </security>
1138
+
1139
+ <server>
1140
+ host #{TARGET_HOST}
1141
+ port #{@target_port}
1142
+ </server>
1143
+ ]
1144
+ @d = d = create_driver(output_conf)
1145
+
1146
+ target_input_driver.run(expect_records: 1, timeout: 1) do
1147
+ e = assert_raise Fluent::UnrecoverableError do
1148
+ d.instance_start
1149
+ end
1150
+ assert_match(/failed to establish connection/, e.message)
1151
+ end
1152
+ end
1153
+
1154
+ test 'nodes_shared_key_miss_match with TLS' do
1155
+ input_conf = target_config + %[
1156
+ <security>
1157
+ self_hostname in.localhost
1158
+ shared_key fluentd-sharedkey
1159
+ </security>
1160
+ <transport tls>
1161
+ insecure true
1162
+ </transport>
1163
+ ]
1164
+ target_input_driver = create_target_input_driver(conf: input_conf)
1165
+ output_conf = %[
1166
+ transport tls
1167
+ tls_insecure_mode true
1168
+ verify_connection_at_startup true
1169
+ <security>
1170
+ self_hostname localhost
1171
+ shared_key key_miss_match
1172
+ </security>
1173
+
1174
+ <server>
1175
+ host #{TARGET_HOST}
1176
+ port #{@target_port}
1177
+ </server>
1178
+ ]
1179
+ @d = d = create_driver(output_conf)
1180
+
1181
+ target_input_driver.run(expect_records: 1, timeout: 1) do
1182
+ e = assert_raise Fluent::UnrecoverableError do
1183
+ d.instance_start
1184
+ end
1185
+
1186
+ assert_match(/failed to establish connection/, e.message)
1187
+ end
1188
+ end
1189
+
1190
+ test 'nodes_shared_key_match' do
1191
+ input_conf = target_config + %[
1192
+ <security>
1193
+ self_hostname in.localhost
1194
+ shared_key fluentd-sharedkey
1195
+ </security>
1196
+ ]
1197
+ target_input_driver = create_target_input_driver(conf: input_conf)
1198
+ output_conf = %[
1199
+ verify_connection_at_startup true
1200
+ <security>
1201
+ self_hostname localhost
1202
+ shared_key fluentd-sharedkey
1203
+ </security>
1204
+ <server>
1205
+ name test
1206
+ host #{TARGET_HOST}
1207
+ port #{@target_port}
1208
+ </server>
1209
+ ]
1210
+ @d = d = create_driver(output_conf)
1211
+
1212
+ time = event_time("2011-01-02 13:14:15 UTC")
1213
+ records = [{ "a" => 1 }, { "a" => 2 }]
1214
+
1215
+ target_input_driver.run(expect_records: 2, timeout: 3) do
1216
+ d.run(default_tag: 'test') do
1217
+ records.each do |record|
1218
+ d.feed(time, record)
1219
+ end
1220
+ end
1221
+ end
1222
+
1223
+ events = target_input_driver.events
1224
+ assert_false events.empty?
1225
+ assert_equal(['test', time, records[0]], events[0])
1226
+ assert_equal(['test', time, records[1]], events[1])
1227
+ end
1228
+ end
1229
+
1230
+ test 'Create new connection per send_data' do
1231
+ target_input_driver = create_target_input_driver(conf: target_config)
1232
+ output_conf = config
1233
+ d = create_driver(output_conf)
1234
+ d.instance_start
1235
+
1236
+ begin
1237
+ chunk = Fluent::Plugin::Buffer::MemoryChunk.new(Fluent::Plugin::Buffer::Metadata.new(nil, nil, nil))
1238
+ mock.proxy(d.instance).socket_create_tcp(TARGET_HOST, @target_port,
1239
+ linger_timeout: anything,
1240
+ send_timeout: anything,
1241
+ recv_timeout: anything,
1242
+ connect_timeout: anything
1243
+ ) { |sock| mock(sock).close.once; sock }.twice
1244
+
1245
+ target_input_driver.run(timeout: 15) do
1246
+ d.run(shutdown: false) do
1247
+ node = d.instance.nodes.first
1248
+ 2.times do
1249
+ node.send_data('test', chunk) rescue nil
1250
+ end
1251
+ end
1252
+ end
1253
+ ensure
1254
+ d.instance_shutdown
1255
+ end
1256
+ end
1257
+
1258
+ test 'if no available node' do
1259
+ # do not create output driver
1260
+ d = create_driver(%[
1261
+ <server>
1262
+ name test
1263
+ standby
1264
+ host #{TARGET_HOST}
1265
+ port #{@target_port}
1266
+ </server>
1267
+ ])
1268
+ d.instance_start
1269
+ assert_nothing_raised { d.run }
1270
+ end
1271
+
1272
+ sub_test_case 'keepalive' do
1273
+ test 'Do not create connection per send_data' do
1274
+ target_input_driver = create_target_input_driver(conf: target_config)
1275
+ output_conf = config + %[
1276
+ keepalive true
1277
+ keepalive_timeout 2
1278
+ ]
1279
+ d = create_driver(output_conf)
1280
+ d.instance_start
1281
+
1282
+ begin
1283
+ chunk = Fluent::Plugin::Buffer::MemoryChunk.new(Fluent::Plugin::Buffer::Metadata.new(nil, nil, nil))
1284
+ mock.proxy(d.instance).socket_create_tcp(TARGET_HOST, @target_port,
1285
+ linger_timeout: anything,
1286
+ send_timeout: anything,
1287
+ recv_timeout: anything,
1288
+ connect_timeout: anything
1289
+ ) { |sock| mock(sock).close.once; sock }.once
1290
+
1291
+ target_input_driver.run(timeout: 15) do
1292
+ d.run(shutdown: false) do
1293
+ node = d.instance.nodes.first
1294
+ 2.times do
1295
+ node.send_data('test', chunk) rescue nil
1296
+ end
1297
+ end
1298
+ end
1299
+ ensure
1300
+ d.instance_shutdown
1301
+ end
1302
+ end
1303
+
1304
+ test 'create timer of purging obsolete sockets' do
1305
+ output_conf = config + %[keepalive true]
1306
+ d = create_driver(output_conf)
1307
+
1308
+ mock(d.instance).timer_execute(:out_forward_heartbeat_request, 1).once
1309
+ mock(d.instance).timer_execute(:out_forward_keep_alived_socket_watcher, 5).once
1310
+ d.instance_start
1311
+ end
1312
+
1313
+ sub_test_case 'with require_ack_response' do
1314
+ test 'Create connection per send_data' do
1315
+ target_input_driver = create_target_input_driver(conf: target_config)
1316
+ output_conf = config + %[
1317
+ require_ack_response true
1318
+ keepalive true
1319
+ keepalive_timeout 2
1320
+ ]
1321
+ d = create_driver(output_conf)
1322
+ d.instance_start
1323
+
1324
+ begin
1325
+ chunk = Fluent::Plugin::Buffer::MemoryChunk.new(Fluent::Plugin::Buffer::Metadata.new(nil, nil, nil))
1326
+ mock.proxy(d.instance).socket_create_tcp(TARGET_HOST, @target_port,
1327
+ linger_timeout: anything,
1328
+ send_timeout: anything,
1329
+ recv_timeout: anything,
1330
+ connect_timeout: anything) { |sock|
1331
+ mock(sock).close.once; sock
1332
+ }.twice
1333
+
1334
+ target_input_driver.run(timeout: 15) do
1335
+ d.run(shutdown: false) do
1336
+ node = d.instance.nodes.first
1337
+ 2.times do
1338
+ node.send_data('test', chunk) rescue nil
1339
+ end
1340
+ end
1341
+ end
1342
+ ensure
1343
+ d.instance_shutdown
1344
+ end
1345
+ end
1346
+ end
1347
+ end
1348
+ end