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,383 @@
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/buffer/chunk'
18
+ require 'fluent/unique_id'
19
+ require 'fluent/msgpack_factory'
20
+
21
+ module Fluent
22
+ module Plugin
23
+ class Buffer
24
+ class FileChunk < Chunk
25
+ class FileChunkError < StandardError; end
26
+
27
+ ### buffer path user specified : /path/to/directory/user_specified_prefix.*.log
28
+ ### buffer chunk path : /path/to/directory/user_specified_prefix.b513b61c9791029c2513b61c9791029c2.log
29
+ ### buffer chunk metadata path : /path/to/directory/user_specified_prefix.b513b61c9791029c2513b61c9791029c2.log.meta
30
+
31
+ # NOTE: Old style buffer path of time sliced output plugins had a part of key: prefix.20150414.b513b61...suffix
32
+ # But this part is not used now for any purpose. (Now metadata is used instead.)
33
+
34
+ # state: b/q - 'b'(on stage, compatible with v0.12), 'q'(enqueued)
35
+ # path_prefix: path prefix string, ended with '.'
36
+ # path_suffix: path suffix string, like '.log' (or any other user specified)
37
+
38
+ include SystemConfig::Mixin
39
+ include MessagePackFactory::Mixin
40
+
41
+ FILE_PERMISSION = 0644
42
+
43
+ attr_reader :path, :permission
44
+
45
+ def initialize(metadata, path, mode, perm: system_config.file_permission || FILE_PERMISSION, compress: :text)
46
+ super(metadata, compress: compress)
47
+ @permission = perm.is_a?(String) ? perm.to_i(8) : perm
48
+ @bytesize = @size = @adding_bytes = @adding_size = 0
49
+ @meta = nil
50
+
51
+ case mode
52
+ when :create then create_new_chunk(path, @permission)
53
+ when :staged then load_existing_staged_chunk(path)
54
+ when :queued then load_existing_enqueued_chunk(path)
55
+ else
56
+ raise ArgumentError, "Invalid file chunk mode: #{mode}"
57
+ end
58
+ end
59
+
60
+ def concat(bulk, bulk_size)
61
+ raise "BUG: concatenating to unwritable chunk, now '#{self.state}'" unless self.writable?
62
+
63
+ bulk.force_encoding(Encoding::ASCII_8BIT)
64
+ @chunk.write bulk
65
+ @adding_bytes += bulk.bytesize
66
+ @adding_size += bulk_size
67
+ true
68
+ end
69
+
70
+ def commit
71
+ write_metadata # this should be at first: of course, this operation may fail
72
+
73
+ @commit_position = @chunk.pos
74
+ @size += @adding_size
75
+ @bytesize += @adding_bytes
76
+ @adding_bytes = @adding_size = 0
77
+ @modified_at = Time.now
78
+
79
+ true
80
+ end
81
+
82
+ def rollback
83
+ if @chunk.pos != @commit_position
84
+ @chunk.seek(@commit_position, IO::SEEK_SET)
85
+ @chunk.truncate(@commit_position)
86
+ end
87
+ @adding_bytes = @adding_size = 0
88
+ true
89
+ end
90
+
91
+ def bytesize
92
+ @bytesize + @adding_bytes
93
+ end
94
+
95
+ def size
96
+ @size + @adding_size
97
+ end
98
+
99
+ def empty?
100
+ @bytesize == 0
101
+ end
102
+
103
+ def enqueued!
104
+ return unless self.staged?
105
+
106
+ new_chunk_path = self.class.generate_queued_chunk_path(@path, @unique_id)
107
+ new_meta_path = new_chunk_path + '.meta'
108
+
109
+ write_metadata(update: false) # re-write metadata w/ finalized records
110
+
111
+ begin
112
+ file_rename(@chunk, @path, new_chunk_path, ->(new_io) { @chunk = new_io })
113
+ rescue => e
114
+ begin
115
+ file_rename(@chunk, new_chunk_path, @path, ->(new_io) { @chunk = new_io }) if File.exist?(new_chunk_path)
116
+ rescue => re
117
+ # In this point, restore buffer state is hard because previous `file_rename` failed by resource problem.
118
+ # Retry is one possible approach but it may cause livelock under limited resources or high load environment.
119
+ # So we ignore such errors for now and log better message instead.
120
+ # "Too many open files" should be fixed by proper buffer configuration and system setting.
121
+ raise "can't enqueue buffer file and failed to restore. This may causes inconsistent state: path = #{@path}, error = '#{e}', retry error = '#{re}'"
122
+ else
123
+ raise "can't enqueue buffer file: path = #{@path}, error = '#{e}'"
124
+ end
125
+ end
126
+
127
+ begin
128
+ file_rename(@meta, @meta_path, new_meta_path, ->(new_io) { @meta = new_io })
129
+ rescue => e
130
+ begin
131
+ file_rename(@chunk, new_chunk_path, @path, ->(new_io) { @chunk = new_io }) if File.exist?(new_chunk_path)
132
+ file_rename(@meta, new_meta_path, @meta_path, ->(new_io) { @meta = new_io }) if File.exist?(new_meta_path)
133
+ rescue => re
134
+ # See above
135
+ raise "can't enqueue buffer metadata and failed to restore. This may causes inconsistent state: path = #{@meta_path}, error = '#{e}', retry error = '#{re}'"
136
+ else
137
+ raise "can't enqueue buffer metadata: path = #{@meta_path}, error = '#{e}'"
138
+ end
139
+ end
140
+
141
+ @path = new_chunk_path
142
+ @meta_path = new_meta_path
143
+
144
+ super
145
+ end
146
+
147
+ def close
148
+ super
149
+ size = @chunk.size
150
+ @chunk.close
151
+ @meta.close if @meta # meta may be missing if chunk is queued at first
152
+ if size == 0
153
+ File.unlink(@path, @meta_path)
154
+ end
155
+ end
156
+
157
+ def purge
158
+ super
159
+ @chunk.close
160
+ @meta.close if @meta
161
+ @bytesize = @size = @adding_bytes = @adding_size = 0
162
+ File.unlink(@path, @meta_path)
163
+ end
164
+
165
+ def read(**kwargs)
166
+ @chunk.seek(0, IO::SEEK_SET)
167
+ @chunk.read
168
+ end
169
+
170
+ def open(**kwargs, &block)
171
+ @chunk.seek(0, IO::SEEK_SET)
172
+ val = yield @chunk
173
+ @chunk.seek(0, IO::SEEK_END) if self.staged?
174
+ val
175
+ end
176
+
177
+ def self.assume_chunk_state(path)
178
+ if /\.(b|q)([0-9a-f]+)\.[^\/]*\Z/n =~ path # //n switch means explicit 'ASCII-8BIT' pattern
179
+ $1 == 'b' ? :staged : :queued
180
+ else
181
+ # files which matches to glob of buffer file pattern
182
+ # it includes files which are created by out_file
183
+ :unknown
184
+ end
185
+ end
186
+
187
+ def self.generate_stage_chunk_path(path, unique_id)
188
+ pos = path.index('.*.')
189
+ raise "BUG: buffer chunk path on stage MUST have '.*.'" unless pos
190
+
191
+ prefix = path[0...pos]
192
+ suffix = path[(pos+3)..-1]
193
+
194
+ chunk_id = Fluent::UniqueId.hex(unique_id)
195
+ state = 'b'
196
+ "#{prefix}.#{state}#{chunk_id}.#{suffix}"
197
+ end
198
+
199
+ def self.generate_queued_chunk_path(path, unique_id)
200
+ chunk_id = Fluent::UniqueId.hex(unique_id)
201
+ if path.index(".b#{chunk_id}.")
202
+ path.sub(".b#{chunk_id}.", ".q#{chunk_id}.")
203
+ else # for unexpected cases (ex: users rename files while opened by fluentd)
204
+ path + ".q#{chunk_id}.chunk"
205
+ end
206
+ end
207
+
208
+ # used only for queued v0.12 buffer path
209
+ def self.unique_id_from_path(path)
210
+ if /\.(b|q)([0-9a-f]+)\.[^\/]*\Z/n =~ path # //n switch means explicit 'ASCII-8BIT' pattern
211
+ return $2.scan(/../).map{|x| x.to_i(16) }.pack('C*')
212
+ end
213
+ nil
214
+ end
215
+
216
+ def restore_metadata(bindata)
217
+ data = msgpack_unpacker(symbolize_keys: true).feed(bindata).read rescue {}
218
+
219
+ now = Time.now
220
+
221
+ @unique_id = data[:id] || self.class.unique_id_from_path(@path) || @unique_id
222
+ @size = data[:s] || 0
223
+ @created_at = Time.at(data.fetch(:c, now.to_i))
224
+ @modified_at = Time.at(data.fetch(:m, now.to_i))
225
+
226
+ @metadata.timekey = data[:timekey]
227
+ @metadata.tag = data[:tag]
228
+ @metadata.variables = data[:variables]
229
+ end
230
+
231
+ def restore_metadata_partially(chunk)
232
+ @unique_id = self.class.unique_id_from_path(chunk.path) || @unique_id
233
+ @size = 0
234
+ @created_at = chunk.ctime # birthtime isn't supported on Windows (and Travis?)
235
+ @modified_at = chunk.mtime
236
+
237
+ @metadata.timekey = nil
238
+ @metadata.tag = nil
239
+ @metadata.variables = nil
240
+ end
241
+
242
+ def write_metadata(update: true)
243
+ data = @metadata.to_h.merge({
244
+ id: @unique_id,
245
+ s: (update ? @size + @adding_size : @size),
246
+ c: @created_at.to_i,
247
+ m: (update ? Time.now : @modified_at).to_i,
248
+ })
249
+ bin = msgpack_packer.pack(data).to_s
250
+ @meta.seek(0, IO::SEEK_SET)
251
+ @meta.write(bin)
252
+ @meta.truncate(bin.bytesize)
253
+ end
254
+
255
+ def file_rename(file, old_path, new_path, callback=nil)
256
+ pos = file.pos
257
+ if Fluent.windows?
258
+ file.close
259
+ File.rename(old_path, new_path)
260
+ file = File.open(new_path, 'rb', @permission)
261
+ else
262
+ File.rename(old_path, new_path)
263
+ file.reopen(new_path, 'rb')
264
+ end
265
+ file.set_encoding(Encoding::ASCII_8BIT)
266
+ file.sync = true
267
+ file.binmode
268
+ file.pos = pos
269
+ callback.call(file) if callback
270
+ end
271
+
272
+ def create_new_chunk(path, perm)
273
+ @path = self.class.generate_stage_chunk_path(path, @unique_id)
274
+ @meta_path = @path + '.meta'
275
+ begin
276
+ @chunk = File.open(@path, 'wb+', perm)
277
+ @chunk.set_encoding(Encoding::ASCII_8BIT)
278
+ @chunk.sync = true
279
+ @chunk.binmode
280
+ rescue => e
281
+ # Here assumes "Too many open files" like recoverable error so raising BufferOverflowError.
282
+ # If other cases are possible, we will change erorr handling with proper classes.
283
+ raise BufferOverflowError, "can't create buffer file for #{path}. Stop creating buffer files: error = #{e}"
284
+ end
285
+ begin
286
+ @meta = File.open(@meta_path, 'wb', perm)
287
+ @meta.set_encoding(Encoding::ASCII_8BIT)
288
+ @meta.sync = true
289
+ @meta.binmode
290
+ write_metadata(update: false)
291
+ rescue => e
292
+ # This case is easier than enqueued!. Just removing pre-create buffer file
293
+ @chunk.close rescue nil
294
+ File.unlink(@path) rescue nil
295
+ # Same as @chunk case. See above
296
+ raise BufferOverflowError, "can't create buffer metadata for #{path}. Stop creating buffer files: error = #{e}"
297
+ end
298
+
299
+ @state = :unstaged
300
+ @bytesize = 0
301
+ @commit_position = @chunk.pos # must be 0
302
+ @adding_bytes = 0
303
+ @adding_size = 0
304
+ end
305
+
306
+ def load_existing_staged_chunk(path)
307
+ @path = path
308
+ @meta_path = @path + '.meta'
309
+
310
+ @meta = nil
311
+ # staging buffer chunk without metadata is classic buffer chunk file
312
+ # and it should be enqueued immediately
313
+ if File.exist?(@meta_path)
314
+ raise FileChunkError, "staged file chunk is empty" if File.size(@path).zero?
315
+
316
+ @chunk = File.open(@path, 'rb+')
317
+ @chunk.set_encoding(Encoding::ASCII_8BIT)
318
+ @chunk.sync = true
319
+ @chunk.seek(0, IO::SEEK_END)
320
+ @chunk.binmode
321
+
322
+ @meta = File.open(@meta_path, 'rb+')
323
+ @meta.set_encoding(Encoding::ASCII_8BIT)
324
+ @meta.sync = true
325
+ @meta.binmode
326
+ begin
327
+ restore_metadata(@meta.read)
328
+ rescue => e
329
+ @chunk.close
330
+ @meta.close
331
+ raise FileChunkError, "staged meta file is broken. #{e.message}"
332
+ end
333
+ @meta.seek(0, IO::SEEK_SET)
334
+
335
+ @state = :staged
336
+ @bytesize = @chunk.size
337
+ @commit_position = @chunk.pos
338
+ @adding_bytes = 0
339
+ @adding_size = 0
340
+ else
341
+ # classic buffer chunk - read only chunk
342
+ @chunk = File.open(@path, 'rb')
343
+ @chunk.set_encoding(Encoding::ASCII_8BIT)
344
+ @chunk.binmode
345
+ @chunk.seek(0, IO::SEEK_SET)
346
+ @state = :queued
347
+ @bytesize = @chunk.size
348
+
349
+ restore_metadata_partially(@chunk)
350
+
351
+ @commit_position = @chunk.size
352
+ @unique_id = self.class.unique_id_from_path(@path) || @unique_id
353
+ end
354
+ end
355
+
356
+ def load_existing_enqueued_chunk(path)
357
+ @path = path
358
+ raise FileChunkError, "enqueued file chunk is empty" if File.size(@path).zero?
359
+
360
+ @chunk = File.open(@path, 'rb')
361
+ @chunk.set_encoding(Encoding::ASCII_8BIT)
362
+ @chunk.binmode
363
+ @chunk.seek(0, IO::SEEK_SET)
364
+ @bytesize = @chunk.size
365
+ @commit_position = @chunk.size
366
+
367
+ @meta_path = @path + '.meta'
368
+ if File.readable?(@meta_path)
369
+ begin
370
+ restore_metadata(File.open(@meta_path){|f| f.set_encoding(Encoding::ASCII_8BIT); f.binmode; f.read })
371
+ rescue => e
372
+ @chunk.close
373
+ raise FileChunkError, "enqueued meta file is broken. #{e.message}"
374
+ end
375
+ else
376
+ restore_metadata_partially(@chunk)
377
+ end
378
+ @state = :queued
379
+ end
380
+ end
381
+ end
382
+ end
383
+ end
@@ -0,0 +1,90 @@
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/buffer/chunk'
18
+
19
+ module Fluent
20
+ module Plugin
21
+ class Buffer
22
+ class MemoryChunk < Chunk
23
+ def initialize(metadata, compress: :text)
24
+ super
25
+ @chunk = ''.force_encoding(Encoding::ASCII_8BIT)
26
+ @chunk_bytes = 0
27
+ @adding_bytes = 0
28
+ @adding_size = 0
29
+ end
30
+
31
+ def concat(bulk, bulk_size)
32
+ raise "BUG: concatenating to unwritable chunk, now '#{self.state}'" unless self.writable?
33
+
34
+ bulk.force_encoding(Encoding::ASCII_8BIT)
35
+ @chunk << bulk
36
+ @adding_bytes += bulk.bytesize
37
+ @adding_size += bulk_size
38
+ true
39
+ end
40
+
41
+ def commit
42
+ @size += @adding_size
43
+ @chunk_bytes += @adding_bytes
44
+
45
+ @adding_bytes = @adding_size = 0
46
+ @modified_at = Time.now
47
+ true
48
+ end
49
+
50
+ def rollback
51
+ @chunk.slice!(@chunk_bytes, @adding_bytes)
52
+ @adding_bytes = @adding_size = 0
53
+ true
54
+ end
55
+
56
+ def bytesize
57
+ @chunk_bytes + @adding_bytes
58
+ end
59
+
60
+ def size
61
+ @size + @adding_size
62
+ end
63
+
64
+ def empty?
65
+ @chunk.empty?
66
+ end
67
+
68
+ def purge
69
+ super
70
+ @chunk = ''.force_encoding("ASCII-8BIT")
71
+ @chunk_bytes = @size = @adding_bytes = @adding_size = 0
72
+ true
73
+ end
74
+
75
+ def read(**kwargs)
76
+ @chunk
77
+ end
78
+
79
+ def open(**kwargs, &block)
80
+ StringIO.open(@chunk, &block)
81
+ end
82
+
83
+ def write_to(io, **kwargs)
84
+ # re-implementation to optimize not to create StringIO
85
+ io.write @chunk
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end