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,98 +1,236 @@
1
1
  require_relative '../helper'
2
- require 'fluent/test'
2
+ require 'fluent/test/driver/output'
3
+ require 'fluent/plugin/out_exec'
3
4
  require 'fileutils'
4
5
 
5
6
  class ExecOutputTest < Test::Unit::TestCase
6
7
  def setup
7
8
  Fluent::Test.setup
8
- FileUtils.rm_rf(TMP_DIR)
9
+ FileUtils.rm_rf(TMP_DIR, secure: true)
10
+ if File.exist?(TMP_DIR)
11
+ # ensure files are closed for Windows, on which deleted files
12
+ # are still visible from filesystem
13
+ GC.start(full_mark: true, immediate_sweep: true)
14
+ FileUtils.remove_entry_secure(TMP_DIR)
15
+ end
9
16
  FileUtils.mkdir_p(TMP_DIR)
10
17
  end
11
18
 
12
19
  TMP_DIR = File.dirname(__FILE__) + "/../tmp/out_exec#{ENV['TEST_ENV_NUMBER']}"
13
20
 
14
- CONFIG = %[
21
+ def create_driver(config)
22
+ Fluent::Test::Driver::Output.new(Fluent::Plugin::ExecOutput).configure(config)
23
+ end
24
+
25
+ def create_test_data
26
+ time = event_time("2011-01-02 13:14:15.123")
27
+ records = [{"k1"=>"v1","kx"=>"vx"}, {"k1"=>"v2","kx"=>"vx"}]
28
+ return time, records
29
+ end
30
+
31
+ DEFAULT_CONFIG_ONLY_WITH_KEYS = %[
32
+ command cat >#{TMP_DIR}/out
33
+ <format>
34
+ keys ["k1", "kx"]
35
+ </format>
36
+ ]
37
+
38
+ test 'configure in default' do
39
+ d = create_driver DEFAULT_CONFIG_ONLY_WITH_KEYS
40
+ assert{ d.instance.formatter.is_a? Fluent::Plugin::TSVFormatter }
41
+ assert_equal ["k1", "kx"], d.instance.formatter.keys
42
+ assert_nil d.instance.inject_config
43
+ end
44
+
45
+ TSV_CONFIG = %[
46
+ command cat >#{TMP_DIR}/out
47
+ <inject>
48
+ tag_key tag
49
+ time_key time
50
+ time_format %Y-%m-%d %H:%M:%S
51
+ localtime yes
52
+ </inject>
53
+ <format>
54
+ @type tsv
55
+ keys time, tag, k1
56
+ </format>
57
+ ]
58
+ TSV_CONFIG_WITH_SUBSEC = %[
59
+ command cat >#{TMP_DIR}/out
60
+ <inject>
61
+ tag_key tag
62
+ time_key time
63
+ time_format %Y-%m-%d %H:%M:%S.%3N
64
+ localtime yes
65
+ </inject>
66
+ <format>
67
+ @type tsv
68
+ keys time, tag, k1
69
+ </format>
70
+ ]
71
+ TSV_CONFIG_WITH_BUFFER = TSV_CONFIG + %[
72
+ <buffer time>
73
+ @type memory
74
+ timekey 3600
75
+ flush_thread_count 5
76
+ chunk_limit_size 50m
77
+ total_limit_size #{50 * 1024 * 1024 * 128}
78
+ flush_at_shutdown yes
79
+ </buffer>
80
+ ]
81
+ JSON_CONFIG = %[
82
+ command cat >#{TMP_DIR}/out
83
+ <format>
84
+ @type json
85
+ </format>
86
+ ]
87
+ MSGPACK_CONFIG = %[
88
+ command cat >#{TMP_DIR}/out
89
+ <format>
90
+ @type msgpack
91
+ </format>
92
+ ]
93
+
94
+ CONFIG_COMPAT = %[
15
95
  buffer_path #{TMP_DIR}/buffer
16
96
  command cat >#{TMP_DIR}/out
17
97
  localtime
18
98
  ]
19
- TSV_CONFIG = %[
99
+ TSV_CONFIG_COMPAT = %[
20
100
  keys "time,tag,k1"
21
101
  tag_key "tag"
22
102
  time_key "time"
23
103
  time_format %Y-%m-%d %H:%M:%S
24
104
  ]
105
+ BUFFER_CONFIG_COMPAT = %[
106
+ buffer_type memory
107
+ time_slice_format %Y%m%d%H
108
+ num_threads 5
109
+ buffer_chunk_limit 50m
110
+ buffer_queue_limit 128
111
+ flush_at_shutdown yes
112
+ ]
113
+ TSV_CONFIG_WITH_SUBSEC_COMPAT = %[
114
+ keys "time,tag,k1"
115
+ tag_key "tag"
116
+ time_key "time"
117
+ time_format %Y-%m-%d %H:%M:%S.%3N
118
+ ]
119
+
120
+ data(
121
+ 'with sections' => TSV_CONFIG,
122
+ 'traditional' => CONFIG_COMPAT + TSV_CONFIG_COMPAT,
123
+ )
124
+ test 'configure for tsv' do |conf|
125
+ d = create_driver(conf)
25
126
 
26
- def create_driver(conf = TSV_CONFIG)
27
- config = CONFIG + conf
28
- Fluent::Test::TimeSlicedOutputTestDriver.new(Fluent::ExecOutput).configure(config, true)
127
+ assert_equal ["time","tag","k1"], d.instance.formatter.keys
128
+ assert_equal "tag", d.instance.inject_config.tag_key
129
+ assert_equal "time", d.instance.inject_config.time_key
130
+ assert_equal "%Y-%m-%d %H:%M:%S", d.instance.inject_config.time_format
131
+ assert_equal true, d.instance.inject_config.localtime
29
132
  end
30
133
 
31
- def create_test_case
32
- time = Time.parse("2011-01-02 13:14:15").to_i
33
- tests = [{"k1"=>"v1","kx"=>"vx"}, {"k1"=>"v2","kx"=>"vx"}]
34
- return time, tests
134
+ data(
135
+ 'with sections' => TSV_CONFIG_WITH_BUFFER,
136
+ 'traditional' => CONFIG_COMPAT + TSV_CONFIG_COMPAT + BUFFER_CONFIG_COMPAT,
137
+ )
138
+ test 'configure_with_compat_buffer_parameters' do |conf|
139
+ d = create_driver(conf)
140
+ assert_equal 3600, d.instance.buffer_config.timekey
141
+ assert_equal 5, d.instance.buffer_config.flush_thread_count
142
+ assert_equal 50*1024*1024, d.instance.buffer.chunk_limit_size
143
+ assert_equal 50*1024*1024*128, d.instance.buffer.total_limit_size
144
+ assert d.instance.buffer_config.flush_at_shutdown
35
145
  end
36
146
 
37
- def test_configure
38
- d = create_driver
147
+ data(
148
+ 'with sections' => TSV_CONFIG,
149
+ 'traditional' => CONFIG_COMPAT + TSV_CONFIG_COMPAT,
150
+ )
151
+ test 'format' do |conf|
152
+ d = create_driver(conf)
153
+ time, records = create_test_data
39
154
 
40
- assert_equal ["time","tag","k1"], d.instance.keys
41
- assert_equal "tag", d.instance.tag_key
42
- assert_equal "time", d.instance.time_key
43
- assert_equal "%Y-%m-%d %H:%M:%S", d.instance.time_format
44
- assert_equal true, d.instance.localtime
45
- end
155
+ d.run(default_tag: 'test') do
156
+ d.feed(time, records[0])
157
+ d.feed(time, records[1])
158
+ end
46
159
 
47
- def test_format
48
- d = create_driver
49
- time, tests = create_test_case
160
+ assert_equal %[2011-01-02 13:14:15\ttest\tv1\n], d.formatted[0]
161
+ assert_equal %[2011-01-02 13:14:15\ttest\tv2\n], d.formatted[1]
162
+ end
50
163
 
51
- tests.each { |test|
52
- d.emit(test, time)
53
- }
164
+ data(
165
+ 'with sections' => JSON_CONFIG,
166
+ 'traditional' => CONFIG_COMPAT + "format json",
167
+ )
168
+ test 'format_json' do |conf|
169
+ d = create_driver(conf)
170
+ time, records = create_test_data
54
171
 
55
- d.expect_format %[2011-01-02 13:14:15\ttest\tv1\n]
56
- d.expect_format %[2011-01-02 13:14:15\ttest\tv2\n]
172
+ d.run(default_tag: 'test') do
173
+ d.feed(time, records[0])
174
+ d.feed(time, records[1])
175
+ end
57
176
 
58
- d.run
177
+ assert_equal Yajl.dump(records[0]) + "\n", d.formatted[0]
178
+ assert_equal Yajl.dump(records[1]) + "\n", d.formatted[1]
59
179
  end
60
180
 
61
- def test_format_json
62
- d = create_driver("format json")
63
- time, tests = create_test_case
181
+ data(
182
+ 'with sections' => MSGPACK_CONFIG,
183
+ 'traditional' => CONFIG_COMPAT + "format msgpack"
184
+ )
185
+ test 'format_msgpack' do |conf|
186
+ d = create_driver(conf)
187
+ time, records = create_test_data
64
188
 
65
- tests.each { |test|
66
- d.emit(test, time)
67
- d.expect_format Yajl.dump(test) + "\n"
68
- }
189
+ d.run(default_tag: 'test') do
190
+ d.feed(time, records[0])
191
+ d.feed(time, records[1])
192
+ end
69
193
 
70
- d.run
194
+ assert_equal records[0].to_msgpack, d.formatted[0]
195
+ assert_equal records[1].to_msgpack, d.formatted[1]
71
196
  end
72
197
 
73
- def test_format_msgpack
74
- d = create_driver("format msgpack")
75
- time, tests = create_test_case
198
+ data(
199
+ 'with sections' => TSV_CONFIG_WITH_SUBSEC,
200
+ 'traditional' => CONFIG_COMPAT + TSV_CONFIG_WITH_SUBSEC_COMPAT,
201
+ )
202
+ test 'format subsecond time' do |conf|
203
+ d = create_driver(conf)
204
+ time, records = create_test_data
76
205
 
77
- tests.each { |test|
78
- d.emit(test, time)
79
- d.expect_format test.to_msgpack
80
- }
206
+ d.run(default_tag: 'test') do
207
+ d.feed(time, records[0])
208
+ d.feed(time, records[1])
209
+ end
81
210
 
82
- d.run
211
+ assert_equal %[2011-01-02 13:14:15.123\ttest\tv1\n], d.formatted[0]
212
+ assert_equal %[2011-01-02 13:14:15.123\ttest\tv2\n], d.formatted[1]
83
213
  end
84
214
 
85
- def test_write
86
- d = create_driver
87
- time, tests = create_test_case
88
-
89
- tests.each { |test|
90
- d.emit(test, time)
91
- }
215
+ data(
216
+ 'with sections' => TSV_CONFIG,
217
+ 'traditional' => CONFIG_COMPAT + TSV_CONFIG_COMPAT,
218
+ )
219
+ test 'write' do |conf|
220
+ d = create_driver(conf)
221
+ time, records = create_test_data
92
222
 
93
- d.run
223
+ d.run(default_tag: 'test', flush: true) do
224
+ d.feed(time, records[0])
225
+ d.feed(time, records[1])
226
+ end
94
227
 
95
228
  expect_path = "#{TMP_DIR}/out"
229
+
230
+ waiting(10, plugin: d.instance) do
231
+ sleep(0.1) until File.exist?(expect_path)
232
+ end
233
+
96
234
  assert_equal true, File.exist?(expect_path)
97
235
 
98
236
  data = File.read(expect_path)
@@ -101,5 +239,72 @@ class ExecOutputTest < Test::Unit::TestCase
101
239
  %[2011-01-02 13:14:15\ttest\tv2\n]
102
240
  assert_equal expect_data, data
103
241
  end
104
- end
105
242
 
243
+ sub_test_case 'when executed process dies unexpectedly' do
244
+ setup do
245
+ @gen_config = ->(num){ <<EOC
246
+ command ruby -e "ARGV.first.to_i == 0 ? open(ARGV[1]){|f| STDOUT.write f.read} : (sleep 1 ; exit ARGV.first.to_i)" #{num} >#{TMP_DIR}/fail_out
247
+ <inject>
248
+ tag_key tag
249
+ time_key time
250
+ time_format %Y-%m-%d %H:%M:%S
251
+ localtime yes
252
+ </inject>
253
+ <format>
254
+ @type tsv
255
+ keys time, tag, k1
256
+ </format>
257
+ EOC
258
+ }
259
+ end
260
+
261
+ test 'flushed chunk will be committed after child process successfully exits' do
262
+ d = create_driver(@gen_config.call(0))
263
+ time, records = create_test_data
264
+
265
+ expect_path = "#{TMP_DIR}/fail_out"
266
+
267
+ d.end_if{ File.exist?(expect_path) }
268
+ d.run(default_tag: 'test', flush: true, wait_flush_completion: false, shutdown: false) do
269
+ d.feed(time, records[0])
270
+ d.feed(time, records[1])
271
+ end
272
+
273
+ assert{ File.exist?(expect_path) }
274
+
275
+ data = File.read(expect_path)
276
+ expect_data =
277
+ %[2011-01-02 13:14:15\ttest\tv1\n] +
278
+ %[2011-01-02 13:14:15\ttest\tv2\n]
279
+ assert_equal expect_data, data
280
+
281
+ assert{ d.instance.buffer.queue.empty? }
282
+ assert{ d.instance.dequeued_chunks.empty? }
283
+
284
+ d.instance_shutdown
285
+ end
286
+
287
+ test 'flushed chunk will be taken back after child process unexpectedly exits' do
288
+ d = create_driver(@gen_config.call(3))
289
+ time, records = create_test_data
290
+
291
+ expect_path = "#{TMP_DIR}/fail_out"
292
+
293
+ d.end_if{ d.instance.log.out.logs.any?{|line| line.include?("command exits with error code") } }
294
+ d.run(default_tag: 'test', flush: true, wait_flush_completion: false, shutdown: false) do
295
+ d.feed(time, records[0])
296
+ d.feed(time, records[1])
297
+ end
298
+
299
+ assert{ d.instance.dequeued_chunks.empty? } # because it's already taken back
300
+ assert{ d.instance.buffer.queue.size == 1 }
301
+
302
+ logs = d.instance.log.out.logs
303
+ assert{ logs.any?{|line| line.include?("command exits with error code") && line.include?("status=3") } }
304
+
305
+ assert{ File.exist?(expect_path) && File.size(expect_path) == 0 }
306
+
307
+ d.instance_shutdown
308
+ end
309
+ end
310
+ end