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
@@ -1,6 +1,7 @@
1
1
  require_relative 'helper'
2
2
  require 'fluent/event_router'
3
3
  require 'fluent/system_config'
4
+ require 'timecop'
4
5
  require_relative 'test_plugin_classes'
5
6
 
6
7
  class RootAgentTest < ::Test::Unit::TestCase
@@ -8,7 +9,7 @@ class RootAgentTest < ::Test::Unit::TestCase
8
9
  include FluentTest
9
10
 
10
11
  def test_initialize
11
- ra = RootAgent.new
12
+ ra = RootAgent.new(log: $log)
12
13
  assert_equal 0, ra.instance_variable_get(:@suppress_emit_error_log_interval)
13
14
  assert_nil ra.instance_variable_get(:@next_emit_error_log_time)
14
15
  end
@@ -19,7 +20,7 @@ class RootAgentTest < ::Test::Unit::TestCase
19
20
  )
20
21
  def test_initialize_with_opt(data)
21
22
  opt, expected = data
22
- ra = RootAgent.new(SystemConfig.new(opt))
23
+ ra = RootAgent.new(log: $log, system_config: SystemConfig.new(opt))
23
24
  expected.each { |k, v|
24
25
  assert_equal v, ra.instance_variable_get(k)
25
26
  }
@@ -27,7 +28,7 @@ class RootAgentTest < ::Test::Unit::TestCase
27
28
 
28
29
  sub_test_case 'configure' do
29
30
  setup do
30
- @ra = RootAgent.new
31
+ @ra = RootAgent.new(log: $log)
31
32
  stub(Engine).root_agent { @ra }
32
33
  end
33
34
 
@@ -43,9 +44,6 @@ class RootAgentTest < ::Test::Unit::TestCase
43
44
  assert_empty ra.labels
44
45
  assert_empty ra.outputs
45
46
  assert_empty ra.filters
46
- [:@started_inputs, :@started_outputs, :@started_filters].each { |k|
47
- assert_empty ra.instance_variable_get(k)
48
- }
49
47
  assert_nil ra.context
50
48
  assert_nil ra.error_collector
51
49
  end
@@ -92,6 +90,41 @@ EOC
92
90
  end
93
91
  end
94
92
 
93
+ test 'raises configuration error if there are two same label section' do
94
+ conf = <<-EOC
95
+ <source>
96
+ @type test_in
97
+ @label @test
98
+ </source>
99
+ <label @test>
100
+ @type test_out
101
+ </label>
102
+ <label @test>
103
+ @type test_out
104
+ </label>
105
+ EOC
106
+ errmsg = "Section <label @test> appears twice"
107
+ assert_raise Fluent::ConfigError.new(errmsg) do
108
+ configure_ra(conf)
109
+ end
110
+ end
111
+
112
+ test 'raises configuration error if there are not match sections in label section' do
113
+ conf = <<-EOC
114
+ <source>
115
+ @type test_in
116
+ @label @test
117
+ </source>
118
+ <label @test>
119
+ @type test_out
120
+ </label>
121
+ EOC
122
+ errmsg = "Missing <match> sections in <label @test> section"
123
+ assert_raise Fluent::ConfigError.new(errmsg) do
124
+ configure_ra(conf)
125
+ end
126
+ end
127
+
95
128
  test 'with plugins' do
96
129
  # check @type and type in one configuration
97
130
  conf = <<-EOC
@@ -122,11 +155,8 @@ EOC
122
155
  EOC
123
156
  ra = configure_ra(conf)
124
157
  assert_kind_of FluentTestInput, ra.inputs.first
125
- assert_kind_of RelabelOutput, ra.outputs.first
158
+ assert_kind_of Plugin::RelabelOutput, ra.outputs.first
126
159
  assert_kind_of FluentTestFilter, ra.filters.first
127
- [:@started_inputs, :@started_outputs, :@started_filters].each { |k|
128
- assert_empty ra.instance_variable_get(k)
129
- }
130
160
  assert ra.error_collector
131
161
 
132
162
  %W(@test @ERROR).each { |label_symbol|
@@ -139,15 +169,21 @@ EOC
139
169
  assert_equal ra, test_label.root_agent
140
170
 
141
171
  error_label = ra.labels['@ERROR']
142
- assert_kind_of NullOutput, error_label.outputs.first
172
+ assert_kind_of Fluent::Plugin::NullOutput, error_label.outputs.first
143
173
  assert_kind_of RootAgent::RootAgentProxyWithoutErrorCollector, error_label.root_agent
144
174
  end
145
175
  end
146
176
 
147
177
  sub_test_case 'start/shutdown' do
148
- setup do
149
- @ra = RootAgent.new
150
- @ra.configure(Config.parse(<<-EOC, "(test)", "(test_dir)", true))
178
+ def setup_root_agent(conf)
179
+ ra = RootAgent.new(log: $log)
180
+ stub(Engine).root_agent { ra }
181
+ ra.configure(Config.parse(conf, "(test)", "(test_dir)", true))
182
+ ra
183
+ end
184
+
185
+ test 'plugin status' do
186
+ ra = setup_root_agent(<<-EOC)
151
187
  <source>
152
188
  @type test_in
153
189
  @id test_in
@@ -160,20 +196,729 @@ EOC
160
196
  @type test_out
161
197
  @id test_out
162
198
  </match>
199
+ EOC
200
+ ra.start
201
+ assert_true ra.inputs.first.started
202
+ assert_true ra.filters.first.started
203
+ assert_true ra.outputs.first.started
204
+
205
+ ra.shutdown
206
+ assert_false ra.inputs.first.started
207
+ assert_false ra.filters.first.started
208
+ assert_false ra.outputs.first.started
209
+ end
210
+
211
+ test 'output plugin threads should run before input plugin is blocked with buffer full' do
212
+ ra = setup_root_agent(<<-EOC)
213
+ <source>
214
+ @type test_in_gen
215
+ @id test_in_gen
216
+ </source>
217
+ <match **>
218
+ @type test_out_buffered
219
+ @id test_out_buffered
220
+ <buffer>
221
+ chunk_limit_size 1k
222
+ queue_limit_length 2
223
+ flush_thread_count 2
224
+ overflow_action block
225
+ </buffer>
226
+ </match>
227
+ EOC
228
+ waiting(5) { ra.start }
229
+ assert_true ra.inputs.first.started
230
+ assert_true ra.outputs.first.started
231
+
232
+ ra.shutdown
233
+ assert_false ra.inputs.first.started
234
+ assert_false ra.outputs.first.started
235
+ end
236
+ end
237
+
238
+ sub_test_case 'configured with label and secondary plugin' do
239
+ setup do
240
+ @ra = RootAgent.new(log: $log)
241
+ stub(Engine).root_agent{ @ra }
242
+ @ra.configure(Config.parse(<<-EOC, "(test)", "(test_dir)", true))
243
+ <source>
244
+ @type test_in
245
+ @label @route_a
246
+ </source>
247
+ <label @route_a>
248
+ <match a.**>
249
+ @type test_out_buffered
250
+ <secondary>
251
+ @type test_out_emit
252
+ </secondary>
253
+ </match>
254
+ </label>
255
+ <label @route_b>
256
+ <match b.**>
257
+ @type test_out
258
+ </match>
259
+ </label>
260
+ EOC
261
+ end
262
+
263
+ test 'secondary plugin has an event router for the label which the plugin is in' do
264
+ assert_equal 1, @ra.inputs.size
265
+ assert_equal 2, @ra.labels.size
266
+ assert_equal ['@route_a', '@route_b'], @ra.labels.keys
267
+ assert_equal '@route_a', @ra.labels['@route_a'].context
268
+ assert_equal '@route_b', @ra.labels['@route_b'].context
269
+
270
+ c1 = @ra.labels['@route_a']
271
+
272
+ assert_equal 1, c1.outputs.size
273
+ assert !c1.outputs.first.has_router?
274
+
275
+ assert c1.outputs.first.secondary
276
+ assert c1.outputs.first.secondary.has_router?
277
+ assert_equal c1.event_router, c1.outputs.first.secondary.router
278
+ end
279
+ end
280
+
281
+ sub_test_case 'configured with label and secondary plugin with @label specifier' do
282
+ setup do
283
+ @ra = RootAgent.new(log: $log)
284
+ stub(Engine).root_agent{ @ra }
285
+ @ra.configure(Config.parse(<<-EOC, "(test)", "(test_dir)", true))
286
+ <source>
287
+ @type test_in
288
+ @label @route_a
289
+ </source>
290
+ <label @route_a>
291
+ <match a.**>
292
+ @type test_out_buffered
293
+ <secondary>
294
+ @type test_out_emit
295
+ @label @route_b
296
+ </secondary>
297
+ </match>
298
+ </label>
299
+ <label @route_b>
300
+ <match b.**>
301
+ @type test_out
302
+ </match>
303
+ </label>
304
+ EOC
305
+ end
306
+
307
+ test 'secondary plugin has an event router for the label specified in secondary section' do
308
+ assert_equal 1, @ra.inputs.size
309
+ assert_equal 2, @ra.labels.size
310
+ assert_equal ['@route_a', '@route_b'], @ra.labels.keys
311
+ assert_equal '@route_a', @ra.labels['@route_a'].context
312
+ assert_equal '@route_b', @ra.labels['@route_b'].context
313
+
314
+ c1 = @ra.labels['@route_a']
315
+ c2 = @ra.labels['@route_b']
316
+
317
+ assert_equal 1, c1.outputs.size
318
+ assert !c1.outputs.first.has_router?
319
+
320
+ assert c1.outputs.first.secondary
321
+ assert c1.outputs.first.secondary.has_router?
322
+ assert_equal c2.event_router, c1.outputs.first.secondary.router
323
+ end
324
+ end
325
+
326
+ sub_test_case 'configured with label and secondary plugin with @label specifier in primary output' do
327
+ setup do
328
+ @ra = RootAgent.new(log: $log)
329
+ stub(Engine).root_agent{ @ra }
330
+ @ra.configure(Config.parse(<<-EOC, "(test)", "(test_dir)", true))
331
+ <source>
332
+ @type test_in
333
+ @label @route_a
334
+ </source>
335
+ <label @route_a>
336
+ <match a.**>
337
+ @type test_out_emit
338
+ @label @route_b
339
+ <secondary>
340
+ @type test_out_emit
341
+ </secondary>
342
+ </match>
343
+ </label>
344
+ <label @route_b>
345
+ <match b.**>
346
+ @type test_out
347
+ </match>
348
+ </label>
349
+ EOC
350
+ end
351
+
352
+ test 'secondary plugin has an event router for the label specified in secondary section' do
353
+ assert_equal 1, @ra.inputs.size
354
+ assert_equal 2, @ra.labels.size
355
+ assert_equal ['@route_a', '@route_b'], @ra.labels.keys
356
+ assert_equal '@route_a', @ra.labels['@route_a'].context
357
+ assert_equal '@route_b', @ra.labels['@route_b'].context
358
+
359
+ c1 = @ra.labels['@route_a']
360
+ c2 = @ra.labels['@route_b']
361
+
362
+ assert_equal 1, c1.outputs.size
363
+ assert c1.outputs.first.secondary
364
+
365
+ p1 = c1.outputs.first
366
+ assert p1.has_router?
367
+ assert_equal c1.event_router, p1.context_router
368
+ assert_equal c2.event_router, p1.router
369
+
370
+ s1 = p1.secondary
371
+ assert s1.has_router?
372
+ assert_equal c1.event_router, s1.context_router
373
+ assert_equal c2.event_router, s1.router
374
+ end
375
+ end
376
+
377
+ sub_test_case 'configured with MultiOutput plugins' do
378
+ setup do
379
+ @ra = RootAgent.new(log: $log)
380
+ stub(Engine).root_agent { @ra }
381
+ @ra.configure(Config.parse(<<-EOC, "(test)", "(test_dir)", true))
382
+ <source>
383
+ @type test_in
384
+ @id test_in
385
+ </source>
386
+ <filter>
387
+ @type test_filter
388
+ @id test_filter
389
+ </filter>
390
+ <match **>
391
+ @type copy
392
+ @id test_copy
393
+ <store>
394
+ @type test_out
395
+ @id test_out1
396
+ </store>
397
+ <store>
398
+ @type test_out
399
+ @id test_out2
400
+ </store>
401
+ </match>
163
402
  EOC
164
403
  @ra
165
404
  end
166
405
 
167
- test 'plugin status' do
406
+ test 'plugin status with multi output' do
407
+ assert_equal 1, @ra.inputs.size
408
+ assert_equal 1, @ra.filters.size
409
+ assert_equal 3, @ra.outputs.size
410
+
168
411
  @ra.start
169
- assert_true @ra.inputs.first.started
170
- assert_true @ra.filters.first.started
171
- assert_true @ra.outputs.first.started
412
+ assert_equal [true], @ra.inputs.map{|i| i.started? }
413
+ assert_equal [true], @ra.filters.map{|i| i.started? }
414
+ assert_equal [true, true, true], @ra.outputs.map{|i| i.started? }
415
+
416
+ assert_equal [true], @ra.inputs.map{|i| i.after_started? }
417
+ assert_equal [true], @ra.filters.map{|i| i.after_started? }
418
+ assert_equal [true, true, true], @ra.outputs.map{|i| i.after_started? }
419
+
420
+ @ra.shutdown
421
+ assert_equal [true], @ra.inputs.map{|i| i.stopped? }
422
+ assert_equal [true], @ra.filters.map{|i| i.stopped? }
423
+ assert_equal [true, true, true], @ra.outputs.map{|i| i.stopped? }
424
+
425
+ assert_equal [true], @ra.inputs.map{|i| i.before_shutdown? }
426
+ assert_equal [true], @ra.filters.map{|i| i.before_shutdown? }
427
+ assert_equal [true, true, true], @ra.outputs.map{|i| i.before_shutdown? }
428
+
429
+ assert_equal [true], @ra.inputs.map{|i| i.shutdown? }
430
+ assert_equal [true], @ra.filters.map{|i| i.shutdown? }
431
+ assert_equal [true, true, true], @ra.outputs.map{|i| i.shutdown? }
432
+
433
+ assert_equal [true], @ra.inputs.map{|i| i.after_shutdown? }
434
+ assert_equal [true], @ra.filters.map{|i| i.after_shutdown? }
435
+ assert_equal [true, true, true], @ra.outputs.map{|i| i.after_shutdown? }
436
+
437
+ assert_equal [true], @ra.inputs.map{|i| i.closed? }
438
+ assert_equal [true], @ra.filters.map{|i| i.closed? }
439
+ assert_equal [true, true, true], @ra.outputs.map{|i| i.closed? }
440
+
441
+ assert_equal [true], @ra.inputs.map{|i| i.terminated? }
442
+ assert_equal [true], @ra.filters.map{|i| i.terminated? }
443
+ assert_equal [true, true, true], @ra.outputs.map{|i| i.terminated? }
444
+ end
445
+ end
446
+
447
+ sub_test_case 'configured with MultiOutput plugins and labels' do
448
+ setup do
449
+ @ra = RootAgent.new(log: $log)
450
+ stub(Engine).root_agent { @ra }
451
+ @ra.configure(Config.parse(<<-EOC, "(test)", "(test_dir)", true))
452
+ <source>
453
+ @type test_in
454
+ @id test_in
455
+ @label @testing
456
+ </source>
457
+ <label @testing>
458
+ <filter>
459
+ @type test_filter
460
+ @id test_filter
461
+ </filter>
462
+ <match **>
463
+ @type copy
464
+ @id test_copy
465
+ <store>
466
+ @type test_out
467
+ @id test_out1
468
+ </store>
469
+ <store>
470
+ @type test_out
471
+ @id test_out2
472
+ </store>
473
+ </match>
474
+ </label>
475
+ EOC
476
+ @ra
477
+ end
478
+
479
+ test 'plugin status with multi output' do
480
+ assert_equal 1, @ra.inputs.size
481
+ assert_equal 0, @ra.filters.size
482
+ assert_equal 0, @ra.outputs.size
483
+ assert_equal 1, @ra.labels.size
484
+ assert_equal '@testing', @ra.labels.keys.first
485
+ assert_equal 1, @ra.labels.values.first.filters.size
486
+ assert_equal 3, @ra.labels.values.first.outputs.size
487
+
488
+ label_filters = @ra.labels.values.first.filters
489
+ label_outputs = @ra.labels.values.first.outputs
490
+
491
+ @ra.start
492
+ assert_equal [true], @ra.inputs.map{|i| i.started? }
493
+ assert_equal [true], label_filters.map{|i| i.started? }
494
+ assert_equal [true, true, true], label_outputs.map{|i| i.started? }
495
+
496
+ @ra.shutdown
497
+ assert_equal [true], @ra.inputs.map{|i| i.stopped? }
498
+ assert_equal [true], label_filters.map{|i| i.stopped? }
499
+ assert_equal [true, true, true], label_outputs.map{|i| i.stopped? }
500
+
501
+ assert_equal [true], @ra.inputs.map{|i| i.before_shutdown? }
502
+ assert_equal [true], label_filters.map{|i| i.before_shutdown? }
503
+ assert_equal [true, true, true], label_outputs.map{|i| i.before_shutdown? }
504
+
505
+ assert_equal [true], @ra.inputs.map{|i| i.shutdown? }
506
+ assert_equal [true], label_filters.map{|i| i.shutdown? }
507
+ assert_equal [true, true, true], label_outputs.map{|i| i.shutdown? }
508
+
509
+ assert_equal [true], @ra.inputs.map{|i| i.after_shutdown? }
510
+ assert_equal [true], label_filters.map{|i| i.after_shutdown? }
511
+ assert_equal [true, true, true], label_outputs.map{|i| i.after_shutdown? }
512
+
513
+ assert_equal [true], @ra.inputs.map{|i| i.closed? }
514
+ assert_equal [true], label_filters.map{|i| i.closed? }
515
+ assert_equal [true, true, true], label_outputs.map{|i| i.closed? }
516
+
517
+ assert_equal [true], @ra.inputs.map{|i| i.terminated? }
518
+ assert_equal [true], label_filters.map{|i| i.terminated? }
519
+ assert_equal [true, true, true], label_outputs.map{|i| i.terminated? }
520
+ end
521
+
522
+ test 'plugin #shutdown is not called twice' do
523
+ assert_equal 1, @ra.inputs.size
524
+ assert_equal 0, @ra.filters.size
525
+ assert_equal 0, @ra.outputs.size
526
+ assert_equal 1, @ra.labels.size
527
+ assert_equal '@testing', @ra.labels.keys.first
528
+ assert_equal 1, @ra.labels.values.first.filters.size
529
+ assert_equal 3, @ra.labels.values.first.outputs.size
530
+
531
+ @ra.start
532
+
533
+ old_level = @ra.log.level
534
+ begin
535
+ @ra.log.instance_variable_get(:@logger).level = Fluent::Log::LEVEL_INFO - 1
536
+ assert_equal Fluent::Log::LEVEL_INFO, @ra.log.level
537
+
538
+ @ra.log.out.flush_logs = false
539
+
540
+ @ra.shutdown
541
+
542
+ test_out1_shutdown_logs = @ra.log.out.logs.select{|line| line =~ /shutting down output plugin type=:test_out plugin_id="test_out1"/ }
543
+ assert_equal 1, test_out1_shutdown_logs.size
544
+ ensure
545
+ @ra.log.out.flush_logs = true
546
+ @ra.log.out.reset
547
+ @ra.log.level = old_level
548
+ end
549
+ end
550
+ end
551
+
552
+ sub_test_case 'configured with MultiOutput plugin which creates plugin instances dynamically' do
553
+ setup do
554
+ @ra = RootAgent.new(log: $log)
555
+ stub(Engine).root_agent { @ra }
556
+ @ra.configure(Config.parse(<<-EOC, "(test)", "(test_dir)", true))
557
+ <source>
558
+ @type test_in
559
+ @id test_in
560
+ @label @testing
561
+ </source>
562
+ <label @testing>
563
+ <match **>
564
+ @type test_dynamic_out
565
+ @id test_dyn
566
+ </match>
567
+ </label>
568
+ EOC
569
+ @ra
570
+ end
571
+
572
+ test 'plugin status with multi output' do
573
+ assert_equal 1, @ra.inputs.size
574
+ assert_equal 0, @ra.filters.size
575
+ assert_equal 0, @ra.outputs.size
576
+ assert_equal 1, @ra.labels.size
577
+ assert_equal '@testing', @ra.labels.keys.first
578
+ assert_equal 0, @ra.labels.values.first.filters.size
579
+ assert_equal 1, @ra.labels.values.first.outputs.size
580
+
581
+ dyn_out = @ra.labels.values.first.outputs.first
582
+ assert_nil dyn_out.child
583
+
584
+ @ra.start
585
+
586
+ assert_equal 1, @ra.labels.values.first.outputs.size
587
+
588
+ assert dyn_out.child
589
+ assert_false dyn_out.child.outputs_statically_created
590
+ assert_equal 2, dyn_out.child.outputs.size
591
+
592
+ assert_equal true, dyn_out.child.outputs[0].started?
593
+ assert_equal true, dyn_out.child.outputs[1].started?
594
+ assert_equal true, dyn_out.child.outputs[0].after_started?
595
+ assert_equal true, dyn_out.child.outputs[1].after_started?
172
596
 
173
597
  @ra.shutdown
174
- assert_false @ra.inputs.first.started
175
- assert_false @ra.filters.first.started
176
- assert_false @ra.outputs.first.started
598
+
599
+ assert_equal 1, @ra.labels.values.first.outputs.size
600
+
601
+ assert_false dyn_out.child.outputs_statically_created
602
+ assert_equal 2, dyn_out.child.outputs.size
603
+
604
+ assert_equal [true, true], dyn_out.child.outputs.map{|i| i.stopped? }
605
+ assert_equal [true, true], dyn_out.child.outputs.map{|i| i.before_shutdown? }
606
+ assert_equal [true, true], dyn_out.child.outputs.map{|i| i.shutdown? }
607
+ assert_equal [true, true], dyn_out.child.outputs.map{|i| i.after_shutdown? }
608
+ assert_equal [true, true], dyn_out.child.outputs.map{|i| i.closed? }
609
+ assert_equal [true, true], dyn_out.child.outputs.map{|i| i.terminated? }
610
+ end
611
+ end
612
+
613
+ sub_test_case 'configure emit_error_interval' do
614
+ setup do
615
+ system_config = SystemConfig.new
616
+ system_config.emit_error_log_interval = 30
617
+ @ra = RootAgent.new(log: $log, system_config: system_config)
618
+ stub(Engine).root_agent { @ra }
619
+ @ra.log.out.reset
620
+ one_minute_ago = Time.now.to_i - 60
621
+ Timecop.freeze(one_minute_ago)
622
+ end
623
+
624
+ teardown do
625
+ Timecop.return
626
+ end
627
+
628
+ test 'suppresses errors' do
629
+ mock(@ra.log).warn_backtrace()
630
+ e = StandardError.new('standard error')
631
+ begin
632
+ @ra.handle_emits_error("tag", nil, e)
633
+ rescue
634
+ end
635
+
636
+ begin
637
+ @ra.handle_emits_error("tag", nil, e)
638
+ rescue
639
+ end
640
+
641
+ assert_equal 1, @ra.log.out.logs.size
642
+ end
643
+ end
644
+
645
+ sub_test_case 'configured at worker2 with 4 workers environment' do
646
+ setup do
647
+ ENV['SERVERENGINE_WORKER_ID'] = '2'
648
+ @ra = RootAgent.new(log: $log)
649
+ system_config = SystemConfig.new
650
+ system_config.workers = 4
651
+ stub(Engine).worker_id { 2 }
652
+ stub(Engine).root_agent { @ra }
653
+ stub(Engine).system_config { system_config }
654
+ @ra
655
+ end
656
+
657
+ teardown '' do
658
+ ENV.delete('SERVERENGINE_WORKER_ID')
659
+ end
660
+
661
+ def configure_ra(conf_str)
662
+ conf = Config.parse(conf_str, "(test)", "(test_dir)", true)
663
+ @ra.configure(conf)
664
+ @ra
665
+ end
666
+
667
+ test 'raises configuration error for missing worker id' do
668
+ errmsg = 'Missing worker id on <worker> directive'
669
+ assert_raise Fluent::ConfigError.new(errmsg) do
670
+ conf = <<-EOC
671
+ <worker>
672
+ </worker>
673
+ EOC
674
+ configure_ra(conf)
675
+ end
676
+ end
677
+
678
+ test 'raises configuration error for too big worker id' do
679
+ errmsg = "worker id 4 specified by <worker> directive is not allowed. Available worker id is between 0 and 3"
680
+ assert_raise Fluent::ConfigError.new(errmsg) do
681
+ conf = <<-EOC
682
+ <worker 4>
683
+ </worker>
684
+ EOC
685
+ configure_ra(conf)
686
+ end
687
+ end
688
+
689
+ test 'raises configuration error for too big worker id on multi workers syntax' do
690
+ errmsg = "worker id 4 specified by <worker> directive is not allowed. Available worker id is between 0 and 3"
691
+ assert_raise Fluent::ConfigError.new(errmsg) do
692
+ conf = <<-EOC
693
+ <worker 1-4>
694
+ </worker>
695
+ EOC
696
+ configure_ra(conf)
697
+ end
698
+ end
699
+
700
+ test 'raises configuration error for worker id collisions on multi workers syntax' do
701
+ errmsg = "specified worker_id<2> collisions is detected on <worker> directive. Available worker id(s): [3]"
702
+ assert_raise Fluent::ConfigError.new(errmsg) do
703
+ conf = <<-EOC
704
+ <worker 0-2>
705
+ </worker>
706
+ <worker 2-4>
707
+ </worker>
708
+ EOC
709
+ configure_ra(conf)
710
+ end
711
+ end
712
+
713
+ test 'raises configuration error for worker id collisions on multi workers syntax when multi avaliable worker_ids are left' do
714
+ errmsg = "specified worker_id<1> collisions is detected on <worker> directive. Available worker id(s): [2, 3]"
715
+ assert_raise Fluent::ConfigError.new(errmsg) do
716
+ conf = <<-EOC
717
+ <worker 0-1>
718
+ </worker>
719
+ <worker 1-3>
720
+ </worker>
721
+ EOC
722
+ configure_ra(conf)
723
+ end
724
+ end
725
+
726
+ test 'raises configuration error for too big worker id on invalid reversed multi workers syntax' do
727
+ errmsg = "greater first_worker_id<3> than last_worker_id<0> specified by <worker> directive is not allowed. Available multi worker assign syntax is <smaller_worker_id>-<greater_worker_id>"
728
+ assert_raise Fluent::ConfigError.new(errmsg) do
729
+ conf = <<-EOC
730
+ <worker 3-0>
731
+ </worker>
732
+ EOC
733
+ configure_ra(conf)
734
+ end
735
+ end
736
+
737
+ test 'raises configuration error for invalid elements as a child of worker section' do
738
+ errmsg = '<worker> section cannot have <system> directive'
739
+ assert_raise Fluent::ConfigError.new(errmsg) do
740
+ conf = <<-EOC
741
+ <worker 2>
742
+ <system>
743
+ </system>
744
+ </worker>
745
+ EOC
746
+ configure_ra(conf)
747
+ end
748
+ end
749
+
750
+ test 'raises configuration error when configured plugins do not have support multi worker configuration' do
751
+ errmsg = "Plugin 'test_out' does not support multi workers configuration (FluentTest::FluentTestOutput)"
752
+ assert_raise Fluent::ConfigError.new(errmsg) do
753
+ conf = <<-EOC
754
+ <match **>
755
+ @type test_out
756
+ </match>
757
+ EOC
758
+ configure_ra(conf)
759
+ end
760
+ end
761
+
762
+ test 'does not raise configuration error when configured plugins in worker section do not have support multi worker configuration' do
763
+ assert_nothing_raised do
764
+ conf = <<-EOC
765
+ <worker 2>
766
+ <match **>
767
+ @type test_out
768
+ </match>
769
+ </worker>
770
+ EOC
771
+ configure_ra(conf)
772
+ end
773
+ end
774
+
775
+ test 'does not raise configuration error when configured plugins as a children of MultiOutput in worker section do not have support multi worker configuration' do
776
+ assert_nothing_raised do
777
+ conf = <<-EOC
778
+ <worker 2>
779
+ <match **>
780
+ @type copy
781
+ <store>
782
+ @type test_out
783
+ </store>
784
+ <store>
785
+ @type test_out
786
+ </store>
787
+ </match>
788
+ </worker>
789
+ EOC
790
+ configure_ra(conf)
791
+ end
792
+ end
793
+
794
+ test 'does not raise configuration error when configured plugins owned by plugin do not have support multi worker configuration' do
795
+ assert_nothing_raised do
796
+ conf = <<-EOC
797
+ <worker 2>
798
+ <match **>
799
+ @type test_out_buffered
800
+ <buffer>
801
+ @type test_buffer
802
+ </buffer>
803
+ </match>
804
+ </worker>
805
+ EOC
806
+ configure_ra(conf)
807
+ end
808
+ end
809
+
810
+ test 'with plugins' do
811
+ conf = <<-EOC
812
+ <worker 2>
813
+ <source>
814
+ @type test_in
815
+ @id test_in
816
+ </source>
817
+ <filter>
818
+ type test_filter
819
+ id test_filter
820
+ </filter>
821
+ <match **>
822
+ @type relabel
823
+ @id test_relabel
824
+ @label @test
825
+ </match>
826
+ <label @test>
827
+ <match **>
828
+ type test_out
829
+ id test_out
830
+ </match>
831
+ </label>
832
+ <label @ERROR>
833
+ <match>
834
+ @type null
835
+ </match>
836
+ </label>
837
+ </worker>
838
+ EOC
839
+ ra = configure_ra(conf)
840
+ assert_kind_of FluentTestInput, ra.inputs.first
841
+ assert_kind_of Plugin::RelabelOutput, ra.outputs.first
842
+ assert_kind_of FluentTestFilter, ra.filters.first
843
+ assert ra.error_collector
844
+
845
+ %W(@test @ERROR).each { |label_symbol|
846
+ assert_include ra.labels, label_symbol
847
+ assert_kind_of Label, ra.labels[label_symbol]
848
+ }
849
+
850
+ test_label = ra.labels['@test']
851
+ assert_kind_of FluentTestOutput, test_label.outputs.first
852
+ assert_equal ra, test_label.root_agent
853
+
854
+ error_label = ra.labels['@ERROR']
855
+ assert_kind_of Fluent::Plugin::NullOutput, error_label.outputs.first
856
+ assert_kind_of RootAgent::RootAgentProxyWithoutErrorCollector, error_label.root_agent
857
+ end
858
+
859
+ test 'with plugins but for another worker' do
860
+ conf = <<-EOC
861
+ <worker 0>
862
+ <source>
863
+ @type test_in
864
+ @id test_in
865
+ </source>
866
+ <filter>
867
+ type test_filter
868
+ id test_filter
869
+ </filter>
870
+ <match **>
871
+ @type relabel
872
+ @id test_relabel
873
+ @label @test
874
+ </match>
875
+ <label @test>
876
+ <match **>
877
+ type test_out
878
+ id test_out
879
+ </match>
880
+ </label>
881
+ <label @ERROR>
882
+ <match>
883
+ @type null
884
+ </match>
885
+ </label>
886
+ </worker>
887
+ EOC
888
+ ra = configure_ra(conf)
889
+ assert_equal 0, ra.inputs.size
890
+ assert_equal 0, ra.outputs.size
891
+ assert_equal 0, ra.filters.size
892
+ assert_equal 0, ra.labels.size
893
+ refute ra.error_collector
894
+ end
895
+
896
+ test 'with plugins for workers syntax should match worker_id equals to 2' do
897
+ conf = <<-EOC
898
+ <worker 0-2>
899
+ <source>
900
+ @type forward
901
+ </source>
902
+ <filter **>
903
+ @type test_filter
904
+ @id test_filter
905
+ </filter>
906
+ <match pattern>
907
+ @type stdout
908
+ </match>
909
+ <label @ERROR>
910
+ <match>
911
+ @type null
912
+ </match>
913
+ </label>
914
+ </worker>
915
+ EOC
916
+
917
+ ra = configure_ra(conf)
918
+ assert_kind_of Fluent::Plugin::ForwardInput, ra.inputs.first
919
+ assert_kind_of Fluent::Plugin::StdoutOutput, ra.outputs.first
920
+ assert_kind_of FluentTestFilter, ra.filters.first
921
+ assert ra.error_collector
177
922
  end
178
923
  end
179
924
  end