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
@@ -18,10 +18,10 @@ require 'delegate'
18
18
 
19
19
  require 'fluent/config/error'
20
20
  require 'fluent/agent'
21
- require 'fluent/engine'
22
21
  require 'fluent/label'
23
22
  require 'fluent/plugin'
24
23
  require 'fluent/system_config'
24
+ require 'fluent/time'
25
25
 
26
26
  module Fluent
27
27
  #
@@ -47,14 +47,14 @@ module Fluent
47
47
  class RootAgent < Agent
48
48
  ERROR_LABEL = "@ERROR".freeze # @ERROR is built-in error label
49
49
 
50
- def initialize(system_config = SystemConfig.new)
51
- super
50
+ def initialize(log:, system_config: SystemConfig.new)
51
+ super(log: log)
52
52
 
53
53
  @labels = {}
54
54
  @inputs = []
55
- @started_inputs = []
56
55
  @suppress_emit_error_log_interval = 0
57
56
  @next_emit_error_log_time = nil
57
+ @without_source = false
58
58
 
59
59
  suppress_interval(system_config.emit_error_log_interval) unless system_config.emit_error_log_interval.nil?
60
60
  @without_source = system_config.without_source unless system_config.without_source.nil?
@@ -64,11 +64,75 @@ module Fluent
64
64
  attr_reader :labels
65
65
 
66
66
  def configure(conf)
67
+ used_worker_ids = []
68
+ available_worker_ids = (0..Fluent::Engine.system_config.workers - 1).to_a
69
+ # initialize <worker> elements
70
+ conf.elements(name: 'worker').each do |e|
71
+ target_worker_id_str = e.arg
72
+ if target_worker_id_str.empty?
73
+ raise Fluent::ConfigError, "Missing worker id on <worker> directive"
74
+ end
75
+
76
+ target_worker_ids = target_worker_id_str.split("-")
77
+ if target_worker_ids.size == 2
78
+ first_worker_id = target_worker_ids.first.to_i
79
+ last_worker_id = target_worker_ids.last.to_i
80
+ if first_worker_id > last_worker_id
81
+ raise Fluent::ConfigError, "greater first_worker_id<#{first_worker_id}> than last_worker_id<#{last_worker_id}> specified by <worker> directive is not allowed. Available multi worker assign syntax is <smaller_worker_id>-<greater_worker_id>"
82
+ end
83
+ target_worker_ids = []
84
+ first_worker_id.step(last_worker_id, 1) do |worker_id|
85
+ target_worker_id = worker_id.to_i
86
+ target_worker_ids << target_worker_id
87
+
88
+ if target_worker_id < 0 || target_worker_id > (Fluent::Engine.system_config.workers - 1)
89
+ raise Fluent::ConfigError, "worker id #{target_worker_id} specified by <worker> directive is not allowed. Available worker id is between 0 and #{(Fluent::Engine.system_config.workers - 1)}"
90
+ end
91
+ available_worker_ids.delete(target_worker_id) if available_worker_ids.include?(target_worker_id)
92
+ if used_worker_ids.include?(target_worker_id) && !Fluent::Engine.dry_run_mode
93
+ raise Fluent::ConfigError, "specified worker_id<#{worker_id}> collisions is detected on <worker> directive. Available worker id(s): #{available_worker_ids}"
94
+ end
95
+ used_worker_ids << target_worker_id
96
+
97
+ e.elements.each do |elem|
98
+ unless ['source', 'match', 'filter', 'label'].include?(elem.name)
99
+ raise Fluent::ConfigError, "<worker> section cannot have <#{elem.name}> directive"
100
+ end
101
+ end
102
+
103
+ # On dry_run mode, all worker sections have to be configured on supervisor (recognized as worker_id = 0).
104
+ target_worker_ids = [0] if Fluent::Engine.dry_run_mode
105
+
106
+ unless target_worker_ids.empty?
107
+ e.set_target_worker_ids(target_worker_ids.uniq)
108
+ end
109
+ end
110
+ else
111
+ target_worker_id = target_worker_id_str.to_i
112
+ if target_worker_id < 0 || target_worker_id > (Fluent::Engine.system_config.workers - 1)
113
+ raise Fluent::ConfigError, "worker id #{target_worker_id} specified by <worker> directive is not allowed. Available worker id is between 0 and #{(Fluent::Engine.system_config.workers - 1)}"
114
+ end
115
+
116
+ ## On dry_run mode, all worker sections have to be configured on supervisor (recognized as worker_id = 0).
117
+ target_worker_id = 0 if Fluent::Engine.dry_run_mode
118
+
119
+ e.elements.each do |elem|
120
+ unless ['source', 'match', 'filter', 'label'].include?(elem.name)
121
+ raise Fluent::ConfigError, "<worker> section cannot have <#{elem.name}> directive"
122
+ end
123
+ elem.set_target_worker_id(target_worker_id)
124
+ end
125
+ end
126
+ conf += e
127
+ end
128
+ conf.elements.delete_if{|e| e.name == 'worker'}
129
+
67
130
  error_label_config = nil
68
131
 
69
132
  # initialize <label> elements before configuring all plugins to avoid 'label not found' in input, filter and output.
70
133
  label_configs = {}
71
- conf.elements.select { |e| e.name == 'label' }.each { |e|
134
+ conf.elements(name: 'label').each { |e|
135
+ next if e.for_another_worker?
72
136
  name = e.arg
73
137
  raise ConfigError, "Missing symbol argument on <label> directive" if name.empty?
74
138
 
@@ -87,10 +151,11 @@ module Fluent
87
151
 
88
152
  # initialize <source> elements
89
153
  if @without_source
90
- log.info "'--without-source' is applied. Ignore <source> sections"
154
+ log.info :worker0, "'--without-source' is applied. Ignore <source> sections"
91
155
  else
92
- conf.elements.select { |e| e.name == 'source' }.each { |e|
93
- type = e['@type'] || e['type']
156
+ conf.elements(name: 'source').each { |e|
157
+ next if e.for_another_worker?
158
+ type = e['@type']
94
159
  raise ConfigError, "Missing '@type' parameter on <source> directive" unless type
95
160
  add_source(type, e)
96
161
  }
@@ -104,43 +169,138 @@ module Fluent
104
169
  @error_collector = error_label.event_router
105
170
  end
106
171
 
107
- def start
108
- super
172
+ def lifecycle(desc: false, kind_callback: nil)
173
+ kind_or_label_list = if desc
174
+ [:output, :filter, @labels.values.reverse, :output_with_router, :input].flatten
175
+ else
176
+ [:input, :output_with_router, @labels.values, :filter, :output].flatten
177
+ end
178
+ kind_or_label_list.each do |kind|
179
+ if kind.respond_to?(:lifecycle)
180
+ label = kind
181
+ label.lifecycle(desc: desc) do |plugin, display_kind|
182
+ yield plugin, display_kind
183
+ end
184
+ else
185
+ list = if desc
186
+ lifecycle_control_list[kind].reverse
187
+ else
188
+ lifecycle_control_list[kind]
189
+ end
190
+ display_kind = (kind == :output_with_router ? :output : kind)
191
+ list.each do |instance|
192
+ yield instance, display_kind
193
+ end
194
+ end
195
+ if kind_callback
196
+ kind_callback.call
197
+ end
198
+ end
199
+ end
109
200
 
110
- @labels.each { |n, l|
111
- l.start
112
- }
201
+ def start
202
+ lifecycle(desc: true) do |i| # instance
203
+ i.start unless i.started?
204
+ # Input#start sometimes emits lots of evetns with in_tail/`read_from_head true` case
205
+ # and it causes deadlock for small buffer/queue output. To avoid such problem,
206
+ # buffer related output threads should be run before `Input#start`.
207
+ # This is why after_start should be called immediately after start call.
208
+ # This depends on `desc: true` because calling plugin order of `desc: true` is
209
+ # Output, Filter, Label, Output with Router, then Input.
210
+ i.after_start unless i.after_started?
211
+ end
212
+ end
113
213
 
114
- @inputs.each { |i|
115
- i.start
116
- @started_inputs << i
117
- }
214
+ def flush!
215
+ log.info "flushing all buffer forcedly"
216
+ flushing_threads = []
217
+ lifecycle(desc: true) do |instance|
218
+ if instance.respond_to?(:force_flush)
219
+ t = Thread.new do
220
+ Thread.current.abort_on_exception = true
221
+ begin
222
+ instance.force_flush
223
+ rescue => e
224
+ log.warn "unexpected error while flushing buffer", plugin: instance.class, plugin_id: instance.plugin_id, error: e
225
+ log.warn_backtrace
226
+ end
227
+ end
228
+ flushing_threads << t
229
+ end
230
+ end
231
+ flushing_threads.each{|t| t.join }
118
232
  end
119
233
 
120
- def shutdown
121
- # Shutdown Input plugin first to prevent emitting to terminated Output plugin
122
- @started_inputs.map { |i|
123
- Thread.new do
234
+ def shutdown # Fluentd's shutdown sequence is stop, before_shutdown, shutdown, after_shutdown, close, terminate for plugins
235
+ # These method callers does `rescue Exception` to call methods of shutdown sequence as far as possible
236
+ # if plugin methods does something like infinite recursive call, `exit`, unregistering signal handlers or others.
237
+ # Plugins should be separated and be in sandbox to protect data in each plugins/buffers.
238
+
239
+ lifecycle_safe_sequence = ->(method, checker) {
240
+ lifecycle do |instance, kind|
124
241
  begin
125
- log.info "shutting down input", type: Plugin.lookup_name_from_class(i.class), plugin_id: i.plugin_id
126
- i.shutdown
127
- rescue => e
128
- log.warn "unexpected error while shutting down input plugin", plugin: i.class, plugin_id: i.plugin_id, error_class: e.class, error: e
242
+ log.debug "calling #{method} on #{kind} plugin", type: Plugin.lookup_type_from_class(instance.class), plugin_id: instance.plugin_id
243
+ instance.send(method) unless instance.send(checker)
244
+ rescue Exception => e
245
+ log.warn "unexpected error while calling #{method} on #{kind} plugin", plugin: instance.class, plugin_id: instance.plugin_id, error: e
129
246
  log.warn_backtrace
130
247
  end
131
248
  end
132
- }.each { |t| t.join }
249
+ }
133
250
 
134
- @labels.each { |n, l|
135
- l.shutdown
251
+ lifecycle_unsafe_sequence = ->(method, checker) {
252
+ operation = case method
253
+ when :shutdown then "shutting down"
254
+ when :close then "closing"
255
+ else
256
+ raise "BUG: unknown method name '#{method}'"
257
+ end
258
+ operation_threads = []
259
+ callback = ->(){
260
+ operation_threads.each{|t| t.join }
261
+ operation_threads.clear
262
+ }
263
+ lifecycle(kind_callback: callback) do |instance, kind|
264
+ t = Thread.new do
265
+ Thread.current.abort_on_exception = true
266
+ begin
267
+ if method == :shutdown
268
+ # To avoid Input#shutdown and Output#before_shutdown mismatch problem, combine before_shutdown and shutdown call in one sequence.
269
+ # The problem is in_tail flushes buffered multiline in shutdown but output's flush_at_shutdown is invoked in before_shutdown
270
+ operation = "preparing shutdown" # for logging
271
+ log.debug "#{operation} #{kind} plugin", type: Plugin.lookup_type_from_class(instance.class), plugin_id: instance.plugin_id
272
+ begin
273
+ instance.send(:before_shutdown) unless instance.send(:before_shutdown?)
274
+ rescue Exception => e
275
+ log.warn "unexpected error while #{operation} on #{kind} plugin", plugin: instance.class, plugin_id: instance.plugin_id, error: e
276
+ log.warn_backtrace
277
+ end
278
+ operation = "shutting down"
279
+ log.info "#{operation} #{kind} plugin", type: Plugin.lookup_type_from_class(instance.class), plugin_id: instance.plugin_id
280
+ instance.send(:shutdown) unless instance.send(:shutdown?)
281
+ else
282
+ log.debug "#{operation} #{kind} plugin", type: Plugin.lookup_type_from_class(instance.class), plugin_id: instance.plugin_id
283
+ instance.send(method) unless instance.send(checker)
284
+ end
285
+ rescue Exception => e
286
+ log.warn "unexpected error while #{operation} on #{kind} plugin", plugin: instance.class, plugin_id: instance.plugin_id, error: e
287
+ log.warn_backtrace
288
+ end
289
+ end
290
+ operation_threads << t
291
+ end
136
292
  }
137
293
 
138
- super
139
- end
294
+ lifecycle_safe_sequence.call(:stop, :stopped?)
140
295
 
141
- def flush!
142
- super
143
- @labels.each{ |name, label| label.flush! }
296
+ # before_shutdown does force_flush for output plugins: it should block, so it's unsafe operation
297
+ lifecycle_unsafe_sequence.call(:shutdown, :shutdown?)
298
+
299
+ lifecycle_safe_sequence.call(:after_shutdown, :after_shutdown?)
300
+
301
+ lifecycle_unsafe_sequence.call(:close, :closed?)
302
+
303
+ lifecycle_safe_sequence.call(:terminate, :terminated?)
144
304
  end
145
305
 
146
306
  def suppress_interval(interval_time)
@@ -149,13 +309,14 @@ module Fluent
149
309
  end
150
310
 
151
311
  def add_source(type, conf)
152
- log.info "adding source", type: type
312
+ log_type = conf.for_this_worker? ? :default : :worker0
313
+ log.info log_type, "adding source", type: type
153
314
 
154
315
  input = Plugin.new_input(type)
155
316
  # <source> emits events to the top-level event router (RootAgent#event_router).
156
317
  # Input#configure overwrites event_router to a label's event_router if it has `@label` parameter.
157
318
  # See also 'fluentd/plugin/input.rb'
158
- input.router = @event_router
319
+ input.context_router = @event_router
159
320
  input.configure(conf)
160
321
  @inputs << input
161
322
 
@@ -163,7 +324,8 @@ module Fluent
163
324
  end
164
325
 
165
326
  def add_label(name)
166
- label = Label.new(name)
327
+ label = Label.new(name, log: log)
328
+ raise ConfigError, "Section <label #{name}> appears twice" if @labels[name]
167
329
  label.root_agent = self
168
330
  @labels[name] = label
169
331
  end
@@ -177,7 +339,7 @@ module Fluent
177
339
  end
178
340
 
179
341
  def emit_error_event(tag, time, record, error)
180
- error_info = {error_class: error.class, error: error.to_s, tag: tag, time: time}
342
+ error_info = {error: error, location: (error.backtrace ? error.backtrace.first : nil), tag: tag, time: time}
181
343
  if @error_collector
182
344
  # A record is not included in the logs because <@ERROR> handles it. This warn is for the notification
183
345
  log.warn "send an error event to @ERROR:", error_info
@@ -189,12 +351,12 @@ module Fluent
189
351
  end
190
352
 
191
353
  def handle_emits_error(tag, es, error)
192
- error_info = {error_class: error.class, error: error.to_s, tag: tag}
354
+ error_info = {error: error, location: (error.backtrace ? error.backtrace.first : nil), tag: tag}
193
355
  if @error_collector
194
356
  log.warn "send an error event stream to @ERROR:", error_info
195
357
  @error_collector.emit_stream(tag, es)
196
358
  else
197
- now = Engine.now
359
+ now = Time.now.to_i
198
360
  if @suppress_emit_error_log_interval.zero? || now > @next_emit_error_log_time
199
361
  log.warn "emit transaction failed:", error_info
200
362
  log.warn_backtrace
@@ -218,14 +380,14 @@ module Fluent
218
380
  end
219
381
 
220
382
  def emit_error_event(tag, time, record, error)
221
- error_info = {error_class: error.class, error: error.to_s, tag: tag, time: time, record: record}
383
+ error_info = {error: error, location: (error.backtrace ? error.backtrace.first : nil), tag: tag, time: time, record: record}
222
384
  log.warn "dump an error event in @ERROR:", error_info
223
385
  end
224
386
 
225
387
  def handle_emits_error(tag, es, e)
226
- now = Engine.now
388
+ now = EventTime.now.to_i
227
389
  if @suppress_emit_error_log_interval.zero? || now > @next_emit_error_log_time
228
- log.warn "emit transaction failed in @ERROR:", error_class: e.class, error: e, tag: tag
390
+ log.warn "emit transaction failed in @ERROR:", error: e, tag: tag
229
391
  log.warn_backtrace
230
392
  @next_emit_error_log_time = now + @suppress_emit_error_log_interval
231
393
  end