fluentd 0.12.40 → 1.6.2

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

Potentially problematic release.


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

Files changed (428) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  4. data/.github/ISSUE_TEMPLATE.md +17 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  6. data/.gitignore +5 -0
  7. data/.gitlab/cicd-template.yaml +10 -0
  8. data/.gitlab-ci.yml +147 -0
  9. data/.travis.yml +56 -20
  10. data/ADOPTERS.md +5 -0
  11. data/CHANGELOG.md +1369 -0
  12. data/CONTRIBUTING.md +16 -5
  13. data/GOVERNANCE.md +55 -0
  14. data/Gemfile +5 -0
  15. data/GithubWorkflow.md +78 -0
  16. data/LICENSE +202 -0
  17. data/MAINTAINERS.md +7 -0
  18. data/README.md +23 -11
  19. data/Rakefile +48 -2
  20. data/Vagrantfile +17 -0
  21. data/appveyor.yml +37 -0
  22. data/bin/fluent-binlog-reader +7 -0
  23. data/bin/fluent-ca-generate +6 -0
  24. data/bin/fluent-plugin-config-format +5 -0
  25. data/bin/fluent-plugin-generate +5 -0
  26. data/bin/fluentd +3 -0
  27. data/code-of-conduct.md +3 -0
  28. data/example/copy_roundrobin.conf +39 -0
  29. data/example/counter.conf +18 -0
  30. data/example/in_dummy_blocks.conf +17 -0
  31. data/example/in_dummy_with_compression.conf +23 -0
  32. data/example/in_forward.conf +7 -0
  33. data/example/in_forward_client.conf +37 -0
  34. data/example/in_forward_shared_key.conf +15 -0
  35. data/example/in_forward_tls.conf +14 -0
  36. data/example/in_forward_users.conf +24 -0
  37. data/example/in_forward_workers.conf +21 -0
  38. data/example/in_http.conf +3 -1
  39. data/example/in_out_forward.conf +17 -0
  40. data/example/logevents.conf +25 -0
  41. data/example/multi_filters.conf +61 -0
  42. data/example/out_exec_filter.conf +42 -0
  43. data/example/out_forward.conf +13 -13
  44. data/example/out_forward_buf_file.conf +23 -0
  45. data/example/out_forward_client.conf +109 -0
  46. data/example/out_forward_heartbeat_none.conf +16 -0
  47. data/example/out_forward_shared_key.conf +36 -0
  48. data/example/out_forward_tls.conf +18 -0
  49. data/example/out_forward_users.conf +65 -0
  50. data/example/out_null.conf +36 -0
  51. data/example/secondary_file.conf +42 -0
  52. data/example/suppress_config_dump.conf +7 -0
  53. data/example/worker_section.conf +36 -0
  54. data/fluent.conf +29 -0
  55. data/fluentd.gemspec +21 -11
  56. data/lib/fluent/agent.rb +67 -90
  57. data/lib/fluent/clock.rb +62 -0
  58. data/lib/fluent/command/binlog_reader.rb +244 -0
  59. data/lib/fluent/command/ca_generate.rb +181 -0
  60. data/lib/fluent/command/cat.rb +42 -18
  61. data/lib/fluent/command/debug.rb +12 -10
  62. data/lib/fluent/command/fluentd.rb +153 -5
  63. data/lib/fluent/command/plugin_config_formatter.rb +292 -0
  64. data/lib/fluent/command/plugin_generator.rb +324 -0
  65. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  66. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  67. data/lib/fluent/compat/exec_util.rb +129 -0
  68. data/lib/fluent/compat/file_util.rb +54 -0
  69. data/lib/fluent/compat/filter.rb +68 -0
  70. data/lib/fluent/compat/formatter.rb +111 -0
  71. data/lib/fluent/compat/formatter_utils.rb +85 -0
  72. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  73. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  74. data/lib/fluent/compat/input.rb +49 -0
  75. data/lib/fluent/compat/output.rb +718 -0
  76. data/lib/fluent/compat/output_chain.rb +60 -0
  77. data/lib/fluent/compat/parser.rb +310 -0
  78. data/lib/fluent/compat/parser_utils.rb +40 -0
  79. data/lib/fluent/compat/propagate_default.rb +62 -0
  80. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  81. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  82. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  83. data/lib/fluent/compat/socket_util.rb +165 -0
  84. data/lib/fluent/compat/string_util.rb +34 -0
  85. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  86. data/lib/fluent/compat/type_converter.rb +90 -0
  87. data/lib/fluent/config/configure_proxy.rb +210 -62
  88. data/lib/fluent/config/dsl.rb +12 -5
  89. data/lib/fluent/config/element.rb +107 -9
  90. data/lib/fluent/config/literal_parser.rb +9 -3
  91. data/lib/fluent/config/parser.rb +4 -4
  92. data/lib/fluent/config/section.rb +51 -14
  93. data/lib/fluent/config/types.rb +28 -13
  94. data/lib/fluent/config/v1_parser.rb +3 -5
  95. data/lib/fluent/config.rb +23 -20
  96. data/lib/fluent/configurable.rb +79 -21
  97. data/lib/fluent/counter/base_socket.rb +46 -0
  98. data/lib/fluent/counter/client.rb +297 -0
  99. data/lib/fluent/counter/error.rb +86 -0
  100. data/lib/fluent/counter/mutex_hash.rb +163 -0
  101. data/lib/fluent/counter/server.rb +273 -0
  102. data/lib/fluent/counter/store.rb +205 -0
  103. data/lib/fluent/counter/validator.rb +145 -0
  104. data/lib/fluent/counter.rb +23 -0
  105. data/lib/fluent/daemon.rb +15 -0
  106. data/lib/fluent/engine.rb +102 -65
  107. data/lib/fluent/env.rb +7 -3
  108. data/lib/fluent/error.rb +30 -0
  109. data/lib/fluent/event.rb +197 -21
  110. data/lib/fluent/event_router.rb +93 -10
  111. data/lib/fluent/filter.rb +2 -50
  112. data/lib/fluent/formatter.rb +4 -293
  113. data/lib/fluent/input.rb +2 -32
  114. data/lib/fluent/label.rb +10 -2
  115. data/lib/fluent/load.rb +3 -3
  116. data/lib/fluent/log.rb +348 -81
  117. data/lib/fluent/match.rb +37 -36
  118. data/lib/fluent/mixin.rb +12 -176
  119. data/lib/fluent/msgpack_factory.rb +62 -0
  120. data/lib/fluent/output.rb +10 -612
  121. data/lib/fluent/output_chain.rb +23 -0
  122. data/lib/fluent/parser.rb +4 -800
  123. data/lib/fluent/plugin/bare_output.rb +63 -0
  124. data/lib/fluent/plugin/base.rb +192 -0
  125. data/lib/fluent/plugin/buf_file.rb +128 -174
  126. data/lib/fluent/plugin/buf_memory.rb +9 -92
  127. data/lib/fluent/plugin/buffer/chunk.rb +221 -0
  128. data/lib/fluent/plugin/buffer/file_chunk.rb +383 -0
  129. data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
  130. data/lib/fluent/plugin/buffer.rb +779 -0
  131. data/lib/fluent/plugin/compressable.rb +92 -0
  132. data/lib/fluent/plugin/exec_util.rb +3 -108
  133. data/lib/fluent/plugin/file_util.rb +4 -34
  134. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  135. data/lib/fluent/plugin/filter.rb +93 -0
  136. data/lib/fluent/plugin/filter_grep.rb +117 -34
  137. data/lib/fluent/plugin/filter_parser.rb +85 -62
  138. data/lib/fluent/plugin/filter_record_transformer.rb +27 -39
  139. data/lib/fluent/plugin/filter_stdout.rb +15 -12
  140. data/lib/fluent/plugin/formatter.rb +50 -0
  141. data/lib/fluent/plugin/formatter_csv.rb +52 -0
  142. data/lib/fluent/plugin/formatter_hash.rb +33 -0
  143. data/lib/fluent/plugin/formatter_json.rb +55 -0
  144. data/lib/fluent/plugin/formatter_ltsv.rb +42 -0
  145. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  146. data/lib/fluent/plugin/formatter_out_file.rb +51 -0
  147. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  148. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  149. data/lib/fluent/plugin/formatter_tsv.rb +38 -0
  150. data/lib/fluent/plugin/in_debug_agent.rb +17 -6
  151. data/lib/fluent/plugin/in_dummy.rb +47 -20
  152. data/lib/fluent/plugin/in_exec.rb +55 -123
  153. data/lib/fluent/plugin/in_forward.rb +299 -216
  154. data/lib/fluent/plugin/in_gc_stat.rb +14 -36
  155. data/lib/fluent/plugin/in_http.rb +204 -91
  156. data/lib/fluent/plugin/in_monitor_agent.rb +186 -258
  157. data/lib/fluent/plugin/in_object_space.rb +13 -41
  158. data/lib/fluent/plugin/in_syslog.rb +112 -134
  159. data/lib/fluent/plugin/in_tail.rb +408 -745
  160. data/lib/fluent/plugin/in_tcp.rb +66 -9
  161. data/lib/fluent/plugin/in_udp.rb +60 -11
  162. data/lib/fluent/plugin/{in_stream.rb → in_unix.rb} +8 -4
  163. data/lib/fluent/plugin/input.rb +37 -0
  164. data/lib/fluent/plugin/multi_output.rb +158 -0
  165. data/lib/fluent/plugin/out_copy.rb +23 -35
  166. data/lib/fluent/plugin/out_exec.rb +67 -70
  167. data/lib/fluent/plugin/out_exec_filter.rb +204 -271
  168. data/lib/fluent/plugin/out_file.rb +267 -73
  169. data/lib/fluent/plugin/out_forward.rb +854 -325
  170. data/lib/fluent/plugin/out_null.rb +42 -9
  171. data/lib/fluent/plugin/out_relabel.rb +9 -5
  172. data/lib/fluent/plugin/out_roundrobin.rb +18 -37
  173. data/lib/fluent/plugin/out_secondary_file.rb +133 -0
  174. data/lib/fluent/plugin/out_stdout.rb +43 -10
  175. data/lib/fluent/plugin/out_stream.rb +7 -2
  176. data/lib/fluent/plugin/output.rb +1498 -0
  177. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  178. data/lib/fluent/plugin/parser.rb +191 -0
  179. data/lib/fluent/plugin/parser_apache.rb +28 -0
  180. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  181. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  182. data/lib/fluent/plugin/parser_csv.rb +39 -0
  183. data/lib/fluent/plugin/parser_json.rb +94 -0
  184. data/lib/fluent/plugin/parser_ltsv.rb +49 -0
  185. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  186. data/lib/fluent/plugin/parser_multiline.rb +106 -0
  187. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  188. data/lib/fluent/plugin/parser_none.rb +36 -0
  189. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  190. data/lib/fluent/plugin/parser_syslog.rb +142 -0
  191. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  192. data/lib/fluent/plugin/socket_util.rb +3 -143
  193. data/lib/fluent/plugin/storage.rb +84 -0
  194. data/lib/fluent/plugin/storage_local.rb +164 -0
  195. data/lib/fluent/plugin/string_util.rb +3 -15
  196. data/lib/fluent/plugin.rb +122 -121
  197. data/lib/fluent/plugin_helper/cert_option.rb +178 -0
  198. data/lib/fluent/plugin_helper/child_process.rb +364 -0
  199. data/lib/fluent/plugin_helper/compat_parameters.rb +333 -0
  200. data/lib/fluent/plugin_helper/counter.rb +51 -0
  201. data/lib/fluent/plugin_helper/event_emitter.rb +93 -0
  202. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  203. data/lib/fluent/plugin_helper/extract.rb +104 -0
  204. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  205. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  206. data/lib/fluent/plugin_helper/http_server/compat/server.rb +81 -0
  207. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  208. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  209. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  210. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  211. data/lib/fluent/plugin_helper/http_server/server.rb +87 -0
  212. data/lib/fluent/plugin_helper/http_server.rb +76 -0
  213. data/lib/fluent/plugin_helper/inject.rb +151 -0
  214. data/lib/fluent/plugin_helper/parser.rb +147 -0
  215. data/lib/fluent/plugin_helper/record_accessor.rb +210 -0
  216. data/lib/fluent/plugin_helper/retry_state.rb +205 -0
  217. data/lib/fluent/plugin_helper/server.rb +807 -0
  218. data/lib/fluent/plugin_helper/socket.rb +250 -0
  219. data/lib/fluent/plugin_helper/socket_option.rb +80 -0
  220. data/lib/fluent/plugin_helper/storage.rb +349 -0
  221. data/lib/fluent/plugin_helper/thread.rb +179 -0
  222. data/lib/fluent/plugin_helper/timer.rb +92 -0
  223. data/lib/fluent/plugin_helper.rb +73 -0
  224. data/lib/fluent/plugin_id.rb +80 -0
  225. data/lib/fluent/process.rb +3 -489
  226. data/lib/fluent/registry.rb +52 -10
  227. data/lib/fluent/root_agent.rb +204 -42
  228. data/lib/fluent/supervisor.rb +597 -359
  229. data/lib/fluent/system_config.rb +131 -42
  230. data/lib/fluent/test/base.rb +6 -54
  231. data/lib/fluent/test/driver/base.rb +224 -0
  232. data/lib/fluent/test/driver/base_owned.rb +70 -0
  233. data/lib/fluent/test/driver/base_owner.rb +135 -0
  234. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  235. data/lib/fluent/test/driver/filter.rb +57 -0
  236. data/lib/fluent/test/driver/formatter.rb +30 -0
  237. data/lib/fluent/test/driver/input.rb +31 -0
  238. data/lib/fluent/test/driver/multi_output.rb +53 -0
  239. data/lib/fluent/test/driver/output.rb +102 -0
  240. data/lib/fluent/test/driver/parser.rb +30 -0
  241. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  242. data/lib/fluent/test/filter_test.rb +0 -1
  243. data/lib/fluent/test/formatter_test.rb +4 -1
  244. data/lib/fluent/test/helpers.rb +58 -10
  245. data/lib/fluent/test/input_test.rb +27 -19
  246. data/lib/fluent/test/log.rb +79 -0
  247. data/lib/fluent/test/output_test.rb +28 -39
  248. data/lib/fluent/test/parser_test.rb +3 -1
  249. data/lib/fluent/test/startup_shutdown.rb +46 -0
  250. data/lib/fluent/test.rb +33 -1
  251. data/lib/fluent/time.rb +450 -1
  252. data/lib/fluent/timezone.rb +27 -3
  253. data/lib/fluent/{status.rb → unique_id.rb} +15 -24
  254. data/lib/fluent/version.rb +1 -1
  255. data/lib/fluent/winsvc.rb +85 -0
  256. data/templates/new_gem/Gemfile +3 -0
  257. data/templates/new_gem/README.md.erb +43 -0
  258. data/templates/new_gem/Rakefile +13 -0
  259. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  260. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  261. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  262. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  263. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  264. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  265. data/templates/new_gem/test/helper.rb.erb +8 -0
  266. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  267. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  268. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  269. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  270. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  271. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  272. data/templates/plugin_config_formatter/param.md.erb +34 -0
  273. data/templates/plugin_config_formatter/section.md.erb +12 -0
  274. data/test/command/test_binlog_reader.rb +346 -0
  275. data/test/command/test_ca_generate.rb +70 -0
  276. data/test/command/test_fluentd.rb +901 -0
  277. data/test/command/test_plugin_config_formatter.rb +276 -0
  278. data/test/command/test_plugin_generator.rb +92 -0
  279. data/test/compat/test_calls_super.rb +166 -0
  280. data/test/compat/test_parser.rb +92 -0
  281. data/test/config/test_config_parser.rb +126 -2
  282. data/test/config/test_configurable.rb +946 -187
  283. data/test/config/test_configure_proxy.rb +424 -74
  284. data/test/config/test_dsl.rb +11 -11
  285. data/test/config/test_element.rb +500 -0
  286. data/test/config/test_literal_parser.rb +8 -0
  287. data/test/config/test_plugin_configuration.rb +56 -0
  288. data/test/config/test_section.rb +79 -7
  289. data/test/config/test_system_config.rb +122 -35
  290. data/test/config/test_types.rb +38 -0
  291. data/test/counter/test_client.rb +559 -0
  292. data/test/counter/test_error.rb +44 -0
  293. data/test/counter/test_mutex_hash.rb +179 -0
  294. data/test/counter/test_server.rb +589 -0
  295. data/test/counter/test_store.rb +258 -0
  296. data/test/counter/test_validator.rb +137 -0
  297. data/test/helper.rb +89 -6
  298. data/test/helpers/fuzzy_assert.rb +89 -0
  299. data/test/plugin/test_bare_output.rb +118 -0
  300. data/test/plugin/test_base.rb +115 -0
  301. data/test/plugin/test_buf_file.rb +823 -460
  302. data/test/plugin/test_buf_memory.rb +32 -194
  303. data/test/plugin/test_buffer.rb +1233 -0
  304. data/test/plugin/test_buffer_chunk.rb +198 -0
  305. data/test/plugin/test_buffer_file_chunk.rb +844 -0
  306. data/test/plugin/test_buffer_memory_chunk.rb +338 -0
  307. data/test/plugin/test_compressable.rb +84 -0
  308. data/test/plugin/test_filter.rb +357 -0
  309. data/test/plugin/test_filter_grep.rb +540 -29
  310. data/test/plugin/test_filter_parser.rb +439 -452
  311. data/test/plugin/test_filter_record_transformer.rb +123 -166
  312. data/test/plugin/test_filter_stdout.rb +160 -72
  313. data/test/plugin/test_formatter_csv.rb +111 -0
  314. data/test/plugin/test_formatter_hash.rb +35 -0
  315. data/test/plugin/test_formatter_json.rb +51 -0
  316. data/test/plugin/test_formatter_ltsv.rb +62 -0
  317. data/test/plugin/test_formatter_msgpack.rb +28 -0
  318. data/test/plugin/test_formatter_out_file.rb +95 -0
  319. data/test/plugin/test_formatter_single_value.rb +38 -0
  320. data/test/plugin/test_formatter_tsv.rb +68 -0
  321. data/test/plugin/test_in_debug_agent.rb +24 -1
  322. data/test/plugin/test_in_dummy.rb +111 -18
  323. data/test/plugin/test_in_exec.rb +200 -113
  324. data/test/plugin/test_in_forward.rb +990 -387
  325. data/test/plugin/test_in_gc_stat.rb +10 -8
  326. data/test/plugin/test_in_http.rb +600 -224
  327. data/test/plugin/test_in_monitor_agent.rb +690 -0
  328. data/test/plugin/test_in_object_space.rb +24 -8
  329. data/test/plugin/test_in_syslog.rb +154 -215
  330. data/test/plugin/test_in_tail.rb +1006 -707
  331. data/test/plugin/test_in_tcp.rb +125 -48
  332. data/test/plugin/test_in_udp.rb +204 -63
  333. data/test/plugin/{test_in_stream.rb → test_in_unix.rb} +14 -13
  334. data/test/plugin/test_input.rb +126 -0
  335. data/test/plugin/test_metadata.rb +89 -0
  336. data/test/plugin/test_multi_output.rb +180 -0
  337. data/test/plugin/test_out_copy.rb +117 -112
  338. data/test/plugin/test_out_exec.rb +258 -53
  339. data/test/plugin/test_out_exec_filter.rb +538 -115
  340. data/test/plugin/test_out_file.rb +865 -178
  341. data/test/plugin/test_out_forward.rb +998 -210
  342. data/test/plugin/test_out_null.rb +105 -0
  343. data/test/plugin/test_out_relabel.rb +28 -0
  344. data/test/plugin/test_out_roundrobin.rb +36 -29
  345. data/test/plugin/test_out_secondary_file.rb +458 -0
  346. data/test/plugin/test_out_stdout.rb +135 -37
  347. data/test/plugin/test_out_stream.rb +18 -0
  348. data/test/plugin/test_output.rb +984 -0
  349. data/test/plugin/test_output_as_buffered.rb +2021 -0
  350. data/test/plugin/test_output_as_buffered_backup.rb +312 -0
  351. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  352. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  353. data/test/plugin/test_output_as_buffered_retries.rb +911 -0
  354. data/test/plugin/test_output_as_buffered_secondary.rb +874 -0
  355. data/test/plugin/test_output_as_standard.rb +374 -0
  356. data/test/plugin/test_owned_by.rb +35 -0
  357. data/test/plugin/test_parser.rb +359 -0
  358. data/test/plugin/test_parser_apache.rb +42 -0
  359. data/test/plugin/test_parser_apache2.rb +47 -0
  360. data/test/plugin/test_parser_apache_error.rb +45 -0
  361. data/test/plugin/test_parser_csv.rb +103 -0
  362. data/test/plugin/test_parser_json.rb +138 -0
  363. data/test/plugin/test_parser_labeled_tsv.rb +145 -0
  364. data/test/plugin/test_parser_multiline.rb +100 -0
  365. data/test/plugin/test_parser_nginx.rb +88 -0
  366. data/test/plugin/test_parser_none.rb +52 -0
  367. data/test/plugin/test_parser_regexp.rb +289 -0
  368. data/test/plugin/test_parser_syslog.rb +441 -0
  369. data/test/plugin/test_parser_tsv.rb +122 -0
  370. data/test/plugin/test_storage.rb +167 -0
  371. data/test/plugin/test_storage_local.rb +335 -0
  372. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  373. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  374. data/test/plugin_helper/data/cert/cert.pem +19 -0
  375. data/test/plugin_helper/http_server/test_app.rb +65 -0
  376. data/test/plugin_helper/http_server/test_route.rb +32 -0
  377. data/test/plugin_helper/test_cert_option.rb +16 -0
  378. data/test/plugin_helper/test_child_process.rb +794 -0
  379. data/test/plugin_helper/test_compat_parameters.rb +353 -0
  380. data/test/plugin_helper/test_event_emitter.rb +51 -0
  381. data/test/plugin_helper/test_event_loop.rb +52 -0
  382. data/test/plugin_helper/test_extract.rb +194 -0
  383. data/test/plugin_helper/test_formatter.rb +255 -0
  384. data/test/plugin_helper/test_http_server_helper.rb +205 -0
  385. data/test/plugin_helper/test_inject.rb +519 -0
  386. data/test/plugin_helper/test_parser.rb +264 -0
  387. data/test/plugin_helper/test_record_accessor.rb +197 -0
  388. data/test/plugin_helper/test_retry_state.rb +442 -0
  389. data/test/plugin_helper/test_server.rb +1714 -0
  390. data/test/plugin_helper/test_storage.rb +542 -0
  391. data/test/plugin_helper/test_thread.rb +164 -0
  392. data/test/plugin_helper/test_timer.rb +132 -0
  393. data/test/scripts/exec_script.rb +0 -6
  394. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  395. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  396. data/test/scripts/fluent/plugin/out_test.rb +23 -15
  397. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  398. data/test/test_clock.rb +164 -0
  399. data/test/test_config.rb +16 -7
  400. data/test/test_configdsl.rb +2 -2
  401. data/test/test_event.rb +360 -13
  402. data/test/test_event_router.rb +108 -11
  403. data/test/test_event_time.rb +199 -0
  404. data/test/test_filter.rb +48 -6
  405. data/test/test_formatter.rb +11 -391
  406. data/test/test_input.rb +1 -1
  407. data/test/test_log.rb +591 -31
  408. data/test/test_mixin.rb +1 -1
  409. data/test/test_output.rb +121 -185
  410. data/test/test_plugin.rb +251 -0
  411. data/test/test_plugin_classes.rb +177 -10
  412. data/test/test_plugin_helper.rb +81 -0
  413. data/test/test_plugin_id.rb +101 -0
  414. data/test/test_process.rb +8 -42
  415. data/test/test_root_agent.rb +766 -21
  416. data/test/test_supervisor.rb +481 -0
  417. data/test/test_test_drivers.rb +135 -0
  418. data/test/test_time_formatter.rb +282 -0
  419. data/test/test_time_parser.rb +231 -0
  420. data/test/test_unique_id.rb +47 -0
  421. metadata +454 -60
  422. data/COPYING +0 -14
  423. data/ChangeLog +0 -666
  424. data/lib/fluent/buffer.rb +0 -365
  425. data/lib/fluent/plugin/in_status.rb +0 -76
  426. data/test/plugin/test_in_status.rb +0 -38
  427. data/test/test_buffer.rb +0 -624
  428. data/test/test_parser.rb +0 -1305
@@ -0,0 +1,364 @@
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 'fluent/plugin_helper/thread'
18
+ require 'fluent/plugin_helper/timer'
19
+ require 'fluent/clock'
20
+
21
+ require 'open3'
22
+ require 'timeout'
23
+
24
+ module Fluent
25
+ module PluginHelper
26
+ module ChildProcess
27
+ include Fluent::PluginHelper::Thread
28
+ include Fluent::PluginHelper::Timer
29
+
30
+ CHILD_PROCESS_LOOP_CHECK_INTERVAL = 0.2 # sec
31
+ CHILD_PROCESS_DEFAULT_EXIT_TIMEOUT = 10 # sec
32
+ CHILD_PROCESS_DEFAULT_KILL_TIMEOUT = 60 # sec
33
+
34
+ MODE_PARAMS = [:read, :write, :stderr, :read_with_stderr]
35
+ STDERR_OPTIONS = [:discard, :connect]
36
+
37
+ # stop : mark callback thread as stopped
38
+ # shutdown : close write IO to child processes (STDIN of child processes), send TERM (KILL for Windows) to all child processes
39
+ # close : send KILL to all child processes
40
+ # terminate: [-]
41
+
42
+ attr_reader :_child_process_processes # for tests
43
+
44
+ def child_process_running?
45
+ # checker for code in callback of child_process_execute
46
+ ::Thread.current[:_fluentd_plugin_helper_child_process_running] || false
47
+ end
48
+
49
+ def child_process_id
50
+ ::Thread.current[:_fluentd_plugin_helper_child_process_pid]
51
+ end
52
+
53
+ def child_process_exist?(pid)
54
+ pinfo = @_child_process_processes[pid]
55
+ return false unless pinfo
56
+
57
+ return false if pinfo.exit_status
58
+
59
+ true
60
+ end
61
+
62
+ # on_exit_callback = ->(status){ ... }
63
+ # status is an instance of Process::Status
64
+ # On Windows, exitstatus=0 and termsig=nil even when child process was killed.
65
+ def child_process_execute(
66
+ title, command,
67
+ arguments: nil, subprocess_name: nil, interval: nil, immediate: false, parallel: false,
68
+ mode: [:read, :write], stderr: :discard, env: {}, unsetenv: false, chdir: nil,
69
+ internal_encoding: 'utf-8', external_encoding: 'ascii-8bit', scrub: true, replace_string: nil,
70
+ wait_timeout: nil, on_exit_callback: nil,
71
+ &block
72
+ )
73
+ raise ArgumentError, "BUG: title must be a symbol" unless title.is_a? Symbol
74
+ raise ArgumentError, "BUG: arguments required if subprocess name is replaced" if subprocess_name && !arguments
75
+
76
+ mode ||= []
77
+ mode = [] unless block
78
+ raise ArgumentError, "BUG: invalid mode specification" unless mode.all?{|m| MODE_PARAMS.include?(m) }
79
+ raise ArgumentError, "BUG: read_with_stderr is exclusive with :read and :stderr" if mode.include?(:read_with_stderr) && (mode.include?(:read) || mode.include?(:stderr))
80
+ raise ArgumentError, "BUG: invalid stderr handling specification" unless STDERR_OPTIONS.include?(stderr)
81
+
82
+ raise ArgumentError, "BUG: number of block arguments are different from size of mode" if block && block.arity != mode.size
83
+
84
+ running = false
85
+ callback = ->(*args) {
86
+ running = true
87
+ begin
88
+ block && block.call(*args)
89
+ ensure
90
+ running = false
91
+ end
92
+ }
93
+
94
+ retval = nil
95
+ execute_child_process = ->(){
96
+ child_process_execute_once(
97
+ title, command, arguments,
98
+ subprocess_name, mode, stderr, env, unsetenv, chdir,
99
+ internal_encoding, external_encoding, scrub, replace_string,
100
+ wait_timeout, on_exit_callback,
101
+ &callback
102
+ )
103
+ }
104
+
105
+ if immediate || !interval
106
+ retval = execute_child_process.call
107
+ end
108
+
109
+ if interval
110
+ timer_execute(:child_process_execute, interval, repeat: true) do
111
+ if !parallel && running
112
+ log.warn "previous child process is still running. skipped.", title: title, command: command, arguments: arguments, interval: interval, parallel: parallel
113
+ else
114
+ execute_child_process.call
115
+ end
116
+ end
117
+ end
118
+
119
+ retval # nil if interval
120
+ end
121
+
122
+ def initialize
123
+ super
124
+ # plugins MAY configure this parameter
125
+ @_child_process_exit_timeout = CHILD_PROCESS_DEFAULT_EXIT_TIMEOUT
126
+ @_child_process_kill_timeout = CHILD_PROCESS_DEFAULT_KILL_TIMEOUT
127
+ @_child_process_mutex = Mutex.new
128
+ @_child_process_processes = {} # pid => ProcessInfo
129
+ end
130
+
131
+ def stop
132
+ @_child_process_mutex.synchronize{ @_child_process_processes.keys }.each do |pid|
133
+ process_info = @_child_process_processes[pid]
134
+ if process_info
135
+ process_info.thread[:_fluentd_plugin_helper_child_process_running] = false
136
+ end
137
+ end
138
+
139
+ super
140
+ end
141
+
142
+ def shutdown
143
+ @_child_process_mutex.synchronize{ @_child_process_processes.keys }.each do |pid|
144
+ process_info = @_child_process_processes[pid]
145
+ next if !process_info
146
+ process_info.writeio && process_info.writeio.close rescue nil
147
+ end
148
+
149
+ super
150
+
151
+ @_child_process_mutex.synchronize{ @_child_process_processes.keys }.each do |pid|
152
+ process_info = @_child_process_processes[pid]
153
+ next if !process_info
154
+ child_process_kill(process_info)
155
+ end
156
+
157
+ exit_wait_timeout = Fluent::Clock.now + @_child_process_exit_timeout
158
+ while Fluent::Clock.now < exit_wait_timeout
159
+ process_exists = false
160
+ @_child_process_mutex.synchronize{ @_child_process_processes.keys }.each do |pid|
161
+ unless @_child_process_processes[pid].exit_status
162
+ process_exists = true
163
+ break
164
+ end
165
+ end
166
+ if process_exists
167
+ sleep CHILD_PROCESS_LOOP_CHECK_INTERVAL
168
+ else
169
+ break
170
+ end
171
+ end
172
+ end
173
+
174
+ def close
175
+ while true
176
+ pids = @_child_process_mutex.synchronize{ @_child_process_processes.keys }
177
+ break if pids.size < 1
178
+
179
+ living_process_exist = false
180
+ pids.each do |pid|
181
+ process_info = @_child_process_processes[pid]
182
+ next if !process_info || process_info.exit_status
183
+
184
+ living_process_exist = true
185
+
186
+ process_info.killed_at ||= Fluent::Clock.now # for illegular case (e.g., created after shutdown)
187
+ timeout_at = process_info.killed_at + @_child_process_kill_timeout
188
+ now = Fluent::Clock.now
189
+ next if now < timeout_at
190
+
191
+ child_process_kill(process_info, force: true)
192
+ end
193
+
194
+ break if living_process_exist
195
+
196
+ sleep CHILD_PROCESS_LOOP_CHECK_INTERVAL
197
+ end
198
+
199
+ super
200
+ end
201
+
202
+ def terminate
203
+ @_child_process_processes = {}
204
+
205
+ super
206
+ end
207
+
208
+ def child_process_kill(pinfo, force: false)
209
+ return if !pinfo
210
+ pinfo.killed_at = Fluent::Clock.now unless force
211
+
212
+ pid = pinfo.pid
213
+ begin
214
+ if !pinfo.exit_status && child_process_exist?(pid)
215
+ signal = (Fluent.windows? || force) ? :KILL : :TERM
216
+ Process.kill(signal, pinfo.pid)
217
+ end
218
+ rescue Errno::ECHILD, Errno::ESRCH
219
+ # ignore
220
+ end
221
+ end
222
+
223
+ ProcessInfo = Struct.new(
224
+ :title,
225
+ :thread, :pid,
226
+ :readio, :readio_in_use, :writeio, :writeio_in_use, :stderrio, :stderrio_in_use,
227
+ :wait_thread, :alive, :killed_at, :exit_status,
228
+ :on_exit_callback, :on_exit_callback_mutex,
229
+ )
230
+
231
+ def child_process_execute_once(
232
+ title, command, arguments, subprocess_name, mode, stderr, env, unsetenv, chdir,
233
+ internal_encoding, external_encoding, scrub, replace_string, wait_timeout, on_exit_callback, &block
234
+ )
235
+ spawn_args = if arguments || subprocess_name
236
+ [ env, (subprocess_name ? [command, subprocess_name] : command), *(arguments || []) ]
237
+ else
238
+ [ env, command ]
239
+ end
240
+ spawn_opts = {
241
+ unsetenv_others: unsetenv,
242
+ }
243
+ if chdir
244
+ spawn_opts[:chdir] = chdir
245
+ end
246
+
247
+ encoding_options = {}
248
+ if scrub
249
+ encoding_options[:invalid] = encoding_options[:undef] = :replace
250
+ if replace_string
251
+ encoding_options[:replace] = replace_string
252
+ end
253
+ end
254
+
255
+ log.debug "Executing command", title: title, spawn: spawn_args, mode: mode, stderr: stderr
256
+
257
+ readio = writeio = stderrio = wait_thread = nil
258
+ readio_in_use = writeio_in_use = stderrio_in_use = false
259
+
260
+ if !mode.include?(:stderr) && !mode.include?(:read_with_stderr) && stderr != :discard # connect
261
+ writeio, readio, wait_thread = *Open3.popen2(*spawn_args, spawn_opts)
262
+ elsif mode.include?(:read_with_stderr)
263
+ writeio, readio, wait_thread = *Open3.popen2e(*spawn_args, spawn_opts)
264
+ else
265
+ writeio, readio, stderrio, wait_thread = *Open3.popen3(*spawn_args, spawn_opts)
266
+ end
267
+
268
+ if mode.include?(:write)
269
+ writeio.set_encoding(external_encoding, internal_encoding, encoding_options)
270
+ writeio_in_use = true
271
+ else
272
+ writeio.reopen(IO::NULL) if writeio
273
+ end
274
+ if mode.include?(:read) || mode.include?(:read_with_stderr)
275
+ readio.set_encoding(external_encoding, internal_encoding, encoding_options)
276
+ readio_in_use = true
277
+ else
278
+ readio.reopen(IO::NULL) if readio
279
+ end
280
+ if mode.include?(:stderr)
281
+ stderrio.set_encoding(external_encoding, internal_encoding, encoding_options)
282
+ stderrio_in_use = true
283
+ else
284
+ stderrio.reopen(IO::NULL) if stderrio && stderrio == :discard
285
+ end
286
+
287
+ pid = wait_thread.pid # wait_thread => Process::Waiter
288
+
289
+ io_objects = []
290
+ mode.each do |m|
291
+ io_obj = case m
292
+ when :read then readio
293
+ when :write then writeio
294
+ when :read_with_stderr then readio
295
+ when :stderr then stderrio
296
+ else
297
+ raise "BUG: invalid mode must be checked before here: '#{m}'"
298
+ end
299
+ io_objects << io_obj
300
+ end
301
+
302
+ m = Mutex.new
303
+ m.lock
304
+ thread = thread_create :child_process_callback do
305
+ m.lock # run after plugin thread get pid, thread instance and i/o
306
+ m.unlock
307
+ begin
308
+ @_child_process_processes[pid].alive = true
309
+ block.call(*io_objects) if block_given?
310
+ writeio.close if writeio
311
+ rescue EOFError => e
312
+ log.debug "Process exit and I/O closed", title: title, pid: pid, command: command, arguments: arguments
313
+ rescue IOError => e
314
+ if e.message == 'stream closed' || e.message == 'closed stream' # "closed stream" is of ruby 2.1
315
+ log.debug "Process I/O stream closed", title: title, pid: pid, command: command, arguments: arguments
316
+ else
317
+ log.error "Unexpected I/O error for child process", title: title, pid: pid, command: command, arguments: arguments, error: e
318
+ end
319
+ rescue Errno::EPIPE => e
320
+ log.debug "Broken pipe, child process unexpectedly exits", title: title, pid: pid, command: command, arguments: arguments
321
+ rescue => e
322
+ log.warn "Unexpected error while processing I/O for child process", title: title, pid: pid, command: command, error: e
323
+ end
324
+
325
+ if wait_timeout
326
+ if wait_thread.join(wait_timeout) # Thread#join returns nil when limit expires
327
+ # wait_thread successfully exits
328
+ @_child_process_processes[pid].exit_status = wait_thread.value
329
+ else
330
+ log.warn "child process timed out", title: title, pid: pid, command: command, arguments: arguments
331
+ child_process_kill(@_child_process_processes[pid], force: true)
332
+ @_child_process_processes[pid].exit_status = wait_thread.value
333
+ end
334
+ else
335
+ @_child_process_processes[pid].exit_status = wait_thread.value # with join
336
+ end
337
+ process_info = @_child_process_mutex.synchronize{ @_child_process_processes.delete(pid) }
338
+
339
+ cb = process_info.on_exit_callback_mutex.synchronize do
340
+ cback = process_info.on_exit_callback
341
+ process_info.on_exit_callback = nil
342
+ cback
343
+ end
344
+ if cb
345
+ cb.call(process_info.exit_status) rescue nil
346
+ end
347
+ end
348
+ thread[:_fluentd_plugin_helper_child_process_running] = true
349
+ thread[:_fluentd_plugin_helper_child_process_pid] = pid
350
+ pinfo = ProcessInfo.new(
351
+ title, thread, pid,
352
+ readio, readio_in_use, writeio, writeio_in_use, stderrio, stderrio_in_use,
353
+ wait_thread, false, nil, nil, on_exit_callback, Mutex.new
354
+ )
355
+
356
+ @_child_process_mutex.synchronize do
357
+ @_child_process_processes[pid] = pinfo
358
+ end
359
+ m.unlock
360
+ pid
361
+ end
362
+ end
363
+ end
364
+ end
@@ -0,0 +1,333 @@
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 'fluent/config/types'
18
+ require 'fluent/config/element'
19
+
20
+ module Fluent
21
+ module PluginHelper
22
+ module CompatParameters
23
+ # This plugin helper is to bring old-fashioned buffer/other
24
+ # configuration parameters to v0.14 plugin API configurations.
25
+ # This helper is mainly to convert plugins from v0.12 API
26
+ # to v0.14 API safely, without breaking user deployment.
27
+
28
+ BUFFER_PARAMS = {
29
+ "buffer_type" => "@type",
30
+ "buffer_path" => "path",
31
+ "num_threads" => "flush_thread_count",
32
+ "flush_interval" => "flush_interval",
33
+ "try_flush_interval" => "flush_thread_interval",
34
+ "queued_chunk_flush_interval" => "flush_thread_burst_interval",
35
+ "disable_retry_limit" => "retry_forever",
36
+ "retry_limit" => "retry_max_times",
37
+ "max_retry_wait" => "retry_max_interval",
38
+ "buffer_chunk_limit" => "chunk_limit_size",
39
+ "buffer_queue_limit" => "queue_limit_length",
40
+ "buffer_queue_full_action" => "overflow_action",
41
+ "flush_at_shutdown" => "flush_at_shutdown",
42
+ }
43
+
44
+ BUFFER_TIME_SLICED_PARAMS = {
45
+ "time_slice_format" => nil,
46
+ "time_slice_wait" => "timekey_wait",
47
+ "timezone" => "timekey_zone",
48
+ }
49
+
50
+ PARSER_PARAMS = {
51
+ "format" => nil,
52
+ "types" => nil,
53
+ "types_delimiter" => nil,
54
+ "types_label_delimiter" => nil,
55
+ "keys" => "keys", # CSVParser, TSVParser (old ValuesParser)
56
+ "time_key" => "time_key",
57
+ "time_format" => "time_format",
58
+ "localtime" => nil,
59
+ "utc" => nil,
60
+ "delimiter" => "delimiter",
61
+ "keep_time_key" => "keep_time_key",
62
+ "null_empty_string" => "null_empty_string",
63
+ "null_value_pattern" => "null_value_pattern",
64
+ "json_parser" => "json_parser", # JSONParser
65
+ "label_delimiter" => "label_delimiter", # LabeledTSVParser
66
+ "format_firstline" => "format_firstline", # MultilineParser
67
+ "message_key" => "message_key", # NoneParser
68
+ "with_priority" => "with_priority", # SyslogParser
69
+ "message_format" => "message_format", # SyslogParser
70
+ "rfc5424_time_format" => "rfc5424_time_format", # SyslogParser
71
+ # There has been no parsers which can handle timezone in v0.12
72
+ }
73
+
74
+ INJECT_PARAMS = {
75
+ "include_time_key" => nil,
76
+ "time_key" => "time_key",
77
+ "time_format" => "time_format",
78
+ "timezone" => "timezone",
79
+ "include_tag_key" => nil,
80
+ "tag_key" => "tag_key",
81
+ "localtime" => nil,
82
+ "utc" => nil,
83
+ }
84
+
85
+ EXTRACT_PARAMS = {
86
+ "time_key" => "time_key",
87
+ "time_format" => "time_format",
88
+ "timezone" => "timezone",
89
+ "tag_key" => "tag_key",
90
+ "localtime" => nil,
91
+ "utc" => nil,
92
+ }
93
+
94
+ FORMATTER_PARAMS = {
95
+ "format" => "@type",
96
+ "delimiter" => "delimiter",
97
+ "force_quotes" => "force_quotes", # CsvFormatter
98
+ "keys" => "keys", # TSVFormatter
99
+ "fields" => "fields", # CsvFormatter
100
+ "json_parser" => "json_parser", # JSONFormatter
101
+ "label_delimiter" => "label_delimiter", # LabeledTSVFormatter
102
+ "output_time" => "output_time", # OutFileFormatter
103
+ "output_tag" => "output_tag", # OutFileFormatter
104
+ "localtime" => "localtime", # OutFileFormatter
105
+ "utc" => "utc", # OutFileFormatter
106
+ "timezone" => "timezone", # OutFileFormatter
107
+ "message_key" => "message_key", # SingleValueFormatter
108
+ "add_newline" => "add_newline", # SingleValueFormatter
109
+ "output_type" => "output_type", # StdoutFormatter
110
+ }
111
+
112
+ def compat_parameters_convert(conf, *types, **kwargs)
113
+ types.each do |type|
114
+ case type
115
+ when :buffer
116
+ compat_parameters_buffer(conf, **kwargs)
117
+ when :inject
118
+ compat_parameters_inject(conf)
119
+ when :extract
120
+ compat_parameters_extract(conf)
121
+ when :parser
122
+ compat_parameters_parser(conf)
123
+ when :formatter
124
+ compat_parameters_formatter(conf)
125
+ else
126
+ raise "BUG: unknown compat_parameters type: #{type}"
127
+ end
128
+ end
129
+
130
+ conf
131
+ end
132
+
133
+ def compat_parameters_buffer(conf, default_chunk_key: '')
134
+ # return immediately if <buffer> section exists, or any buffer-related parameters don't exist
135
+ return unless conf.elements('buffer').empty?
136
+ return if (BUFFER_PARAMS.keys + BUFFER_TIME_SLICED_PARAMS.keys).all?{|k| !conf.has_key?(k) }
137
+
138
+ # TODO: warn obsolete parameters if these are deprecated
139
+ buffer_params = BUFFER_PARAMS.merge(BUFFER_TIME_SLICED_PARAMS)
140
+ hash = compat_parameters_copy_to_subsection_attributes(conf, buffer_params) do |compat_key, value|
141
+ if compat_key == 'buffer_queue_full_action' && value == 'exception'
142
+ 'throw_exception'
143
+ else
144
+ value
145
+ end
146
+ end
147
+
148
+ chunk_key = default_chunk_key
149
+
150
+ if conf.has_key?('time_slice_format')
151
+ chunk_key = 'time'
152
+ hash['timekey'] = case conf['time_slice_format']
153
+ when /\%S/ then 1
154
+ when /\%M/ then 60
155
+ when /\%H/ then 3600
156
+ when /\%d/ then 86400
157
+ else
158
+ raise Fluent::ConfigError, "time_slice_format only with %Y or %m is too long"
159
+ end
160
+ if conf.has_key?('localtime') || conf.has_key?('utc')
161
+ if conf.has_key?('localtime') && conf.has_key?('utc')
162
+ raise Fluent::ConfigError, "both of utc and localtime are specified, use only one of them"
163
+ elsif conf.has_key?('localtime')
164
+ hash['timekey_use_utc'] = !(Fluent::Config.bool_value(conf['localtime']))
165
+ elsif conf.has_key?('utc')
166
+ hash['timekey_use_utc'] = Fluent::Config.bool_value(conf['utc'])
167
+ end
168
+ end
169
+ else
170
+ if chunk_key == 'time'
171
+ hash['timekey'] = 86400 # TimeSliceOutput.time_slice_format default value is '%Y%m%d'
172
+ end
173
+ end
174
+
175
+ e = Fluent::Config::Element.new('buffer', chunk_key, hash, [])
176
+ conf.elements << e
177
+
178
+ conf
179
+ end
180
+
181
+ def compat_parameters_inject(conf)
182
+ return unless conf.elements('inject').empty?
183
+ return if INJECT_PARAMS.keys.all?{|k| !conf.has_key?(k) }
184
+
185
+ # TODO: warn obsolete parameters if these are deprecated
186
+ hash = compat_parameters_copy_to_subsection_attributes(conf, INJECT_PARAMS)
187
+
188
+ if conf.has_key?('include_time_key') && Fluent::Config.bool_value(conf['include_time_key'])
189
+ hash['time_key'] ||= 'time'
190
+ hash['time_type'] ||= 'string'
191
+ end
192
+ if conf.has_key?('time_as_epoch') && Fluent::Config.bool_value(conf['time_as_epoch'])
193
+ hash['time_key'] ||= 'time'
194
+ hash['time_type'] = 'unixtime'
195
+ end
196
+ if conf.has_key?('localtime') || conf.has_key?('utc')
197
+ if conf.has_key?('localtime') && conf.has_key?('utc')
198
+ raise Fluent::ConfigError, "both of utc and localtime are specified, use only one of them"
199
+ elsif conf.has_key?('localtime')
200
+ hash['localtime'] = Fluent::Config.bool_value(conf['localtime'])
201
+ elsif conf.has_key?('utc')
202
+ hash['localtime'] = !(Fluent::Config.bool_value(conf['utc']))
203
+ # Specifying "localtime false" means using UTC in TimeFormatter
204
+ # And specifying "utc" is different from specifying "timezone +0000"(it's not always UTC).
205
+ # There are difference between "Z" and "+0000" in timezone formatting.
206
+ # TODO: add kwargs to TimeFormatter to specify "using localtime", "using UTC" or "using specified timezone" in more explicit way
207
+ end
208
+ end
209
+
210
+ if conf.has_key?('include_tag_key') && Fluent::Config.bool_value(conf['include_tag_key'])
211
+ hash['tag_key'] ||= 'tag'
212
+ end
213
+
214
+ e = Fluent::Config::Element.new('inject', '', hash, [])
215
+ conf.elements << e
216
+
217
+ conf
218
+ end
219
+
220
+ def compat_parameters_extract(conf)
221
+ return unless conf.elements('extract').empty?
222
+ return if EXTRACT_PARAMS.keys.all?{|k| !conf.has_key?(k) } && !conf.has_key?('format')
223
+
224
+ # TODO: warn obsolete parameters if these are deprecated
225
+ hash = compat_parameters_copy_to_subsection_attributes(conf, EXTRACT_PARAMS)
226
+
227
+ if conf.has_key?('time_as_epoch') && Fluent::Config.bool_value(conf['time_as_epoch'])
228
+ hash['time_key'] ||= 'time'
229
+ hash['time_type'] = 'unixtime'
230
+ elsif conf.has_key?('format') && conf["format"].start_with?("/") && conf["format"].end_with?("/") # old-style regexp parser
231
+ hash['time_key'] ||= 'time'
232
+ hash['time_type'] ||= 'string'
233
+ end
234
+ if conf.has_key?('localtime') || conf.has_key?('utc')
235
+ if conf.has_key?('localtime') && conf.has_key?('utc')
236
+ raise Fluent::ConfigError, "both of utc and localtime are specified, use only one of them"
237
+ elsif conf.has_key?('localtime')
238
+ hash['localtime'] = Fluent::Config.bool_value(conf['localtime'])
239
+ elsif conf.has_key?('utc')
240
+ hash['localtime'] = !(Fluent::Config.bool_value(conf['utc']))
241
+ # Specifying "localtime false" means using UTC in TimeFormatter
242
+ # And specifying "utc" is different from specifying "timezone +0000"(it's not always UTC).
243
+ # There are difference between "Z" and "+0000" in timezone formatting.
244
+ # TODO: add kwargs to TimeFormatter to specify "using localtime", "using UTC" or "using specified timezone" in more explicit way
245
+ end
246
+ end
247
+
248
+ e = Fluent::Config::Element.new('extract', '', hash, [])
249
+ conf.elements << e
250
+
251
+ conf
252
+ end
253
+
254
+ def compat_parameters_parser(conf)
255
+ return unless conf.elements('parse').empty?
256
+ return if PARSER_PARAMS.keys.all?{|k| !conf.has_key?(k) }
257
+
258
+ # TODO: warn obsolete parameters if these are deprecated
259
+ hash = compat_parameters_copy_to_subsection_attributes(conf, PARSER_PARAMS)
260
+
261
+ if conf["format"]
262
+ if conf["format"].start_with?("/") && conf["format"].end_with?("/")
263
+ hash["@type"] = "regexp"
264
+ hash["expression"] = conf["format"][1..-2]
265
+ else
266
+ hash["@type"] = conf["format"]
267
+ end
268
+ end
269
+
270
+ if conf["types"]
271
+ delimiter = conf["types_delimiter"] || ','
272
+ label_delimiter = conf["types_label_delimiter"] || ':'
273
+ types = {}
274
+ conf['types'].split(delimiter).each do |pair|
275
+ key, value = pair.split(label_delimiter, 2)
276
+ types[key] = value
277
+ end
278
+ hash["types"] = JSON.dump(types)
279
+ end
280
+ if conf.has_key?('localtime') || conf.has_key?('utc')
281
+ if conf.has_key?('localtime') && conf.has_key?('utc')
282
+ raise Fluent::ConfigError, "both of utc and localtime are specified, use only one of them"
283
+ elsif conf.has_key?('localtime')
284
+ hash['localtime'] = Fluent::Config.bool_value(conf['localtime'])
285
+ elsif conf.has_key?('utc')
286
+ hash['localtime'] = !(Fluent::Config.bool_value(conf['utc']))
287
+ # Specifying "localtime false" means using UTC in TimeFormatter
288
+ # And specifying "utc" is different from specifying "timezone +0000"(it's not always UTC).
289
+ # There are difference between "Z" and "+0000" in timezone formatting.
290
+ # TODO: add kwargs to TimeFormatter to specify "using localtime", "using UTC" or "using specified timezone" in more explicit way
291
+ end
292
+ end
293
+
294
+ e = Fluent::Config::Element.new('parse', '', hash, [])
295
+ conf.elements << e
296
+
297
+ conf
298
+ end
299
+
300
+ def compat_parameters_formatter(conf)
301
+ return unless conf.elements('format').empty?
302
+ return if FORMATTER_PARAMS.keys.all?{|k| !conf.has_key?(k) }
303
+
304
+ # TODO: warn obsolete parameters if these are deprecated
305
+ hash = compat_parameters_copy_to_subsection_attributes(conf, FORMATTER_PARAMS)
306
+
307
+ if conf.has_key?('time_as_epoch') && Fluent::Config.bool_value(conf['time_as_epoch'])
308
+ hash['time_type'] = 'unixtime'
309
+ end
310
+
311
+ e = Fluent::Config::Element.new('format', '', hash, [])
312
+ conf.elements << e
313
+
314
+ conf
315
+ end
316
+
317
+ def compat_parameters_copy_to_subsection_attributes(conf, params, &block)
318
+ hash = {}
319
+ params.each do |compat, current|
320
+ next unless current
321
+ if conf.has_key?(compat)
322
+ if block_given?
323
+ hash[current] = block.call(compat, conf[compat])
324
+ else
325
+ hash[current] = conf[compat]
326
+ end
327
+ end
328
+ end
329
+ hash
330
+ end
331
+ end
332
+ end
333
+ end