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
data/test/test_mixin.rb CHANGED
@@ -208,7 +208,7 @@ module MixinTest
208
208
 
209
209
  def test_timezone_invalid
210
210
  assert_raise(Fluent::ConfigError) do
211
- d = create_driver(Fluent::SetTimeKeyMixin, %[
211
+ create_driver(Fluent::SetTimeKeyMixin, %[
212
212
  include_time_key true
213
213
  timezone Invalid/Invalid
214
214
  ])
data/test/test_output.rb CHANGED
@@ -1,8 +1,10 @@
1
1
  require_relative 'helper'
2
2
  require 'fluent/test'
3
3
  require 'fluent/output'
4
+ require 'fluent/output_chain'
5
+ require 'fluent/plugin/buffer'
4
6
  require 'timecop'
5
- require 'flexmock'
7
+ require 'flexmock/test_unit'
6
8
 
7
9
  module FluentOutputTest
8
10
  include Fluent
@@ -15,6 +17,7 @@ module FluentOutputTest
15
17
  def startup
16
18
  $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), 'scripts'))
17
19
  require 'fluent/plugin/out_test'
20
+ require 'fluent/plugin/out_test2'
18
21
  end
19
22
 
20
23
  def shutdown
@@ -47,7 +50,6 @@ module FluentOutputTest
47
50
  assert_equal nil, d.instance.max_retry_wait
48
51
  assert_equal 1.0, d.instance.retry_wait
49
52
  assert_equal 1, d.instance.num_threads
50
- assert_equal 20.0, d.instance.slow_flush_log_threshold
51
53
  assert_equal 1, d.instance.queued_chunk_flush_interval
52
54
 
53
55
  # max_retry_wait
@@ -58,51 +60,24 @@ module FluentOutputTest
58
60
  d = create_driver(CONFIG + %[disable_retry_limit true])
59
61
  assert_equal true, d.instance.disable_retry_limit
60
62
 
61
- # retry_wait is converted to Float for calc_retry_wait
62
- d = create_driver(CONFIG + %[retry_wait 1s])
63
- assert_equal Float, d.instance.retry_wait.class
63
+ #### retry_state cares it
64
+ # # retry_wait is converted to Float for calc_retry_wait
65
+ # d = create_driver(CONFIG + %[retry_wait 1s])
66
+ # assert_equal Float, d.instance.retry_wait.class
64
67
  end
65
68
 
66
- def test_calc_retry_wait
67
- # default
68
- d = create_driver
69
- d.instance.retry_limit.times {
70
- # "d.instance.instance_variable_get(:@num_errors) += 1" causes SyntaxError
71
- d.instance.instance_eval { @num_errors += 1 }
72
- }
73
- wait = d.instance.retry_wait * (2 ** (d.instance.retry_limit - 1))
74
- assert( d.instance.calc_retry_wait > wait - wait / 8.0 )
75
-
76
- # max_retry_wait
77
- d = create_driver(CONFIG + %[max_retry_wait 4])
78
- d.instance.retry_limit.times {
79
- d.instance.instance_eval { @num_errors += 1 }
80
- }
81
- assert_equal 4, d.instance.calc_retry_wait
82
- end
83
-
84
- def test_calc_retry_wait_with_integer_retry_wait
85
- d = create_driver(CONFIG + %[retry_wait 2s])
86
- d.instance.retry_limit.times {
87
- d.instance.instance_eval { @num_errors += 1 }
88
- }
89
- assert_equal true, d.instance.calc_retry_wait.finite?
69
+ class FormatterInjectTestOutput < Fluent::Output
70
+ def initialize
71
+ super
72
+ @formatter = nil
73
+ end
90
74
  end
91
-
92
- def test_large_num_retries
93
- # Test that everything works properly after a very large number of
94
- # retries and we hit the expected max_retry_wait.
95
- exp_max_retry_wait = 300
96
- d = create_driver(CONFIG + %[
97
- disable_retry_limit true
98
- max_retry_wait #{exp_max_retry_wait}
99
- ])
100
- d.instance.instance_eval { @num_errors += 1000 }
101
- assert_equal exp_max_retry_wait, d.instance.calc_retry_wait
102
- d.instance.instance_eval { @num_errors += 1000 }
103
- assert_equal exp_max_retry_wait, d.instance.calc_retry_wait
104
- d.instance.instance_eval { @num_errors += 1000 }
105
- assert_equal exp_max_retry_wait, d.instance.calc_retry_wait
75
+ def test_start
76
+ i = FormatterInjectTestOutput.new
77
+ i.configure(config_element('ROOT', '', {}, [config_element('inject', '', {'hostname_key' => "host"})]))
78
+ assert_nothing_raised do
79
+ i.start
80
+ end
106
81
  end
107
82
 
108
83
  def create_mock_driver(conf=CONFIG)
@@ -134,135 +109,63 @@ module FluentOutputTest
134
109
  end.configure(conf)
135
110
  end
136
111
 
137
- def test_submit_flush_target
138
- # default
139
- d = create_mock_driver
140
- d.instance.start_mock
141
- assert_equal 0, d.instance.instance_variable_get('@writer_current_position')
142
- d.instance.submit_flush
143
- assert_equal 0, d.instance.instance_variable_get('@writer_current_position')
144
- d.instance.submit_flush
145
- assert_equal 0, d.instance.instance_variable_get('@writer_current_position')
146
- d.instance.submit_flush
147
- assert_equal 0, d.instance.instance_variable_get('@writer_current_position')
148
- d.instance.submit_flush
149
- assert_equal 0, d.instance.instance_variable_get('@writer_current_position')
150
- d.instance.shutdown
151
- assert_equal 1, d.instance.submit_flush_threads.size
152
-
153
- # num_threads 4
154
- d = create_mock_driver(CONFIG + %[num_threads 4])
155
- d.instance.start
156
- assert_equal 0, d.instance.instance_variable_get('@writer_current_position')
157
- d.instance.submit_flush
158
- assert_equal 1, d.instance.instance_variable_get('@writer_current_position')
159
- d.instance.submit_flush
160
- assert_equal 2, d.instance.instance_variable_get('@writer_current_position')
161
- d.instance.submit_flush
162
- assert_equal 3, d.instance.instance_variable_get('@writer_current_position')
163
- d.instance.submit_flush
164
- assert_equal 0, d.instance.instance_variable_get('@writer_current_position')
165
- d.instance.shutdown
166
- assert (d.instance.submit_flush_threads.size > 1), "fails if only one thread works to submit flush"
167
- end
168
-
169
112
  def test_secondary
170
- d = create_driver(CONFIG + %[
113
+ d = Fluent::Test::BufferedOutputTestDriver.new(Fluent::BufferedOutput) do
114
+ def write(chunk)
115
+ chunk.read
116
+ end
117
+ end
118
+
119
+ mock(d.instance.log).warn("secondary type should be same with primary one",
120
+ { primary: d.instance.class.to_s, secondary: "Fluent::Plugin::Test2Output" })
121
+ d.configure(CONFIG + %[
171
122
  <secondary>
172
- type test
123
+ type test2
173
124
  name c0
174
125
  </secondary>
175
126
  ])
127
+
176
128
  assert_not_nil d.instance.instance_variable_get(:@secondary).router
177
129
  end
178
130
 
179
- sub_test_case "test_force_flush" do
180
- setup do
181
- time = Time.parse("2011-01-02 13:14:15 UTC")
182
- Timecop.freeze(time)
183
- @time = time.to_i
184
- end
131
+ def test_secondary_with_no_warn_log
132
+ # ObjectBufferedOutput doesn't implement `custom_filter`
133
+ d = Fluent::Test::BufferedOutputTestDriver.new(Fluent::ObjectBufferedOutput)
185
134
 
186
- teardown do
187
- Timecop.return
188
- end
135
+ mock(d.instance.log).warn("secondary type should be same with primary one",
136
+ { primary: d.instance.class.to_s, secondary: "Fluent::Plugin::Test2Output" }).never
137
+ d.configure(CONFIG + %[
138
+ <secondary>
139
+ type test2
140
+ name c0
141
+ </secondary>
142
+ ])
189
143
 
190
- test "force_flush works on retrying" do
191
- d = create_driver(CONFIG)
192
- d.instance.start
193
- buffer = d.instance.instance_variable_get(:@buffer)
194
- # imitate 10 failures
195
- d.instance.instance_variable_set(:@num_errors, 10)
196
- d.instance.instance_variable_set(:@next_retry_time, @time + d.instance.calc_retry_wait)
197
- # buffer should be popped (flushed) immediately
198
- flexmock(buffer).should_receive(:pop).once
199
- # force_flush
200
- buffer.emit("test", 'test', NullOutputChain.instance)
201
- d.instance.force_flush
202
- 10.times { sleep 0.05 }
203
- end
144
+ assert_not_nil d.instance.instance_variable_get(:@secondary).router
204
145
  end
205
146
 
206
- sub_test_case "test slow_flush_log_threshold" do
207
- def create_slow_driver(conf, sleep_time)
208
- d = Fluent::Test::BufferedOutputTestDriver.new(Fluent::BufferedOutput) do
209
- attr_accessor :sleep_time
210
-
211
- def initialize
212
- super
213
- @_written_check_mutex = Mutex.new
214
- @_written_check = false
215
- end
216
-
217
- def written_check
218
- @_written_check_mutex.synchronize { @_written_check }
219
- end
220
-
221
- def write(chunk)
222
- sleep @sleep_time
223
- end
224
-
225
- def try_flush
226
- super
227
- @_written_check_mutex.synchronize { @_written_check = true }
228
- end
229
- end.configure(conf)
230
- d.instance.sleep_time = sleep_time
231
- d
232
- end
147
+ test 'BufferQueueLimitError compatibility' do
148
+ assert_equal Fluent::Plugin::Buffer::BufferOverflowError, Fluent::BufferQueueLimitError
149
+ end
150
+ end
233
151
 
234
- def setup
235
- # output#try_flush uses $log, so it should be replaced
236
- @orig_log = $log
237
- $log = Fluent::Test::TestLogger.new
238
- end
152
+ class ObjectBufferedOutputTest < ::Test::Unit::TestCase
153
+ include FluentOutputTest
239
154
 
240
- def teardown
241
- $log = @orig_log
242
- end
155
+ def setup
156
+ Fluent::Test.setup
157
+ end
243
158
 
244
- test "flush took longer time than slow_flush_log_threshold" do
245
- d = create_slow_driver(%[
246
- slow_flush_log_threshold 0.5
247
- ], 1.5)
248
- run_driver(d)
249
- assert_equal 1, $log.logs.count { |line| line =~ /buffer flush took longer time than slow_flush_log_threshold:/ }
250
- end
159
+ CONFIG = %[]
251
160
 
252
- test "flush took lower time than slow_flush_log_threshold. No logs" do
253
- d = create_slow_driver(%[
254
- slow_flush_log_threshold 5.0
255
- ], 0)
256
- run_driver(d)
257
- assert_equal 0, $log.logs.count { |line| line =~ /buffer flush took longer time than slow_flush_log_threshold:/ }
258
- end
161
+ def create_driver(conf=CONFIG)
162
+ Fluent::Test::OutputTestDriver.new(Fluent::ObjectBufferedOutput).configure(conf, true)
163
+ end
259
164
 
260
- def run_driver(d)
261
- d.instance.start
262
- d.instance.emit('test', OneEventStream.new(@time.to_i, {"message" => "foo"}), NullOutputChain.instance)
263
- d.instance.force_flush
264
- until d.instance.written_check; end
265
- end
165
+ def test_configure
166
+ # default
167
+ d = create_driver
168
+ assert_equal true, d.instance.time_as_integer
266
169
  end
267
170
  end
268
171
 
@@ -278,37 +181,51 @@ module FluentOutputTest
278
181
 
279
182
  TMP_DIR = File.expand_path(File.dirname(__FILE__) + "/tmp/time_sliced_output")
280
183
 
281
- CONFIG = %[buffer_path #{TMP_DIR}/foo]
184
+ CONFIG = %[
185
+ buffer_path #{TMP_DIR}/foo
186
+ time_slice_format %Y%m%d%H
187
+ ]
188
+
189
+ class TimeSlicedOutputTestPlugin < Fluent::TimeSlicedOutput
190
+ attr_reader :written_chunk_keys, :errors_in_write
191
+ def initialize
192
+ super
193
+ @written_chunk_keys = []
194
+ @errors_in_write = []
195
+ end
282
196
 
283
- def create_driver(conf=CONFIG)
284
- Fluent::Test::TimeSlicedOutputTestDriver.new(Fluent::TimeSlicedOutput).configure(conf, true)
285
- end
197
+ def configure(conf)
198
+ super
286
199
 
287
- sub_test_case "force_flush test" do
288
- setup do
289
- time = Time.parse("2011-01-02 13:14:15 UTC")
290
- Timecop.freeze(time)
291
- @es = OneEventStream.new(time.to_i, {"message" => "foo"})
200
+ @formatter = Fluent::Plugin.new_formatter('out_file')
201
+ @formatter.configure(conf)
292
202
  end
293
203
 
294
- teardown do
295
- Timecop.return
204
+ def format(tag, time, record)
205
+ @formatter.format(tag, time, record)
296
206
  end
297
-
298
- test "force_flush immediately flushes" do
299
- d = create_driver(CONFIG + %[
300
- time_format %Y%m%d%H%M%S
301
- ])
302
- d.instance.start
303
- # buffer should be popped (flushed) immediately
304
- flexmock(d.instance.instance_variable_get(:@buffer)).should_receive(:pop).once
305
- # force_flush
306
- d.instance.emit('test', @es, NullOutputChain.instance)
307
- d.instance.force_flush
308
- 10.times { sleep 0.05 }
207
+ def write(chunk)
208
+ @written_chunk_keys << chunk.key
209
+ true
210
+ rescue => e
211
+ @errors_in_write << e
309
212
  end
310
213
  end
311
214
 
215
+ def create_driver(conf=CONFIG)
216
+ Fluent::Test::TimeSlicedOutputTestDriver.new(TimeSlicedOutputTestPlugin).configure(conf, true)
217
+ end
218
+
219
+ data(:none => '',
220
+ :utc => "utc",
221
+ :localtime => 'localtime',
222
+ :timezone => 'timezone +0000')
223
+ test 'configure with timezone related parameters' do |param|
224
+ assert_nothing_raised {
225
+ create_driver(CONFIG + param)
226
+ }
227
+ end
228
+
312
229
  sub_test_case "test emit" do
313
230
  setup do
314
231
  @time = Time.parse("2011-01-02 13:14:15 UTC")
@@ -319,18 +236,37 @@ module FluentOutputTest
319
236
  Timecop.return
320
237
  end
321
238
 
322
- test "emit with valid event" do
239
+ test "emit with invalid event" do
323
240
  d = create_driver
324
241
  d.instance.start
325
- d.instance.emit('test', OneEventStream.new(@time.to_i, {"message" => "foo"}), NullOutputChain.instance)
326
- assert_equal 0, d.instance.log.logs.size
242
+ d.instance.after_start
243
+ assert_raise ArgumentError, "time must be a Fluent::EventTime (or Integer)" do
244
+ d.instance.emit_events('test', OneEventStream.new('string', 10))
245
+ end
327
246
  end
328
247
 
329
- test "emit with invalid event" do
248
+ test "plugin can get key of chunk in #write" do
330
249
  d = create_driver
331
250
  d.instance.start
332
- d.instance.emit('test', OneEventStream.new('string', 10), NullOutputChain.instance)
333
- assert_equal 1, d.instance.log.logs.count { |line| line =~ /dump an error event/ }
251
+ d.instance.after_start
252
+ d.instance.emit_events('test', OneEventStream.new(event_time("2016-11-08 17:44:30 +0900"), {"message" => "yay"}))
253
+ d.instance.force_flush
254
+ waiting(10) do
255
+ sleep 0.1 until d.instance.written_chunk_keys.size == 1
256
+ end
257
+ assert_equal [], d.instance.errors_in_write
258
+ assert_equal ["2016110808"], d.instance.written_chunk_keys # default timezone is UTC
259
+ end
260
+
261
+ test "check formatted time compatibility with utc. Should Z, not +00:00" do
262
+ d = create_driver(CONFIG + %[
263
+ utc
264
+ include_time_key
265
+ ])
266
+ time = Time.parse("2016-11-08 12:00:00 UTC").to_i
267
+ d.emit({"a" => 1}, time)
268
+ d.expect_format %[2016-11-08T12:00:00Z\ttest\t{"a":1,"time":"2016-11-08T12:00:00Z"}\n]
269
+ d.run
334
270
  end
335
271
  end
336
272
  end
@@ -0,0 +1,251 @@
1
+ require_relative 'helper'
2
+
3
+ require 'fluent/plugin'
4
+ require 'fluent/plugin/input'
5
+ require 'fluent/plugin/filter'
6
+ require 'fluent/plugin/output'
7
+ require 'fluent/plugin/buffer'
8
+ require 'fluent/plugin/parser'
9
+ require 'fluent/plugin/formatter'
10
+ require 'fluent/plugin/storage'
11
+
12
+ class PluginTest < Test::Unit::TestCase
13
+ class Dummy1Input < Fluent::Plugin::Input
14
+ Fluent::Plugin.register_input('plugin_test_dummy1', self)
15
+ end
16
+ class Dummy2Input < Fluent::Plugin::Input
17
+ Fluent::Plugin.register_input('plugin_test_dummy2', self)
18
+ helpers :storage
19
+ config_section :storage do
20
+ config_set_default :@type, 'plugin_test_dummy1'
21
+ end
22
+ def multi_workers_ready?
23
+ true
24
+ end
25
+ end
26
+ class DummyFilter < Fluent::Plugin::Filter
27
+ Fluent::Plugin.register_filter('plugin_test_dummy', self)
28
+ helpers :parser, :formatter
29
+ config_section :parse do
30
+ config_set_default :@type, 'plugin_test_dummy'
31
+ end
32
+ config_section :format do
33
+ config_set_default :@type, 'plugin_test_dummy'
34
+ end
35
+ def filter(tag, time, record)
36
+ record
37
+ end
38
+ end
39
+ class Dummy1Output < Fluent::Plugin::Output
40
+ Fluent::Plugin.register_output('plugin_test_dummy1', self)
41
+ def write(chunk)
42
+ # drop
43
+ end
44
+ end
45
+ class Dummy2Output < Fluent::Plugin::Output
46
+ Fluent::Plugin.register_output('plugin_test_dummy2', self)
47
+ config_section :buffer do
48
+ config_set_default :@type, 'plugin_test_dummy1'
49
+ end
50
+ def multi_workers_ready?
51
+ true
52
+ end
53
+ def write(chunk)
54
+ # drop
55
+ end
56
+ end
57
+ class Dummy1Buffer < Fluent::Plugin::Buffer
58
+ Fluent::Plugin.register_buffer('plugin_test_dummy1', self)
59
+ end
60
+ class Dummy2Buffer < Fluent::Plugin::Buffer
61
+ Fluent::Plugin.register_buffer('plugin_test_dummy2', self)
62
+ def multi_workers_ready?
63
+ false
64
+ end
65
+ end
66
+ class DummyParser < Fluent::Plugin::Parser
67
+ Fluent::Plugin.register_parser('plugin_test_dummy', self)
68
+ end
69
+ class DummyFormatter < Fluent::Plugin::Formatter
70
+ Fluent::Plugin.register_formatter('plugin_test_dummy', self)
71
+ end
72
+ class Dummy1Storage < Fluent::Plugin::Storage
73
+ Fluent::Plugin.register_storage('plugin_test_dummy1', self)
74
+ end
75
+ class Dummy2Storage < Fluent::Plugin::Storage
76
+ Fluent::Plugin.register_storage('plugin_test_dummy2', self)
77
+ def multi_workers_ready?
78
+ false
79
+ end
80
+ end
81
+ class DummyOwner < Fluent::Plugin::Base
82
+ include Fluent::PluginId
83
+ include Fluent::PluginLoggerMixin
84
+ end
85
+ class DummyEventRouter
86
+ def emit(tag, time, record); end
87
+ def emit_array(tag, array); end
88
+ def emit_stream(tag, es); end
89
+ def emit_error_event(tag, time, record, error); end
90
+ end
91
+
92
+ sub_test_case '#new_* methods' do
93
+ data(
94
+ input1: ['plugin_test_dummy1', Dummy1Input, :new_input],
95
+ input2: ['plugin_test_dummy2', Dummy2Input, :new_input],
96
+ filter: ['plugin_test_dummy', DummyFilter, :new_filter],
97
+ output1: ['plugin_test_dummy1', Dummy1Output, :new_output],
98
+ output2: ['plugin_test_dummy2', Dummy2Output, :new_output],
99
+ )
100
+ test 'returns plugin instances of registered plugin classes' do |(type, klass, m)|
101
+ instance = Fluent::Plugin.__send__(m, type)
102
+ assert_kind_of klass, instance
103
+ end
104
+
105
+ data(
106
+ buffer1: ['plugin_test_dummy1', Dummy1Buffer, :new_buffer],
107
+ buffer2: ['plugin_test_dummy2', Dummy2Buffer, :new_buffer],
108
+ parser: ['plugin_test_dummy', DummyParser, :new_parser],
109
+ formatter: ['plugin_test_dummy', DummyFormatter, :new_formatter],
110
+ storage1: ['plugin_test_dummy1', Dummy1Storage, :new_storage],
111
+ storage2: ['plugin_test_dummy2', Dummy2Storage, :new_storage],
112
+ )
113
+ test 'returns plugin instances of registered owned plugin classes' do |(type, klass, m)|
114
+ owner = DummyOwner.new
115
+ instance = Fluent::Plugin.__send__(m, type, parent: owner)
116
+ assert_kind_of klass, instance
117
+ end
118
+
119
+ data(
120
+ input1: ['plugin_test_dummy1', Dummy1Input, :new_input, nil],
121
+ input2: ['plugin_test_dummy2', Dummy2Input, :new_input, nil],
122
+ filter: ['plugin_test_dummy', DummyFilter, :new_filter, nil],
123
+ output1: ['plugin_test_dummy1', Dummy1Output, :new_output, nil],
124
+ output2: ['plugin_test_dummy2', Dummy2Output, :new_output, nil],
125
+ buffer1: ['plugin_test_dummy1', Dummy1Buffer, :new_buffer, {parent: DummyOwner.new}],
126
+ buffer2: ['plugin_test_dummy2', Dummy2Buffer, :new_buffer, {parent: DummyOwner.new}],
127
+ parser: ['plugin_test_dummy', DummyParser, :new_parser, {parent: DummyOwner.new}],
128
+ formatter: ['plugin_test_dummy', DummyFormatter, :new_formatter, {parent: DummyOwner.new}],
129
+ storage1: ['plugin_test_dummy1', Dummy1Storage, :new_storage, {parent: DummyOwner.new}],
130
+ storage2: ['plugin_test_dummy2', Dummy2Storage, :new_storage, {parent: DummyOwner.new}],
131
+ )
132
+ test 'returns plugin instances which are extended by FeatureAvailabilityChecker module' do |(type, _, m, kwargs)|
133
+ instance = if kwargs
134
+ Fluent::Plugin.__send__(m, type, **kwargs)
135
+ else
136
+ Fluent::Plugin.__send__(m, type)
137
+ end
138
+ assert_kind_of Fluent::Plugin::FeatureAvailabilityChecker, instance
139
+ end
140
+ end
141
+
142
+ sub_test_case 'with default system configuration' do
143
+ data(
144
+ input1: ['plugin_test_dummy1', Dummy1Input, :new_input, nil],
145
+ input2: ['plugin_test_dummy2', Dummy2Input, :new_input, nil],
146
+ filter: ['plugin_test_dummy', DummyFilter, :new_filter, nil],
147
+ output1: ['plugin_test_dummy1', Dummy1Output, :new_output, nil],
148
+ output2: ['plugin_test_dummy2', Dummy2Output, :new_output, nil],
149
+ buffer1: ['plugin_test_dummy1', Dummy1Buffer, :new_buffer, {parent: DummyOwner.new}],
150
+ buffer2: ['plugin_test_dummy2', Dummy2Buffer, :new_buffer, {parent: DummyOwner.new}],
151
+ parser: ['plugin_test_dummy', DummyParser, :new_parser, {parent: DummyOwner.new}],
152
+ formatter: ['plugin_test_dummy', DummyFormatter, :new_formatter, {parent: DummyOwner.new}],
153
+ storage1: ['plugin_test_dummy1', Dummy1Storage, :new_storage, {parent: DummyOwner.new}],
154
+ storage2: ['plugin_test_dummy2', Dummy2Storage, :new_storage, {parent: DummyOwner.new}],
155
+ )
156
+ test '#configure does not raise anything' do |(type, _, m, kwargs)|
157
+ instance = if kwargs
158
+ Fluent::Plugin.__send__(m, type, **kwargs)
159
+ else
160
+ Fluent::Plugin.__send__(m, type)
161
+ end
162
+ if instance.respond_to?(:context_router=)
163
+ instance.context_router = DummyEventRouter.new
164
+ end
165
+ assert_nothing_raised do
166
+ instance.configure(config_element())
167
+ end
168
+ end
169
+ end
170
+
171
+ sub_test_case 'with single worker configuration' do
172
+ data(
173
+ input1: ['plugin_test_dummy1', Dummy1Input, :new_input, nil],
174
+ input2: ['plugin_test_dummy2', Dummy2Input, :new_input, nil],
175
+ filter: ['plugin_test_dummy', DummyFilter, :new_filter, nil],
176
+ output1: ['plugin_test_dummy1', Dummy1Output, :new_output, nil],
177
+ output2: ['plugin_test_dummy2', Dummy2Output, :new_output, nil],
178
+ buffer1: ['plugin_test_dummy1', Dummy1Buffer, :new_buffer, {parent: DummyOwner.new}],
179
+ buffer2: ['plugin_test_dummy2', Dummy2Buffer, :new_buffer, {parent: DummyOwner.new}],
180
+ parser: ['plugin_test_dummy', DummyParser, :new_parser, {parent: DummyOwner.new}],
181
+ formatter: ['plugin_test_dummy', DummyFormatter, :new_formatter, {parent: DummyOwner.new}],
182
+ storage1: ['plugin_test_dummy1', Dummy1Storage, :new_storage, {parent: DummyOwner.new}],
183
+ storage2: ['plugin_test_dummy2', Dummy2Storage, :new_storage, {parent: DummyOwner.new}],
184
+ )
185
+ test '#configure does not raise anything' do |(type, _, m, kwargs)|
186
+ instance = if kwargs
187
+ Fluent::Plugin.__send__(m, type, **kwargs)
188
+ else
189
+ Fluent::Plugin.__send__(m, type)
190
+ end
191
+ if instance.respond_to?(:context_router=)
192
+ instance.context_router = DummyEventRouter.new
193
+ end
194
+ assert_nothing_raised do
195
+ instance.system_config_override('workers' => 1)
196
+ instance.configure(config_element())
197
+ end
198
+ end
199
+ end
200
+
201
+ sub_test_case 'with multi workers configuration' do
202
+ data(
203
+ input1: ['plugin_test_dummy1', Dummy1Input, :new_input],
204
+ output1: ['plugin_test_dummy1', Dummy1Output, :new_output],
205
+ )
206
+ test '#configure raise configuration error if plugins are not ready for multi workers' do |(type, klass, new_method)|
207
+ conf = config_element()
208
+ instance = Fluent::Plugin.__send__(new_method, type)
209
+ if instance.respond_to?(:context_router=)
210
+ instance.context_router = DummyEventRouter.new
211
+ end
212
+ assert_raise Fluent::ConfigError.new("Plugin '#{type}' does not support multi workers configuration (#{klass})") do
213
+ instance.system_config_override('workers' => 3)
214
+ instance.configure(conf)
215
+ end
216
+ end
217
+
218
+ data(
219
+ input2: ['plugin_test_dummy2', Dummy2Input, :new_input], # with Dummy1Storage
220
+ filter: ['plugin_test_dummy', DummyFilter, :new_filter], # with DummyParser and DummyFormatter
221
+ output2: ['plugin_test_dummy2', Dummy2Output, :new_output], # with Dummy1Buffer
222
+ )
223
+ test '#configure does not raise any errors if plugins and its owned plugins are ready for multi workers' do |(type, _klass, new_method)|
224
+ conf = config_element()
225
+ instance = Fluent::Plugin.__send__(new_method, type)
226
+ if instance.respond_to?(:context_router=)
227
+ instance.context_router = DummyEventRouter.new
228
+ end
229
+ assert_nothing_raised do
230
+ instance.system_config_override('workers' => 3)
231
+ instance.configure(conf)
232
+ end
233
+ end
234
+
235
+ data(
236
+ input2: ['plugin_test_dummy2', Dummy2Input, :new_input, 'storage', 'plugin_test_dummy2', Dummy2Storage],
237
+ output2: ['plugin_test_dummy2', Dummy2Output, :new_output, 'buffer', 'plugin_test_dummy2', Dummy2Buffer],
238
+ )
239
+ test '#configure raise configuration error if configured owned plugins are not ready for multi workers' do |(type, _klass, new_method, subsection, subsection_type, problematic)|
240
+ conf = config_element('root', '', {}, [config_element(subsection, '', {'@type' => subsection_type})])
241
+ instance = Fluent::Plugin.__send__(new_method, type)
242
+ if instance.respond_to?(:context_router=)
243
+ instance.context_router = DummyEventRouter.new
244
+ end
245
+ assert_raise Fluent::ConfigError.new("Plugin '#{subsection_type}' does not support multi workers configuration (#{problematic})") do
246
+ instance.system_config_override('workers' => 3)
247
+ instance.configure(conf)
248
+ end
249
+ end
250
+ end
251
+ end