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
@@ -16,6 +16,7 @@
16
16
 
17
17
  require 'fluent/match'
18
18
  require 'fluent/event'
19
+ require 'fluent/filter'
19
20
 
20
21
  module Fluent
21
22
  #
@@ -45,7 +46,6 @@ module Fluent
45
46
  @match_cache = MatchCache.new
46
47
  @default_collector = default_collector
47
48
  @emit_error_handler = emit_error_handler
48
- @chain = NullOutputChain.instance
49
49
  end
50
50
 
51
51
  attr_accessor :default_collector
@@ -71,6 +71,12 @@ module Fluent
71
71
  attr_reader :pattern_str
72
72
  end
73
73
 
74
+ def suppress_missing_match!
75
+ if @default_collector.respond_to?(:suppress_missing_match!)
76
+ @default_collector.suppress_missing_match!
77
+ end
78
+ end
79
+
74
80
  # called by Agent to add new match pattern and collector
75
81
  def add_rule(pattern, collector)
76
82
  @match_rules << Rule.new(pattern, collector)
@@ -87,7 +93,7 @@ module Fluent
87
93
  end
88
94
 
89
95
  def emit_stream(tag, es)
90
- match(tag).emit(tag, es, @chain)
96
+ match(tag).emit_events(tag, es)
91
97
  rescue => e
92
98
  @emit_error_handler.handle_emits_error(tag, es, e)
93
99
  end
@@ -102,7 +108,7 @@ module Fluent
102
108
 
103
109
  def match(tag)
104
110
  collector = @match_cache.get(tag) {
105
- c = find(tag) || @default_collector
111
+ find(tag) || @default_collector
106
112
  }
107
113
  collector
108
114
  end
@@ -136,22 +142,99 @@ module Fluent
136
142
  def initialize
137
143
  @filters = []
138
144
  @output = nil
145
+ @optimizer = FilterOptimizer.new
139
146
  end
140
147
 
141
148
  def add_filter(filter)
142
149
  @filters << filter
150
+ @optimizer.filters = @filters
143
151
  end
144
152
 
145
153
  def set_output(output)
146
154
  @output = output
147
155
  end
148
156
 
149
- def emit(tag, es, chain)
150
- processed = es
151
- @filters.each { |filter|
152
- processed = filter.filter_stream(tag, processed)
153
- }
154
- @output.emit(tag, processed, chain)
157
+ def emit_events(tag, es)
158
+ processed = @optimizer.filter_stream(tag, es)
159
+ @output.emit_events(tag, processed)
160
+ end
161
+
162
+ class FilterOptimizer
163
+ def initialize(filters = [])
164
+ @filters = filters
165
+ @optimizable = nil
166
+ end
167
+
168
+ def filters=(filters)
169
+ @filters = filters
170
+ reset_optimization
171
+ end
172
+
173
+ def filter_stream(tag, es)
174
+ if optimizable?
175
+ optimized_filter_stream(tag, es)
176
+ else
177
+ @filters.reduce(es) { |acc, filter| filter.filter_stream(tag, acc) }
178
+ end
179
+ end
180
+
181
+ private
182
+
183
+ def optimized_filter_stream(tag, es)
184
+ new_es = MultiEventStream.new
185
+ es.each do |time, record|
186
+ filtered_record = record
187
+ filtered_time = time
188
+
189
+ catch :break_loop do
190
+ @filters.each do |filter|
191
+ if filter.has_filter_with_time
192
+ begin
193
+ filtered_time, filtered_record = filter.filter_with_time(tag, filtered_time, filtered_record)
194
+ throw :break_loop unless filtered_record && filtered_time
195
+ rescue => e
196
+ filter.router.emit_error_event(tag, filtered_time, filtered_record, e)
197
+ end
198
+ else
199
+ begin
200
+ filtered_record = filter.filter(tag, filtered_time, filtered_record)
201
+ throw :break_loop unless filtered_record
202
+ rescue => e
203
+ filter.router.emit_error_event(tag, filtered_time, filtered_record, e)
204
+ end
205
+ end
206
+ end
207
+
208
+ new_es.add(filtered_time, filtered_record)
209
+ end
210
+ end
211
+ new_es
212
+ end
213
+
214
+ def optimizable?
215
+ return @optimizable unless @optimizable.nil?
216
+ fs_filters = filters_having_filter_stream
217
+ @optimizable = if fs_filters.empty?
218
+ true
219
+ else
220
+ # skip log message when filter is only 1, because its performance is same as non optimized chain.
221
+ if @filters.size > 1 && fs_filters.size >= 1
222
+ $log.info "disable filter chain optimization because #{fs_filters.map(&:class)} uses `#filter_stream` method."
223
+ end
224
+ false
225
+ end
226
+ end
227
+
228
+ def filters_having_filter_stream
229
+ @filters_having_filter_stream ||= @filters.select do |filter|
230
+ filter.class.instance_methods(false).include?(:filter_stream)
231
+ end
232
+ end
233
+
234
+ def reset_optimization
235
+ @optimizable = nil
236
+ @filters_having_filter_stream = nil
237
+ end
155
238
  end
156
239
  end
157
240
 
@@ -159,7 +242,7 @@ module Fluent
159
242
  pipeline = nil
160
243
  @match_rules.each_with_index { |rule, i|
161
244
  if rule.match?(tag)
162
- if rule.collector.is_a?(Filter)
245
+ if rule.collector.is_a?(Plugin::Filter)
163
246
  pipeline ||= Pipeline.new
164
247
  pipeline.add_filter(rule.collector)
165
248
  else
data/lib/fluent/filter.rb CHANGED
@@ -14,56 +14,8 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- require 'fluent/config'
18
- require 'fluent/configurable'
19
- require 'fluent/engine'
20
- require 'fluent/event'
21
- require 'fluent/log'
17
+ require 'fluent/compat/filter'
22
18
 
23
19
  module Fluent
24
- class Filter
25
- include Configurable
26
- include PluginId
27
- include PluginLoggerMixin
28
-
29
- attr_accessor :router
30
-
31
- def initialize
32
- super
33
- end
34
-
35
- def configure(conf)
36
- super
37
-
38
- if label_name = conf['@label']
39
- label = Engine.root_agent.find_label(label_name)
40
- @router = label.event_router
41
- elsif @router.nil?
42
- @router = Engine.root_agent.event_router
43
- end
44
- end
45
-
46
- def start
47
- end
48
-
49
- def shutdown
50
- end
51
-
52
- def filter(tag, time, record)
53
- raise NotImplementedError, "Implement this method in child class"
54
- end
55
-
56
- def filter_stream(tag, es)
57
- new_es = MultiEventStream.new
58
- es.each { |time, record|
59
- begin
60
- filtered_record = filter(tag, time, record)
61
- new_es.add(time, filtered_record) if filtered_record
62
- rescue => e
63
- router.emit_error_event(tag, time, record, e)
64
- end
65
- }
66
- new_es
67
- end
68
- end
20
+ Filter = Fluent::Compat::Filter
69
21
  end
@@ -14,299 +14,10 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- require 'fluent/configurable'
18
- require 'fluent/env'
19
- require 'fluent/registry'
20
- require 'fluent/mixin'
17
+ require 'fluent/compat/formatter'
21
18
 
22
19
  module Fluent
23
- class Formatter
24
- include Configurable
25
-
26
- def configure(conf)
27
- super
28
- end
29
-
30
- def format(tag, time, record)
31
- raise NotImplementedError, "Implement this method in child class"
32
- end
33
- end
34
-
35
- module TextFormatter
36
- module HandleTagAndTimeMixin
37
- def self.included(klass)
38
- klass.instance_eval {
39
- config_param :include_time_key, :bool, default: false
40
- config_param :time_key, :string, default: 'time'
41
- config_param :time_format, :string, default: nil
42
- config_param :include_tag_key, :bool, default: false
43
- config_param :tag_key, :string, default: 'tag'
44
- config_param :localtime, :bool, default: true
45
- config_param :timezone, :string, default: nil
46
- }
47
- end
48
-
49
- def configure(conf)
50
- super
51
-
52
- if conf['utc']
53
- @localtime = false
54
- end
55
- @timef = TimeFormatter.new(@time_format, @localtime, @timezone)
56
- end
57
-
58
- def filter_record(tag, time, record)
59
- if @include_tag_key
60
- record[@tag_key] = tag
61
- end
62
- if @include_time_key
63
- record[@time_key] = @timef.format(time)
64
- end
65
- end
66
- end
67
-
68
- class OutFileFormatter < Formatter
69
- include HandleTagAndTimeMixin
70
-
71
- config_param :output_time, :bool, default: true
72
- config_param :output_tag, :bool, default: true
73
- config_param :delimiter, default: "\t" do |val|
74
- case val
75
- when /SPACE/i then ' '
76
- when /COMMA/i then ','
77
- else "\t"
78
- end
79
- end
80
-
81
- def format(tag, time, record)
82
- filter_record(tag, time, record)
83
- header = ''
84
- header << "#{@timef.format(time)}#{@delimiter}" if @output_time
85
- header << "#{tag}#{@delimiter}" if @output_tag
86
- "#{header}#{Yajl.dump(record)}\n"
87
- end
88
- end
89
-
90
- class StdoutFormatter < Formatter
91
- config_param :output_type, :string, default: 'json'
92
-
93
- def configure(conf)
94
- super
95
-
96
- @formatter = Plugin.new_formatter(@output_type)
97
- @formatter.configure(conf)
98
- end
99
-
100
- def format(tag, time, record)
101
- header = "#{Time.now.localtime} #{tag}: "
102
- "#{header}#{@formatter.format(tag, time, record)}"
103
- end
104
- end
105
-
106
- module StructuredFormatMixin
107
- def self.included(klass)
108
- klass.instance_eval {
109
- config_param :time_as_epoch, :bool, default: false
110
- }
111
- end
112
-
113
- def configure(conf)
114
- super
115
-
116
- if @time_as_epoch
117
- if @include_time_key
118
- @include_time_key = false
119
- else
120
- $log.warn "include_time_key is false so ignore time_as_epoch"
121
- @time_as_epoch = false
122
- end
123
- end
124
- end
125
-
126
- def format(tag, time, record)
127
- filter_record(tag, time, record)
128
- record[@time_key] = time if @time_as_epoch
129
- format_record(record)
130
- end
131
- end
132
-
133
- class JSONFormatter < Formatter
134
- include HandleTagAndTimeMixin
135
- include StructuredFormatMixin
136
-
137
- config_param :json_parser, :string, default: 'oj'
138
- config_param :add_newline, :bool, default: true
139
-
140
- def configure(conf)
141
- super
142
-
143
- begin
144
- raise LoadError unless @json_parser == 'oj'
145
- require 'oj'
146
- Oj.default_options = Fluent::DEFAULT_OJ_OPTIONS
147
- @dump_proc = Oj.method(:dump)
148
- rescue LoadError
149
- @dump_proc = Yajl.method(:dump)
150
- end
151
-
152
- # format json is used on various highload environment, so re-define method to skip if check
153
- unless @add_newline
154
- define_singleton_method(:format, method(:format_without_nl))
155
- end
156
- end
157
-
158
- def format_record(record)
159
- "#{@dump_proc.call(record)}\n"
160
- end
161
-
162
- def format_without_nl(tag, time, record)
163
- @dump_proc.call(record)
164
- end
165
- end
166
-
167
- class HashFormatter < Formatter
168
- include HandleTagAndTimeMixin
169
- include StructuredFormatMixin
170
-
171
- config_param :add_newline, :bool, default: true
172
-
173
- def format_record(record)
174
- if @add_newline
175
- "#{record.to_s}\n"
176
- else
177
- record.to_s
178
- end
179
- end
180
- end
181
-
182
- class MessagePackFormatter < Formatter
183
- include HandleTagAndTimeMixin
184
- include StructuredFormatMixin
185
-
186
- def format_record(record)
187
- record.to_msgpack
188
- end
189
- end
190
-
191
- class LabeledTSVFormatter < Formatter
192
- include HandleTagAndTimeMixin
193
-
194
- config_param :delimiter, :string, default: "\t"
195
- config_param :label_delimiter, :string, default: ":"
196
- config_param :add_newline, :bool, default: true
197
-
198
- def format(tag, time, record)
199
- filter_record(tag, time, record)
200
- formatted = record.inject('') { |result, pair|
201
- result << @delimiter if result.length.nonzero?
202
- result << "#{pair.first}#{@label_delimiter}#{pair.last}"
203
- }
204
- formatted << "\n".freeze if @add_newline
205
- formatted
206
- end
207
- end
208
-
209
- class CsvFormatter < Formatter
210
- include HandleTagAndTimeMixin
211
-
212
- config_param :delimiter, default: ',' do |val|
213
- ['\t', 'TAB'].include?(val) ? "\t" : val
214
- end
215
- config_param :force_quotes, :bool, default: true
216
- config_param :fields, :array, value_type: :string
217
- config_param :add_newline, :bool, default: true
218
-
219
- def initialize
220
- super
221
- require 'csv'
222
- end
223
-
224
- def configure(conf)
225
- super
226
- @fields = fields.select { |f| !f.empty? }
227
- raise ConfigError, "empty value is specified in fields parameter" if @fields.empty?
228
-
229
- @generate_opts = {col_sep: @delimiter, force_quotes: @force_quotes}
230
- end
231
-
232
- def format(tag, time, record)
233
- filter_record(tag, time, record)
234
- row = @fields.inject([]) do |memo, key|
235
- memo << record[key]
236
- memo
237
- end
238
- line = CSV.generate_line(row, @generate_opts)
239
- line.chomp! unless @add_newline
240
- line
241
- end
242
- end
243
-
244
- class SingleValueFormatter < Formatter
245
- config_param :message_key, :string, default: 'message'
246
- config_param :add_newline, :bool, default: true
247
-
248
- def format(tag, time, record)
249
- text = record[@message_key].to_s.dup
250
- text << "\n" if @add_newline
251
- text
252
- end
253
- end
254
-
255
- class ProcWrappedFormatter < Formatter
256
- def initialize(proc)
257
- @proc = proc
258
- end
259
-
260
- def configure(conf)
261
- end
262
-
263
- def format(tag, time, record)
264
- @proc.call(tag, time, record)
265
- end
266
- end
267
-
268
- TEMPLATE_REGISTRY = Registry.new(:formatter_type, 'fluent/plugin/formatter_')
269
- {
270
- 'out_file' => Proc.new { OutFileFormatter.new },
271
- 'stdout' => Proc.new { StdoutFormatter.new },
272
- 'json' => Proc.new { JSONFormatter.new },
273
- 'hash' => Proc.new { HashFormatter.new },
274
- 'msgpack' => Proc.new { MessagePackFormatter.new },
275
- 'ltsv' => Proc.new { LabeledTSVFormatter.new },
276
- 'csv' => Proc.new { CsvFormatter.new },
277
- 'single_value' => Proc.new { SingleValueFormatter.new },
278
- }.each { |name, factory|
279
- TEMPLATE_REGISTRY.register(name, factory)
280
- }
281
-
282
- def self.register_template(name, factory_or_proc)
283
- factory = if factory_or_proc.is_a?(Class) # XXXFormatter
284
- Proc.new { factory_or_proc.new }
285
- elsif factory_or_proc.arity == 3 # Proc.new { |tag, time, record| }
286
- Proc.new { ProcWrappedFormatter.new(factory_or_proc) }
287
- else # Proc.new { XXXFormatter.new }
288
- factory_or_proc
289
- end
290
-
291
- TEMPLATE_REGISTRY.register(name, factory)
292
- end
293
-
294
- def self.lookup(format)
295
- TEMPLATE_REGISTRY.lookup(format).call
296
- end
297
-
298
- # Keep backward-compatibility
299
- def self.create(conf)
300
- format = conf['format']
301
- if format.nil?
302
- raise ConfigError, "'format' parameter is required"
303
- end
304
-
305
- formatter = lookup(format)
306
- if formatter.respond_to?(:configure)
307
- formatter.configure(conf)
308
- end
309
- formatter
310
- end
311
- end
20
+ Formatter = Fluent::Compat::Formatter
21
+ TextFormatter = Fluent::Compat::TextFormatter
22
+ # deprecate_constant is ruby 2.3 feature
312
23
  end
data/lib/fluent/input.rb CHANGED
@@ -14,38 +14,8 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- require 'fluent/config'
18
- require 'fluent/configurable'
19
- require 'fluent/engine'
20
- require 'fluent/log'
17
+ require 'fluent/compat/input'
21
18
 
22
19
  module Fluent
23
- class Input
24
- include Configurable
25
- include PluginId
26
- include PluginLoggerMixin
27
-
28
- attr_accessor :router
29
-
30
- def initialize
31
- super
32
- end
33
-
34
- def configure(conf)
35
- super
36
-
37
- if label_name = conf['@label']
38
- label = Engine.root_agent.find_label(label_name)
39
- @router = label.event_router
40
- elsif @router.nil?
41
- @router = Engine.root_agent.event_router
42
- end
43
- end
44
-
45
- def start
46
- end
47
-
48
- def shutdown
49
- end
50
- end
20
+ Input = Fluent::Compat::Input
51
21
  end
data/lib/fluent/label.rb CHANGED
@@ -18,8 +18,8 @@ require 'fluent/agent'
18
18
 
19
19
  module Fluent
20
20
  class Label < Agent
21
- def initialize(name, opts = {})
22
- super(opts)
21
+ def initialize(name, log:)
22
+ super(log: log)
23
23
 
24
24
  @context = name
25
25
  @root_agent = nil
@@ -27,6 +27,14 @@ module Fluent
27
27
 
28
28
  attr_accessor :root_agent
29
29
 
30
+ def configure(conf)
31
+ super
32
+
33
+ if conf.elements('match').size == 0
34
+ raise ConfigError, "Missing <match> sections in <label #{@context}> section"
35
+ end
36
+ end
37
+
30
38
  def emit_error_event(tag, time, record, e)
31
39
  @root_agent.emit_error_event(tag, time, record, e)
32
40
  end
data/lib/fluent/load.rb CHANGED
@@ -9,26 +9,26 @@ require 'json'
9
9
  require 'yajl'
10
10
  require 'uri'
11
11
  require 'msgpack'
12
+ require 'strptime'
12
13
  begin
13
14
  require 'sigdump/setup'
14
15
  rescue
15
16
  # ignore setup error on Win or similar platform which doesn't support signal
16
17
  end
17
18
  require 'cool.io'
19
+
20
+ require 'fluent/time'
18
21
  require 'fluent/env'
19
22
  require 'fluent/version'
20
23
  require 'fluent/log'
21
- require 'fluent/status'
22
24
  require 'fluent/config'
23
25
  require 'fluent/engine'
24
26
  require 'fluent/rpc'
25
27
  require 'fluent/mixin'
26
- require 'fluent/process'
27
28
  require 'fluent/plugin'
28
29
  require 'fluent/parser'
29
30
  require 'fluent/formatter'
30
31
  require 'fluent/event'
31
- require 'fluent/buffer'
32
32
  require 'fluent/input'
33
33
  require 'fluent/output'
34
34
  require 'fluent/filter'