fluentd 0.12.40 → 1.6.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fluentd might be problematic. Click here for more details.

Files changed (428) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  4. data/.github/ISSUE_TEMPLATE.md +17 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  6. data/.gitignore +5 -0
  7. data/.gitlab/cicd-template.yaml +10 -0
  8. data/.gitlab-ci.yml +147 -0
  9. data/.travis.yml +56 -20
  10. data/ADOPTERS.md +5 -0
  11. data/CHANGELOG.md +1369 -0
  12. data/CONTRIBUTING.md +16 -5
  13. data/GOVERNANCE.md +55 -0
  14. data/Gemfile +5 -0
  15. data/GithubWorkflow.md +78 -0
  16. data/LICENSE +202 -0
  17. data/MAINTAINERS.md +7 -0
  18. data/README.md +23 -11
  19. data/Rakefile +48 -2
  20. data/Vagrantfile +17 -0
  21. data/appveyor.yml +37 -0
  22. data/bin/fluent-binlog-reader +7 -0
  23. data/bin/fluent-ca-generate +6 -0
  24. data/bin/fluent-plugin-config-format +5 -0
  25. data/bin/fluent-plugin-generate +5 -0
  26. data/bin/fluentd +3 -0
  27. data/code-of-conduct.md +3 -0
  28. data/example/copy_roundrobin.conf +39 -0
  29. data/example/counter.conf +18 -0
  30. data/example/in_dummy_blocks.conf +17 -0
  31. data/example/in_dummy_with_compression.conf +23 -0
  32. data/example/in_forward.conf +7 -0
  33. data/example/in_forward_client.conf +37 -0
  34. data/example/in_forward_shared_key.conf +15 -0
  35. data/example/in_forward_tls.conf +14 -0
  36. data/example/in_forward_users.conf +24 -0
  37. data/example/in_forward_workers.conf +21 -0
  38. data/example/in_http.conf +3 -1
  39. data/example/in_out_forward.conf +17 -0
  40. data/example/logevents.conf +25 -0
  41. data/example/multi_filters.conf +61 -0
  42. data/example/out_exec_filter.conf +42 -0
  43. data/example/out_forward.conf +13 -13
  44. data/example/out_forward_buf_file.conf +23 -0
  45. data/example/out_forward_client.conf +109 -0
  46. data/example/out_forward_heartbeat_none.conf +16 -0
  47. data/example/out_forward_shared_key.conf +36 -0
  48. data/example/out_forward_tls.conf +18 -0
  49. data/example/out_forward_users.conf +65 -0
  50. data/example/out_null.conf +36 -0
  51. data/example/secondary_file.conf +42 -0
  52. data/example/suppress_config_dump.conf +7 -0
  53. data/example/worker_section.conf +36 -0
  54. data/fluent.conf +29 -0
  55. data/fluentd.gemspec +21 -11
  56. data/lib/fluent/agent.rb +67 -90
  57. data/lib/fluent/clock.rb +62 -0
  58. data/lib/fluent/command/binlog_reader.rb +244 -0
  59. data/lib/fluent/command/ca_generate.rb +181 -0
  60. data/lib/fluent/command/cat.rb +42 -18
  61. data/lib/fluent/command/debug.rb +12 -10
  62. data/lib/fluent/command/fluentd.rb +153 -5
  63. data/lib/fluent/command/plugin_config_formatter.rb +292 -0
  64. data/lib/fluent/command/plugin_generator.rb +324 -0
  65. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  66. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  67. data/lib/fluent/compat/exec_util.rb +129 -0
  68. data/lib/fluent/compat/file_util.rb +54 -0
  69. data/lib/fluent/compat/filter.rb +68 -0
  70. data/lib/fluent/compat/formatter.rb +111 -0
  71. data/lib/fluent/compat/formatter_utils.rb +85 -0
  72. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  73. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  74. data/lib/fluent/compat/input.rb +49 -0
  75. data/lib/fluent/compat/output.rb +718 -0
  76. data/lib/fluent/compat/output_chain.rb +60 -0
  77. data/lib/fluent/compat/parser.rb +310 -0
  78. data/lib/fluent/compat/parser_utils.rb +40 -0
  79. data/lib/fluent/compat/propagate_default.rb +62 -0
  80. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  81. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  82. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  83. data/lib/fluent/compat/socket_util.rb +165 -0
  84. data/lib/fluent/compat/string_util.rb +34 -0
  85. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  86. data/lib/fluent/compat/type_converter.rb +90 -0
  87. data/lib/fluent/config/configure_proxy.rb +210 -62
  88. data/lib/fluent/config/dsl.rb +12 -5
  89. data/lib/fluent/config/element.rb +107 -9
  90. data/lib/fluent/config/literal_parser.rb +9 -3
  91. data/lib/fluent/config/parser.rb +4 -4
  92. data/lib/fluent/config/section.rb +51 -14
  93. data/lib/fluent/config/types.rb +28 -13
  94. data/lib/fluent/config/v1_parser.rb +3 -5
  95. data/lib/fluent/config.rb +23 -20
  96. data/lib/fluent/configurable.rb +79 -21
  97. data/lib/fluent/counter/base_socket.rb +46 -0
  98. data/lib/fluent/counter/client.rb +297 -0
  99. data/lib/fluent/counter/error.rb +86 -0
  100. data/lib/fluent/counter/mutex_hash.rb +163 -0
  101. data/lib/fluent/counter/server.rb +273 -0
  102. data/lib/fluent/counter/store.rb +205 -0
  103. data/lib/fluent/counter/validator.rb +145 -0
  104. data/lib/fluent/counter.rb +23 -0
  105. data/lib/fluent/daemon.rb +15 -0
  106. data/lib/fluent/engine.rb +102 -65
  107. data/lib/fluent/env.rb +7 -3
  108. data/lib/fluent/error.rb +30 -0
  109. data/lib/fluent/event.rb +197 -21
  110. data/lib/fluent/event_router.rb +93 -10
  111. data/lib/fluent/filter.rb +2 -50
  112. data/lib/fluent/formatter.rb +4 -293
  113. data/lib/fluent/input.rb +2 -32
  114. data/lib/fluent/label.rb +10 -2
  115. data/lib/fluent/load.rb +3 -3
  116. data/lib/fluent/log.rb +348 -81
  117. data/lib/fluent/match.rb +37 -36
  118. data/lib/fluent/mixin.rb +12 -176
  119. data/lib/fluent/msgpack_factory.rb +62 -0
  120. data/lib/fluent/output.rb +10 -612
  121. data/lib/fluent/output_chain.rb +23 -0
  122. data/lib/fluent/parser.rb +4 -800
  123. data/lib/fluent/plugin/bare_output.rb +63 -0
  124. data/lib/fluent/plugin/base.rb +192 -0
  125. data/lib/fluent/plugin/buf_file.rb +128 -174
  126. data/lib/fluent/plugin/buf_memory.rb +9 -92
  127. data/lib/fluent/plugin/buffer/chunk.rb +221 -0
  128. data/lib/fluent/plugin/buffer/file_chunk.rb +383 -0
  129. data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
  130. data/lib/fluent/plugin/buffer.rb +779 -0
  131. data/lib/fluent/plugin/compressable.rb +92 -0
  132. data/lib/fluent/plugin/exec_util.rb +3 -108
  133. data/lib/fluent/plugin/file_util.rb +4 -34
  134. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  135. data/lib/fluent/plugin/filter.rb +93 -0
  136. data/lib/fluent/plugin/filter_grep.rb +117 -34
  137. data/lib/fluent/plugin/filter_parser.rb +85 -62
  138. data/lib/fluent/plugin/filter_record_transformer.rb +27 -39
  139. data/lib/fluent/plugin/filter_stdout.rb +15 -12
  140. data/lib/fluent/plugin/formatter.rb +50 -0
  141. data/lib/fluent/plugin/formatter_csv.rb +52 -0
  142. data/lib/fluent/plugin/formatter_hash.rb +33 -0
  143. data/lib/fluent/plugin/formatter_json.rb +55 -0
  144. data/lib/fluent/plugin/formatter_ltsv.rb +42 -0
  145. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  146. data/lib/fluent/plugin/formatter_out_file.rb +51 -0
  147. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  148. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  149. data/lib/fluent/plugin/formatter_tsv.rb +38 -0
  150. data/lib/fluent/plugin/in_debug_agent.rb +17 -6
  151. data/lib/fluent/plugin/in_dummy.rb +47 -20
  152. data/lib/fluent/plugin/in_exec.rb +55 -123
  153. data/lib/fluent/plugin/in_forward.rb +299 -216
  154. data/lib/fluent/plugin/in_gc_stat.rb +14 -36
  155. data/lib/fluent/plugin/in_http.rb +204 -91
  156. data/lib/fluent/plugin/in_monitor_agent.rb +186 -258
  157. data/lib/fluent/plugin/in_object_space.rb +13 -41
  158. data/lib/fluent/plugin/in_syslog.rb +112 -134
  159. data/lib/fluent/plugin/in_tail.rb +408 -745
  160. data/lib/fluent/plugin/in_tcp.rb +66 -9
  161. data/lib/fluent/plugin/in_udp.rb +60 -11
  162. data/lib/fluent/plugin/{in_stream.rb → in_unix.rb} +8 -4
  163. data/lib/fluent/plugin/input.rb +37 -0
  164. data/lib/fluent/plugin/multi_output.rb +158 -0
  165. data/lib/fluent/plugin/out_copy.rb +23 -35
  166. data/lib/fluent/plugin/out_exec.rb +67 -70
  167. data/lib/fluent/plugin/out_exec_filter.rb +204 -271
  168. data/lib/fluent/plugin/out_file.rb +267 -73
  169. data/lib/fluent/plugin/out_forward.rb +854 -325
  170. data/lib/fluent/plugin/out_null.rb +42 -9
  171. data/lib/fluent/plugin/out_relabel.rb +9 -5
  172. data/lib/fluent/plugin/out_roundrobin.rb +18 -37
  173. data/lib/fluent/plugin/out_secondary_file.rb +133 -0
  174. data/lib/fluent/plugin/out_stdout.rb +43 -10
  175. data/lib/fluent/plugin/out_stream.rb +7 -2
  176. data/lib/fluent/plugin/output.rb +1498 -0
  177. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  178. data/lib/fluent/plugin/parser.rb +191 -0
  179. data/lib/fluent/plugin/parser_apache.rb +28 -0
  180. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  181. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  182. data/lib/fluent/plugin/parser_csv.rb +39 -0
  183. data/lib/fluent/plugin/parser_json.rb +94 -0
  184. data/lib/fluent/plugin/parser_ltsv.rb +49 -0
  185. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  186. data/lib/fluent/plugin/parser_multiline.rb +106 -0
  187. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  188. data/lib/fluent/plugin/parser_none.rb +36 -0
  189. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  190. data/lib/fluent/plugin/parser_syslog.rb +142 -0
  191. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  192. data/lib/fluent/plugin/socket_util.rb +3 -143
  193. data/lib/fluent/plugin/storage.rb +84 -0
  194. data/lib/fluent/plugin/storage_local.rb +164 -0
  195. data/lib/fluent/plugin/string_util.rb +3 -15
  196. data/lib/fluent/plugin.rb +122 -121
  197. data/lib/fluent/plugin_helper/cert_option.rb +178 -0
  198. data/lib/fluent/plugin_helper/child_process.rb +364 -0
  199. data/lib/fluent/plugin_helper/compat_parameters.rb +333 -0
  200. data/lib/fluent/plugin_helper/counter.rb +51 -0
  201. data/lib/fluent/plugin_helper/event_emitter.rb +93 -0
  202. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  203. data/lib/fluent/plugin_helper/extract.rb +104 -0
  204. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  205. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  206. data/lib/fluent/plugin_helper/http_server/compat/server.rb +81 -0
  207. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  208. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  209. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  210. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  211. data/lib/fluent/plugin_helper/http_server/server.rb +87 -0
  212. data/lib/fluent/plugin_helper/http_server.rb +76 -0
  213. data/lib/fluent/plugin_helper/inject.rb +151 -0
  214. data/lib/fluent/plugin_helper/parser.rb +147 -0
  215. data/lib/fluent/plugin_helper/record_accessor.rb +210 -0
  216. data/lib/fluent/plugin_helper/retry_state.rb +205 -0
  217. data/lib/fluent/plugin_helper/server.rb +807 -0
  218. data/lib/fluent/plugin_helper/socket.rb +250 -0
  219. data/lib/fluent/plugin_helper/socket_option.rb +80 -0
  220. data/lib/fluent/plugin_helper/storage.rb +349 -0
  221. data/lib/fluent/plugin_helper/thread.rb +179 -0
  222. data/lib/fluent/plugin_helper/timer.rb +92 -0
  223. data/lib/fluent/plugin_helper.rb +73 -0
  224. data/lib/fluent/plugin_id.rb +80 -0
  225. data/lib/fluent/process.rb +3 -489
  226. data/lib/fluent/registry.rb +52 -10
  227. data/lib/fluent/root_agent.rb +204 -42
  228. data/lib/fluent/supervisor.rb +597 -359
  229. data/lib/fluent/system_config.rb +131 -42
  230. data/lib/fluent/test/base.rb +6 -54
  231. data/lib/fluent/test/driver/base.rb +224 -0
  232. data/lib/fluent/test/driver/base_owned.rb +70 -0
  233. data/lib/fluent/test/driver/base_owner.rb +135 -0
  234. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  235. data/lib/fluent/test/driver/filter.rb +57 -0
  236. data/lib/fluent/test/driver/formatter.rb +30 -0
  237. data/lib/fluent/test/driver/input.rb +31 -0
  238. data/lib/fluent/test/driver/multi_output.rb +53 -0
  239. data/lib/fluent/test/driver/output.rb +102 -0
  240. data/lib/fluent/test/driver/parser.rb +30 -0
  241. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  242. data/lib/fluent/test/filter_test.rb +0 -1
  243. data/lib/fluent/test/formatter_test.rb +4 -1
  244. data/lib/fluent/test/helpers.rb +58 -10
  245. data/lib/fluent/test/input_test.rb +27 -19
  246. data/lib/fluent/test/log.rb +79 -0
  247. data/lib/fluent/test/output_test.rb +28 -39
  248. data/lib/fluent/test/parser_test.rb +3 -1
  249. data/lib/fluent/test/startup_shutdown.rb +46 -0
  250. data/lib/fluent/test.rb +33 -1
  251. data/lib/fluent/time.rb +450 -1
  252. data/lib/fluent/timezone.rb +27 -3
  253. data/lib/fluent/{status.rb → unique_id.rb} +15 -24
  254. data/lib/fluent/version.rb +1 -1
  255. data/lib/fluent/winsvc.rb +85 -0
  256. data/templates/new_gem/Gemfile +3 -0
  257. data/templates/new_gem/README.md.erb +43 -0
  258. data/templates/new_gem/Rakefile +13 -0
  259. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  260. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  261. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  262. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  263. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  264. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  265. data/templates/new_gem/test/helper.rb.erb +8 -0
  266. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  267. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  268. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  269. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  270. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  271. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  272. data/templates/plugin_config_formatter/param.md.erb +34 -0
  273. data/templates/plugin_config_formatter/section.md.erb +12 -0
  274. data/test/command/test_binlog_reader.rb +346 -0
  275. data/test/command/test_ca_generate.rb +70 -0
  276. data/test/command/test_fluentd.rb +901 -0
  277. data/test/command/test_plugin_config_formatter.rb +276 -0
  278. data/test/command/test_plugin_generator.rb +92 -0
  279. data/test/compat/test_calls_super.rb +166 -0
  280. data/test/compat/test_parser.rb +92 -0
  281. data/test/config/test_config_parser.rb +126 -2
  282. data/test/config/test_configurable.rb +946 -187
  283. data/test/config/test_configure_proxy.rb +424 -74
  284. data/test/config/test_dsl.rb +11 -11
  285. data/test/config/test_element.rb +500 -0
  286. data/test/config/test_literal_parser.rb +8 -0
  287. data/test/config/test_plugin_configuration.rb +56 -0
  288. data/test/config/test_section.rb +79 -7
  289. data/test/config/test_system_config.rb +122 -35
  290. data/test/config/test_types.rb +38 -0
  291. data/test/counter/test_client.rb +559 -0
  292. data/test/counter/test_error.rb +44 -0
  293. data/test/counter/test_mutex_hash.rb +179 -0
  294. data/test/counter/test_server.rb +589 -0
  295. data/test/counter/test_store.rb +258 -0
  296. data/test/counter/test_validator.rb +137 -0
  297. data/test/helper.rb +89 -6
  298. data/test/helpers/fuzzy_assert.rb +89 -0
  299. data/test/plugin/test_bare_output.rb +118 -0
  300. data/test/plugin/test_base.rb +115 -0
  301. data/test/plugin/test_buf_file.rb +823 -460
  302. data/test/plugin/test_buf_memory.rb +32 -194
  303. data/test/plugin/test_buffer.rb +1233 -0
  304. data/test/plugin/test_buffer_chunk.rb +198 -0
  305. data/test/plugin/test_buffer_file_chunk.rb +844 -0
  306. data/test/plugin/test_buffer_memory_chunk.rb +338 -0
  307. data/test/plugin/test_compressable.rb +84 -0
  308. data/test/plugin/test_filter.rb +357 -0
  309. data/test/plugin/test_filter_grep.rb +540 -29
  310. data/test/plugin/test_filter_parser.rb +439 -452
  311. data/test/plugin/test_filter_record_transformer.rb +123 -166
  312. data/test/plugin/test_filter_stdout.rb +160 -72
  313. data/test/plugin/test_formatter_csv.rb +111 -0
  314. data/test/plugin/test_formatter_hash.rb +35 -0
  315. data/test/plugin/test_formatter_json.rb +51 -0
  316. data/test/plugin/test_formatter_ltsv.rb +62 -0
  317. data/test/plugin/test_formatter_msgpack.rb +28 -0
  318. data/test/plugin/test_formatter_out_file.rb +95 -0
  319. data/test/plugin/test_formatter_single_value.rb +38 -0
  320. data/test/plugin/test_formatter_tsv.rb +68 -0
  321. data/test/plugin/test_in_debug_agent.rb +24 -1
  322. data/test/plugin/test_in_dummy.rb +111 -18
  323. data/test/plugin/test_in_exec.rb +200 -113
  324. data/test/plugin/test_in_forward.rb +990 -387
  325. data/test/plugin/test_in_gc_stat.rb +10 -8
  326. data/test/plugin/test_in_http.rb +600 -224
  327. data/test/plugin/test_in_monitor_agent.rb +690 -0
  328. data/test/plugin/test_in_object_space.rb +24 -8
  329. data/test/plugin/test_in_syslog.rb +154 -215
  330. data/test/plugin/test_in_tail.rb +1006 -707
  331. data/test/plugin/test_in_tcp.rb +125 -48
  332. data/test/plugin/test_in_udp.rb +204 -63
  333. data/test/plugin/{test_in_stream.rb → test_in_unix.rb} +14 -13
  334. data/test/plugin/test_input.rb +126 -0
  335. data/test/plugin/test_metadata.rb +89 -0
  336. data/test/plugin/test_multi_output.rb +180 -0
  337. data/test/plugin/test_out_copy.rb +117 -112
  338. data/test/plugin/test_out_exec.rb +258 -53
  339. data/test/plugin/test_out_exec_filter.rb +538 -115
  340. data/test/plugin/test_out_file.rb +865 -178
  341. data/test/plugin/test_out_forward.rb +998 -210
  342. data/test/plugin/test_out_null.rb +105 -0
  343. data/test/plugin/test_out_relabel.rb +28 -0
  344. data/test/plugin/test_out_roundrobin.rb +36 -29
  345. data/test/plugin/test_out_secondary_file.rb +458 -0
  346. data/test/plugin/test_out_stdout.rb +135 -37
  347. data/test/plugin/test_out_stream.rb +18 -0
  348. data/test/plugin/test_output.rb +984 -0
  349. data/test/plugin/test_output_as_buffered.rb +2021 -0
  350. data/test/plugin/test_output_as_buffered_backup.rb +312 -0
  351. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  352. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  353. data/test/plugin/test_output_as_buffered_retries.rb +911 -0
  354. data/test/plugin/test_output_as_buffered_secondary.rb +874 -0
  355. data/test/plugin/test_output_as_standard.rb +374 -0
  356. data/test/plugin/test_owned_by.rb +35 -0
  357. data/test/plugin/test_parser.rb +359 -0
  358. data/test/plugin/test_parser_apache.rb +42 -0
  359. data/test/plugin/test_parser_apache2.rb +47 -0
  360. data/test/plugin/test_parser_apache_error.rb +45 -0
  361. data/test/plugin/test_parser_csv.rb +103 -0
  362. data/test/plugin/test_parser_json.rb +138 -0
  363. data/test/plugin/test_parser_labeled_tsv.rb +145 -0
  364. data/test/plugin/test_parser_multiline.rb +100 -0
  365. data/test/plugin/test_parser_nginx.rb +88 -0
  366. data/test/plugin/test_parser_none.rb +52 -0
  367. data/test/plugin/test_parser_regexp.rb +289 -0
  368. data/test/plugin/test_parser_syslog.rb +441 -0
  369. data/test/plugin/test_parser_tsv.rb +122 -0
  370. data/test/plugin/test_storage.rb +167 -0
  371. data/test/plugin/test_storage_local.rb +335 -0
  372. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  373. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  374. data/test/plugin_helper/data/cert/cert.pem +19 -0
  375. data/test/plugin_helper/http_server/test_app.rb +65 -0
  376. data/test/plugin_helper/http_server/test_route.rb +32 -0
  377. data/test/plugin_helper/test_cert_option.rb +16 -0
  378. data/test/plugin_helper/test_child_process.rb +794 -0
  379. data/test/plugin_helper/test_compat_parameters.rb +353 -0
  380. data/test/plugin_helper/test_event_emitter.rb +51 -0
  381. data/test/plugin_helper/test_event_loop.rb +52 -0
  382. data/test/plugin_helper/test_extract.rb +194 -0
  383. data/test/plugin_helper/test_formatter.rb +255 -0
  384. data/test/plugin_helper/test_http_server_helper.rb +205 -0
  385. data/test/plugin_helper/test_inject.rb +519 -0
  386. data/test/plugin_helper/test_parser.rb +264 -0
  387. data/test/plugin_helper/test_record_accessor.rb +197 -0
  388. data/test/plugin_helper/test_retry_state.rb +442 -0
  389. data/test/plugin_helper/test_server.rb +1714 -0
  390. data/test/plugin_helper/test_storage.rb +542 -0
  391. data/test/plugin_helper/test_thread.rb +164 -0
  392. data/test/plugin_helper/test_timer.rb +132 -0
  393. data/test/scripts/exec_script.rb +0 -6
  394. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  395. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  396. data/test/scripts/fluent/plugin/out_test.rb +23 -15
  397. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  398. data/test/test_clock.rb +164 -0
  399. data/test/test_config.rb +16 -7
  400. data/test/test_configdsl.rb +2 -2
  401. data/test/test_event.rb +360 -13
  402. data/test/test_event_router.rb +108 -11
  403. data/test/test_event_time.rb +199 -0
  404. data/test/test_filter.rb +48 -6
  405. data/test/test_formatter.rb +11 -391
  406. data/test/test_input.rb +1 -1
  407. data/test/test_log.rb +591 -31
  408. data/test/test_mixin.rb +1 -1
  409. data/test/test_output.rb +121 -185
  410. data/test/test_plugin.rb +251 -0
  411. data/test/test_plugin_classes.rb +177 -10
  412. data/test/test_plugin_helper.rb +81 -0
  413. data/test/test_plugin_id.rb +101 -0
  414. data/test/test_process.rb +8 -42
  415. data/test/test_root_agent.rb +766 -21
  416. data/test/test_supervisor.rb +481 -0
  417. data/test/test_test_drivers.rb +135 -0
  418. data/test/test_time_formatter.rb +282 -0
  419. data/test/test_time_parser.rb +231 -0
  420. data/test/test_unique_id.rb +47 -0
  421. metadata +454 -60
  422. data/COPYING +0 -14
  423. data/ChangeLog +0 -666
  424. data/lib/fluent/buffer.rb +0 -365
  425. data/lib/fluent/plugin/in_status.rb +0 -76
  426. data/test/plugin/test_in_status.rb +0 -38
  427. data/test/test_buffer.rb +0 -624
  428. data/test/test_parser.rb +0 -1305
@@ -0,0 +1,312 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin/output'
3
+ require 'fluent/plugin/buffer'
4
+ require 'fluent/event'
5
+ require 'fluent/error'
6
+
7
+ require 'json'
8
+ require 'time'
9
+ require 'timeout'
10
+ require 'timecop'
11
+
12
+
13
+ class BufferedOutputBackupTest < Test::Unit::TestCase
14
+ class BareOutput < Fluent::Plugin::Output
15
+ def register(name, &block)
16
+ instance_variable_set("@#{name}", block)
17
+ end
18
+ end
19
+ class DummyOutput < BareOutput
20
+ def initialize
21
+ super
22
+ @process = nil
23
+ @format = nil
24
+ @write = nil
25
+ @try_write = nil
26
+ end
27
+ def prefer_buffered_processing
28
+ true
29
+ end
30
+ def prefer_delayed_commit
31
+ false
32
+ end
33
+ def process(tag, es)
34
+ @process ? @process.call(tag, es) : nil
35
+ end
36
+ def format(tag, time, record)
37
+ [tag, time.to_i, record].to_json + "\n"
38
+ end
39
+ def write(chunk)
40
+ @write ? @write.call(chunk) : nil
41
+ end
42
+ def try_write(chunk)
43
+ @try_write ? @try_write.call(chunk) : nil
44
+ end
45
+ end
46
+ class DummyOutputForSecondary < BareOutput
47
+ def initialize
48
+ super
49
+ @process = nil
50
+ @format = nil
51
+ @write = nil
52
+ @try_write = nil
53
+ end
54
+ def prefer_buffered_processing
55
+ true
56
+ end
57
+ def prefer_delayed_commit
58
+ false
59
+ end
60
+ def process(tag, es)
61
+ @process ? @process.call(tag, es) : nil
62
+ end
63
+ def format(tag, time, record)
64
+ [tag, time.to_i, record].to_json + "\n"
65
+ end
66
+ def write(chunk)
67
+ @write ? @write.call(chunk) : nil
68
+ end
69
+ def try_write(chunk)
70
+ @try_write ? @try_write.call(chunk) : nil
71
+ end
72
+ end
73
+ class DummyAsyncOutputForSecondary < BareOutput
74
+ def initialize
75
+ super
76
+ @process = nil
77
+ @format = nil
78
+ @write = nil
79
+ @try_write = nil
80
+ end
81
+ def prefer_buffered_processing
82
+ true
83
+ end
84
+ def prefer_delayed_commit
85
+ true
86
+ end
87
+ def process(tag, es)
88
+ @process ? @process.call(tag, es) : nil
89
+ end
90
+ def format(tag, time, record)
91
+ [tag, time.to_i, record].to_json + "\n"
92
+ end
93
+ def write(chunk)
94
+ @write ? @write.call(chunk) : nil
95
+ end
96
+ def try_write(chunk)
97
+ @try_write ? @try_write.call(chunk) : nil
98
+ end
99
+ end
100
+
101
+ TMP_DIR = File.expand_path(File.dirname(__FILE__) + "/../tmp/bu#{ENV['TEST_ENV_NUMBER']}")
102
+
103
+ def create_output
104
+ DummyOutput.new
105
+ end
106
+ def create_metadata(timekey: nil, tag: nil, variables: nil)
107
+ Fluent::Plugin::Buffer::Metadata.new(timekey, tag, variables)
108
+ end
109
+ def waiting(seconds)
110
+ begin
111
+ Timeout.timeout(seconds) do
112
+ yield
113
+ end
114
+ rescue Timeout::Error
115
+ STDERR.print(*@i.log.out.logs)
116
+ raise
117
+ end
118
+ end
119
+
120
+ def dummy_event_stream
121
+ Fluent::ArrayEventStream.new([
122
+ [ event_time('2016-04-13 18:33:00'), {"name" => "moris", "age" => 36, "message" => "data1"} ],
123
+ [ event_time('2016-04-13 18:33:13'), {"name" => "moris", "age" => 36, "message" => "data2"} ],
124
+ [ event_time('2016-04-13 18:33:32'), {"name" => "moris", "age" => 36, "message" => "data3"} ],
125
+ ])
126
+ end
127
+
128
+ setup do
129
+ @i = create_output
130
+ FileUtils.rm_rf(TMP_DIR)
131
+ FileUtils.mkdir_p(TMP_DIR)
132
+
133
+ Fluent::Plugin.register_output('backup_output', DummyOutput)
134
+ Fluent::Plugin.register_output('backup_output2', DummyOutputForSecondary)
135
+ Fluent::Plugin.register_output('backup_async_output', DummyAsyncOutputForSecondary)
136
+ end
137
+
138
+ teardown do
139
+ if @i
140
+ @i.stop unless @i.stopped?
141
+ @i.before_shutdown unless @i.before_shutdown?
142
+ @i.shutdown unless @i.shutdown?
143
+ @i.after_shutdown unless @i.after_shutdown?
144
+ @i.close unless @i.closed?
145
+ @i.terminate unless @i.terminated?
146
+ end
147
+ Timecop.return
148
+ end
149
+
150
+ sub_test_case 'buffered output for broken chunks' do
151
+ def flush_chunks
152
+ @i.start
153
+ @i.after_start
154
+
155
+ @i.interrupt_flushes
156
+
157
+ now = Time.parse('2016-04-13 18:33:30 -0700')
158
+ Timecop.freeze(now)
159
+ @i.emit_events("test.tag.1", dummy_event_stream())
160
+ now = Time.parse('2016-04-13 18:33:32 -0700')
161
+ Timecop.freeze(now)
162
+
163
+ @i.enqueue_thread_wait
164
+ @i.flush_thread_wakeup
165
+ waiting(4) { Thread.pass until @i.write_count > 0 }
166
+
167
+ assert { @i.write_count > 0 }
168
+ Timecop.freeze(now)
169
+ @i.flush_thread_wakeup
170
+ end
171
+
172
+ def wait_flush(target_file)
173
+ waiting(5) {
174
+ target_dir = File.join(File.dirname(target_file), "*")
175
+ while Dir.glob(target_dir).size.zero?
176
+ end
177
+ }
178
+ end
179
+
180
+ data('unrecoverable error' => Fluent::UnrecoverableError,
181
+ 'type error' => TypeError,
182
+ 'argument error' => ArgumentError,
183
+ 'no method error' => NoMethodError,
184
+ 'msgpack unpack error' => MessagePack::UnpackError)
185
+ test 'backup chunk without secondary' do |error_class|
186
+ Fluent::SystemConfig.overwrite_system_config('root_dir' => TMP_DIR) do
187
+ id = 'backup_test'
188
+ hash = {
189
+ 'flush_interval' => 1,
190
+ 'flush_thread_burst_interval' => 0.1,
191
+ }
192
+ chunk_id = nil
193
+ @i.configure(config_element('ROOT', '', {'@id' => id}, [config_element('buffer', 'tag', hash)]))
194
+ @i.register(:write) { |chunk|
195
+ chunk_id = chunk.unique_id;
196
+ raise error_class, "yay, your #write must fail"
197
+ }
198
+
199
+ flush_chunks
200
+
201
+ target = "#{TMP_DIR}/backup/worker0/#{id}/#{@i.dump_unique_id_hex(chunk_id)}.log"
202
+ wait_flush(target)
203
+ assert_true File.exist?(target)
204
+ logs = @i.log.out.logs
205
+ assert { logs.any? { |l| l.include?("got unrecoverable error in primary and no secondary") } }
206
+ end
207
+ end
208
+
209
+ test 'backup chunk with same type secondary' do
210
+ Fluent::SystemConfig.overwrite_system_config('root_dir' => TMP_DIR) do
211
+ id = 'backup_test_with_same_secondary'
212
+ hash = {
213
+ 'flush_interval' => 1,
214
+ 'flush_thread_burst_interval' => 0.1,
215
+ }
216
+ chunk_id = nil
217
+ secconf = config_element('secondary','',{'@type' => 'backup_output'})
218
+ @i.configure(config_element('ROOT', '', {'@id' => id}, [config_element('buffer', 'tag', hash), secconf]))
219
+ @i.register(:write) { |chunk|
220
+ chunk_id = chunk.unique_id;
221
+ raise Fluent::UnrecoverableError, "yay, your #write must fail"
222
+ }
223
+
224
+ flush_chunks
225
+
226
+ target = "#{TMP_DIR}/backup/worker0/#{id}/#{@i.dump_unique_id_hex(chunk_id)}.log"
227
+ wait_flush(target)
228
+ assert_true File.exist?(target)
229
+ logs = @i.log.out.logs
230
+ assert { logs.any? { |l| l.include?("got unrecoverable error in primary and secondary type is same as primary") } }
231
+ end
232
+ end
233
+
234
+ test 'backup chunk with different type secondary' do
235
+ Fluent::SystemConfig.overwrite_system_config('root_dir' => TMP_DIR) do
236
+ id = 'backup_test_with_diff_secondary'
237
+ hash = {
238
+ 'flush_interval' => 1,
239
+ 'flush_thread_burst_interval' => 0.1,
240
+ }
241
+ chunk_id = nil
242
+ secconf = config_element('secondary','',{'@type' => 'backup_output2'})
243
+ @i.configure(config_element('ROOT', '', {'@id' => id}, [config_element('buffer', 'tag', hash), secconf]))
244
+ @i.register(:write) { |chunk|
245
+ chunk_id = chunk.unique_id;
246
+ raise Fluent::UnrecoverableError, "yay, your #write must fail"
247
+ }
248
+ @i.secondary.register(:write) { |chunk|
249
+ raise Fluent::UnrecoverableError, "yay, your secondary #write must fail"
250
+ }
251
+
252
+ flush_chunks
253
+
254
+ target = "#{TMP_DIR}/backup/worker0/#{id}/#{@i.dump_unique_id_hex(chunk_id)}.log"
255
+ wait_flush(target)
256
+ assert_true File.exist?(target)
257
+ logs = @i.log.out.logs
258
+ assert { logs.any? { |l| l.include?("got unrecoverable error in primary. Skip retry and flush chunk to secondary") } }
259
+ assert { logs.any? { |l| l.include?("got an error in secondary for unrecoverable error") } }
260
+ end
261
+ end
262
+
263
+ test 'backup chunk with async secondary' do
264
+ Fluent::SystemConfig.overwrite_system_config('root_dir' => TMP_DIR) do
265
+ id = 'backup_test_with_diff_secondary'
266
+ hash = {
267
+ 'flush_interval' => 1,
268
+ 'flush_thread_burst_interval' => 0.1,
269
+ }
270
+ chunk_id = nil
271
+ secconf = config_element('secondary','',{'@type' => 'backup_async_output'})
272
+ @i.configure(config_element('ROOT', '', {'@id' => id}, [config_element('buffer', 'tag', hash), secconf]))
273
+ @i.register(:write) { |chunk|
274
+ chunk_id = chunk.unique_id;
275
+ raise Fluent::UnrecoverableError, "yay, your #write must fail"
276
+ }
277
+
278
+ flush_chunks
279
+
280
+ target = "#{TMP_DIR}/backup/worker0/#{id}/#{@i.dump_unique_id_hex(chunk_id)}.log"
281
+ wait_flush(target)
282
+ assert_true File.exist?(target)
283
+ logs = @i.log.out.logs
284
+ assert { logs.any? { |l| l.include?("got unrecoverable error in primary and secondary is async output") } }
285
+ end
286
+ end
287
+
288
+ test 'chunk is thrown away when disable_chunk_backup is true' do
289
+ Fluent::SystemConfig.overwrite_system_config('root_dir' => TMP_DIR) do
290
+ id = 'backup_test'
291
+ hash = {
292
+ 'flush_interval' => 1,
293
+ 'flush_thread_burst_interval' => 0.1,
294
+ 'disable_chunk_backup' => true
295
+ }
296
+ chunk_id = nil
297
+ @i.configure(config_element('ROOT', '', {'@id' => id}, [config_element('buffer', 'tag', hash)]))
298
+ @i.register(:write) { |chunk|
299
+ chunk_id = chunk.unique_id;
300
+ raise Fluent::UnrecoverableError, "yay, your #write must fail"
301
+ }
302
+
303
+ flush_chunks
304
+
305
+ target = "#{TMP_DIR}/backup/worker0/#{id}/#{@i.dump_unique_id_hex(chunk_id)}.log"
306
+ assert_false File.exist?(target)
307
+ logs = @i.log.out.logs
308
+ assert { logs.any? { |l| l.include?("disable_chunk_backup is true") } }
309
+ end
310
+ end
311
+ end
312
+ end
@@ -0,0 +1,165 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin/output'
3
+ require 'fluent/plugin/buffer'
4
+ require 'fluent/plugin/compressable'
5
+ require 'fluent/event'
6
+
7
+ require 'timeout'
8
+
9
+ module FluentPluginOutputAsBufferedCompressTest
10
+ class DummyBareOutput < Fluent::Plugin::Output
11
+ def register(name, &block)
12
+ instance_variable_set("@#{name}", block)
13
+ end
14
+ end
15
+
16
+ class DummyAsyncOutput < DummyBareOutput
17
+ def initialize
18
+ super
19
+ @format = @write = nil
20
+ end
21
+ def write(chunk)
22
+ @write ? @write.call(chunk) : nil
23
+ end
24
+ end
25
+
26
+ class DummyAsyncOutputWithFormat < DummyBareOutput
27
+ def initialize
28
+ super
29
+ @format = nil
30
+ end
31
+ def write(chunk)
32
+ @write ? @write.call(chunk) : nil
33
+ end
34
+ def format(tag, time, record)
35
+ @format ? @format.call(tag, time, record) : [tag, time, record].to_json
36
+ end
37
+ end
38
+ end
39
+
40
+ class BufferedOutputCompressTest < Test::Unit::TestCase
41
+ include Fluent::Plugin::Compressable
42
+
43
+ def create_output(type=:async)
44
+ case type
45
+ when :async then FluentPluginOutputAsBufferedCompressTest::DummyAsyncOutput.new
46
+ when :async_with_format then FluentPluginOutputAsBufferedCompressTest::DummyAsyncOutputWithFormat.new
47
+ else
48
+ raise ArgumentError, "unknown type: #{type}"
49
+ end
50
+ end
51
+
52
+ def waiting(seconds)
53
+ begin
54
+ Timeout.timeout(seconds) do
55
+ yield
56
+ end
57
+ rescue Timeout::Error
58
+ STDERR.print(*@i.log.out.logs)
59
+ raise
60
+ end
61
+ end
62
+
63
+ def dummy_event_stream
64
+ Fluent::ArrayEventStream.new(
65
+ [
66
+ [event_time('2016-04-13 18:33:00'), { 'name' => 'moris', 'age' => 36, 'message' => 'data1' }],
67
+ [event_time('2016-04-13 18:33:13'), { 'name' => 'moris', 'age' => 36, 'message' => 'data2' }],
68
+ [event_time('2016-04-13 18:33:32'), { 'name' => 'moris', 'age' => 36, 'message' => 'data3' }],
69
+ ]
70
+ )
71
+ end
72
+
73
+ TMP_DIR = File.expand_path('../../tmp/test_output_as_buffered_compress', __FILE__)
74
+
75
+ setup do
76
+ FileUtils.rm_r TMP_DIR rescue nil
77
+ FileUtils.mkdir_p TMP_DIR
78
+ end
79
+
80
+ teardown do
81
+ if @i
82
+ @i.stop unless @i.stopped?
83
+ @i.before_shutdown unless @i.before_shutdown?
84
+ @i.shutdown unless @i.shutdown?
85
+ @i.after_shutdown unless @i.after_shutdown?
86
+ @i.close unless @i.closed?
87
+ @i.terminate unless @i.terminated?
88
+ end
89
+ end
90
+
91
+ data(
92
+ handle_simple_stream: config_element('buffer', '', { 'flush_interval' => 1, 'compress' => 'gzip' }),
93
+ handle_stream_with_standard_format: config_element('buffer', 'tag', { 'flush_interval' => 1, 'compress' => 'gzip' }),
94
+ handle_simple_stream_and_file_chunk: config_element('buffer', '', { '@type' => 'file', 'path' => File.join(TMP_DIR,'test.*.log'), 'flush_interval' => 1, 'compress' => 'gzip' }),
95
+ handle_stream_with_standard_format_and_file_chunk: config_element('buffer', 'tag', { '@type' => 'file', 'path' => File.join(TMP_DIR,'test.*.log'), 'flush_interval' => 1, 'compress' => 'gzip' }),
96
+ )
97
+ test 'call a standard format when output plugin adds data to chunk' do |buffer_config|
98
+ @i = create_output(:async)
99
+ @i.configure(config_element('ROOT','', {}, [buffer_config]))
100
+ @i.start
101
+ @i.after_start
102
+
103
+ io = StringIO.new
104
+ es = dummy_event_stream
105
+ expected = es.map { |e| e }
106
+ compressed_data = ''
107
+
108
+ assert_equal :gzip, @i.buffer.compress
109
+
110
+ @i.register(:write) do |c|
111
+ compressed_data = c.instance_variable_get(:@chunk)
112
+ if compressed_data.is_a?(File)
113
+ compressed_data.seek(0, IO::SEEK_SET)
114
+ compressed_data = compressed_data.read
115
+ end
116
+ c.write_to(io)
117
+ end
118
+
119
+ @i.emit_events('tag', es)
120
+ @i.enqueue_thread_wait
121
+ @i.flush_thread_wakeup
122
+ waiting(4) { Thread.pass until io.size > 0 }
123
+
124
+ assert_equal expected, Fluent::MessagePackEventStream.new(decompress(compressed_data)).map { |t, r| [t, r] }
125
+ assert_equal expected, Fluent::MessagePackEventStream.new(io.string).map { |t, r| [t, r] }
126
+ end
127
+
128
+ data(
129
+ handle_simple_stream: config_element('buffer', '', { 'flush_interval' => 1, 'compress' => 'gzip' }),
130
+ handle_stream_with_custom_format: config_element('buffer', 'tag', { 'flush_interval' => 1, 'compress' => 'gzip' }),
131
+ handle_simple_stream_and_file_chunk: config_element('buffer', '', { '@type' => 'file', 'path' => File.join(TMP_DIR,'test.*.log'), 'flush_interval' => 1, 'compress' => 'gzip' }),
132
+ handle_stream_with_custom_format_and_file_chunk: config_element('buffer', 'tag', { '@type' => 'file', 'path' => File.join(TMP_DIR,'test.*.log'), 'flush_interval' => 1, 'compress' => 'gzip' }),
133
+ )
134
+ test 'call a custom format when output plugin adds data to chunk' do |buffer_config|
135
+ @i = create_output(:async_with_format)
136
+ @i.configure(config_element('ROOT','', {}, [buffer_config]))
137
+ @i.start
138
+ @i.after_start
139
+
140
+ io = StringIO.new
141
+ es = dummy_event_stream
142
+ expected = es.map { |e| "#{e[1]}\n" }.join # e[1] is record
143
+ compressed_data = ''
144
+
145
+ assert_equal :gzip, @i.buffer.compress
146
+
147
+ @i.register(:format) { |tag, time, record| "#{record}\n" }
148
+ @i.register(:write) { |c|
149
+ compressed_data = c.instance_variable_get(:@chunk)
150
+ if compressed_data.is_a?(File)
151
+ compressed_data.seek(0, IO::SEEK_SET)
152
+ compressed_data = compressed_data.read
153
+ end
154
+ c.write_to(io)
155
+ }
156
+
157
+ @i.emit_events('tag', es)
158
+ @i.enqueue_thread_wait
159
+ @i.flush_thread_wakeup
160
+ waiting(4) { sleep 0.1 until io.size > 0 }
161
+
162
+ assert_equal expected, decompress(compressed_data)
163
+ assert_equal expected, io.string
164
+ end
165
+ end