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,718 @@
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'
18
+ require 'fluent/plugin/buffer'
19
+ require 'fluent/plugin/output'
20
+ require 'fluent/plugin/bare_output'
21
+ require 'fluent/compat/call_super_mixin'
22
+ require 'fluent/compat/formatter_utils'
23
+ require 'fluent/compat/handle_tag_and_time_mixin'
24
+ require 'fluent/compat/parser_utils'
25
+ require 'fluent/compat/propagate_default'
26
+ require 'fluent/compat/record_filter_mixin'
27
+ require 'fluent/compat/output_chain'
28
+ require 'fluent/timezone'
29
+ require 'fluent/mixin'
30
+ require 'fluent/process'
31
+ require 'fluent/event'
32
+
33
+ require 'fluent/plugin_helper/compat_parameters'
34
+
35
+ require 'time'
36
+
37
+ module Fluent
38
+ module Compat
39
+ NULL_OUTPUT_CHAIN = NullOutputChain.instance
40
+ BufferQueueLimitError = ::Fluent::Plugin::Buffer::BufferOverflowError
41
+
42
+ module CompatOutputUtils
43
+ def self.buffer_section(conf)
44
+ conf.elements(name: 'buffer').first
45
+ end
46
+
47
+ def self.secondary_section(conf)
48
+ conf.elements(name: 'secondary').first
49
+ end
50
+ end
51
+
52
+ module BufferedEventStreamMixin
53
+ include Enumerable
54
+
55
+ def repeatable?
56
+ true
57
+ end
58
+
59
+ def each(&block)
60
+ msgpack_each(&block)
61
+ end
62
+
63
+ def to_msgpack_stream
64
+ read
65
+ end
66
+
67
+ def key
68
+ metadata.tag
69
+ end
70
+ end
71
+
72
+ module AddTimeSliceKeyToChunkMixin
73
+ def time_slice_format=(format)
74
+ @_time_slice_format = format
75
+ end
76
+
77
+ def timekey=(unit)
78
+ @_timekey = unit
79
+ end
80
+
81
+ def timezone=(tz)
82
+ @_timezone = tz
83
+ end
84
+
85
+ def assume_timekey!
86
+ @_formatter = Fluent::TimeFormatter.new(@_time_slice_format, nil, @_timezone)
87
+
88
+ return if self.metadata.timekey
89
+ if self.respond_to?(:path) && self.path =~ /\.(\d+)\.(?:b|q)(?:[a-z0-9]+)/
90
+ begin
91
+ self.metadata.timekey = Time.parse($1, @_time_slice_format).to_i
92
+ rescue ArgumentError
93
+ # unknown format / value as timekey
94
+ end
95
+ end
96
+ unless self.metadata.timekey
97
+ # file creation time is assumed in the time range of that time slice
98
+ # because the first record should be in that range.
99
+ time_int = self.created_at.to_i
100
+ self.metadata.timekey = time_int - (time_int % @_timekey)
101
+ end
102
+ end
103
+
104
+ def key
105
+ @_formatter.call(self.metadata.timekey)
106
+ end
107
+ end
108
+
109
+ module AddKeyToChunkMixin
110
+ def key
111
+ self.metadata.variables[:key]
112
+ end
113
+ end
114
+
115
+ module ChunkSizeCompatMixin
116
+ def size
117
+ self.bytesize
118
+ end
119
+
120
+ def size_of_events
121
+ @size + @adding_size
122
+ end
123
+ end
124
+
125
+ module BufferedChunkMixin
126
+ # prepend this module to BufferedOutput (including ObjectBufferedOutput) plugin singleton class
127
+ def write(chunk)
128
+ chunk.extend(ChunkSizeCompatMixin)
129
+ chunk.extend(ChunkMessagePackEventStreamer)
130
+ chunk.extend(AddKeyToChunkMixin) if chunk.metadata.variables && chunk.metadata.variables.has_key?(:key)
131
+ super
132
+ end
133
+ end
134
+
135
+ module TimeSliceChunkMixin
136
+ # prepend this module to TimeSlicedOutput plugin singleton class
137
+ def write(chunk)
138
+ chunk.extend(ChunkSizeCompatMixin)
139
+ chunk.extend(ChunkMessagePackEventStreamer)
140
+ chunk.extend(AddTimeSliceKeyToChunkMixin)
141
+ chunk.time_slice_format = @time_slice_format
142
+ chunk.timekey = @_timekey
143
+ chunk.timezone = @timezone
144
+ chunk.assume_timekey!
145
+ super
146
+ end
147
+ end
148
+
149
+ class Output < Fluent::Plugin::Output
150
+ # TODO: warn when deprecated
151
+
152
+ helpers_internal :event_emitter, :inject
153
+
154
+ def support_in_v12_style?(feature)
155
+ case feature
156
+ when :synchronous then true
157
+ when :buffered then false
158
+ when :delayed_commit then false
159
+ when :custom_format then false
160
+ end
161
+ end
162
+
163
+ def process(tag, es)
164
+ emit(tag, es, NULL_OUTPUT_CHAIN)
165
+ end
166
+
167
+ def initialize
168
+ super
169
+ unless self.class.ancestors.include?(Fluent::Compat::CallSuperMixin)
170
+ self.class.prepend Fluent::Compat::CallSuperMixin
171
+ end
172
+ end
173
+
174
+ def configure(conf)
175
+ ParserUtils.convert_parser_conf(conf)
176
+ FormatterUtils.convert_formatter_conf(conf)
177
+
178
+ super
179
+ end
180
+
181
+ def start
182
+ super
183
+
184
+ if instance_variable_defined?(:@formatter) && @inject_config
185
+ unless @formatter.class.ancestors.include?(Fluent::Compat::HandleTagAndTimeMixin)
186
+ if @formatter.respond_to?(:owner) && !@formatter.owner
187
+ @formatter.owner = self
188
+ @formatter.singleton_class.prepend FormatterUtils::InjectMixin
189
+ end
190
+ end
191
+ end
192
+ end
193
+ end
194
+
195
+ class MultiOutput < Fluent::Plugin::BareOutput
196
+ # TODO: warn when deprecated
197
+
198
+ helpers_internal :event_emitter
199
+
200
+ def process(tag, es)
201
+ emit(tag, es, NULL_OUTPUT_CHAIN)
202
+ end
203
+ end
204
+
205
+ class BufferedOutput < Fluent::Plugin::Output
206
+ # TODO: warn when deprecated
207
+
208
+ helpers_internal :event_emitter, :inject
209
+
210
+ def support_in_v12_style?(feature)
211
+ case feature
212
+ when :synchronous then false
213
+ when :buffered then true
214
+ when :delayed_commit then false
215
+ when :custom_format then true
216
+ end
217
+ end
218
+
219
+ desc 'The buffer type (memory, file)'
220
+ config_param :buffer_type, :string, default: 'memory'
221
+ desc 'The interval between data flushes.'
222
+ config_param :flush_interval, :time, default: 60
223
+ config_param :try_flush_interval, :float, default: 1
224
+ desc 'If true, the value of `retry_value` is ignored and there is no limit'
225
+ config_param :disable_retry_limit, :bool, default: false
226
+ desc 'The limit on the number of retries before buffered data is discarded'
227
+ config_param :retry_limit, :integer, default: 17
228
+ desc 'The initial intervals between write retries.'
229
+ config_param :retry_wait, :time, default: 1.0
230
+ desc 'The maximum intervals between write retries.'
231
+ config_param :max_retry_wait, :time, default: nil
232
+ desc 'The number of threads to flush the buffer.'
233
+ config_param :num_threads, :integer, default: 1
234
+ desc 'The interval between data flushes for queued chunk.'
235
+ config_param :queued_chunk_flush_interval, :time, default: 1
236
+
237
+ desc 'The size of each buffer chunk.'
238
+ config_param :buffer_chunk_limit, :size, default: 8*1024*1024
239
+ desc 'The length limit of the chunk queue.'
240
+ config_param :buffer_queue_limit, :integer, default: 256
241
+ desc 'The action when the size of buffer queue exceeds the buffer_queue_limit.'
242
+ config_param :buffer_queue_full_action, :enum, list: [:exception, :block, :drop_oldest_chunk], default: :exception
243
+
244
+ config_param :flush_at_shutdown, :bool, default: true
245
+
246
+ BUFFER_PARAMS = Fluent::PluginHelper::CompatParameters::BUFFER_PARAMS
247
+
248
+ def self.propagate_default_params
249
+ BUFFER_PARAMS
250
+ end
251
+ include PropagateDefault
252
+
253
+ def configure(conf)
254
+ bufconf = CompatOutputUtils.buffer_section(conf)
255
+ config_style = (bufconf ? :v1 : :v0)
256
+ if config_style == :v0
257
+ buf_params = {
258
+ "flush_mode" => "interval",
259
+ "retry_type" => "exponential_backoff",
260
+ }
261
+ BUFFER_PARAMS.each do |older, newer|
262
+ next unless newer
263
+ if conf.has_key?(older)
264
+ if older == 'buffer_queue_full_action' && conf[older] == 'exception'
265
+ buf_params[newer] = 'throw_exception'
266
+ else
267
+ buf_params[newer] = conf[older]
268
+ end
269
+ end
270
+ end
271
+
272
+ conf.elements << Fluent::Config::Element.new('buffer', '', buf_params, [])
273
+ end
274
+
275
+ @includes_record_filter = self.class.ancestors.include?(Fluent::Compat::RecordFilterMixin)
276
+
277
+ methods_of_plugin = self.class.instance_methods(false)
278
+ @overrides_emit = methods_of_plugin.include?(:emit)
279
+ # RecordFilter mixin uses its own #format_stream method implementation
280
+ @overrides_format_stream = methods_of_plugin.include?(:format_stream) || @includes_record_filter
281
+
282
+ ParserUtils.convert_parser_conf(conf)
283
+ FormatterUtils.convert_formatter_conf(conf)
284
+
285
+ super
286
+
287
+ if config_style == :v1
288
+ unless @buffer_config.chunk_keys.empty?
289
+ raise Fluent::ConfigError, "this plugin '#{self.class}' cannot handle arguments for <buffer ...> section"
290
+ end
291
+ end
292
+
293
+ self.extend BufferedChunkMixin
294
+
295
+ if @overrides_emit
296
+ self.singleton_class.module_eval do
297
+ attr_accessor :last_emit_via_buffer
298
+ end
299
+ output_plugin = self
300
+ m = Module.new do
301
+ define_method(:emit) do |key, data, chain|
302
+ # receivers of this method are buffer instances
303
+ output_plugin.last_emit_via_buffer = [key, data]
304
+ end
305
+ end
306
+ @buffer.extend m
307
+ end
308
+ end
309
+
310
+ # original implementation of v0.12 BufferedOutput
311
+ def emit(tag, es, chain, key="")
312
+ # this method will not be used except for the case that plugin calls super
313
+ @emit_count += 1
314
+ data = format_stream(tag, es)
315
+ if @buffer.emit(key, data, chain)
316
+ submit_flush
317
+ end
318
+ end
319
+
320
+ def submit_flush
321
+ # nothing todo: blank method to be called from #emit of 3rd party plugins
322
+ end
323
+
324
+ def format_stream(tag, es)
325
+ # this method will not be used except for the case that plugin calls super
326
+ out = ''
327
+ es.each do |time, record|
328
+ out << format(tag, time, record)
329
+ end
330
+ out
331
+ end
332
+
333
+ # #format MUST be implemented in plugin
334
+ # #write is also
335
+
336
+ # This method overrides Fluent::Plugin::Output#handle_stream_simple
337
+ # because v0.12 BufferedOutput may overrides #format_stream, but original #handle_stream_simple method doesn't consider about it
338
+ def handle_stream_simple(tag, es, enqueue: false)
339
+ if @overrides_emit
340
+ current_emit_count = @emit_count
341
+ size = es.size
342
+ key = data = nil
343
+ begin
344
+ emit(tag, es, NULL_OUTPUT_CHAIN)
345
+ key, data = self.last_emit_via_buffer
346
+ ensure
347
+ @emit_count = current_emit_count
348
+ self.last_emit_via_buffer = nil
349
+ end
350
+ # on-the-fly key assignment can be done, and it's not configurable if Plugin#emit does it dynamically
351
+ meta = @buffer.metadata(variables: (key && !key.empty? ? {key: key} : nil))
352
+ write_guard do
353
+ @buffer.write({meta => data}, format: ->(_data){ _data }, size: ->(){ size }, enqueue: enqueue)
354
+ end
355
+ @counters_monitor.synchronize{ @emit_records += size }
356
+ return [meta]
357
+ end
358
+
359
+ if @overrides_format_stream
360
+ meta = metadata(nil, nil, nil)
361
+ size = es.size
362
+ bulk = format_stream(tag, es)
363
+ write_guard do
364
+ @buffer.write({meta => bulk}, format: ->(_data){ _data }, size: ->(){ size }, enqueue: enqueue)
365
+ end
366
+ @counters_monitor.synchronize{ @emit_records += size }
367
+ return [meta]
368
+ end
369
+
370
+ meta = metadata(nil, nil, nil)
371
+ size = es.size
372
+ data = es.map{|time,record| format(tag, time, record) }
373
+ write_guard do
374
+ @buffer.write({meta => data}, enqueue: enqueue)
375
+ end
376
+ @counters_monitor.synchronize{ @emit_records += size }
377
+ [meta]
378
+ end
379
+
380
+ def extract_placeholders(str, metadata)
381
+ raise "BUG: compat plugin does not support extract_placeholders: use newer plugin API"
382
+ end
383
+
384
+ def initialize
385
+ super
386
+ unless self.class.ancestors.include?(Fluent::Compat::CallSuperMixin)
387
+ self.class.prepend Fluent::Compat::CallSuperMixin
388
+ end
389
+ end
390
+
391
+ def start
392
+ super
393
+
394
+ if instance_variable_defined?(:@formatter) && @inject_config
395
+ unless @formatter.class.ancestors.include?(Fluent::Compat::HandleTagAndTimeMixin)
396
+ if @formatter.respond_to?(:owner) && !@formatter.owner
397
+ @formatter.owner = self
398
+ @formatter.singleton_class.prepend FormatterUtils::InjectMixin
399
+ end
400
+ end
401
+ end
402
+ end
403
+
404
+ def detach_process(&block)
405
+ log.warn "detach_process is not supported in this version. ignored."
406
+ block.call
407
+ end
408
+
409
+ def detach_multi_process(&block)
410
+ log.warn "detach_process is not supported in this version. ignored."
411
+ block.call
412
+ end
413
+ end
414
+
415
+ class ObjectBufferedOutput < Fluent::Plugin::Output
416
+ # TODO: warn when deprecated
417
+
418
+ helpers_internal :event_emitter, :inject
419
+
420
+ # This plugin cannot inherit BufferedOutput because #configure sets chunk_key 'tag'
421
+ # to flush chunks per tags, but BufferedOutput#configure doesn't allow setting chunk_key
422
+ # in v1 style configuration
423
+
424
+ def support_in_v12_style?(feature)
425
+ case feature
426
+ when :synchronous then false
427
+ when :buffered then true
428
+ when :delayed_commit then false
429
+ when :custom_format then false
430
+ end
431
+ end
432
+
433
+ desc 'The buffer type (memory, file)'
434
+ config_param :buffer_type, :string, default: 'memory'
435
+ desc 'The interval between data flushes.'
436
+ config_param :flush_interval, :time, default: 60
437
+ config_param :try_flush_interval, :float, default: 1
438
+ desc 'If true, the value of `retry_value` is ignored and there is no limit'
439
+ config_param :disable_retry_limit, :bool, default: false
440
+ desc 'The limit on the number of retries before buffered data is discarded'
441
+ config_param :retry_limit, :integer, default: 17
442
+ desc 'The initial intervals between write retries.'
443
+ config_param :retry_wait, :time, default: 1.0
444
+ desc 'The maximum intervals between write retries.'
445
+ config_param :max_retry_wait, :time, default: nil
446
+ desc 'The number of threads to flush the buffer.'
447
+ config_param :num_threads, :integer, default: 1
448
+ desc 'The interval between data flushes for queued chunk.'
449
+ config_param :queued_chunk_flush_interval, :time, default: 1
450
+
451
+ desc 'The size of each buffer chunk.'
452
+ config_param :buffer_chunk_limit, :size, default: 8*1024*1024
453
+ desc 'The length limit of the chunk queue.'
454
+ config_param :buffer_queue_limit, :integer, default: 256
455
+ desc 'The action when the size of buffer queue exceeds the buffer_queue_limit.'
456
+ config_param :buffer_queue_full_action, :enum, list: [:exception, :block, :drop_oldest_chunk], default: :exception
457
+
458
+ config_param :flush_at_shutdown, :bool, default: true
459
+
460
+ config_set_default :time_as_integer, true
461
+
462
+ BUFFER_PARAMS = Fluent::PluginHelper::CompatParameters::BUFFER_PARAMS
463
+
464
+ def self.propagate_default_params
465
+ BUFFER_PARAMS
466
+ end
467
+ include PropagateDefault
468
+
469
+ def configure(conf)
470
+ bufconf = CompatOutputUtils.buffer_section(conf)
471
+ config_style = (bufconf ? :v1 : :v0)
472
+ if config_style == :v0
473
+ buf_params = {
474
+ "flush_mode" => "interval",
475
+ "retry_type" => "exponential_backoff",
476
+ }
477
+ BUFFER_PARAMS.each do |older, newer|
478
+ next unless newer
479
+ if conf.has_key?(older)
480
+ if older == 'buffer_queue_full_action' && conf[older] == 'exception'
481
+ buf_params[newer] = 'throw_exception'
482
+ else
483
+ buf_params[newer] = conf[older]
484
+ end
485
+ end
486
+ end
487
+
488
+ conf.elements << Fluent::Config::Element.new('buffer', 'tag', buf_params, [])
489
+ end
490
+
491
+ ParserUtils.convert_parser_conf(conf)
492
+ FormatterUtils.convert_formatter_conf(conf)
493
+
494
+ super
495
+
496
+ if config_style == :v1
497
+ if @buffer_config.chunk_keys == ['tag']
498
+ raise Fluent::ConfigError, "this plugin '#{self.class}' allows <buffer tag> only"
499
+ end
500
+ end
501
+
502
+ self.extend BufferedChunkMixin
503
+ end
504
+
505
+ def format_stream(tag, es) # for BufferedOutputTestDriver
506
+ if @compress == :gzip
507
+ es.to_compressed_msgpack_stream(time_int: @time_as_integer)
508
+ else
509
+ es.to_msgpack_stream(time_int: @time_as_integer)
510
+ end
511
+ end
512
+
513
+ def write(chunk)
514
+ write_objects(chunk.metadata.tag, chunk)
515
+ end
516
+
517
+ def extract_placeholders(str, metadata)
518
+ raise "BUG: compat plugin does not support extract_placeholders: use newer plugin API"
519
+ end
520
+
521
+ def initialize
522
+ super
523
+ unless self.class.ancestors.include?(Fluent::Compat::CallSuperMixin)
524
+ self.class.prepend Fluent::Compat::CallSuperMixin
525
+ end
526
+ end
527
+
528
+ def start
529
+ super
530
+
531
+ if instance_variable_defined?(:@formatter) && @inject_config
532
+ unless @formatter.class.ancestors.include?(Fluent::Compat::HandleTagAndTimeMixin)
533
+ if @formatter.respond_to?(:owner) && !@formatter.owner
534
+ @formatter.owner = self
535
+ @formatter.singleton_class.prepend FormatterUtils::InjectMixin
536
+ end
537
+ end
538
+ end
539
+ end
540
+
541
+ def detach_process(&block)
542
+ log.warn "detach_process is not supported in this version. ignored."
543
+ block.call
544
+ end
545
+
546
+ def detach_multi_process(&block)
547
+ log.warn "detach_process is not supported in this version. ignored."
548
+ block.call
549
+ end
550
+ end
551
+
552
+ class TimeSlicedOutput < Fluent::Plugin::Output
553
+ # TODO: warn when deprecated
554
+
555
+ helpers_internal :event_emitter, :inject
556
+
557
+ def support_in_v12_style?(feature)
558
+ case feature
559
+ when :synchronous then false
560
+ when :buffered then true
561
+ when :delayed_commit then false
562
+ when :custom_format then true
563
+ end
564
+ end
565
+
566
+ desc 'The buffer type (memory, file)'
567
+ config_param :buffer_type, :string, default: 'file'
568
+ desc 'The interval between data flushes.'
569
+ config_param :flush_interval, :time, default: nil
570
+ config_param :try_flush_interval, :float, default: 1
571
+ desc 'If true, the value of `retry_value` is ignored and there is no limit'
572
+ config_param :disable_retry_limit, :bool, default: false
573
+ desc 'The limit on the number of retries before buffered data is discarded'
574
+ config_param :retry_limit, :integer, default: 17
575
+ desc 'The initial intervals between write retries.'
576
+ config_param :retry_wait, :time, default: 1.0
577
+ desc 'The maximum intervals between write retries.'
578
+ config_param :max_retry_wait, :time, default: nil
579
+ desc 'The number of threads to flush the buffer.'
580
+ config_param :num_threads, :integer, default: 1
581
+ desc 'The interval between data flushes for queued chunk.'
582
+ config_param :queued_chunk_flush_interval, :time, default: 1
583
+
584
+ desc 'The time format used as part of the file name.'
585
+ config_param :time_slice_format, :string, default: '%Y%m%d'
586
+ desc 'The amount of time Fluentd will wait for old logs to arrive.'
587
+ config_param :time_slice_wait, :time, default: 10*60
588
+ desc 'Parse the time value in the specified timezone'
589
+ config_param :timezone, :string, default: nil
590
+
591
+ desc 'The size of each buffer chunk.'
592
+ config_param :buffer_chunk_limit, :size, default: 256*1024*1024
593
+ desc 'The length limit of the chunk queue.'
594
+ config_param :buffer_queue_limit, :integer, default: 256
595
+ desc 'The action when the size of buffer queue exceeds the buffer_queue_limit.'
596
+ config_param :buffer_queue_full_action, :enum, list: [:exception, :block, :drop_oldest_chunk], default: :exception
597
+
598
+ config_param :flush_at_shutdown, :bool, default: false
599
+
600
+ attr_accessor :localtime
601
+
602
+ config_section :buffer do
603
+ config_set_default :@type, 'file'
604
+ end
605
+
606
+ BUFFER_PARAMS = Fluent::PluginHelper::CompatParameters::BUFFER_PARAMS.merge(Fluent::PluginHelper::CompatParameters::BUFFER_TIME_SLICED_PARAMS)
607
+
608
+ def initialize
609
+ super
610
+ @localtime = true
611
+
612
+ unless self.class.ancestors.include?(Fluent::Compat::CallSuperMixin)
613
+ self.class.prepend Fluent::Compat::CallSuperMixin
614
+ end
615
+ end
616
+
617
+ def self.propagate_default_params
618
+ BUFFER_PARAMS
619
+ end
620
+ include PropagateDefault
621
+
622
+ def configure(conf)
623
+ bufconf = CompatOutputUtils.buffer_section(conf)
624
+ config_style = (bufconf ? :v1 : :v0)
625
+ if config_style == :v0
626
+ buf_params = {
627
+ "flush_mode" => (conf['flush_interval'] ? "interval" : "lazy"),
628
+ "retry_type" => "exponential_backoff",
629
+ }
630
+ BUFFER_PARAMS.each do |older, newer|
631
+ next unless newer
632
+ if conf.has_key?(older)
633
+ if older == 'buffer_queue_full_action' && conf[older] == 'exception'
634
+ buf_params[newer] = 'throw_exception'
635
+ else
636
+ buf_params[newer] = conf[older]
637
+ end
638
+ end
639
+ end
640
+
641
+ if conf['timezone']
642
+ Fluent::Timezone.validate!(conf['timezone'])
643
+ elsif conf['utc']
644
+ # v0.12 assumes UTC without any configuration
645
+ # 'localtime=false && no timezone key' means UTC
646
+ conf['localtime'] = "false"
647
+ conf.delete('utc')
648
+ elsif conf['localtime']
649
+ conf['timezone'] = Time.now.strftime('%z')
650
+ conf['localtime'] = "true"
651
+ else
652
+ # v0.12 assumes UTC without any configuration
653
+ # 'localtime=false && no timezone key' means UTC
654
+ conf['localtime'] = "false"
655
+ end
656
+
657
+ @_timekey = case conf['time_slice_format']
658
+ when /\%S/ then 1
659
+ when /\%M/ then 60
660
+ when /\%H/ then 3600
661
+ when /\%d/ then 86400
662
+ when nil then 86400 # default value of TimeSlicedOutput.time_slice_format is '%Y%m%d'
663
+ else
664
+ raise Fluent::ConfigError, "time_slice_format only with %Y or %m is too long"
665
+ end
666
+ buf_params["timekey"] = @_timekey
667
+
668
+ conf.elements << Fluent::Config::Element.new('buffer', 'time', buf_params, [])
669
+ end
670
+
671
+ ParserUtils.convert_parser_conf(conf)
672
+ FormatterUtils.convert_formatter_conf(conf)
673
+
674
+ super
675
+
676
+ if config_style == :v1
677
+ if @buffer_config.chunk_keys == ['tag']
678
+ raise Fluent::ConfigError, "this plugin '#{self.class}' allows <buffer tag> only"
679
+ end
680
+ end
681
+
682
+ self.extend TimeSliceChunkMixin
683
+ end
684
+
685
+ def start
686
+ super
687
+
688
+ if instance_variable_defined?(:@formatter) && @inject_config
689
+ unless @formatter.class.ancestors.include?(Fluent::Compat::HandleTagAndTimeMixin)
690
+ if @formatter.respond_to?(:owner) && !@formatter.owner
691
+ @formatter.owner = self
692
+ @formatter.singleton_class.prepend FormatterUtils::InjectMixin
693
+ end
694
+ end
695
+ end
696
+ end
697
+
698
+ def detach_process(&block)
699
+ log.warn "detach_process is not supported in this version. ignored."
700
+ block.call
701
+ end
702
+
703
+ def detach_multi_process(&block)
704
+ log.warn "detach_process is not supported in this version. ignored."
705
+ block.call
706
+ end
707
+
708
+ # Original TimeSlicedOutput#emit doesn't call #format_stream
709
+
710
+ # #format MUST be implemented in plugin
711
+ # #write is also
712
+
713
+ def extract_placeholders(str, metadata)
714
+ raise "BUG: compat plugin does not support extract_placeholders: use newer plugin API"
715
+ end
716
+ end
717
+ end
718
+ end