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
@@ -17,8 +17,12 @@
17
17
  require 'optparse'
18
18
 
19
19
  require 'fluent/supervisor'
20
+ require 'fluent/log'
21
+ require 'fluent/env'
20
22
  require 'fluent/version'
21
23
 
24
+ $fluentdargv = Marshal.load(Marshal.dump(ARGV))
25
+
22
26
  op = OptionParser.new
23
27
  op.version = Fluent::VERSION
24
28
 
@@ -36,7 +40,7 @@ op.on('--dry-run', "Check fluentd setup is correct or not", TrueClass) {|b|
36
40
  opts[:dry_run] = b
37
41
  }
38
42
 
39
- op.on('--show-plugin-config=PLUGIN', "Show PLUGIN configuration and exit(ex: input:dummy)") {|plugin|
43
+ op.on('--show-plugin-config=PLUGIN', "[DEPRECATED] Show PLUGIN configuration and exit(ex: input:dummy)") {|plugin|
40
44
  opts[:show_plugin_config] = plugin
41
45
  }
42
46
 
@@ -56,10 +60,19 @@ op.on('-d', '--daemon PIDFILE', "daemonize fluent process") {|s|
56
60
  opts[:daemonize] = s
57
61
  }
58
62
 
59
- op.on('--no-supervisor', "run without fluent supervisor") {
63
+ op.on('--under-supervisor', "run fluent worker under supervisor (this option is NOT for users)") {
60
64
  opts[:supervise] = false
61
65
  }
62
66
 
67
+ op.on('--no-supervisor', "run fluent worker without supervisor") {
68
+ opts[:supervise] = false
69
+ opts[:standalone_worker] = true
70
+ }
71
+
72
+ op.on('--workers NUM', "specify the number of workers under supervisor") { |i|
73
+ opts[:workers] = i.to_i
74
+ }
75
+
63
76
  op.on('--user USER', "change user") {|s|
64
77
  opts[:chuser] = s
65
78
  }
@@ -72,7 +85,28 @@ op.on('-o', '--log PATH', "log file path") {|s|
72
85
  opts[:log_path] = s
73
86
  }
74
87
 
75
- op.on('-i', '--inline-config CONFIG_STRING', "inline config which is appended to the config file on-fly") {|s|
88
+ ROTATE_AGE = %w(daily weekly monthly)
89
+ op.on('--log-rotate-age AGE', 'generations to keep rotated log files') {|age|
90
+ if ROTATE_AGE.include?(age)
91
+ opts[:log_rotate_age] = age
92
+ else
93
+ begin
94
+ opts[:log_rotate_age] = Integer(age)
95
+ rescue TypeError, ArgumentError
96
+ usage "log-rotate-age should be #{ROTATE_AGE.join(', ')} or a number"
97
+ end
98
+ end
99
+ }
100
+
101
+ op.on('--log-rotate-size BYTES', 'sets the byte size to rotate log files') {|s|
102
+ opts[:log_rotate_size] = s.to_i
103
+ }
104
+
105
+ op.on('--log-event-verbose', 'enable log events during process startup/shutdown') {|b|
106
+ opts[:log_event_verbose] = b
107
+ }
108
+
109
+ op.on('-i', '--inline-config CONFIG_STRING', "inline config which is appended to the config file on-the-fly") {|s|
76
110
  opts[:inline_config] = s
77
111
  }
78
112
 
@@ -121,7 +155,51 @@ op.on('-G', '--gem-path GEM_INSTALL_PATH', "Gemfile install path (default: $(dir
121
155
  opts[:gem_install_path] = s
122
156
  }
123
157
 
124
- (class << self; self; end).module_eval do
158
+ op.on('--conf-encoding ENCODING', "specify configuration file encoding") { |s|
159
+ opts[:conf_encoding] = s
160
+ }
161
+
162
+ if Fluent.windows?
163
+ require 'windows/library'
164
+ include Windows::Library
165
+
166
+ opts.merge!(
167
+ :winsvc_name => 'fluentdwinsvc',
168
+ :winsvc_display_name => 'Fluentd Windows Service',
169
+ :winsvc_desc => 'Fluentd is an event collector system.',
170
+ )
171
+
172
+ op.on('-x', '--signame INTSIGNAME', "an object name which is used for Windows Service signal (Windows only)") {|s|
173
+ opts[:signame] = s
174
+ }
175
+
176
+ op.on('--reg-winsvc MODE', "install/uninstall as Windows Service. (i: install, u: uninstall) (Windows only)") {|s|
177
+ opts[:regwinsvc] = s
178
+ }
179
+
180
+ op.on('--[no-]reg-winsvc-auto-start', "Automatically start the Windows Service at boot. (only effective with '--reg-winsvc i') (Windows only)") {|s|
181
+ opts[:regwinsvcautostart] = s
182
+ }
183
+
184
+ op.on('--reg-winsvc-fluentdopt OPTION', "specify fluentd option parameters for Windows Service. (Windows only)") {|s|
185
+ opts[:fluentdopt] = s
186
+ }
187
+
188
+ op.on('--winsvc-name NAME', "The Windows Service name to run as (Windows only)") {|s|
189
+ opts[:winsvc_name] = s
190
+ }
191
+
192
+ op.on('--winsvc-display-name DISPLAY_NAME', "The Windows Service display name (Windows only)") {|s|
193
+ opts[:winsvc_display_name] = s
194
+ }
195
+
196
+ op.on('--winsvc-desc DESC', "The Windows Service description (Windows only)") {|s|
197
+ opts[:winsvc_desc] = s
198
+ }
199
+ end
200
+
201
+
202
+ singleton_class.module_eval do
125
203
  define_method(:usage) do |msg|
126
204
  puts op.to_s
127
205
  puts "error: #{msg}" if msg
@@ -170,4 +248,74 @@ if setup_path = opts[:setup_path]
170
248
  exit 0
171
249
  end
172
250
 
173
- Fluent::Supervisor.new(opts).start
251
+ early_exit = false
252
+ start_service = false
253
+ if winsvcinstmode = opts[:regwinsvc]
254
+ require 'fileutils'
255
+ require "win32/service"
256
+ require "win32/registry"
257
+ include Win32
258
+
259
+ case winsvcinstmode
260
+ when 'i'
261
+ binary_path = File.join(File.dirname(__FILE__), "..")
262
+ ruby_path = "\0" * 256
263
+ GetModuleFileName.call(0,ruby_path,256)
264
+ ruby_path = ruby_path.rstrip.gsub(/\\/, '/')
265
+ start_type = Service::DEMAND_START
266
+ if opts[:regwinsvcautostart]
267
+ start_type = Service::AUTO_START
268
+ start_service = true
269
+ end
270
+
271
+
272
+ Service.create(
273
+ service_name: opts[:winsvc_name],
274
+ host: nil,
275
+ service_type: Service::WIN32_OWN_PROCESS,
276
+ description: opts[:winsvc_desc],
277
+ start_type: start_type,
278
+ error_control: Service::ERROR_NORMAL,
279
+ binary_path_name: "\"#{ruby_path}\" -C \"#{binary_path}\" winsvc.rb --service-name #{opts[:winsvc_name]}",
280
+ load_order_group: "",
281
+ dependencies: [""],
282
+ display_name: opts[:winsvc_display_name]
283
+ )
284
+ when 'u'
285
+ if Service.status(opts[:winsvc_name]).current_state != 'stopped'
286
+ begin
287
+ Service.stop(opts[:winsvc_name])
288
+ rescue => ex
289
+ puts "Warning: Failed to stop service: ", ex
290
+ end
291
+ end
292
+ Service.delete(opts[:winsvc_name])
293
+ else
294
+ # none
295
+ end
296
+ early_exit = true
297
+ end
298
+
299
+ if fluentdopt = opts[:fluentdopt]
300
+ Win32::Registry::HKEY_LOCAL_MACHINE.open("SYSTEM\\CurrentControlSet\\Services\\#{opts[:winsvc_name]}", Win32::Registry::KEY_ALL_ACCESS) do |reg|
301
+ reg['fluentdopt', Win32::Registry::REG_SZ] = fluentdopt
302
+ end
303
+ early_exit = true
304
+ end
305
+
306
+ if start_service
307
+ Service.start(opts[:winsvc_name])
308
+ end
309
+
310
+ exit 0 if early_exit
311
+
312
+ require 'fluent/supervisor'
313
+ if opts[:supervise]
314
+ Fluent::Supervisor.new(opts).run_supervisor
315
+ else
316
+ if opts[:standalone_worker] && opts[:workers] && opts[:workers] > 1
317
+ puts "Error: multi workers is not supported with --no-supervisor"
318
+ exit 2
319
+ end
320
+ Fluent::Supervisor.new(opts).run_worker
321
+ end
@@ -0,0 +1,292 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require "erb"
18
+ require "optparse"
19
+ require "pathname"
20
+ require "fluent/plugin"
21
+ require "fluent/env"
22
+ require "fluent/engine"
23
+ require "fluent/system_config"
24
+ require "fluent/config/element"
25
+ require 'fluent/version'
26
+
27
+ class FluentPluginConfigFormatter
28
+
29
+ AVAILABLE_FORMATS = [:markdown, :txt, :json]
30
+ SUPPORTED_TYPES = [
31
+ "input", "output", "filter",
32
+ "buffer", "parser", "formatter", "storage"
33
+ ]
34
+
35
+ DOCS_BASE_URL = "https://docs.fluentd.org/v/1.0"
36
+ DOCS_PLUGIN_HELPER_BASE_URL = "#{DOCS_BASE_URL}/plugin-helper-overview/"
37
+
38
+ def initialize(argv = ARGV)
39
+ @argv = argv
40
+
41
+ @compact = false
42
+ @format = :markdown
43
+ @verbose = false
44
+ @libs = []
45
+ @plugin_dirs = []
46
+ @options = {}
47
+
48
+ prepare_option_parser
49
+ end
50
+
51
+ def call
52
+ parse_options!
53
+ init_libraries
54
+ @plugin = Fluent::Plugin.__send__("new_#{@plugin_type}", @plugin_name)
55
+ dumped_config = {}
56
+ if @plugin.class.respond_to?(:plugin_helpers)
57
+ dumped_config[:plugin_helpers] = @plugin.class.plugin_helpers
58
+ end
59
+ @plugin.class.ancestors.reverse_each do |plugin_class|
60
+ next unless plugin_class.respond_to?(:dump_config_definition)
61
+ unless @verbose
62
+ next if plugin_class.name =~ /::PluginHelper::/
63
+ end
64
+ dumped_config_definition = plugin_class.dump_config_definition
65
+ dumped_config[plugin_class.name] = dumped_config_definition unless dumped_config_definition.empty?
66
+ end
67
+ case @format
68
+ when :txt
69
+ puts dump_txt(dumped_config)
70
+ when :markdown
71
+ puts dump_markdown(dumped_config)
72
+ when :json
73
+ puts dump_json(dumped_config)
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ def dump_txt(dumped_config)
80
+ dumped = ""
81
+ plugin_helpers = dumped_config.delete(:plugin_helpers)
82
+ if plugin_helpers && !plugin_helpers.empty?
83
+ dumped << "helpers: #{plugin_helpers.join(',')}\n"
84
+ end
85
+ if @verbose
86
+ dumped_config.each do |name, config|
87
+ dumped << "#{name}\n"
88
+ dumped << dump_section_txt(config)
89
+ end
90
+ else
91
+ configs = dumped_config.values
92
+ root_section = configs.shift
93
+ configs.each do |config|
94
+ root_section.update(config)
95
+ end
96
+ dumped << dump_section_txt(root_section)
97
+ end
98
+ dumped
99
+ end
100
+
101
+ def dump_section_txt(base_section, level = 0)
102
+ dumped = ""
103
+ indent = " " * level
104
+ if base_section[:section]
105
+ sections = []
106
+ params = base_section
107
+ else
108
+ sections, params = base_section.partition {|_name, value| value[:section] }
109
+ end
110
+ params.each do |name, config|
111
+ next if name == :section
112
+ dumped << "#{indent}#{name}: #{config[:type]}: (#{config[:default].inspect})"
113
+ dumped << " # #{config[:description]}" if config.key?(:description)
114
+ dumped << "\n"
115
+ end
116
+ sections.each do |section_name, sub_section|
117
+ required = sub_section.delete(:required)
118
+ multi = sub_section.delete(:multi)
119
+ alias_name = sub_section.delete(:alias)
120
+ required_label = required ? "required" : "optional"
121
+ multi_label = multi ? "multiple" : "single"
122
+ alias_label = "alias: #{alias_name}"
123
+ dumped << "#{indent}<#{section_name}>: #{required_label}, #{multi_label}"
124
+ if alias_name
125
+ dumped << ", #{alias_label}\n"
126
+ else
127
+ dumped << "\n"
128
+ end
129
+ sub_section.delete(:section)
130
+ dumped << dump_section_txt(sub_section, level + 1)
131
+ end
132
+ dumped
133
+ end
134
+
135
+ def dump_markdown(dumped_config)
136
+ dumped = ""
137
+ plugin_helpers = dumped_config.delete(:plugin_helpers)
138
+ if plugin_helpers && !plugin_helpers.empty?
139
+ dumped = "## Plugin helpers\n\n"
140
+ plugin_helpers.each do |plugin_helper|
141
+ dumped << "* #{plugin_helper_markdown_link(plugin_helper)}\n"
142
+ end
143
+ dumped << "\n"
144
+ end
145
+ dumped_config.each do |name, config|
146
+ if name == @plugin.class.name
147
+ dumped << "## #{name}\n\n"
148
+ dumped << dump_section_markdown(config)
149
+ else
150
+ dumped << "* See also: #{plugin_overview_markdown_link(name)}\n\n"
151
+ end
152
+ end
153
+ dumped
154
+ end
155
+
156
+ def dump_section_markdown(base_section, level = 0)
157
+ dumped = ""
158
+ if base_section[:section]
159
+ sections = []
160
+ params = base_section
161
+ else
162
+ sections, params = base_section.partition {|_name, value| value[:section] }
163
+ end
164
+ params.each do |name, config|
165
+ next if name == :section
166
+ template_name = @compact ? "param.md-compact.erb" : "param.md.erb"
167
+ template = template_path(template_name).read
168
+ dumped <<
169
+ if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+
170
+ ERB.new(template, trim_mode: "-")
171
+ else
172
+ ERB.new(template, nil, "-")
173
+ end.result(binding)
174
+ end
175
+ dumped << "\n"
176
+ sections.each do |section_name, sub_section|
177
+ required = sub_section.delete(:required)
178
+ multi = sub_section.delete(:multi)
179
+ alias_name = sub_section.delete(:alias)
180
+ sub_section.delete(:section)
181
+ template = template_path("section.md.erb").read
182
+ dumped <<
183
+ if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+
184
+ ERB.new(template, trim_mode: "-")
185
+ else
186
+ ERB.new(template, nil, "-")
187
+ end.result(binding)
188
+ end
189
+ dumped
190
+ end
191
+
192
+ def dump_json(dumped_config)
193
+ if @compact
194
+ JSON.generate(dumped_config)
195
+ else
196
+ JSON.pretty_generate(dumped_config)
197
+ end
198
+ end
199
+
200
+ def plugin_helper_url(plugin_helper)
201
+ "#{DOCS_PLUGIN_HELPER_BASE_URL}api-plugin-helper-#{plugin_helper}"
202
+ end
203
+
204
+ def plugin_helper_markdown_link(plugin_helper)
205
+ "[#{plugin_helper}](#{plugin_helper_url(plugin_helper)})"
206
+ end
207
+
208
+ def plugin_overview_url(class_name)
209
+ plugin_type = class_name.slice(/::(\w+)\z/, 1).downcase
210
+ "#{DOCS_BASE_URL}/#{plugin_type}#overview"
211
+ end
212
+
213
+ def plugin_overview_markdown_link(class_name)
214
+ plugin_type = class_name.slice(/::(\w+)\z/, 1)
215
+ "[#{plugin_type} Plugin Overview](#{plugin_overview_url(class_name)})"
216
+ end
217
+
218
+ def usage(message = nil)
219
+ puts @parser.to_s
220
+ puts
221
+ puts "Error: #{message}" if message
222
+ exit(false)
223
+ end
224
+
225
+ def prepare_option_parser
226
+ @parser = OptionParser.new
227
+ @parser.version = Fluent::VERSION
228
+ @parser.banner = <<BANNER
229
+ Usage: #{$0} [options] <type> <name>
230
+
231
+ Output plugin config definitions
232
+
233
+ Arguments:
234
+ \ttype: #{SUPPORTED_TYPES.join(",")}
235
+ \tname: registered plugin name
236
+
237
+ Options:
238
+ BANNER
239
+ @parser.on("--verbose", "Be verbose") do
240
+ @verbose = true
241
+ end
242
+ @parser.on("-c", "--compact", "Compact output") do
243
+ @compact = true
244
+ end
245
+ @parser.on("-f", "--format=FORMAT", "Specify format. (#{AVAILABLE_FORMATS.join(',')})") do |s|
246
+ format = s.to_sym
247
+ usage("Unsupported format: #{s}") unless AVAILABLE_FORMATS.include?(format)
248
+ @format = format
249
+ end
250
+ @parser.on("-I PATH", "Add PATH to $LOAD_PATH") do |s|
251
+ $LOAD_PATH.unshift(s)
252
+ end
253
+ @parser.on("-r NAME", "Load library") do |s|
254
+ @libs << s
255
+ end
256
+ @parser.on("-p", "--plugin=DIR", "Add plugin directory") do |s|
257
+ @plugin_dirs << s
258
+ end
259
+ end
260
+
261
+ def parse_options!
262
+ @parser.parse!(@argv)
263
+
264
+ raise "Must specify plugin type and name" unless @argv.size == 2
265
+
266
+ @plugin_type, @plugin_name = @argv
267
+ @options = {
268
+ compact: @compact,
269
+ format: @format,
270
+ verbose: @verbose,
271
+ }
272
+ rescue => e
273
+ usage(e)
274
+ end
275
+
276
+ def init_libraries
277
+ @libs.each do |lib|
278
+ require lib
279
+ end
280
+
281
+ @plugin_dirs.each do |dir|
282
+ if Dir.exist?(dir)
283
+ dir = File.expand_path(dir)
284
+ Fluent::Plugin.add_plugin_dir(dir)
285
+ end
286
+ end
287
+ end
288
+
289
+ def template_path(name)
290
+ (Pathname(__dir__) + "../../../templates/plugin_config_formatter/#{name}").realpath
291
+ end
292
+ end