dtomasgu-fluentd 1.14.7.pre.dev

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