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_event.rb CHANGED
@@ -1,17 +1,45 @@
1
1
  require_relative 'helper'
2
2
  require 'fluent/test'
3
3
  require 'fluent/event'
4
+ require 'fluent/plugin/compressable'
4
5
 
5
6
  module EventTest
7
+ module DeepCopyAssertion
8
+ def assert_duplicated_records(es1, es2)
9
+ ary1 = []
10
+ es1.each do |_, record|
11
+ ary1 << record
12
+ end
13
+ ary2 = []
14
+ es2.each do |_, record|
15
+ ary2 << record
16
+ end
17
+ assert_equal ary1.size, ary2.size
18
+ ary1.each_with_index do |r, i|
19
+ assert_not_equal r.object_id, ary2[i].object_id
20
+ end
21
+ end
22
+ end
23
+
6
24
  class OneEventStreamTest < ::Test::Unit::TestCase
7
25
  include Fluent
26
+ include DeepCopyAssertion
27
+ include Fluent::Plugin::Compressable
8
28
 
9
29
  def setup
10
- @time = Engine.now
30
+ @time = event_time()
11
31
  @record = {'k' => 'v', 'n' => 1}
12
32
  @es = OneEventStream.new(@time, @record)
13
33
  end
14
34
 
35
+ test 'empty?' do
36
+ assert_false @es.empty?
37
+ end
38
+
39
+ test 'size' do
40
+ assert_equal 1, @es.size
41
+ end
42
+
15
43
  test 'repeatable?' do
16
44
  assert_true @es.repeatable?
17
45
  end
@@ -20,6 +48,21 @@ module EventTest
20
48
  dupped = @es.dup
21
49
  assert_kind_of OneEventStream, dupped
22
50
  assert_not_equal @es.object_id, dupped.object_id
51
+ assert_duplicated_records @es, dupped
52
+ end
53
+
54
+ test 'slice' do
55
+ assert_equal 0, @es.slice(1, 1).size
56
+ assert_equal 0, @es.slice(0, 0).size
57
+
58
+ sliced = @es.slice(0, 1)
59
+ assert_kind_of EventStream, sliced
60
+ assert_equal 1, sliced.size
61
+
62
+ sliced.each do |time, record|
63
+ assert_equal @time, time
64
+ assert_equal @record, record
65
+ end
23
66
  end
24
67
 
25
68
  test 'each' do
@@ -31,18 +74,45 @@ module EventTest
31
74
 
32
75
  test 'to_msgpack_stream' do
33
76
  stream = @es.to_msgpack_stream
34
- MessagePack::Unpacker.new.feed_each(stream) { |time, record|
77
+ Fluent::Engine.msgpack_factory.unpacker.feed_each(stream) { |time, record|
35
78
  assert_equal @time, time
36
79
  assert_equal @record, record
37
80
  }
38
81
  end
82
+
83
+ test 'to_msgpack_stream with time_int argument' do
84
+ stream = @es.to_msgpack_stream(time_int: true)
85
+ Fluent::Engine.msgpack_factory.unpacker.feed_each(stream) { |time, record|
86
+ assert_equal @time.to_i, time
87
+ assert_equal @record, record
88
+ }
89
+ end
90
+
91
+ test 'to_compressed_msgpack_stream' do
92
+ stream = @es.to_compressed_msgpack_stream
93
+ Fluent::Engine.msgpack_factory.unpacker.feed_each(decompress(stream)) { |time, record|
94
+ assert_equal @time, time
95
+ assert_equal @record, record
96
+ }
97
+ end
98
+
99
+ test 'to_compressed_msgpack_stream with time_int argument' do
100
+ stream = @es.to_compressed_msgpack_stream(time_int: true)
101
+ Fluent::Engine.msgpack_factory.unpacker.feed_each(decompress(stream)) { |time, record|
102
+ assert_equal @time.to_i, time
103
+ assert_equal @record, record
104
+ }
105
+ end
39
106
  end
40
107
 
41
108
  class ArrayEventStreamTest < ::Test::Unit::TestCase
42
109
  include Fluent
110
+ include DeepCopyAssertion
111
+ include Fluent::Plugin::Compressable
43
112
 
44
113
  def setup
45
- @times = [Engine.now, Engine.now + 1]
114
+ time = Engine.now
115
+ @times = [Fluent::EventTime.new(time.sec), Fluent::EventTime.new(time.sec + 1)]
46
116
  @records = [{'k' => 'v1', 'n' => 1}, {'k' => 'v2', 'n' => 2}]
47
117
  @es = ArrayEventStream.new(@times.zip(@records))
48
118
  end
@@ -55,6 +125,7 @@ module EventTest
55
125
  dupped = @es.dup
56
126
  assert_kind_of ArrayEventStream, dupped
57
127
  assert_not_equal @es.object_id, dupped.object_id
128
+ assert_duplicated_records @es, dupped
58
129
  end
59
130
 
60
131
  test 'empty?' do
@@ -62,6 +133,35 @@ module EventTest
62
133
  assert_true ArrayEventStream.new([]).empty?
63
134
  end
64
135
 
136
+ test 'size' do
137
+ assert_equal 2, @es.size
138
+ assert_equal 0, ArrayEventStream.new([]).size
139
+ end
140
+
141
+ test 'slice' do
142
+ sliced = @es.slice(1,1)
143
+ assert_kind_of EventStream, sliced
144
+ assert_equal 1, sliced.size
145
+
146
+ sliced.each do |time, record|
147
+ assert_equal @times[1], time
148
+ assert_equal 'v2', record['k']
149
+ assert_equal 2, record['n']
150
+ end
151
+
152
+ sliced = @es.slice(0,2)
153
+ assert_kind_of EventStream, sliced
154
+ assert_equal 2, sliced.size
155
+
156
+ counter = 0
157
+ sliced.each do |time, record|
158
+ assert_equal @times[counter], time
159
+ assert_equal @records[counter]['k'], record['k']
160
+ assert_equal @records[counter]['n'], record['n']
161
+ counter += 1
162
+ end
163
+ end
164
+
65
165
  test 'each' do
66
166
  i = 0
67
167
  @es.each { |time, record|
@@ -74,23 +174,48 @@ module EventTest
74
174
  test 'to_msgpack_stream' do
75
175
  i = 0
76
176
  stream = @es.to_msgpack_stream
77
- MessagePack::Unpacker.new.feed_each(stream) { |time, record|
177
+ Fluent::Engine.msgpack_factory.unpacker.feed_each(stream) { |time, record|
78
178
  assert_equal @times[i], time
79
179
  assert_equal @records[i], record
80
180
  i += 1
81
181
  }
82
182
  end
183
+
184
+ test 'to_compressed_msgpack_stream' do
185
+ i = 0
186
+ compressed_stream = @es.to_compressed_msgpack_stream
187
+ stream = decompress(compressed_stream)
188
+ Fluent::Engine.msgpack_factory.unpacker.feed_each(stream) { |time, record|
189
+ assert_equal @times[i], time
190
+ assert_equal @records[i], record
191
+ i += 1
192
+ }
193
+ end
194
+
195
+ test 'to_compressed_msgpack_stream with time_int argument' do
196
+ i = 0
197
+ compressed_stream = @es.to_compressed_msgpack_stream(time_int: true)
198
+ stream = decompress(compressed_stream)
199
+ Fluent::Engine.msgpack_factory.unpacker.feed_each(stream) { |time, record|
200
+ assert_equal @times[i].to_i, time
201
+ assert_equal @records[i], record
202
+ i += 1
203
+ }
204
+ end
83
205
  end
84
206
 
85
207
  class MultiEventStreamTest < ::Test::Unit::TestCase
86
208
  include Fluent
209
+ include DeepCopyAssertion
210
+ include Fluent::Plugin::Compressable
87
211
 
88
212
  def setup
89
- @times = [Engine.now, Engine.now + 1]
213
+ time = Engine.now
214
+ @times = [Fluent::EventTime.new(time.sec), Fluent::EventTime.new(time.sec + 1)]
90
215
  @records = [{'k' => 'v1', 'n' => 1}, {'k' => 'v2', 'n' => 2}]
91
216
  @es = MultiEventStream.new
92
- @times.zip(@records).each { |time, record|
93
- @es.add(time, record)
217
+ @times.zip(@records).each { |_time, record|
218
+ @es.add(_time, record)
94
219
  }
95
220
  end
96
221
 
@@ -102,6 +227,7 @@ module EventTest
102
227
  dupped = @es.dup
103
228
  assert_kind_of MultiEventStream, dupped
104
229
  assert_not_equal @es.object_id, dupped.object_id
230
+ assert_duplicated_records @es, dupped
105
231
  end
106
232
 
107
233
  test 'empty?' do
@@ -109,6 +235,35 @@ module EventTest
109
235
  assert_true MultiEventStream.new.empty?
110
236
  end
111
237
 
238
+ test 'size' do
239
+ assert_equal 2, @es.size
240
+ assert_equal 0, MultiEventStream.new.size
241
+ end
242
+
243
+ test 'slice' do
244
+ sliced = @es.slice(1,1)
245
+ assert_kind_of EventStream, sliced
246
+ assert_equal 1, sliced.size
247
+
248
+ sliced.each do |time, record|
249
+ assert_equal @times[1], time
250
+ assert_equal 'v2', record['k']
251
+ assert_equal 2, record['n']
252
+ end
253
+
254
+ sliced = @es.slice(0,2)
255
+ assert_kind_of EventStream, sliced
256
+ assert_equal 2, sliced.size
257
+
258
+ counter = 0
259
+ sliced.each do |time, record|
260
+ assert_equal @times[counter], time
261
+ assert_equal @records[counter]['k'], record['k']
262
+ assert_equal @records[counter]['n'], record['n']
263
+ counter += 1
264
+ end
265
+ end
266
+
112
267
  test 'each' do
113
268
  i = 0
114
269
  @es.each { |time, record|
@@ -121,31 +276,102 @@ module EventTest
121
276
  test 'to_msgpack_stream' do
122
277
  i = 0
123
278
  stream = @es.to_msgpack_stream
124
- MessagePack::Unpacker.new.feed_each(stream) { |time, record|
279
+ Fluent::Engine.msgpack_factory.unpacker.feed_each(stream) { |time, record|
280
+ assert_equal @times[i], time
281
+ assert_equal @records[i], record
282
+ i += 1
283
+ }
284
+ end
285
+
286
+ test 'to_compressed_msgpack_stream' do
287
+ i = 0
288
+ compressed_stream = @es.to_compressed_msgpack_stream
289
+ stream = decompress(compressed_stream)
290
+ Fluent::Engine.msgpack_factory.unpacker.feed_each(stream) { |time, record|
125
291
  assert_equal @times[i], time
126
292
  assert_equal @records[i], record
127
293
  i += 1
128
294
  }
129
295
  end
296
+
297
+ test 'to_compressed_msgpack_stream with time_int argument' do
298
+ i = 0
299
+ compressed_stream = @es.to_compressed_msgpack_stream(time_int: true)
300
+ stream = decompress(compressed_stream)
301
+ Fluent::Engine.msgpack_factory.unpacker.feed_each(stream) { |time, record|
302
+ assert_equal @times[i].to_i, time
303
+ assert_equal @records[i], record
304
+ i += 1
305
+ }
306
+ end
130
307
  end
131
308
 
132
309
  class MessagePackEventStreamTest < ::Test::Unit::TestCase
133
310
  include Fluent
311
+ include DeepCopyAssertion
312
+ include Fluent::Plugin::Compressable
134
313
 
135
314
  def setup
136
- pk = MessagePack::Packer.new
137
- @times = [Engine.now, Engine.now + 1]
315
+ pk = Fluent::Engine.msgpack_factory.packer
316
+ time = Engine.now
317
+ @times = [Fluent::EventTime.new(time.sec), Fluent::EventTime.new(time.sec + 1)]
138
318
  @records = [{'k' => 'v1', 'n' => 1}, {'k' => 'v2', 'n' => 2}]
139
- @times.zip(@records).each { |time, record|
140
- pk.write([time, record])
319
+ @times.zip(@records).each { |_time, record|
320
+ pk.write([_time, record])
141
321
  }
142
322
  @es = MessagePackEventStream.new(pk.to_s)
143
323
  end
144
324
 
325
+ test 'dup' do
326
+ dupped = @es.dup
327
+ assert_kind_of MessagePackEventStream, dupped
328
+ assert_not_equal @es.object_id, dupped.object_id
329
+ assert_duplicated_records @es, dupped
330
+
331
+ # After iteration of events (done in assert_duplicated_records),
332
+ # duplicated event stream still has unpacked objects and correct size
333
+ dupped = @es.dup
334
+ assert_equal 2, dupped.instance_eval{ @size }
335
+ end
336
+
337
+ test 'empty?' do
338
+ assert_false @es.empty?
339
+ assert_true MessagePackEventStream.new('', 0).empty?
340
+ end
341
+
342
+ test 'size' do
343
+ assert_equal 2, @es.size
344
+ assert_equal 0, MessagePackEventStream.new('').size
345
+ end
346
+
145
347
  test 'repeatable?' do
146
348
  assert_true @es.repeatable?
147
349
  end
148
350
 
351
+ test 'slice' do
352
+ sliced = @es.slice(1,1)
353
+ assert_kind_of EventStream, sliced
354
+ assert_equal 1, sliced.size
355
+
356
+ sliced.each do |time, record|
357
+ assert_equal @times[1], time
358
+ assert_equal 'v2', record['k']
359
+ assert_equal 2, record['n']
360
+ end
361
+
362
+ sliced = @es.slice(0,2)
363
+ assert_kind_of EventStream, sliced
364
+ assert_equal 2, sliced.size
365
+
366
+ counter = 0
367
+ sliced.each do |time, record|
368
+ assert_equal @times[counter], time
369
+ assert_equal @records[counter]['k'], record['k']
370
+ assert_equal @records[counter]['n'], record['n']
371
+ counter += 1
372
+ end
373
+ end
374
+
149
375
  test 'each' do
150
376
  i = 0
151
377
  @es.each { |time, record|
@@ -158,7 +384,128 @@ module EventTest
158
384
  test 'to_msgpack_stream' do
159
385
  i = 0
160
386
  stream = @es.to_msgpack_stream
161
- MessagePack::Unpacker.new.feed_each(stream) { |time, record|
387
+ Fluent::Engine.msgpack_factory.unpacker.feed_each(stream) { |time, record|
388
+ assert_equal @times[i], time
389
+ assert_equal @records[i], record
390
+ i += 1
391
+ }
392
+ end
393
+
394
+ test 'to_compressed_msgpack_stream' do
395
+ i = 0
396
+ compressed_stream = @es.to_compressed_msgpack_stream
397
+ stream = decompress(compressed_stream)
398
+ Fluent::Engine.msgpack_factory.unpacker.feed_each(stream) { |time, record|
399
+ assert_equal @times[i], time
400
+ assert_equal @records[i], record
401
+ i += 1
402
+ }
403
+ end
404
+ end
405
+
406
+ class CompressedMessagePackEventStreamTest < ::Test::Unit::TestCase
407
+ include Fluent
408
+ include DeepCopyAssertion
409
+ include Fluent::Plugin::Compressable
410
+
411
+ def setup
412
+ time = Engine.now
413
+ @times = [Fluent::EventTime.new(time.sec), Fluent::EventTime.new(time.sec + 1)]
414
+ @records = [{ 'k' => 'v1', 'n' => 1 }, { 'k' => 'v2', 'n' => 2 }]
415
+ @packed_record = ''
416
+ @entries = ''
417
+ @times.zip(@records).each do |_time, record|
418
+ v = [_time, record].to_msgpack
419
+ @packed_record += v
420
+ @entries += compress(v)
421
+ end
422
+ @es = CompressedMessagePackEventStream.new(@entries)
423
+ end
424
+
425
+ def ensure_data_is_decompressed
426
+ assert_equal @entries, @es.instance_variable_get(:@data)
427
+ yield
428
+ assert_equal @packed_record, @es.instance_variable_get(:@data)
429
+ end
430
+
431
+ test 'dup' do
432
+ dupped = @es.dup
433
+ assert_kind_of CompressedMessagePackEventStream, dupped
434
+ assert_not_equal @es.object_id, dupped.object_id
435
+ assert_duplicated_records @es, dupped
436
+
437
+ # After iteration of events (done in assert_duplicated_records),
438
+ # duplicated event stream still has unpacked objects and correct size
439
+ dupped = @es.dup
440
+ assert_equal 2, dupped.instance_eval{ @size }
441
+ end
442
+
443
+ test 'repeatable?' do
444
+ assert_true @es.repeatable?
445
+ end
446
+
447
+ test 'size' do
448
+ assert_equal 0, CompressedMessagePackEventStream.new('').size
449
+ ensure_data_is_decompressed { assert_equal 2, @es.size }
450
+ end
451
+
452
+ test 'each' do
453
+ i = 0
454
+ ensure_data_is_decompressed do
455
+ @es.each do |time, record|
456
+ assert_equal @times[i], time
457
+ assert_equal @records[i], record
458
+ i += 1
459
+ end
460
+ end
461
+ end
462
+
463
+ test 'slice' do
464
+ sliced = nil
465
+ ensure_data_is_decompressed { sliced = @es.slice(1,1) }
466
+ assert_kind_of EventStream, sliced
467
+ assert_equal 1, sliced.size
468
+
469
+ sliced.each do |time, record|
470
+ assert_equal @times[1], time
471
+ assert_equal 'v2', record['k']
472
+ assert_equal 2, record['n']
473
+ end
474
+
475
+ sliced = @es.slice(0,2)
476
+ assert_kind_of EventStream, sliced
477
+ assert_equal 2, sliced.size
478
+
479
+ counter = 0
480
+ sliced.each do |time, record|
481
+ assert_equal @times[counter], time
482
+ assert_equal @records[counter]['k'], record['k']
483
+ assert_equal @records[counter]['n'], record['n']
484
+ counter += 1
485
+ end
486
+ end
487
+
488
+ test 'to_msgpack_stream' do
489
+ i = 0
490
+ stream = nil
491
+ ensure_data_is_decompressed { stream = @es.to_msgpack_stream }
492
+
493
+ Fluent::Engine.msgpack_factory.unpacker.feed_each(stream) { |time, record|
494
+ assert_equal @times[i], time
495
+ assert_equal @records[i], record
496
+ i += 1
497
+ }
498
+ end
499
+
500
+ test 'to_compressed_msgpack_stream' do
501
+ i = 0
502
+ # Do not call ensure_decompressed!
503
+ assert_equal @entries, @es.instance_variable_get(:@data)
504
+ compressed_stream = @es.to_compressed_msgpack_stream
505
+ assert_equal @entries, @es.instance_variable_get(:@data)
506
+
507
+ stream = decompress(compressed_stream)
508
+ Fluent::Engine.msgpack_factory.unpacker.feed_each(stream) { |time, record|
162
509
  assert_equal @times[i], time
163
510
  assert_equal @records[i], record
164
511
  i += 1
@@ -9,6 +9,7 @@ class EventRouterTest < ::Test::Unit::TestCase
9
9
  teardown do
10
10
  @output = nil
11
11
  @filter = nil
12
+ @compat_filter = nil
12
13
  @error_output = nil
13
14
  @emit_handler = nil
14
15
  @default_collector = nil
@@ -22,6 +23,10 @@ class EventRouterTest < ::Test::Unit::TestCase
22
23
  @filter ||= FluentTestFilter.new
23
24
  end
24
25
 
26
+ def compat_filter
27
+ @compat_filter ||= FluentCompatTestFilter.new
28
+ end
29
+
25
30
  def error_output
26
31
  @error_output ||= FluentTestErrorOutput.new
27
32
  end
@@ -97,7 +102,7 @@ class EventRouterTest < ::Test::Unit::TestCase
97
102
 
98
103
  test 'set one output' do
99
104
  @pipeline.set_output(output)
100
- @pipeline.emit('test', @es, nil)
105
+ @pipeline.emit_events('test', @es)
101
106
  assert_equal 1, output.events.size
102
107
  assert_equal 'value', output.events['test'].first['key']
103
108
  end
@@ -107,17 +112,21 @@ class EventRouterTest < ::Test::Unit::TestCase
107
112
  @pipeline.set_output(output)
108
113
  end
109
114
 
110
- test 'set one filer' do
111
- @pipeline.add_filter(filter)
112
- @pipeline.emit('test', @es, nil)
115
+ data('Filter plugin' => 'filter',
116
+ 'Compat::Filter plugin' => 'compat_filter')
117
+ test 'set one filer' do |filter_type|
118
+ @pipeline.add_filter(filter_type == 'filter' ? filter : compat_filter)
119
+ @pipeline.emit_events('test', @es)
113
120
  assert_equal 1, output.events.size
114
121
  assert_equal 'value', output.events['test'].first['key']
115
122
  assert_equal 0, output.events['test'].first['__test__']
116
123
  end
117
124
 
118
- test 'set one filer with multi events' do
119
- @pipeline.add_filter(filter)
120
- @pipeline.emit('test', events, nil)
125
+ data('Filter plugin' => 'filter',
126
+ 'Compat::Filter plugin' => 'compat_filter')
127
+ test 'set one filer with multi events' do |filter_type|
128
+ @pipeline.add_filter(filter_type == 'filter' ? filter : compat_filter)
129
+ @pipeline.emit_events('test', events)
121
130
  assert_equal 1, output.events.size
122
131
  assert_equal 5, output.events['test'].size
123
132
  DEFAULT_EVENT_NUM.times { |i|
@@ -140,7 +149,7 @@ class EventRouterTest < ::Test::Unit::TestCase
140
149
  sub_test_case 'default collector' do
141
150
  test 'call default collector when no output' do
142
151
  assert_rr do
143
- mock(default_collector).emit('test', is_a(OneEventStream), NullOutputChain.instance)
152
+ mock(default_collector).emit_events('test', is_a(OneEventStream))
144
153
  event_router.emit('test', Engine.now, 'k' => 'v')
145
154
  end
146
155
  end
@@ -149,7 +158,7 @@ class EventRouterTest < ::Test::Unit::TestCase
149
158
  event_router.add_rule('test', filter)
150
159
  assert_rr do
151
160
  # After apply Filter, EventStream becomes MultiEventStream by default
152
- mock(default_collector).emit('test', is_a(MultiEventStream), NullOutputChain.instance)
161
+ mock(default_collector).emit_events('test', is_a(MultiEventStream))
153
162
  event_router.emit('test', Engine.now, 'k' => 'v')
154
163
  end
155
164
  assert_equal 1, filter.num
@@ -158,7 +167,7 @@ class EventRouterTest < ::Test::Unit::TestCase
158
167
  test "call default collector when no matched with output" do
159
168
  event_router.add_rule('test', output)
160
169
  assert_rr do
161
- mock(default_collector).emit('dummy', is_a(OneEventStream), NullOutputChain.instance)
170
+ mock(default_collector).emit_events('dummy', is_a(OneEventStream))
162
171
  event_router.emit('dummy', Engine.now, 'k' => 'v')
163
172
  end
164
173
  end
@@ -166,7 +175,7 @@ class EventRouterTest < ::Test::Unit::TestCase
166
175
  test "don't call default collector when tag matched" do
167
176
  event_router.add_rule('test', output)
168
177
  assert_rr do
169
- dont_allow(default_collector).emit('test', is_a(OneEventStream), NullOutputChain.instance)
178
+ dont_allow(default_collector).emit_events('test', is_a(OneEventStream))
170
179
  event_router.emit('test', Engine.now, 'k' => 'v')
171
180
  end
172
181
  # check emit handler doesn't catch rr error
@@ -176,6 +185,10 @@ class EventRouterTest < ::Test::Unit::TestCase
176
185
 
177
186
  sub_test_case 'filter' do
178
187
  test 'filter should be called when tag matched' do
188
+ filter = Class.new(FluentTestFilter) { |x|
189
+ def filter_stream(_tag, es); end
190
+ }.new
191
+
179
192
  event_router.add_rule('test', filter)
180
193
 
181
194
  assert_rr do
@@ -220,10 +233,94 @@ class EventRouterTest < ::Test::Unit::TestCase
220
233
  end
221
234
  end
222
235
 
236
+ sub_test_case 'optimized filter' do
237
+ setup do
238
+ @record = { 'k' => 'v' }
239
+ @now = Engine.now
240
+ end
241
+
242
+ test 'call optimized filter when the filter plugin implements #filter without #filter_stream' do
243
+ event_router.add_rule('test', filter)
244
+
245
+ assert_rr do
246
+ mock(filter).filter('test', @now, @record) { @record }
247
+ event_router.emit('test', @now, @record)
248
+ end
249
+ end
250
+
251
+ test 'call optimized filter when the filter plugin implements #filter_with_time without #filter_stream' do
252
+ filter = Class.new(FluentTestFilter) {
253
+ undef_method :filter
254
+ def filter_with_time(tag, time, record); end
255
+ }.new
256
+
257
+ event_router.add_rule('test', filter)
258
+
259
+ assert_rr do
260
+ mock(filter).filter_with_time('test', @now, @record) { [time, @record] }
261
+ event_router.emit('test', @now, @record)
262
+ end
263
+ end
264
+
265
+ test "don't call optimized filter when filter plugins implement #filter_stream" do
266
+ filter = Class.new(FluentTestFilter) {
267
+ undef_method :filter
268
+ def filter_stream(tag, time, record); end
269
+ }.new
270
+
271
+ event_router.add_rule('test', filter)
272
+
273
+ assert_rr do
274
+ mock(filter).filter_stream('test', is_a(OneEventStream)) { OneEventStream.new(@now, @record) }
275
+ event_router.emit('test', @now, @record)
276
+ end
277
+ end
278
+
279
+ test 'call optimized filter when filter plugins have #filter_with_time instead of #filter' do
280
+ filter_with_time = Class.new(FluentTestFilter) {
281
+ undef_method :filter
282
+ def filter_with_time(tag, time, record); end
283
+ }.new
284
+
285
+ event_router.add_rule('test', filter_with_time)
286
+ event_router.add_rule('test', filter)
287
+
288
+ assert_rr do
289
+ mock(filter_with_time).filter_with_time('test', @now, @record) { [@now + 1, @record] }
290
+ mock(filter).filter('test', @now + 1, @record) { @record }
291
+ event_router.emit('test', @now, @record)
292
+ end
293
+ end
294
+
295
+ test "don't call optimized filter even if just a filter of some filters implements #filter_stream method" do
296
+ filter_stream = Class.new(FluentTestFilter) {
297
+ def filter_stream(tag, record); end
298
+ }.new
299
+
300
+ filter_with_time = Class.new(FluentTestFilter) {
301
+ undef_method :filter
302
+ def filter_with_time(tag, time, record); end
303
+ }.new
304
+
305
+ filters = [filter_stream, filter_with_time, filter]
306
+ filters.each { |f| event_router.add_rule('test', f) }
307
+
308
+ e = OneEventStream.new(@now, @record)
309
+ assert_rr do
310
+ mock($log).info("disable filter chain optimization because #{[filter_stream].map(&:class)} uses `#filter_stream` method.")
311
+ mock(filter_stream).filter_stream('test', is_a(OneEventStream)) { e }
312
+ mock(filter).filter_stream('test', is_a(OneEventStream)) { e }
313
+ mock(filter_with_time).filter_stream('test', is_a(OneEventStream)) { e }
314
+ event_router.emit('test', @now, @record)
315
+ end
316
+ end
317
+ end
318
+
223
319
  sub_test_case 'emit_error_handler' do
224
320
  test 'call handle_emits_error when emit failed' do
225
321
  event_router.add_rule('test', error_output)
226
322
 
323
+ event_router.emit('test', Engine.now, 'k' => 'v')
227
324
  assert_rr do
228
325
  mock(emit_handler).handle_emits_error('test', is_a(OneEventStream), is_a(RuntimeError))
229
326
  event_router.emit('test', Engine.now, 'k' => 'v')