fluentd 0.12.40 → 1.6.2

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 (428) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  4. data/.github/ISSUE_TEMPLATE.md +17 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  6. data/.gitignore +5 -0
  7. data/.gitlab/cicd-template.yaml +10 -0
  8. data/.gitlab-ci.yml +147 -0
  9. data/.travis.yml +56 -20
  10. data/ADOPTERS.md +5 -0
  11. data/CHANGELOG.md +1369 -0
  12. data/CONTRIBUTING.md +16 -5
  13. data/GOVERNANCE.md +55 -0
  14. data/Gemfile +5 -0
  15. data/GithubWorkflow.md +78 -0
  16. data/LICENSE +202 -0
  17. data/MAINTAINERS.md +7 -0
  18. data/README.md +23 -11
  19. data/Rakefile +48 -2
  20. data/Vagrantfile +17 -0
  21. data/appveyor.yml +37 -0
  22. data/bin/fluent-binlog-reader +7 -0
  23. data/bin/fluent-ca-generate +6 -0
  24. data/bin/fluent-plugin-config-format +5 -0
  25. data/bin/fluent-plugin-generate +5 -0
  26. data/bin/fluentd +3 -0
  27. data/code-of-conduct.md +3 -0
  28. data/example/copy_roundrobin.conf +39 -0
  29. data/example/counter.conf +18 -0
  30. data/example/in_dummy_blocks.conf +17 -0
  31. data/example/in_dummy_with_compression.conf +23 -0
  32. data/example/in_forward.conf +7 -0
  33. data/example/in_forward_client.conf +37 -0
  34. data/example/in_forward_shared_key.conf +15 -0
  35. data/example/in_forward_tls.conf +14 -0
  36. data/example/in_forward_users.conf +24 -0
  37. data/example/in_forward_workers.conf +21 -0
  38. data/example/in_http.conf +3 -1
  39. data/example/in_out_forward.conf +17 -0
  40. data/example/logevents.conf +25 -0
  41. data/example/multi_filters.conf +61 -0
  42. data/example/out_exec_filter.conf +42 -0
  43. data/example/out_forward.conf +13 -13
  44. data/example/out_forward_buf_file.conf +23 -0
  45. data/example/out_forward_client.conf +109 -0
  46. data/example/out_forward_heartbeat_none.conf +16 -0
  47. data/example/out_forward_shared_key.conf +36 -0
  48. data/example/out_forward_tls.conf +18 -0
  49. data/example/out_forward_users.conf +65 -0
  50. data/example/out_null.conf +36 -0
  51. data/example/secondary_file.conf +42 -0
  52. data/example/suppress_config_dump.conf +7 -0
  53. data/example/worker_section.conf +36 -0
  54. data/fluent.conf +29 -0
  55. data/fluentd.gemspec +21 -11
  56. data/lib/fluent/agent.rb +67 -90
  57. data/lib/fluent/clock.rb +62 -0
  58. data/lib/fluent/command/binlog_reader.rb +244 -0
  59. data/lib/fluent/command/ca_generate.rb +181 -0
  60. data/lib/fluent/command/cat.rb +42 -18
  61. data/lib/fluent/command/debug.rb +12 -10
  62. data/lib/fluent/command/fluentd.rb +153 -5
  63. data/lib/fluent/command/plugin_config_formatter.rb +292 -0
  64. data/lib/fluent/command/plugin_generator.rb +324 -0
  65. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  66. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  67. data/lib/fluent/compat/exec_util.rb +129 -0
  68. data/lib/fluent/compat/file_util.rb +54 -0
  69. data/lib/fluent/compat/filter.rb +68 -0
  70. data/lib/fluent/compat/formatter.rb +111 -0
  71. data/lib/fluent/compat/formatter_utils.rb +85 -0
  72. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  73. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  74. data/lib/fluent/compat/input.rb +49 -0
  75. data/lib/fluent/compat/output.rb +718 -0
  76. data/lib/fluent/compat/output_chain.rb +60 -0
  77. data/lib/fluent/compat/parser.rb +310 -0
  78. data/lib/fluent/compat/parser_utils.rb +40 -0
  79. data/lib/fluent/compat/propagate_default.rb +62 -0
  80. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  81. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  82. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  83. data/lib/fluent/compat/socket_util.rb +165 -0
  84. data/lib/fluent/compat/string_util.rb +34 -0
  85. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  86. data/lib/fluent/compat/type_converter.rb +90 -0
  87. data/lib/fluent/config/configure_proxy.rb +210 -62
  88. data/lib/fluent/config/dsl.rb +12 -5
  89. data/lib/fluent/config/element.rb +107 -9
  90. data/lib/fluent/config/literal_parser.rb +9 -3
  91. data/lib/fluent/config/parser.rb +4 -4
  92. data/lib/fluent/config/section.rb +51 -14
  93. data/lib/fluent/config/types.rb +28 -13
  94. data/lib/fluent/config/v1_parser.rb +3 -5
  95. data/lib/fluent/config.rb +23 -20
  96. data/lib/fluent/configurable.rb +79 -21
  97. data/lib/fluent/counter/base_socket.rb +46 -0
  98. data/lib/fluent/counter/client.rb +297 -0
  99. data/lib/fluent/counter/error.rb +86 -0
  100. data/lib/fluent/counter/mutex_hash.rb +163 -0
  101. data/lib/fluent/counter/server.rb +273 -0
  102. data/lib/fluent/counter/store.rb +205 -0
  103. data/lib/fluent/counter/validator.rb +145 -0
  104. data/lib/fluent/counter.rb +23 -0
  105. data/lib/fluent/daemon.rb +15 -0
  106. data/lib/fluent/engine.rb +102 -65
  107. data/lib/fluent/env.rb +7 -3
  108. data/lib/fluent/error.rb +30 -0
  109. data/lib/fluent/event.rb +197 -21
  110. data/lib/fluent/event_router.rb +93 -10
  111. data/lib/fluent/filter.rb +2 -50
  112. data/lib/fluent/formatter.rb +4 -293
  113. data/lib/fluent/input.rb +2 -32
  114. data/lib/fluent/label.rb +10 -2
  115. data/lib/fluent/load.rb +3 -3
  116. data/lib/fluent/log.rb +348 -81
  117. data/lib/fluent/match.rb +37 -36
  118. data/lib/fluent/mixin.rb +12 -176
  119. data/lib/fluent/msgpack_factory.rb +62 -0
  120. data/lib/fluent/output.rb +10 -612
  121. data/lib/fluent/output_chain.rb +23 -0
  122. data/lib/fluent/parser.rb +4 -800
  123. data/lib/fluent/plugin/bare_output.rb +63 -0
  124. data/lib/fluent/plugin/base.rb +192 -0
  125. data/lib/fluent/plugin/buf_file.rb +128 -174
  126. data/lib/fluent/plugin/buf_memory.rb +9 -92
  127. data/lib/fluent/plugin/buffer/chunk.rb +221 -0
  128. data/lib/fluent/plugin/buffer/file_chunk.rb +383 -0
  129. data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
  130. data/lib/fluent/plugin/buffer.rb +779 -0
  131. data/lib/fluent/plugin/compressable.rb +92 -0
  132. data/lib/fluent/plugin/exec_util.rb +3 -108
  133. data/lib/fluent/plugin/file_util.rb +4 -34
  134. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  135. data/lib/fluent/plugin/filter.rb +93 -0
  136. data/lib/fluent/plugin/filter_grep.rb +117 -34
  137. data/lib/fluent/plugin/filter_parser.rb +85 -62
  138. data/lib/fluent/plugin/filter_record_transformer.rb +27 -39
  139. data/lib/fluent/plugin/filter_stdout.rb +15 -12
  140. data/lib/fluent/plugin/formatter.rb +50 -0
  141. data/lib/fluent/plugin/formatter_csv.rb +52 -0
  142. data/lib/fluent/plugin/formatter_hash.rb +33 -0
  143. data/lib/fluent/plugin/formatter_json.rb +55 -0
  144. data/lib/fluent/plugin/formatter_ltsv.rb +42 -0
  145. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  146. data/lib/fluent/plugin/formatter_out_file.rb +51 -0
  147. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  148. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  149. data/lib/fluent/plugin/formatter_tsv.rb +38 -0
  150. data/lib/fluent/plugin/in_debug_agent.rb +17 -6
  151. data/lib/fluent/plugin/in_dummy.rb +47 -20
  152. data/lib/fluent/plugin/in_exec.rb +55 -123
  153. data/lib/fluent/plugin/in_forward.rb +299 -216
  154. data/lib/fluent/plugin/in_gc_stat.rb +14 -36
  155. data/lib/fluent/plugin/in_http.rb +204 -91
  156. data/lib/fluent/plugin/in_monitor_agent.rb +186 -258
  157. data/lib/fluent/plugin/in_object_space.rb +13 -41
  158. data/lib/fluent/plugin/in_syslog.rb +112 -134
  159. data/lib/fluent/plugin/in_tail.rb +408 -745
  160. data/lib/fluent/plugin/in_tcp.rb +66 -9
  161. data/lib/fluent/plugin/in_udp.rb +60 -11
  162. data/lib/fluent/plugin/{in_stream.rb → in_unix.rb} +8 -4
  163. data/lib/fluent/plugin/input.rb +37 -0
  164. data/lib/fluent/plugin/multi_output.rb +158 -0
  165. data/lib/fluent/plugin/out_copy.rb +23 -35
  166. data/lib/fluent/plugin/out_exec.rb +67 -70
  167. data/lib/fluent/plugin/out_exec_filter.rb +204 -271
  168. data/lib/fluent/plugin/out_file.rb +267 -73
  169. data/lib/fluent/plugin/out_forward.rb +854 -325
  170. data/lib/fluent/plugin/out_null.rb +42 -9
  171. data/lib/fluent/plugin/out_relabel.rb +9 -5
  172. data/lib/fluent/plugin/out_roundrobin.rb +18 -37
  173. data/lib/fluent/plugin/out_secondary_file.rb +133 -0
  174. data/lib/fluent/plugin/out_stdout.rb +43 -10
  175. data/lib/fluent/plugin/out_stream.rb +7 -2
  176. data/lib/fluent/plugin/output.rb +1498 -0
  177. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  178. data/lib/fluent/plugin/parser.rb +191 -0
  179. data/lib/fluent/plugin/parser_apache.rb +28 -0
  180. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  181. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  182. data/lib/fluent/plugin/parser_csv.rb +39 -0
  183. data/lib/fluent/plugin/parser_json.rb +94 -0
  184. data/lib/fluent/plugin/parser_ltsv.rb +49 -0
  185. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  186. data/lib/fluent/plugin/parser_multiline.rb +106 -0
  187. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  188. data/lib/fluent/plugin/parser_none.rb +36 -0
  189. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  190. data/lib/fluent/plugin/parser_syslog.rb +142 -0
  191. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  192. data/lib/fluent/plugin/socket_util.rb +3 -143
  193. data/lib/fluent/plugin/storage.rb +84 -0
  194. data/lib/fluent/plugin/storage_local.rb +164 -0
  195. data/lib/fluent/plugin/string_util.rb +3 -15
  196. data/lib/fluent/plugin.rb +122 -121
  197. data/lib/fluent/plugin_helper/cert_option.rb +178 -0
  198. data/lib/fluent/plugin_helper/child_process.rb +364 -0
  199. data/lib/fluent/plugin_helper/compat_parameters.rb +333 -0
  200. data/lib/fluent/plugin_helper/counter.rb +51 -0
  201. data/lib/fluent/plugin_helper/event_emitter.rb +93 -0
  202. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  203. data/lib/fluent/plugin_helper/extract.rb +104 -0
  204. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  205. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  206. data/lib/fluent/plugin_helper/http_server/compat/server.rb +81 -0
  207. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  208. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  209. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  210. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  211. data/lib/fluent/plugin_helper/http_server/server.rb +87 -0
  212. data/lib/fluent/plugin_helper/http_server.rb +76 -0
  213. data/lib/fluent/plugin_helper/inject.rb +151 -0
  214. data/lib/fluent/plugin_helper/parser.rb +147 -0
  215. data/lib/fluent/plugin_helper/record_accessor.rb +210 -0
  216. data/lib/fluent/plugin_helper/retry_state.rb +205 -0
  217. data/lib/fluent/plugin_helper/server.rb +807 -0
  218. data/lib/fluent/plugin_helper/socket.rb +250 -0
  219. data/lib/fluent/plugin_helper/socket_option.rb +80 -0
  220. data/lib/fluent/plugin_helper/storage.rb +349 -0
  221. data/lib/fluent/plugin_helper/thread.rb +179 -0
  222. data/lib/fluent/plugin_helper/timer.rb +92 -0
  223. data/lib/fluent/plugin_helper.rb +73 -0
  224. data/lib/fluent/plugin_id.rb +80 -0
  225. data/lib/fluent/process.rb +3 -489
  226. data/lib/fluent/registry.rb +52 -10
  227. data/lib/fluent/root_agent.rb +204 -42
  228. data/lib/fluent/supervisor.rb +597 -359
  229. data/lib/fluent/system_config.rb +131 -42
  230. data/lib/fluent/test/base.rb +6 -54
  231. data/lib/fluent/test/driver/base.rb +224 -0
  232. data/lib/fluent/test/driver/base_owned.rb +70 -0
  233. data/lib/fluent/test/driver/base_owner.rb +135 -0
  234. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  235. data/lib/fluent/test/driver/filter.rb +57 -0
  236. data/lib/fluent/test/driver/formatter.rb +30 -0
  237. data/lib/fluent/test/driver/input.rb +31 -0
  238. data/lib/fluent/test/driver/multi_output.rb +53 -0
  239. data/lib/fluent/test/driver/output.rb +102 -0
  240. data/lib/fluent/test/driver/parser.rb +30 -0
  241. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  242. data/lib/fluent/test/filter_test.rb +0 -1
  243. data/lib/fluent/test/formatter_test.rb +4 -1
  244. data/lib/fluent/test/helpers.rb +58 -10
  245. data/lib/fluent/test/input_test.rb +27 -19
  246. data/lib/fluent/test/log.rb +79 -0
  247. data/lib/fluent/test/output_test.rb +28 -39
  248. data/lib/fluent/test/parser_test.rb +3 -1
  249. data/lib/fluent/test/startup_shutdown.rb +46 -0
  250. data/lib/fluent/test.rb +33 -1
  251. data/lib/fluent/time.rb +450 -1
  252. data/lib/fluent/timezone.rb +27 -3
  253. data/lib/fluent/{status.rb → unique_id.rb} +15 -24
  254. data/lib/fluent/version.rb +1 -1
  255. data/lib/fluent/winsvc.rb +85 -0
  256. data/templates/new_gem/Gemfile +3 -0
  257. data/templates/new_gem/README.md.erb +43 -0
  258. data/templates/new_gem/Rakefile +13 -0
  259. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  260. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  261. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  262. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  263. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  264. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  265. data/templates/new_gem/test/helper.rb.erb +8 -0
  266. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  267. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  268. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  269. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  270. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  271. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  272. data/templates/plugin_config_formatter/param.md.erb +34 -0
  273. data/templates/plugin_config_formatter/section.md.erb +12 -0
  274. data/test/command/test_binlog_reader.rb +346 -0
  275. data/test/command/test_ca_generate.rb +70 -0
  276. data/test/command/test_fluentd.rb +901 -0
  277. data/test/command/test_plugin_config_formatter.rb +276 -0
  278. data/test/command/test_plugin_generator.rb +92 -0
  279. data/test/compat/test_calls_super.rb +166 -0
  280. data/test/compat/test_parser.rb +92 -0
  281. data/test/config/test_config_parser.rb +126 -2
  282. data/test/config/test_configurable.rb +946 -187
  283. data/test/config/test_configure_proxy.rb +424 -74
  284. data/test/config/test_dsl.rb +11 -11
  285. data/test/config/test_element.rb +500 -0
  286. data/test/config/test_literal_parser.rb +8 -0
  287. data/test/config/test_plugin_configuration.rb +56 -0
  288. data/test/config/test_section.rb +79 -7
  289. data/test/config/test_system_config.rb +122 -35
  290. data/test/config/test_types.rb +38 -0
  291. data/test/counter/test_client.rb +559 -0
  292. data/test/counter/test_error.rb +44 -0
  293. data/test/counter/test_mutex_hash.rb +179 -0
  294. data/test/counter/test_server.rb +589 -0
  295. data/test/counter/test_store.rb +258 -0
  296. data/test/counter/test_validator.rb +137 -0
  297. data/test/helper.rb +89 -6
  298. data/test/helpers/fuzzy_assert.rb +89 -0
  299. data/test/plugin/test_bare_output.rb +118 -0
  300. data/test/plugin/test_base.rb +115 -0
  301. data/test/plugin/test_buf_file.rb +823 -460
  302. data/test/plugin/test_buf_memory.rb +32 -194
  303. data/test/plugin/test_buffer.rb +1233 -0
  304. data/test/plugin/test_buffer_chunk.rb +198 -0
  305. data/test/plugin/test_buffer_file_chunk.rb +844 -0
  306. data/test/plugin/test_buffer_memory_chunk.rb +338 -0
  307. data/test/plugin/test_compressable.rb +84 -0
  308. data/test/plugin/test_filter.rb +357 -0
  309. data/test/plugin/test_filter_grep.rb +540 -29
  310. data/test/plugin/test_filter_parser.rb +439 -452
  311. data/test/plugin/test_filter_record_transformer.rb +123 -166
  312. data/test/plugin/test_filter_stdout.rb +160 -72
  313. data/test/plugin/test_formatter_csv.rb +111 -0
  314. data/test/plugin/test_formatter_hash.rb +35 -0
  315. data/test/plugin/test_formatter_json.rb +51 -0
  316. data/test/plugin/test_formatter_ltsv.rb +62 -0
  317. data/test/plugin/test_formatter_msgpack.rb +28 -0
  318. data/test/plugin/test_formatter_out_file.rb +95 -0
  319. data/test/plugin/test_formatter_single_value.rb +38 -0
  320. data/test/plugin/test_formatter_tsv.rb +68 -0
  321. data/test/plugin/test_in_debug_agent.rb +24 -1
  322. data/test/plugin/test_in_dummy.rb +111 -18
  323. data/test/plugin/test_in_exec.rb +200 -113
  324. data/test/plugin/test_in_forward.rb +990 -387
  325. data/test/plugin/test_in_gc_stat.rb +10 -8
  326. data/test/plugin/test_in_http.rb +600 -224
  327. data/test/plugin/test_in_monitor_agent.rb +690 -0
  328. data/test/plugin/test_in_object_space.rb +24 -8
  329. data/test/plugin/test_in_syslog.rb +154 -215
  330. data/test/plugin/test_in_tail.rb +1006 -707
  331. data/test/plugin/test_in_tcp.rb +125 -48
  332. data/test/plugin/test_in_udp.rb +204 -63
  333. data/test/plugin/{test_in_stream.rb → test_in_unix.rb} +14 -13
  334. data/test/plugin/test_input.rb +126 -0
  335. data/test/plugin/test_metadata.rb +89 -0
  336. data/test/plugin/test_multi_output.rb +180 -0
  337. data/test/plugin/test_out_copy.rb +117 -112
  338. data/test/plugin/test_out_exec.rb +258 -53
  339. data/test/plugin/test_out_exec_filter.rb +538 -115
  340. data/test/plugin/test_out_file.rb +865 -178
  341. data/test/plugin/test_out_forward.rb +998 -210
  342. data/test/plugin/test_out_null.rb +105 -0
  343. data/test/plugin/test_out_relabel.rb +28 -0
  344. data/test/plugin/test_out_roundrobin.rb +36 -29
  345. data/test/plugin/test_out_secondary_file.rb +458 -0
  346. data/test/plugin/test_out_stdout.rb +135 -37
  347. data/test/plugin/test_out_stream.rb +18 -0
  348. data/test/plugin/test_output.rb +984 -0
  349. data/test/plugin/test_output_as_buffered.rb +2021 -0
  350. data/test/plugin/test_output_as_buffered_backup.rb +312 -0
  351. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  352. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  353. data/test/plugin/test_output_as_buffered_retries.rb +911 -0
  354. data/test/plugin/test_output_as_buffered_secondary.rb +874 -0
  355. data/test/plugin/test_output_as_standard.rb +374 -0
  356. data/test/plugin/test_owned_by.rb +35 -0
  357. data/test/plugin/test_parser.rb +359 -0
  358. data/test/plugin/test_parser_apache.rb +42 -0
  359. data/test/plugin/test_parser_apache2.rb +47 -0
  360. data/test/plugin/test_parser_apache_error.rb +45 -0
  361. data/test/plugin/test_parser_csv.rb +103 -0
  362. data/test/plugin/test_parser_json.rb +138 -0
  363. data/test/plugin/test_parser_labeled_tsv.rb +145 -0
  364. data/test/plugin/test_parser_multiline.rb +100 -0
  365. data/test/plugin/test_parser_nginx.rb +88 -0
  366. data/test/plugin/test_parser_none.rb +52 -0
  367. data/test/plugin/test_parser_regexp.rb +289 -0
  368. data/test/plugin/test_parser_syslog.rb +441 -0
  369. data/test/plugin/test_parser_tsv.rb +122 -0
  370. data/test/plugin/test_storage.rb +167 -0
  371. data/test/plugin/test_storage_local.rb +335 -0
  372. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  373. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  374. data/test/plugin_helper/data/cert/cert.pem +19 -0
  375. data/test/plugin_helper/http_server/test_app.rb +65 -0
  376. data/test/plugin_helper/http_server/test_route.rb +32 -0
  377. data/test/plugin_helper/test_cert_option.rb +16 -0
  378. data/test/plugin_helper/test_child_process.rb +794 -0
  379. data/test/plugin_helper/test_compat_parameters.rb +353 -0
  380. data/test/plugin_helper/test_event_emitter.rb +51 -0
  381. data/test/plugin_helper/test_event_loop.rb +52 -0
  382. data/test/plugin_helper/test_extract.rb +194 -0
  383. data/test/plugin_helper/test_formatter.rb +255 -0
  384. data/test/plugin_helper/test_http_server_helper.rb +205 -0
  385. data/test/plugin_helper/test_inject.rb +519 -0
  386. data/test/plugin_helper/test_parser.rb +264 -0
  387. data/test/plugin_helper/test_record_accessor.rb +197 -0
  388. data/test/plugin_helper/test_retry_state.rb +442 -0
  389. data/test/plugin_helper/test_server.rb +1714 -0
  390. data/test/plugin_helper/test_storage.rb +542 -0
  391. data/test/plugin_helper/test_thread.rb +164 -0
  392. data/test/plugin_helper/test_timer.rb +132 -0
  393. data/test/scripts/exec_script.rb +0 -6
  394. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  395. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  396. data/test/scripts/fluent/plugin/out_test.rb +23 -15
  397. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  398. data/test/test_clock.rb +164 -0
  399. data/test/test_config.rb +16 -7
  400. data/test/test_configdsl.rb +2 -2
  401. data/test/test_event.rb +360 -13
  402. data/test/test_event_router.rb +108 -11
  403. data/test/test_event_time.rb +199 -0
  404. data/test/test_filter.rb +48 -6
  405. data/test/test_formatter.rb +11 -391
  406. data/test/test_input.rb +1 -1
  407. data/test/test_log.rb +591 -31
  408. data/test/test_mixin.rb +1 -1
  409. data/test/test_output.rb +121 -185
  410. data/test/test_plugin.rb +251 -0
  411. data/test/test_plugin_classes.rb +177 -10
  412. data/test/test_plugin_helper.rb +81 -0
  413. data/test/test_plugin_id.rb +101 -0
  414. data/test/test_process.rb +8 -42
  415. data/test/test_root_agent.rb +766 -21
  416. data/test/test_supervisor.rb +481 -0
  417. data/test/test_test_drivers.rb +135 -0
  418. data/test/test_time_formatter.rb +282 -0
  419. data/test/test_time_parser.rb +231 -0
  420. data/test/test_unique_id.rb +47 -0
  421. metadata +454 -60
  422. data/COPYING +0 -14
  423. data/ChangeLog +0 -666
  424. data/lib/fluent/buffer.rb +0 -365
  425. data/lib/fluent/plugin/in_status.rb +0 -76
  426. data/test/plugin/test_in_status.rb +0 -38
  427. data/test/test_buffer.rb +0 -624
  428. data/test/test_parser.rb +0 -1305
@@ -0,0 +1,901 @@
1
+ require_relative '../helper'
2
+
3
+ # require 'fluent/command/fluentd'
4
+ # don't require it... it runs immediately
5
+
6
+ require 'fileutils'
7
+ require 'timeout'
8
+
9
+ class TestFluentdCommand < ::Test::Unit::TestCase
10
+ TMP_DIR = File.expand_path(File.dirname(__FILE__) + "/../tmp/command/fluentd#{ENV['TEST_ENV_NUMBER']}")
11
+ SUPERVISOR_PID_PATTERN = /starting fluentd-[.0-9]+ pid=(\d+)/
12
+ WORKER_PID_PATTERN = /starting fluentd worker pid=(\d+) /
13
+
14
+ setup do
15
+ FileUtils.rm_rf(TMP_DIR)
16
+ FileUtils.mkdir_p(TMP_DIR)
17
+ @supervisor_pid = nil
18
+ @worker_pids = []
19
+ end
20
+
21
+ def process_exist?(pid)
22
+ begin
23
+ r = Process.waitpid(pid, Process::WNOHANG)
24
+ return true if r.nil?
25
+ false
26
+ rescue SystemCallError
27
+ false
28
+ end
29
+ end
30
+
31
+ def create_conf_file(name, content, ext_enc = 'utf-8')
32
+ conf_path = File.join(TMP_DIR, name)
33
+ File.open(conf_path, "w:#{ext_enc}:utf-8") do |file|
34
+ file.write content
35
+ end
36
+ conf_path
37
+ end
38
+
39
+ def create_plugin_file(name, content)
40
+ file_path = File.join(TMP_DIR, 'plugin', name)
41
+ FileUtils.mkdir_p(File.dirname(file_path))
42
+ File.open(file_path, 'w') do |file|
43
+ file.write content
44
+ end
45
+ file_path
46
+ end
47
+
48
+ def create_cmdline(conf_path, *fluentd_options)
49
+ cmd_path = File.expand_path(File.dirname(__FILE__) + "../../../bin/fluentd")
50
+ ["bundle", "exec", "ruby", cmd_path, "-c", conf_path, *fluentd_options]
51
+ end
52
+
53
+ def execute_command(cmdline, chdir=TMP_DIR)
54
+ null_stream = File.open(File::NULL, 'w')
55
+ gemfile_path = File.expand_path(File.dirname(__FILE__) + "../../../Gemfile")
56
+
57
+ env = {
58
+ "BUNDLE_GEMFILE" => gemfile_path,
59
+ }
60
+ cmdname = cmdline.shift
61
+ arg0 = "testing-fluentd"
62
+ # p(here: "executing process", env: env, cmdname: cmdname, arg0: arg0, args: cmdline)
63
+ IO.popen(env, [[cmdname, arg0], *cmdline], chdir: chdir, err: [:child, :out]) do |io|
64
+ pid = io.pid
65
+ begin
66
+ yield pid, io
67
+ # p(here: "execute command", pid: pid, worker_pids: @worker_pids)
68
+ ensure
69
+ Process.kill(:KILL, pid) rescue nil
70
+ if @supervisor_pid
71
+ Process.kill(:KILL, @supervisor_pid) rescue nil
72
+ end
73
+ @worker_pids.each do |cpid|
74
+ Process.kill(:KILL, cpid) rescue nil
75
+ end
76
+ # p(here: "execute command", pid: pid, exist: process_exist?(pid), worker_pids: @worker_pids, exists: @worker_pids.map{|i| process_exist?(i) })
77
+ Timeout.timeout(10){ sleep 0.1 while process_exist?(pid) }
78
+ end
79
+ end
80
+ ensure
81
+ null_stream.close rescue nil
82
+ end
83
+
84
+ def assert_log_matches(cmdline, *pattern_list, patterns_not_match: [], timeout: 10)
85
+ matched = false
86
+ assert_error_msg = "matched correctly"
87
+ stdio_buf = ""
88
+ begin
89
+ execute_command(cmdline) do |pid, stdout|
90
+ begin
91
+ waiting(timeout) do
92
+ while process_exist?(pid) && !matched
93
+ readables, _, _ = IO.select([stdout], nil, nil, 1)
94
+ next unless readables
95
+ break if readables.first.eof?
96
+
97
+ buf = readables.first.readpartial(1024)
98
+ # puts buf
99
+ stdio_buf << buf
100
+ lines = stdio_buf.split("\n")
101
+ if pattern_list.all?{|ptn| lines.any?{|line| ptn.is_a?(Regexp) ? ptn.match(line) : line.include?(ptn) } }
102
+ matched = true
103
+ end
104
+ end
105
+ end
106
+ ensure
107
+ if SUPERVISOR_PID_PATTERN =~ stdio_buf
108
+ @supervisor_pid = $1.to_i
109
+ end
110
+ stdio_buf.scan(WORKER_PID_PATTERN) do |worker_pid|
111
+ @worker_pids << worker_pid.first.to_i
112
+ end
113
+ end
114
+ end
115
+ rescue Timeout::Error
116
+ assert_error_msg = "execution timeout with command out:\n" + stdio_buf
117
+ rescue => e
118
+ assert_error_msg = "unexpected error in launching fluentd: #{e.inspect}\n" + stdio_buf
119
+ end
120
+ assert matched, assert_error_msg
121
+
122
+ unless patterns_not_match.empty?
123
+ lines = stdio_buf.split("\n")
124
+ patterns_not_match.each do |ptn|
125
+ matched_wrongly = if ptn.is_a? Regexp
126
+ lines.any?{|line| ptn.match(line) }
127
+ else
128
+ lines.any?{|line| line.include?(ptn) }
129
+ end
130
+ assert_false matched_wrongly, "pattern exists in logs wrongly:\n" + stdio_buf
131
+ end
132
+ end
133
+ end
134
+
135
+ def assert_fluentd_fails_to_start(cmdline, *pattern_list, timeout: 10)
136
+ # empty_list.all?{ ... } is always true
137
+ matched = false
138
+ running = false
139
+ assert_error_msg = "failed to start correctly"
140
+ stdio_buf = ""
141
+ begin
142
+ execute_command(cmdline) do |pid, stdout|
143
+ begin
144
+ waiting(timeout) do
145
+ while process_exist?(pid) && !running
146
+ readables, _, _ = IO.select([stdout], nil, nil, 1)
147
+ next unless readables
148
+ next if readables.first.eof?
149
+
150
+ stdio_buf << readables.first.readpartial(1024)
151
+ lines = stdio_buf.split("\n")
152
+ if lines.any?{|line| line.include?("fluentd worker is now running") }
153
+ running = true
154
+ end
155
+ if pattern_list.all?{|ptn| lines.any?{|line| ptn.is_a?(Regexp) ? ptn.match(line) : line.include?(ptn) } }
156
+ matched = true
157
+ end
158
+ end
159
+ end
160
+ ensure
161
+ if SUPERVISOR_PID_PATTERN =~ stdio_buf
162
+ @supervisor_pid = $1.to_i
163
+ end
164
+ stdio_buf.scan(WORKER_PID_PATTERN) do |worker_pid|
165
+ @worker_pids << worker_pid.first.to_i
166
+ end
167
+ end
168
+ end
169
+ rescue Timeout::Error
170
+ assert_error_msg = "execution timeout with command out:\n" + stdio_buf
171
+ rescue => e
172
+ assert_error_msg = "unexpected error in launching fluentd: #{e.inspect}\n" + stdio_buf
173
+ assert false, assert_error_msg
174
+ end
175
+ assert !running, "fluentd started to run incorrectly:\n" + stdio_buf
176
+ unless matched
177
+ assert_error_msg = "fluentd failed to start, without specified regular expressions:\n" + stdio_buf
178
+ end
179
+ assert matched, assert_error_msg
180
+ end
181
+
182
+ sub_test_case 'with valid configuration' do
183
+ test 'runs successfully' do
184
+ conf = <<CONF
185
+ <source>
186
+ @type dummy
187
+ @id dummy
188
+ @label @dummydata
189
+ tag dummy
190
+ dummy {"message": "yay!"}
191
+ </source>
192
+ <label @dummydata>
193
+ <match dummy>
194
+ @type null
195
+ @id blackhole
196
+ </match>
197
+ </label>
198
+ CONF
199
+ conf_path = create_conf_file('valid.conf', conf)
200
+ assert File.exist?(conf_path)
201
+
202
+ assert_log_matches(create_cmdline(conf_path), "fluentd worker is now running", 'worker=0')
203
+ end
204
+ end
205
+
206
+ sub_test_case 'with --conf-encoding' do
207
+ test 'runs successfully' do
208
+ conf = <<CONF
209
+ # テスト
210
+ <source>
211
+ @type dummy
212
+ tag dummy
213
+ dummy {"message": "yay!"}
214
+ </source>
215
+ <match dummy>
216
+ @type null
217
+ </match>
218
+ CONF
219
+ conf_path = create_conf_file('shift_jis.conf', conf, 'shift_jis')
220
+ assert_log_matches(create_cmdline(conf_path, '--conf-encoding', 'shift_jis'), "fluentd worker is now running", 'worker=0')
221
+ end
222
+
223
+ test 'failed to run by invalid encoding' do
224
+ conf = <<CONF
225
+ # テスト
226
+ <source>
227
+ @type dummy
228
+ tag dummy
229
+ dummy {"message": "yay!"}
230
+ </source>
231
+ <match dummy>
232
+ @type null
233
+ </match>
234
+ CONF
235
+ conf_path = create_conf_file('shift_jis.conf', conf, 'shift_jis')
236
+ assert_fluentd_fails_to_start(create_cmdline(conf_path), "invalid byte sequence in UTF-8")
237
+ end
238
+ end
239
+
240
+ sub_test_case 'with system configuration about root directory' do
241
+ setup do
242
+ @root_path = File.join(TMP_DIR, "rootpath")
243
+ FileUtils.rm_rf(@root_path)
244
+ @conf = <<CONF
245
+ <system>
246
+ root_dir #{@root_path}
247
+ </system>
248
+ <source>
249
+ @type dummy
250
+ @id dummy
251
+ @label @dummydata
252
+ tag dummy
253
+ dummy {"message": "yay!"}
254
+ </source>
255
+ <label @dummydata>
256
+ <match dummy>
257
+ @type null
258
+ @id blackhole
259
+ </match>
260
+ </label>
261
+ CONF
262
+ end
263
+
264
+ test 'use the specified existing directory as root' do
265
+ FileUtils.mkdir_p(@root_path)
266
+ conf_path = create_conf_file('existing_root_dir.conf', @conf)
267
+ assert Dir.exist?(@root_path)
268
+
269
+ assert_log_matches(create_cmdline(conf_path), "fluentd worker is now running", 'worker=0')
270
+ end
271
+
272
+ test 'creates the specified root directory if missing' do
273
+ conf_path = create_conf_file('missing_root_dir.conf', @conf)
274
+ assert_false Dir.exist?(@root_path)
275
+
276
+ assert_log_matches(create_cmdline(conf_path), "fluentd worker is now running", 'worker=0')
277
+ assert Dir.exist?(@root_path)
278
+ end
279
+
280
+ test 'fails to launch fluentd if specified root path is invalid path for directory' do
281
+ File.open(@root_path, 'w') do |_|
282
+ # create file and close it
283
+ end
284
+ conf_path = create_conf_file('existing_root_dir.conf', @conf)
285
+
286
+ assert_fluentd_fails_to_start(
287
+ create_cmdline(conf_path),
288
+ "non directory entry exists:#{@root_path} (Fluent::InvalidRootDirectory)",
289
+ )
290
+ end
291
+ end
292
+
293
+ sub_test_case 'configured to route log events to plugins' do
294
+ setup do
295
+ @basic_conf = <<CONF
296
+ <source>
297
+ @type dummy
298
+ @id dummy
299
+ tag dummy
300
+ dummy {"message": "yay!"}
301
+ </source>
302
+ <match dummy>
303
+ @type null
304
+ @id blackhole
305
+ </match>
306
+ CONF
307
+ end
308
+
309
+ test 'by top level <match fluent.*> section' do
310
+ conf = @basic_conf + <<CONF
311
+ <match fluent.**>
312
+ @type stdout
313
+ </match>
314
+ CONF
315
+ conf_path = create_conf_file('logevent_1.conf', conf)
316
+ assert_log_matches(
317
+ create_cmdline(conf_path),
318
+ "fluentd worker is now running",
319
+ 'fluent.info: {"worker":0,"message":"fluentd worker is now running worker=0"}',
320
+ patterns_not_match: ['[warn]: some tags for log events are not defined (to be ignored) tags=["fluent.trace", "fluent.debug"]'],
321
+ )
322
+ end
323
+
324
+ test 'by top level <match> section with warning for missing log levels (and warnings for each log event records)' do
325
+ conf = @basic_conf + <<CONF
326
+ <match fluent.warn fluent.error fluent.fatal>
327
+ @type stdout
328
+ </match>
329
+ CONF
330
+ conf_path = create_conf_file('logevent_2.conf', conf)
331
+ assert_log_matches(
332
+ create_cmdline(conf_path),
333
+ "fluentd worker is now running",
334
+ '[warn]: #0 match for some tags of log events are not defined (to be ignored) tags=["fluent.trace", "fluent.debug", "fluent.info"]',
335
+ '[warn]: #0 no patterns matched tag="fluent.info"',
336
+ )
337
+ end
338
+
339
+ test 'by <label @FLUENT_LOG> section' do
340
+ conf = @basic_conf + <<CONF
341
+ <label @FLUENT_LOG>
342
+ <match **>
343
+ @type stdout
344
+ </match>
345
+ </label>
346
+ CONF
347
+ conf_path = create_conf_file('logevent_3.conf', conf)
348
+ assert_log_matches(
349
+ create_cmdline(conf_path),
350
+ "fluentd worker is now running",
351
+ 'fluent.info: {"worker":0,"message":"fluentd worker is now running worker=0"}',
352
+ patterns_not_match: ['[warn]: some tags for log events are not defined (to be ignored)'],
353
+ )
354
+ end
355
+
356
+ test 'by <label> section with warning for missing log levels' do
357
+ conf = @basic_conf + <<CONF
358
+ <label @FLUENT_LOG>
359
+ <match fluent.{trace,debug}>
360
+ @type null
361
+ </match>
362
+ <match fluent.warn fluent.error>
363
+ @type stdout
364
+ </match>
365
+ </label>
366
+ CONF
367
+ conf_path = create_conf_file('logevent_4.conf', conf)
368
+ assert_log_matches(
369
+ create_cmdline(conf_path),
370
+ "fluentd worker is now running",
371
+ '[warn]: #0 match for some tags of log events are not defined (to be ignored) tags=["fluent.info", "fluent.fatal"]',
372
+ patterns_not_match: ['[warn]: no patterns matched tag="fluent.info"'],
373
+ )
374
+ end
375
+ end
376
+
377
+ sub_test_case 'configured to suppress configuration dump' do
378
+ setup do
379
+ @basic_conf = <<CONF
380
+ <source>
381
+ @type dummy
382
+ @id dummy
383
+ @label @dummydata
384
+ tag dummy
385
+ dummy {"message": "yay!"}
386
+ </source>
387
+ <label @dummydata>
388
+ <match dummy>
389
+ @type null
390
+ @id blackhole
391
+ </match>
392
+ </label>
393
+ CONF
394
+ end
395
+
396
+ test 'configured by system config' do
397
+ conf = <<SYSTEM + @basic_conf
398
+ <system>
399
+ suppress_config_dump
400
+ </system>
401
+ SYSTEM
402
+ conf_path = create_conf_file('suppress_conf_dump_1.conf', conf)
403
+ assert_log_matches(create_cmdline(conf_path), "fluentd worker is now running", patterns_not_match: ["tag dummy"])
404
+ end
405
+
406
+ test 'configured by command line option' do
407
+ conf_path = create_conf_file('suppress_conf_dump_2.conf', @basic_conf)
408
+ assert_log_matches(create_cmdline(conf_path, '--suppress-config-dump'), "fluentd worker is now running", patterns_not_match: ["tag dummy"])
409
+ end
410
+
411
+ test 'configured as false by system config, but overridden as true by command line option' do
412
+ conf = <<SYSTEM + @basic_conf
413
+ <system>
414
+ suppress_config_dump false
415
+ </system>
416
+ SYSTEM
417
+ conf_path = create_conf_file('suppress_conf_dump_3.conf', conf)
418
+ assert_log_matches(create_cmdline(conf_path, '--suppress-config-dump'), "fluentd worker is now running", patterns_not_match: ["tag dummy"])
419
+ end
420
+ end
421
+
422
+ sub_test_case 'configuration with wrong plugin type' do
423
+ test 'failed to start' do
424
+ conf = <<CONF
425
+ <source>
426
+ @type
427
+ @id dummy
428
+ @label @dummydata
429
+ tag dummy
430
+ dummy {"message": "yay!"}
431
+ </source>
432
+ <label @dummydata>
433
+ <match dummy>
434
+ @type null
435
+ @id blackhole
436
+ </match>
437
+ </label>
438
+ CONF
439
+ conf_path = create_conf_file('type_missing.conf', conf)
440
+ assert File.exist?(conf_path)
441
+
442
+ assert_fluentd_fails_to_start(
443
+ create_cmdline(conf_path),
444
+ "config error",
445
+ "error=\"Unknown input plugin ''. Run 'gem search -rd fluent-plugin' to find plugins",
446
+ )
447
+ end
448
+ end
449
+
450
+ sub_test_case 'configuration to load plugin file with syntax error' do
451
+ test 'failed to start' do
452
+ script = "require 'fluent/plugin/input'\n"
453
+ script << "module Fluent::Plugin\n"
454
+ script << " class BuggyInput < Input\n"
455
+ script << " Fluent::Plugin.register_input('buggy', self)\n"
456
+ script << " end\n"
457
+ plugin_path = create_plugin_file('in_buggy.rb', script)
458
+
459
+ conf = <<CONF
460
+ <source>
461
+ @type buggy
462
+ @id dummy
463
+ @label @dummydata
464
+ tag dummy
465
+ dummy {"message": "yay!"}
466
+ </source>
467
+ <label @dummydata>
468
+ <match dummy>
469
+ @type null
470
+ @id blackhole
471
+ </match>
472
+ </label>
473
+ CONF
474
+ conf_path = create_conf_file('buggy_plugin.conf', conf)
475
+ assert File.exist?(conf_path)
476
+
477
+ assert_fluentd_fails_to_start(
478
+ create_cmdline(conf_path, "-p", File.dirname(plugin_path)),
479
+ "in_buggy.rb:5: syntax error, unexpected end-of-input, expecting"
480
+ )
481
+ end
482
+ end
483
+
484
+ sub_test_case 'configuration to load plugin which raises unrecoverable error in #start' do
485
+ test 'failed to start' do
486
+ script = "require 'fluent/plugin/input'\n"
487
+ script << "require 'fluent/error'\n"
488
+ script << "module Fluent::Plugin\n"
489
+ script << " class CrashingInput < Input\n"
490
+ script << " Fluent::Plugin.register_input('crashing', self)\n"
491
+ script << " def start\n"
492
+ script << " raise Fluent::UnrecoverableError"
493
+ script << " end\n"
494
+ script << " end\n"
495
+ script << "end\n"
496
+ plugin_path = create_plugin_file('in_crashing.rb', script)
497
+
498
+ conf = <<CONF
499
+ <source>
500
+ @type crashing
501
+ @id dummy
502
+ @label @dummydata
503
+ tag dummy
504
+ dummy {"message": "yay!"}
505
+ </source>
506
+ <label @dummydata>
507
+ <match dummy>
508
+ @type null
509
+ @id blackhole
510
+ </match>
511
+ </label>
512
+ CONF
513
+ conf_path = create_conf_file('crashing_plugin.conf', conf)
514
+ assert File.exist?(conf_path)
515
+
516
+ assert_fluentd_fails_to_start(
517
+ create_cmdline(conf_path, "-p", File.dirname(plugin_path)),
518
+ 'unexpected error error_class=Fluent::UnrecoverableError error="an unrecoverable error occurs in Fluentd process"',
519
+ )
520
+ end
521
+ end
522
+
523
+ sub_test_case 'configured to run 2 workers' do
524
+ setup do
525
+ @root_path = File.join(TMP_DIR, "rootpath")
526
+ FileUtils.rm_rf(@root_path)
527
+ FileUtils.mkdir_p(@root_path)
528
+ end
529
+
530
+ test 'success to start the number of workers specified in configuration' do
531
+ conf = <<'CONF'
532
+ <system>
533
+ workers 2
534
+ root_dir #{@root_path}
535
+ </system>
536
+ <source>
537
+ @type dummy
538
+ @id "dummy#{worker_id}" # check worker_id works or not with actual command
539
+ @label @dummydata
540
+ tag dummy
541
+ dummy {"message": "yay!"}
542
+ </source>
543
+ <label @dummydata>
544
+ <match dummy>
545
+ @type null
546
+ @id blackhole
547
+ </match>
548
+ </label>
549
+ CONF
550
+ conf_path = create_conf_file('workers1.conf', conf)
551
+ assert Dir.exist?(@root_path)
552
+
553
+ assert_log_matches(
554
+ create_cmdline(conf_path),
555
+ "#0 fluentd worker is now running worker=0",
556
+ "#1 fluentd worker is now running worker=1"
557
+ )
558
+ end
559
+
560
+ test 'success to start the number of workers specified by command line option' do
561
+ conf = <<CONF
562
+ <system>
563
+ root_dir #{@root_path}
564
+ </system>
565
+ <source>
566
+ @type dummy
567
+ @id dummy
568
+ @label @dummydata
569
+ tag dummy
570
+ dummy {"message": "yay!"}
571
+ </source>
572
+ <label @dummydata>
573
+ <match dummy>
574
+ @type null
575
+ @id blackhole
576
+ </match>
577
+ </label>
578
+ CONF
579
+ conf_path = create_conf_file('workers2.conf', conf)
580
+ assert_log_matches(
581
+ create_cmdline(conf_path, '--workers', '2'),
582
+ "#0 fluentd worker is now running worker=0",
583
+ "#1 fluentd worker is now running worker=1"
584
+ )
585
+ end
586
+
587
+ test 'failed to start workers when configured plugins do not support multi worker configuration' do
588
+ script = "require 'fluent/plugin/input'\n"
589
+ script << "module Fluent::Plugin\n"
590
+ script << " class SingleInput < Input\n"
591
+ script << " Fluent::Plugin.register_input('single', self)\n"
592
+ script << " def multi_workers_ready?\n"
593
+ script << " false\n"
594
+ script << " end\n"
595
+ script << " end\n"
596
+ script << "end\n"
597
+ plugin_path = create_plugin_file('in_single.rb', script)
598
+
599
+ conf = <<CONF
600
+ <system>
601
+ workers 2
602
+ </system>
603
+ <source>
604
+ @type single
605
+ @id single
606
+ @label @dummydata
607
+ </source>
608
+ <label @dummydata>
609
+ <match dummy>
610
+ @type null
611
+ @id blackhole
612
+ </match>
613
+ </label>
614
+ CONF
615
+ conf_path = create_conf_file('workers_invalid1.conf', conf)
616
+ assert_fluentd_fails_to_start(
617
+ create_cmdline(conf_path, "-p", File.dirname(plugin_path)),
618
+ "Plugin 'single' does not support multi workers configuration (Fluent::Plugin::SingleInput)",
619
+ )
620
+ end
621
+
622
+ test 'failed to start workers when file buffer is configured in non-workers way' do
623
+ conf = <<CONF
624
+ <system>
625
+ workers 2
626
+ </system>
627
+ <source>
628
+ @type single
629
+ @id single
630
+ @label @dummydata
631
+ </source>
632
+ <label @dummydata>
633
+ <match dummy>
634
+ @type null
635
+ @id blackhole
636
+ <buffer>
637
+ @type file
638
+ path #{File.join(@root_path, "buf", "file.*.log")}
639
+ </buffer>
640
+ </match>
641
+ </label>
642
+ CONF
643
+ conf_path = create_conf_file('workers_invalid2.conf', conf)
644
+ assert_fluentd_fails_to_start(
645
+ create_cmdline(conf_path),
646
+ "[blackhole] file buffer with multi workers should be configured to use directory 'path', or system root_dir and plugin id",
647
+ "config error file=\"#{conf_path}\" error_class=Fluent::ConfigError error=\"Plugin 'file' does not support multi workers configuration (Fluent::Plugin::FileBuffer)\"",
648
+ )
649
+ end
650
+
651
+ test 'failed to start workers when configured plugins as children of MultiOutput do not support multi worker configuration' do
652
+ script = <<-EOC
653
+ require 'fluent/plugin/output'
654
+ module Fluent::Plugin
655
+ class SingleOutput < Output
656
+ Fluent::Plugin.register_output('single', self)
657
+ def multi_workers_ready?
658
+ false
659
+ end
660
+ def write(chunk)
661
+ end
662
+ end
663
+ end
664
+ EOC
665
+ plugin_path = create_plugin_file('out_single.rb', script)
666
+
667
+ conf = <<CONF
668
+ <system>
669
+ workers 2
670
+ </system>
671
+ <source>
672
+ @type single
673
+ @id single
674
+ @label @dummydata
675
+ </source>
676
+ <label @dummydata>
677
+ <match dummy>
678
+ @type copy
679
+ <store>
680
+ @type single
681
+ </store>
682
+ <store>
683
+ @type single
684
+ </store>
685
+ </match>
686
+ </label>
687
+ CONF
688
+ conf_path = create_conf_file('workers_invalid3.conf', conf)
689
+ assert_fluentd_fails_to_start(
690
+ create_cmdline(conf_path, "-p", File.dirname(plugin_path)),
691
+ "Plugin 'single' does not support multi workers configuration (Fluent::Plugin::SingleOutput)",
692
+ )
693
+ end
694
+
695
+ test 'success to start a worker with worker specific configuration' do
696
+ conf = <<CONF
697
+ <system>
698
+ workers 2
699
+ root_dir #{@root_path}
700
+ </system>
701
+ <source>
702
+ @type dummy
703
+ @id dummy
704
+ @label @dummydata
705
+ tag dummy
706
+ dummy {"message": "yay!"}
707
+ </source>
708
+ <worker 1>
709
+ <source>
710
+ @type dummy
711
+ @id dummy_in_worker
712
+ @label @dummydata
713
+ tag dummy
714
+ dummy {"message": "yay!"}
715
+ </source>
716
+ </worker>
717
+ <label @dummydata>
718
+ <match dummy>
719
+ @type null
720
+ @id blackhole
721
+ </match>
722
+ </label>
723
+ CONF
724
+ conf_path = create_conf_file('worker_section0.conf', conf)
725
+ assert Dir.exist?(@root_path)
726
+
727
+ assert_log_matches(
728
+ create_cmdline(conf_path),
729
+ "#0 fluentd worker is now running worker=0",
730
+ "#1 fluentd worker is now running worker=1",
731
+ /(?!#\d) adding source type="dummy"/,
732
+ '#1 adding source type="dummy"'
733
+ )
734
+ end
735
+
736
+ test 'success to start workers when configured plugins only for specific worker do not support multi worker configuration' do
737
+ script = <<-EOC
738
+ require 'fluent/plugin/input'
739
+ module Fluent::Plugin
740
+ class SingleInput < Input
741
+ Fluent::Plugin.register_input('single', self)
742
+ def multi_workers_ready?
743
+ false
744
+ end
745
+ end
746
+ end
747
+ EOC
748
+ plugin_path = create_plugin_file('in_single.rb', script)
749
+
750
+ conf = <<CONF
751
+ <system>
752
+ workers 2
753
+ </system>
754
+ <worker 1>
755
+ <source>
756
+ @type single
757
+ @id single
758
+ @label @dummydata
759
+ </source>
760
+ </worker>
761
+ <label @dummydata>
762
+ <match dummy>
763
+ @type null
764
+ @id blackhole
765
+ </match>
766
+ </label>
767
+ CONF
768
+ conf_path = create_conf_file('worker_section1.conf', conf)
769
+ assert Dir.exist?(@root_path)
770
+
771
+ assert_log_matches(
772
+ create_cmdline(conf_path, "-p", File.dirname(plugin_path)),
773
+ "#0 fluentd worker is now running worker=0",
774
+ "#1 fluentd worker is now running worker=1",
775
+ '#1 adding source type="single"'
776
+ )
777
+ end
778
+
779
+ test 'success to start workers when file buffer is configured in non-workers way only for specific worker' do
780
+ conf = <<CONF
781
+ <system>
782
+ workers 2
783
+ </system>
784
+ <source>
785
+ @type dummy
786
+ @id dummy
787
+ tag dummy
788
+ dummy {"message": "yay!"}
789
+ </source>
790
+ <worker 1>
791
+ <match dummy>
792
+ @type null
793
+ @id blackhole
794
+ <buffer>
795
+ @type file
796
+ path #{File.join(@root_path, "buf", "file.*.log")}
797
+ </buffer>
798
+ </match>
799
+ </worker>
800
+ CONF
801
+ conf_path = create_conf_file('worker_section2.conf', conf)
802
+ assert_log_matches(
803
+ create_cmdline(conf_path),
804
+ "#0 fluentd worker is now running worker=0",
805
+ "#1 fluentd worker is now running worker=1",
806
+ '#1 adding match pattern="dummy" type="null"'
807
+ )
808
+ end
809
+
810
+ test 'success to start workers when configured plugins as a chidren of MultiOutput only for specific worker do not support multi worker configuration' do
811
+ script = <<-EOC
812
+ require 'fluent/plugin/output'
813
+ module Fluent::Plugin
814
+ class SingleOutput < Output
815
+ Fluent::Plugin.register_output('single', self)
816
+ def multi_workers_ready?
817
+ false
818
+ end
819
+ def write(chunk)
820
+ end
821
+ end
822
+ end
823
+ EOC
824
+ plugin_path = create_plugin_file('out_single.rb', script)
825
+
826
+ conf = <<CONF
827
+ <system>
828
+ workers 2
829
+ </system>
830
+ <source>
831
+ @type dummy
832
+ @id dummy
833
+ tag dummy
834
+ dummy {"message": "yay!"}
835
+ </source>
836
+ <worker 1>
837
+ <match dummy>
838
+ @type copy
839
+ <store>
840
+ @type single
841
+ </store>
842
+ <store>
843
+ @type single
844
+ </store>
845
+ </match>
846
+ </worker>
847
+ CONF
848
+ conf_path = create_conf_file('worker_section3.conf', conf)
849
+ assert_log_matches(
850
+ create_cmdline(conf_path, "-p", File.dirname(plugin_path)),
851
+ "#0 fluentd worker is now running worker=0",
852
+ "#1 fluentd worker is now running worker=1",
853
+ '#1 adding match pattern="dummy" type="copy"'
854
+ )
855
+ end
856
+ end
857
+
858
+ sub_test_case 'config dump' do
859
+ test 'all secret parameters in worker section is sealed' do
860
+ script = <<-EOC
861
+ require 'fluent/plugin/input'
862
+ module Fluent::Plugin
863
+ class FakeInput < Input
864
+ Fluent::Plugin.register_input('fake', self)
865
+ config_param :secret, :string, secret: true
866
+ end
867
+ end
868
+ EOC
869
+ plugin_path = create_plugin_file('in_fake.rb', script)
870
+
871
+ conf = <<CONF
872
+ <system>
873
+ workers 2
874
+ </system>
875
+ <worker 0>
876
+ <source>
877
+ @type fake
878
+ secret secret0
879
+ </source>
880
+ <match>
881
+ @type null
882
+ </match>
883
+ </worker>
884
+ <worker 1>
885
+ <source>
886
+ @type fake
887
+ secret secret1
888
+ </source>
889
+ <match>
890
+ @type null
891
+ </match>
892
+ </worker>
893
+ CONF
894
+ conf_path = create_conf_file('secret_in_worker.conf', conf)
895
+ assert File.exist?(conf_path)
896
+
897
+ assert_log_matches(create_cmdline(conf_path, "-p", File.dirname(plugin_path)),
898
+ "secret xxxxxx", patterns_not_match: ["secret secret0", "secret secret1"])
899
+ end
900
+ end
901
+ end