fluentd 1.14.4-x64-mingw-ucrt

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 (558) hide show
  1. checksums.yaml +7 -0
  2. data/.deepsource.toml +13 -0
  3. data/.drone.yml +35 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.yaml +70 -0
  5. data/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. data/.github/ISSUE_TEMPLATE/feature_request.yaml +38 -0
  7. data/.github/ISSUE_TEMPLATE.md +17 -0
  8. data/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  9. data/.github/workflows/issue-auto-closer.yml +12 -0
  10. data/.github/workflows/linux-test.yaml +36 -0
  11. data/.github/workflows/macos-test.yaml +30 -0
  12. data/.github/workflows/stale-actions.yml +22 -0
  13. data/.github/workflows/windows-test.yaml +46 -0
  14. data/.gitignore +30 -0
  15. data/.gitlab-ci.yml +103 -0
  16. data/ADOPTERS.md +5 -0
  17. data/AUTHORS +2 -0
  18. data/CHANGELOG.md +2409 -0
  19. data/CONTRIBUTING.md +45 -0
  20. data/GOVERNANCE.md +55 -0
  21. data/Gemfile +9 -0
  22. data/GithubWorkflow.md +78 -0
  23. data/LICENSE +202 -0
  24. data/MAINTAINERS.md +11 -0
  25. data/README.md +97 -0
  26. data/Rakefile +79 -0
  27. data/SECURITY.md +18 -0
  28. data/bin/fluent-binlog-reader +7 -0
  29. data/bin/fluent-ca-generate +6 -0
  30. data/bin/fluent-cap-ctl +7 -0
  31. data/bin/fluent-cat +5 -0
  32. data/bin/fluent-ctl +7 -0
  33. data/bin/fluent-debug +5 -0
  34. data/bin/fluent-gem +9 -0
  35. data/bin/fluent-plugin-config-format +5 -0
  36. data/bin/fluent-plugin-generate +5 -0
  37. data/bin/fluentd +15 -0
  38. data/code-of-conduct.md +3 -0
  39. data/docs/SECURITY_AUDIT.pdf +0 -0
  40. data/example/copy_roundrobin.conf +39 -0
  41. data/example/counter.conf +18 -0
  42. data/example/filter_stdout.conf +22 -0
  43. data/example/in_forward.conf +14 -0
  44. data/example/in_forward_client.conf +37 -0
  45. data/example/in_forward_shared_key.conf +15 -0
  46. data/example/in_forward_tls.conf +14 -0
  47. data/example/in_forward_users.conf +24 -0
  48. data/example/in_forward_workers.conf +21 -0
  49. data/example/in_http.conf +16 -0
  50. data/example/in_out_forward.conf +17 -0
  51. data/example/in_sample_blocks.conf +17 -0
  52. data/example/in_sample_with_compression.conf +23 -0
  53. data/example/in_syslog.conf +15 -0
  54. data/example/in_tail.conf +14 -0
  55. data/example/in_tcp.conf +13 -0
  56. data/example/in_udp.conf +13 -0
  57. data/example/logevents.conf +25 -0
  58. data/example/multi_filters.conf +61 -0
  59. data/example/out_copy.conf +20 -0
  60. data/example/out_exec_filter.conf +42 -0
  61. data/example/out_file.conf +13 -0
  62. data/example/out_forward.conf +35 -0
  63. data/example/out_forward_buf_file.conf +23 -0
  64. data/example/out_forward_client.conf +109 -0
  65. data/example/out_forward_heartbeat_none.conf +16 -0
  66. data/example/out_forward_sd.conf +17 -0
  67. data/example/out_forward_shared_key.conf +36 -0
  68. data/example/out_forward_tls.conf +18 -0
  69. data/example/out_forward_users.conf +65 -0
  70. data/example/out_null.conf +36 -0
  71. data/example/sd.yaml +8 -0
  72. data/example/secondary_file.conf +42 -0
  73. data/example/suppress_config_dump.conf +7 -0
  74. data/example/v0_12_filter.conf +78 -0
  75. data/example/v1_literal_example.conf +36 -0
  76. data/example/worker_section.conf +36 -0
  77. data/fluent.conf +139 -0
  78. data/fluentd.gemspec +55 -0
  79. data/lib/fluent/agent.rb +168 -0
  80. data/lib/fluent/capability.rb +87 -0
  81. data/lib/fluent/clock.rb +66 -0
  82. data/lib/fluent/command/binlog_reader.rb +244 -0
  83. data/lib/fluent/command/bundler_injection.rb +45 -0
  84. data/lib/fluent/command/ca_generate.rb +184 -0
  85. data/lib/fluent/command/cap_ctl.rb +174 -0
  86. data/lib/fluent/command/cat.rb +365 -0
  87. data/lib/fluent/command/ctl.rb +177 -0
  88. data/lib/fluent/command/debug.rb +103 -0
  89. data/lib/fluent/command/fluentd.rb +374 -0
  90. data/lib/fluent/command/plugin_config_formatter.rb +308 -0
  91. data/lib/fluent/command/plugin_generator.rb +365 -0
  92. data/lib/fluent/compat/call_super_mixin.rb +76 -0
  93. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  94. data/lib/fluent/compat/exec_util.rb +129 -0
  95. data/lib/fluent/compat/file_util.rb +54 -0
  96. data/lib/fluent/compat/filter.rb +68 -0
  97. data/lib/fluent/compat/formatter.rb +111 -0
  98. data/lib/fluent/compat/formatter_utils.rb +85 -0
  99. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  100. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  101. data/lib/fluent/compat/input.rb +49 -0
  102. data/lib/fluent/compat/output.rb +721 -0
  103. data/lib/fluent/compat/output_chain.rb +60 -0
  104. data/lib/fluent/compat/parser.rb +310 -0
  105. data/lib/fluent/compat/parser_utils.rb +40 -0
  106. data/lib/fluent/compat/propagate_default.rb +62 -0
  107. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  108. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  109. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  110. data/lib/fluent/compat/socket_util.rb +165 -0
  111. data/lib/fluent/compat/string_util.rb +34 -0
  112. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  113. data/lib/fluent/compat/type_converter.rb +90 -0
  114. data/lib/fluent/config/basic_parser.rb +123 -0
  115. data/lib/fluent/config/configure_proxy.rb +424 -0
  116. data/lib/fluent/config/dsl.rb +152 -0
  117. data/lib/fluent/config/element.rb +265 -0
  118. data/lib/fluent/config/error.rb +32 -0
  119. data/lib/fluent/config/literal_parser.rb +286 -0
  120. data/lib/fluent/config/parser.rb +107 -0
  121. data/lib/fluent/config/section.rb +272 -0
  122. data/lib/fluent/config/types.rb +249 -0
  123. data/lib/fluent/config/v1_parser.rb +192 -0
  124. data/lib/fluent/config.rb +76 -0
  125. data/lib/fluent/configurable.rb +201 -0
  126. data/lib/fluent/counter/base_socket.rb +44 -0
  127. data/lib/fluent/counter/client.rb +297 -0
  128. data/lib/fluent/counter/error.rb +86 -0
  129. data/lib/fluent/counter/mutex_hash.rb +163 -0
  130. data/lib/fluent/counter/server.rb +273 -0
  131. data/lib/fluent/counter/store.rb +205 -0
  132. data/lib/fluent/counter/validator.rb +145 -0
  133. data/lib/fluent/counter.rb +23 -0
  134. data/lib/fluent/daemon.rb +15 -0
  135. data/lib/fluent/daemonizer.rb +88 -0
  136. data/lib/fluent/engine.rb +253 -0
  137. data/lib/fluent/env.rb +40 -0
  138. data/lib/fluent/error.rb +34 -0
  139. data/lib/fluent/event.rb +326 -0
  140. data/lib/fluent/event_router.rb +297 -0
  141. data/lib/fluent/ext_monitor_require.rb +28 -0
  142. data/lib/fluent/filter.rb +21 -0
  143. data/lib/fluent/fluent_log_event_router.rb +141 -0
  144. data/lib/fluent/formatter.rb +23 -0
  145. data/lib/fluent/input.rb +21 -0
  146. data/lib/fluent/label.rb +46 -0
  147. data/lib/fluent/load.rb +34 -0
  148. data/lib/fluent/log.rb +713 -0
  149. data/lib/fluent/match.rb +187 -0
  150. data/lib/fluent/mixin.rb +31 -0
  151. data/lib/fluent/msgpack_factory.rb +106 -0
  152. data/lib/fluent/oj_options.rb +62 -0
  153. data/lib/fluent/output.rb +29 -0
  154. data/lib/fluent/output_chain.rb +23 -0
  155. data/lib/fluent/parser.rb +23 -0
  156. data/lib/fluent/plugin/bare_output.rb +104 -0
  157. data/lib/fluent/plugin/base.rb +197 -0
  158. data/lib/fluent/plugin/buf_file.rb +213 -0
  159. data/lib/fluent/plugin/buf_file_single.rb +225 -0
  160. data/lib/fluent/plugin/buf_memory.rb +34 -0
  161. data/lib/fluent/plugin/buffer/chunk.rb +240 -0
  162. data/lib/fluent/plugin/buffer/file_chunk.rb +413 -0
  163. data/lib/fluent/plugin/buffer/file_single_chunk.rb +311 -0
  164. data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
  165. data/lib/fluent/plugin/buffer.rb +918 -0
  166. data/lib/fluent/plugin/compressable.rb +96 -0
  167. data/lib/fluent/plugin/exec_util.rb +22 -0
  168. data/lib/fluent/plugin/file_util.rb +22 -0
  169. data/lib/fluent/plugin/file_wrapper.rb +187 -0
  170. data/lib/fluent/plugin/filter.rb +127 -0
  171. data/lib/fluent/plugin/filter_grep.rb +189 -0
  172. data/lib/fluent/plugin/filter_parser.rb +130 -0
  173. data/lib/fluent/plugin/filter_record_transformer.rb +324 -0
  174. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  175. data/lib/fluent/plugin/formatter.rb +75 -0
  176. data/lib/fluent/plugin/formatter_csv.rb +78 -0
  177. data/lib/fluent/plugin/formatter_hash.rb +35 -0
  178. data/lib/fluent/plugin/formatter_json.rb +59 -0
  179. data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
  180. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  181. data/lib/fluent/plugin/formatter_out_file.rb +53 -0
  182. data/lib/fluent/plugin/formatter_single_value.rb +36 -0
  183. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  184. data/lib/fluent/plugin/formatter_tsv.rb +40 -0
  185. data/lib/fluent/plugin/in_debug_agent.rb +71 -0
  186. data/lib/fluent/plugin/in_dummy.rb +18 -0
  187. data/lib/fluent/plugin/in_exec.rb +110 -0
  188. data/lib/fluent/plugin/in_forward.rb +473 -0
  189. data/lib/fluent/plugin/in_gc_stat.rb +72 -0
  190. data/lib/fluent/plugin/in_http.rb +667 -0
  191. data/lib/fluent/plugin/in_monitor_agent.rb +412 -0
  192. data/lib/fluent/plugin/in_object_space.rb +93 -0
  193. data/lib/fluent/plugin/in_sample.rb +141 -0
  194. data/lib/fluent/plugin/in_syslog.rb +276 -0
  195. data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
  196. data/lib/fluent/plugin/in_tail.rb +1228 -0
  197. data/lib/fluent/plugin/in_tcp.rb +181 -0
  198. data/lib/fluent/plugin/in_udp.rb +92 -0
  199. data/lib/fluent/plugin/in_unix.rb +195 -0
  200. data/lib/fluent/plugin/input.rb +75 -0
  201. data/lib/fluent/plugin/metrics.rb +119 -0
  202. data/lib/fluent/plugin/metrics_local.rb +96 -0
  203. data/lib/fluent/plugin/multi_output.rb +195 -0
  204. data/lib/fluent/plugin/out_copy.rb +120 -0
  205. data/lib/fluent/plugin/out_exec.rb +105 -0
  206. data/lib/fluent/plugin/out_exec_filter.rb +319 -0
  207. data/lib/fluent/plugin/out_file.rb +334 -0
  208. data/lib/fluent/plugin/out_forward/ack_handler.rb +161 -0
  209. data/lib/fluent/plugin/out_forward/connection_manager.rb +113 -0
  210. data/lib/fluent/plugin/out_forward/error.rb +28 -0
  211. data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
  212. data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
  213. data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
  214. data/lib/fluent/plugin/out_forward/socket_cache.rb +140 -0
  215. data/lib/fluent/plugin/out_forward.rb +826 -0
  216. data/lib/fluent/plugin/out_http.rb +275 -0
  217. data/lib/fluent/plugin/out_null.rb +74 -0
  218. data/lib/fluent/plugin/out_relabel.rb +32 -0
  219. data/lib/fluent/plugin/out_roundrobin.rb +84 -0
  220. data/lib/fluent/plugin/out_secondary_file.rb +131 -0
  221. data/lib/fluent/plugin/out_stdout.rb +74 -0
  222. data/lib/fluent/plugin/out_stream.rb +130 -0
  223. data/lib/fluent/plugin/output.rb +1556 -0
  224. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  225. data/lib/fluent/plugin/parser.rb +275 -0
  226. data/lib/fluent/plugin/parser_apache.rb +28 -0
  227. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  228. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  229. data/lib/fluent/plugin/parser_csv.rb +114 -0
  230. data/lib/fluent/plugin/parser_json.rb +96 -0
  231. data/lib/fluent/plugin/parser_ltsv.rb +51 -0
  232. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  233. data/lib/fluent/plugin/parser_multiline.rb +152 -0
  234. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  235. data/lib/fluent/plugin/parser_none.rb +36 -0
  236. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  237. data/lib/fluent/plugin/parser_syslog.rb +496 -0
  238. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  239. data/lib/fluent/plugin/sd_file.rb +156 -0
  240. data/lib/fluent/plugin/sd_srv.rb +135 -0
  241. data/lib/fluent/plugin/sd_static.rb +58 -0
  242. data/lib/fluent/plugin/service_discovery.rb +65 -0
  243. data/lib/fluent/plugin/socket_util.rb +22 -0
  244. data/lib/fluent/plugin/storage.rb +84 -0
  245. data/lib/fluent/plugin/storage_local.rb +162 -0
  246. data/lib/fluent/plugin/string_util.rb +22 -0
  247. data/lib/fluent/plugin.rb +206 -0
  248. data/lib/fluent/plugin_helper/cert_option.rb +191 -0
  249. data/lib/fluent/plugin_helper/child_process.rb +366 -0
  250. data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
  251. data/lib/fluent/plugin_helper/counter.rb +51 -0
  252. data/lib/fluent/plugin_helper/event_emitter.rb +100 -0
  253. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  254. data/lib/fluent/plugin_helper/extract.rb +104 -0
  255. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  256. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  257. data/lib/fluent/plugin_helper/http_server/compat/server.rb +92 -0
  258. data/lib/fluent/plugin_helper/http_server/compat/ssl_context_extractor.rb +52 -0
  259. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  260. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  261. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  262. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  263. data/lib/fluent/plugin_helper/http_server/server.rb +93 -0
  264. data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
  265. data/lib/fluent/plugin_helper/http_server.rb +135 -0
  266. data/lib/fluent/plugin_helper/inject.rb +154 -0
  267. data/lib/fluent/plugin_helper/metrics.rb +129 -0
  268. data/lib/fluent/plugin_helper/parser.rb +147 -0
  269. data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
  270. data/lib/fluent/plugin_helper/retry_state.rb +209 -0
  271. data/lib/fluent/plugin_helper/server.rb +801 -0
  272. data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
  273. data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
  274. data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
  275. data/lib/fluent/plugin_helper/socket.rb +277 -0
  276. data/lib/fluent/plugin_helper/socket_option.rb +98 -0
  277. data/lib/fluent/plugin_helper/storage.rb +349 -0
  278. data/lib/fluent/plugin_helper/thread.rb +180 -0
  279. data/lib/fluent/plugin_helper/timer.rb +92 -0
  280. data/lib/fluent/plugin_helper.rb +75 -0
  281. data/lib/fluent/plugin_id.rb +93 -0
  282. data/lib/fluent/process.rb +22 -0
  283. data/lib/fluent/registry.rb +116 -0
  284. data/lib/fluent/root_agent.rb +372 -0
  285. data/lib/fluent/rpc.rb +94 -0
  286. data/lib/fluent/static_config_analysis.rb +194 -0
  287. data/lib/fluent/supervisor.rb +1054 -0
  288. data/lib/fluent/system_config.rb +187 -0
  289. data/lib/fluent/test/base.rb +78 -0
  290. data/lib/fluent/test/driver/base.rb +225 -0
  291. data/lib/fluent/test/driver/base_owned.rb +83 -0
  292. data/lib/fluent/test/driver/base_owner.rb +135 -0
  293. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  294. data/lib/fluent/test/driver/filter.rb +57 -0
  295. data/lib/fluent/test/driver/formatter.rb +30 -0
  296. data/lib/fluent/test/driver/input.rb +31 -0
  297. data/lib/fluent/test/driver/multi_output.rb +53 -0
  298. data/lib/fluent/test/driver/output.rb +102 -0
  299. data/lib/fluent/test/driver/parser.rb +30 -0
  300. data/lib/fluent/test/driver/storage.rb +30 -0
  301. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  302. data/lib/fluent/test/filter_test.rb +77 -0
  303. data/lib/fluent/test/formatter_test.rb +65 -0
  304. data/lib/fluent/test/helpers.rb +134 -0
  305. data/lib/fluent/test/input_test.rb +174 -0
  306. data/lib/fluent/test/log.rb +79 -0
  307. data/lib/fluent/test/output_test.rb +156 -0
  308. data/lib/fluent/test/parser_test.rb +70 -0
  309. data/lib/fluent/test/startup_shutdown.rb +46 -0
  310. data/lib/fluent/test.rb +58 -0
  311. data/lib/fluent/time.rb +512 -0
  312. data/lib/fluent/timezone.rb +171 -0
  313. data/lib/fluent/tls.rb +81 -0
  314. data/lib/fluent/unique_id.rb +39 -0
  315. data/lib/fluent/variable_store.rb +40 -0
  316. data/lib/fluent/version.rb +21 -0
  317. data/lib/fluent/winsvc.rb +103 -0
  318. data/templates/new_gem/Gemfile +3 -0
  319. data/templates/new_gem/README.md.erb +43 -0
  320. data/templates/new_gem/Rakefile +13 -0
  321. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  322. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  323. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  324. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  325. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  326. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  327. data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
  328. data/templates/new_gem/test/helper.rb.erb +8 -0
  329. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  330. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  331. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  332. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  333. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  334. data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
  335. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  336. data/templates/plugin_config_formatter/param.md-table.erb +10 -0
  337. data/templates/plugin_config_formatter/param.md.erb +34 -0
  338. data/templates/plugin_config_formatter/section.md.erb +12 -0
  339. data/test/command/test_binlog_reader.rb +362 -0
  340. data/test/command/test_ca_generate.rb +70 -0
  341. data/test/command/test_cap_ctl.rb +100 -0
  342. data/test/command/test_cat.rb +128 -0
  343. data/test/command/test_ctl.rb +57 -0
  344. data/test/command/test_fluentd.rb +1106 -0
  345. data/test/command/test_plugin_config_formatter.rb +398 -0
  346. data/test/command/test_plugin_generator.rb +109 -0
  347. data/test/compat/test_calls_super.rb +166 -0
  348. data/test/compat/test_parser.rb +92 -0
  349. data/test/config/assertions.rb +42 -0
  350. data/test/config/test_config_parser.rb +551 -0
  351. data/test/config/test_configurable.rb +1784 -0
  352. data/test/config/test_configure_proxy.rb +604 -0
  353. data/test/config/test_dsl.rb +415 -0
  354. data/test/config/test_element.rb +518 -0
  355. data/test/config/test_literal_parser.rb +309 -0
  356. data/test/config/test_plugin_configuration.rb +56 -0
  357. data/test/config/test_section.rb +191 -0
  358. data/test/config/test_system_config.rb +199 -0
  359. data/test/config/test_types.rb +408 -0
  360. data/test/counter/test_client.rb +563 -0
  361. data/test/counter/test_error.rb +44 -0
  362. data/test/counter/test_mutex_hash.rb +179 -0
  363. data/test/counter/test_server.rb +589 -0
  364. data/test/counter/test_store.rb +258 -0
  365. data/test/counter/test_validator.rb +137 -0
  366. data/test/helper.rb +155 -0
  367. data/test/helpers/fuzzy_assert.rb +89 -0
  368. data/test/helpers/process_extenstion.rb +33 -0
  369. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  370. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  371. data/test/plugin/data/2010/01/20100102.log +0 -0
  372. data/test/plugin/data/log/bar +0 -0
  373. data/test/plugin/data/log/foo/bar.log +0 -0
  374. data/test/plugin/data/log/foo/bar2 +0 -0
  375. data/test/plugin/data/log/test.log +0 -0
  376. data/test/plugin/data/sd_file/config +11 -0
  377. data/test/plugin/data/sd_file/config.json +17 -0
  378. data/test/plugin/data/sd_file/config.yaml +11 -0
  379. data/test/plugin/data/sd_file/config.yml +11 -0
  380. data/test/plugin/data/sd_file/invalid_config.yml +7 -0
  381. data/test/plugin/in_tail/test_fifo.rb +121 -0
  382. data/test/plugin/in_tail/test_io_handler.rb +140 -0
  383. data/test/plugin/in_tail/test_position_file.rb +379 -0
  384. data/test/plugin/out_forward/test_ack_handler.rb +101 -0
  385. data/test/plugin/out_forward/test_connection_manager.rb +145 -0
  386. data/test/plugin/out_forward/test_handshake_protocol.rb +112 -0
  387. data/test/plugin/out_forward/test_load_balancer.rb +106 -0
  388. data/test/plugin/out_forward/test_socket_cache.rb +149 -0
  389. data/test/plugin/test_bare_output.rb +131 -0
  390. data/test/plugin/test_base.rb +115 -0
  391. data/test/plugin/test_buf_file.rb +1275 -0
  392. data/test/plugin/test_buf_file_single.rb +833 -0
  393. data/test/plugin/test_buf_memory.rb +42 -0
  394. data/test/plugin/test_buffer.rb +1383 -0
  395. data/test/plugin/test_buffer_chunk.rb +198 -0
  396. data/test/plugin/test_buffer_file_chunk.rb +871 -0
  397. data/test/plugin/test_buffer_file_single_chunk.rb +611 -0
  398. data/test/plugin/test_buffer_memory_chunk.rb +339 -0
  399. data/test/plugin/test_compressable.rb +87 -0
  400. data/test/plugin/test_file_util.rb +96 -0
  401. data/test/plugin/test_file_wrapper.rb +126 -0
  402. data/test/plugin/test_filter.rb +368 -0
  403. data/test/plugin/test_filter_grep.rb +697 -0
  404. data/test/plugin/test_filter_parser.rb +731 -0
  405. data/test/plugin/test_filter_record_transformer.rb +577 -0
  406. data/test/plugin/test_filter_stdout.rb +207 -0
  407. data/test/plugin/test_formatter_csv.rb +136 -0
  408. data/test/plugin/test_formatter_hash.rb +38 -0
  409. data/test/plugin/test_formatter_json.rb +61 -0
  410. data/test/plugin/test_formatter_ltsv.rb +70 -0
  411. data/test/plugin/test_formatter_msgpack.rb +28 -0
  412. data/test/plugin/test_formatter_out_file.rb +116 -0
  413. data/test/plugin/test_formatter_single_value.rb +44 -0
  414. data/test/plugin/test_formatter_tsv.rb +76 -0
  415. data/test/plugin/test_in_debug_agent.rb +49 -0
  416. data/test/plugin/test_in_exec.rb +261 -0
  417. data/test/plugin/test_in_forward.rb +1180 -0
  418. data/test/plugin/test_in_gc_stat.rb +62 -0
  419. data/test/plugin/test_in_http.rb +1080 -0
  420. data/test/plugin/test_in_monitor_agent.rb +923 -0
  421. data/test/plugin/test_in_object_space.rb +60 -0
  422. data/test/plugin/test_in_sample.rb +190 -0
  423. data/test/plugin/test_in_syslog.rb +505 -0
  424. data/test/plugin/test_in_tail.rb +2363 -0
  425. data/test/plugin/test_in_tcp.rb +243 -0
  426. data/test/plugin/test_in_udp.rb +268 -0
  427. data/test/plugin/test_in_unix.rb +181 -0
  428. data/test/plugin/test_input.rb +137 -0
  429. data/test/plugin/test_metadata.rb +89 -0
  430. data/test/plugin/test_metrics.rb +294 -0
  431. data/test/plugin/test_metrics_local.rb +96 -0
  432. data/test/plugin/test_multi_output.rb +204 -0
  433. data/test/plugin/test_out_copy.rb +308 -0
  434. data/test/plugin/test_out_exec.rb +312 -0
  435. data/test/plugin/test_out_exec_filter.rb +606 -0
  436. data/test/plugin/test_out_file.rb +1037 -0
  437. data/test/plugin/test_out_forward.rb +1348 -0
  438. data/test/plugin/test_out_http.rb +428 -0
  439. data/test/plugin/test_out_null.rb +105 -0
  440. data/test/plugin/test_out_relabel.rb +28 -0
  441. data/test/plugin/test_out_roundrobin.rb +146 -0
  442. data/test/plugin/test_out_secondary_file.rb +458 -0
  443. data/test/plugin/test_out_stdout.rb +205 -0
  444. data/test/plugin/test_out_stream.rb +103 -0
  445. data/test/plugin/test_output.rb +1065 -0
  446. data/test/plugin/test_output_as_buffered.rb +2024 -0
  447. data/test/plugin/test_output_as_buffered_backup.rb +363 -0
  448. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  449. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  450. data/test/plugin/test_output_as_buffered_retries.rb +919 -0
  451. data/test/plugin/test_output_as_buffered_secondary.rb +882 -0
  452. data/test/plugin/test_output_as_standard.rb +374 -0
  453. data/test/plugin/test_owned_by.rb +35 -0
  454. data/test/plugin/test_parser.rb +399 -0
  455. data/test/plugin/test_parser_apache.rb +42 -0
  456. data/test/plugin/test_parser_apache2.rb +47 -0
  457. data/test/plugin/test_parser_apache_error.rb +45 -0
  458. data/test/plugin/test_parser_csv.rb +200 -0
  459. data/test/plugin/test_parser_json.rb +138 -0
  460. data/test/plugin/test_parser_labeled_tsv.rb +160 -0
  461. data/test/plugin/test_parser_multiline.rb +111 -0
  462. data/test/plugin/test_parser_nginx.rb +88 -0
  463. data/test/plugin/test_parser_none.rb +52 -0
  464. data/test/plugin/test_parser_regexp.rb +289 -0
  465. data/test/plugin/test_parser_syslog.rb +650 -0
  466. data/test/plugin/test_parser_tsv.rb +122 -0
  467. data/test/plugin/test_sd_file.rb +228 -0
  468. data/test/plugin/test_sd_srv.rb +230 -0
  469. data/test/plugin/test_storage.rb +167 -0
  470. data/test/plugin/test_storage_local.rb +335 -0
  471. data/test/plugin/test_string_util.rb +26 -0
  472. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  473. data/test/plugin_helper/data/cert/cert-with-CRLF.pem +19 -0
  474. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  475. data/test/plugin_helper/data/cert/cert.pem +19 -0
  476. data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +27 -0
  477. data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +20 -0
  478. data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +27 -0
  479. data/test/plugin_helper/data/cert/cert_chains/cert.pem +40 -0
  480. data/test/plugin_helper/data/cert/empty.pem +0 -0
  481. data/test/plugin_helper/data/cert/generate_cert.rb +125 -0
  482. data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +30 -0
  483. data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +27 -0
  484. data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +20 -0
  485. data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +20 -0
  486. data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +30 -0
  487. data/test/plugin_helper/data/cert/with_ca/cert-key.pem +27 -0
  488. data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +21 -0
  489. data/test/plugin_helper/data/cert/with_ca/cert.pem +21 -0
  490. data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +30 -0
  491. data/test/plugin_helper/data/cert/without_ca/cert-key.pem +27 -0
  492. data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +20 -0
  493. data/test/plugin_helper/data/cert/without_ca/cert.pem +20 -0
  494. data/test/plugin_helper/http_server/test_app.rb +65 -0
  495. data/test/plugin_helper/http_server/test_route.rb +32 -0
  496. data/test/plugin_helper/service_discovery/test_manager.rb +93 -0
  497. data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +21 -0
  498. data/test/plugin_helper/test_cert_option.rb +25 -0
  499. data/test/plugin_helper/test_child_process.rb +840 -0
  500. data/test/plugin_helper/test_compat_parameters.rb +358 -0
  501. data/test/plugin_helper/test_event_emitter.rb +80 -0
  502. data/test/plugin_helper/test_event_loop.rb +52 -0
  503. data/test/plugin_helper/test_extract.rb +194 -0
  504. data/test/plugin_helper/test_formatter.rb +255 -0
  505. data/test/plugin_helper/test_http_server_helper.rb +372 -0
  506. data/test/plugin_helper/test_inject.rb +561 -0
  507. data/test/plugin_helper/test_metrics.rb +137 -0
  508. data/test/plugin_helper/test_parser.rb +264 -0
  509. data/test/plugin_helper/test_record_accessor.rb +238 -0
  510. data/test/plugin_helper/test_retry_state.rb +442 -0
  511. data/test/plugin_helper/test_server.rb +1823 -0
  512. data/test/plugin_helper/test_service_discovery.rb +165 -0
  513. data/test/plugin_helper/test_socket.rb +146 -0
  514. data/test/plugin_helper/test_storage.rb +542 -0
  515. data/test/plugin_helper/test_thread.rb +164 -0
  516. data/test/plugin_helper/test_timer.rb +130 -0
  517. data/test/scripts/exec_script.rb +32 -0
  518. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  519. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  520. data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
  521. data/test/scripts/fluent/plugin/out_test.rb +81 -0
  522. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  523. data/test/scripts/fluent/plugin/parser_known.rb +4 -0
  524. data/test/test_capability.rb +74 -0
  525. data/test/test_clock.rb +164 -0
  526. data/test/test_config.rb +202 -0
  527. data/test/test_configdsl.rb +148 -0
  528. data/test/test_daemonizer.rb +91 -0
  529. data/test/test_engine.rb +203 -0
  530. data/test/test_event.rb +531 -0
  531. data/test/test_event_router.rb +331 -0
  532. data/test/test_event_time.rb +199 -0
  533. data/test/test_filter.rb +121 -0
  534. data/test/test_fluent_log_event_router.rb +99 -0
  535. data/test/test_formatter.rb +366 -0
  536. data/test/test_input.rb +31 -0
  537. data/test/test_log.rb +994 -0
  538. data/test/test_logger_initializer.rb +46 -0
  539. data/test/test_match.rb +148 -0
  540. data/test/test_mixin.rb +351 -0
  541. data/test/test_msgpack_factory.rb +18 -0
  542. data/test/test_oj_options.rb +55 -0
  543. data/test/test_output.rb +278 -0
  544. data/test/test_plugin.rb +251 -0
  545. data/test/test_plugin_classes.rb +370 -0
  546. data/test/test_plugin_helper.rb +81 -0
  547. data/test/test_plugin_id.rb +119 -0
  548. data/test/test_process.rb +14 -0
  549. data/test/test_root_agent.rb +951 -0
  550. data/test/test_static_config_analysis.rb +177 -0
  551. data/test/test_supervisor.rb +601 -0
  552. data/test/test_test_drivers.rb +136 -0
  553. data/test/test_time_formatter.rb +301 -0
  554. data/test/test_time_parser.rb +362 -0
  555. data/test/test_tls.rb +65 -0
  556. data/test/test_unique_id.rb +47 -0
  557. data/test/test_variable_store.rb +65 -0
  558. metadata +1261 -0
@@ -0,0 +1,240 @@
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'
18
+ require 'fluent/plugin/compressable'
19
+ require 'fluent/unique_id'
20
+ require 'fluent/event'
21
+ require 'fluent/ext_monitor_require'
22
+
23
+ require 'tempfile'
24
+ require 'zlib'
25
+
26
+ module Fluent
27
+ module Plugin
28
+ class Buffer # fluent/plugin/buffer is already loaded
29
+ class Chunk
30
+ include MonitorMixin
31
+ include UniqueId::Mixin
32
+
33
+ # Chunks has 2 part:
34
+ # * metadata: contains metadata which should be restored after resume (if possible)
35
+ # v: {key=>value,key=>value,...} (optional)
36
+ # t: tag as string (optional)
37
+ # k: time slice key (optional)
38
+ #
39
+ # id: unique_id of chunk (*)
40
+ # s: size (number of events in chunk) (*)
41
+ # c: created_at as unix time (*)
42
+ # m: modified_at as unix time (*)
43
+ # (*): fields automatically injected by chunk itself
44
+ # * data: binary data, combined records represented as String, maybe compressed
45
+
46
+ # NOTE: keys of metadata are named with a single letter
47
+ # to decread bytesize of metadata I/O
48
+
49
+ # TODO: CompressedPackedMessage of forward protocol?
50
+
51
+ def initialize(metadata, compress: :text)
52
+ super()
53
+ @unique_id = generate_unique_id
54
+ @metadata = metadata
55
+
56
+ # state: unstaged/staged/queued/closed
57
+ @state = :unstaged
58
+
59
+ @size = 0
60
+ @created_at = Fluent::Clock.real_now
61
+ @modified_at = Fluent::Clock.real_now
62
+
63
+ extend Decompressable if compress == :gzip
64
+ end
65
+
66
+ attr_reader :unique_id, :metadata, :state
67
+
68
+ def raw_create_at
69
+ @created_at
70
+ end
71
+
72
+ def raw_modified_at
73
+ @modified_at
74
+ end
75
+
76
+ # for compatibility
77
+ def created_at
78
+ @created_at_object ||= Time.at(@created_at)
79
+ end
80
+
81
+ # for compatibility
82
+ def modified_at
83
+ @modified_at_object ||= Time.at(@modified_at)
84
+ end
85
+
86
+ # data is array of formatted record string
87
+ def append(data, **kwargs)
88
+ raise ArgumentError, '`compress: gzip` can be used for Compressable module' if kwargs[:compress] == :gzip
89
+ adding = ''.b
90
+ data.each do |d|
91
+ adding << d.b
92
+ end
93
+ concat(adding, data.size)
94
+ end
95
+
96
+ # for event streams which is packed or zipped (and we want not to unpack/uncompress)
97
+ def concat(bulk, records)
98
+ raise NotImplementedError, "Implement this method in child class"
99
+ end
100
+
101
+ def commit
102
+ raise NotImplementedError, "Implement this method in child class"
103
+ end
104
+
105
+ def rollback
106
+ raise NotImplementedError, "Implement this method in child class"
107
+ end
108
+
109
+ def bytesize
110
+ raise NotImplementedError, "Implement this method in child class"
111
+ end
112
+
113
+ def size
114
+ raise NotImplementedError, "Implement this method in child class"
115
+ end
116
+ alias :length :size
117
+
118
+ def empty?
119
+ size == 0
120
+ end
121
+
122
+ def writable?
123
+ @state == :staged || @state == :unstaged
124
+ end
125
+
126
+ def unstaged?
127
+ @state == :unstaged
128
+ end
129
+
130
+ def staged?
131
+ @state == :staged
132
+ end
133
+
134
+ def queued?
135
+ @state == :queued
136
+ end
137
+
138
+ def closed?
139
+ @state == :closed
140
+ end
141
+
142
+ def staged!
143
+ @state = :staged
144
+ self
145
+ end
146
+
147
+ def unstaged!
148
+ @state = :unstaged
149
+ self
150
+ end
151
+
152
+ def enqueued!
153
+ @state = :queued
154
+ self
155
+ end
156
+
157
+ def close
158
+ @state = :closed
159
+ self
160
+ end
161
+
162
+ def purge
163
+ @state = :closed
164
+ self
165
+ end
166
+
167
+ def read(**kwargs)
168
+ raise ArgumentError, '`compressed: gzip` can be used for Compressable module' if kwargs[:compressed] == :gzip
169
+ raise NotImplementedError, "Implement this method in child class"
170
+ end
171
+
172
+ def open(**kwargs, &block)
173
+ raise ArgumentError, '`compressed: gzip` can be used for Compressable module' if kwargs[:compressed] == :gzip
174
+ raise NotImplementedError, "Implement this method in child class"
175
+ end
176
+
177
+ def write_to(io, **kwargs)
178
+ raise ArgumentError, '`compressed: gzip` can be used for Compressable module' if kwargs[:compressed] == :gzip
179
+ open do |i|
180
+ IO.copy_stream(i, io)
181
+ end
182
+ end
183
+
184
+ module Decompressable
185
+ include Fluent::Plugin::Compressable
186
+
187
+ def append(data, **kwargs)
188
+ if kwargs[:compress] == :gzip
189
+ io = StringIO.new
190
+ Zlib::GzipWriter.wrap(io) do |gz|
191
+ data.each do |d|
192
+ gz.write d
193
+ end
194
+ end
195
+ concat(io.string, data.size)
196
+ else
197
+ super
198
+ end
199
+ end
200
+
201
+ def open(**kwargs, &block)
202
+ if kwargs[:compressed] == :gzip
203
+ super
204
+ else
205
+ super(**kwargs) do |chunk_io|
206
+ output_io = if chunk_io.is_a?(StringIO)
207
+ StringIO.new
208
+ else
209
+ Tempfile.new('decompressed-data')
210
+ end
211
+ output_io.binmode if output_io.is_a?(Tempfile)
212
+ decompress(input_io: chunk_io, output_io: output_io)
213
+ output_io.seek(0, IO::SEEK_SET)
214
+ yield output_io
215
+ end
216
+ end
217
+ end
218
+
219
+ def read(**kwargs)
220
+ if kwargs[:compressed] == :gzip
221
+ super
222
+ else
223
+ decompress(super)
224
+ end
225
+ end
226
+
227
+ def write_to(io, **kwargs)
228
+ open(compressed: :gzip) do |chunk_io|
229
+ if kwargs[:compressed] == :gzip
230
+ IO.copy_stream(chunk_io, io)
231
+ else
232
+ decompress(input_io: chunk_io, output_io: io)
233
+ end
234
+ end
235
+ end
236
+ end
237
+ end
238
+ end
239
+ end
240
+ end
@@ -0,0 +1,413 @@
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_HEADER = "\xc1\x00".force_encoding(Encoding::ASCII_8BIT).freeze
28
+
29
+ ### buffer path user specified : /path/to/directory/user_specified_prefix.*.log
30
+ ### buffer chunk path : /path/to/directory/user_specified_prefix.b513b61c9791029c2513b61c9791029c2.log
31
+ ### buffer chunk metadata path : /path/to/directory/user_specified_prefix.b513b61c9791029c2513b61c9791029c2.log.meta
32
+
33
+ # NOTE: Old style buffer path of time sliced output plugins had a part of key: prefix.20150414.b513b61...suffix
34
+ # But this part is not used now for any purpose. (Now metadata is used instead.)
35
+
36
+ # state: b/q - 'b'(on stage, compatible with v0.12), 'q'(enqueued)
37
+ # path_prefix: path prefix string, ended with '.'
38
+ # path_suffix: path suffix string, like '.log' (or any other user specified)
39
+
40
+ attr_reader :path, :permission
41
+
42
+ def initialize(metadata, path, mode, perm: nil, compress: :text)
43
+ super(metadata, compress: compress)
44
+ perm ||= Fluent::DEFAULT_FILE_PERMISSION
45
+ @permission = perm.is_a?(String) ? perm.to_i(8) : perm
46
+ @bytesize = @size = @adding_bytes = @adding_size = 0
47
+ @meta = nil
48
+
49
+ case mode
50
+ when :create then create_new_chunk(path, @permission)
51
+ when :staged then load_existing_staged_chunk(path)
52
+ when :queued then load_existing_enqueued_chunk(path)
53
+ else
54
+ raise ArgumentError, "Invalid file chunk mode: #{mode}"
55
+ end
56
+ end
57
+
58
+ def concat(bulk, bulk_size)
59
+ raise "BUG: concatenating to unwritable chunk, now '#{self.state}'" unless self.writable?
60
+
61
+ bulk.force_encoding(Encoding::ASCII_8BIT)
62
+ @chunk.write bulk
63
+ @adding_bytes += bulk.bytesize
64
+ @adding_size += bulk_size
65
+ true
66
+ end
67
+
68
+ def commit
69
+ write_metadata # this should be at first: of course, this operation may fail
70
+
71
+ @commit_position = @chunk.pos
72
+ @size += @adding_size
73
+ @bytesize += @adding_bytes
74
+ @adding_bytes = @adding_size = 0
75
+ @modified_at = Fluent::Clock.real_now
76
+ @modified_at_object = nil
77
+
78
+ true
79
+ end
80
+
81
+ def rollback
82
+ if @chunk.pos != @commit_position
83
+ @chunk.seek(@commit_position, IO::SEEK_SET)
84
+ @chunk.truncate(@commit_position)
85
+ end
86
+ @adding_bytes = @adding_size = 0
87
+ true
88
+ end
89
+
90
+ def bytesize
91
+ @bytesize + @adding_bytes
92
+ end
93
+
94
+ def size
95
+ @size + @adding_size
96
+ end
97
+
98
+ def empty?
99
+ @bytesize == 0
100
+ end
101
+
102
+ def enqueued!
103
+ return unless self.staged?
104
+
105
+ new_chunk_path = self.class.generate_queued_chunk_path(@path, @unique_id)
106
+ new_meta_path = new_chunk_path + '.meta'
107
+
108
+ write_metadata(update: false) # re-write metadata w/ finalized records
109
+
110
+ begin
111
+ file_rename(@chunk, @path, new_chunk_path, ->(new_io) { @chunk = new_io })
112
+ rescue => e
113
+ begin
114
+ file_rename(@chunk, new_chunk_path, @path, ->(new_io) { @chunk = new_io }) if File.exist?(new_chunk_path)
115
+ rescue => re
116
+ # In this point, restore buffer state is hard because previous `file_rename` failed by resource problem.
117
+ # Retry is one possible approach but it may cause livelock under limited resources or high load environment.
118
+ # So we ignore such errors for now and log better message instead.
119
+ # "Too many open files" should be fixed by proper buffer configuration and system setting.
120
+ raise "can't enqueue buffer file and failed to restore. This may causes inconsistent state: path = #{@path}, error = '#{e}', retry error = '#{re}'"
121
+ else
122
+ raise "can't enqueue buffer file: path = #{@path}, error = '#{e}'"
123
+ end
124
+ end
125
+
126
+ begin
127
+ file_rename(@meta, @meta_path, new_meta_path, ->(new_io) { @meta = new_io })
128
+ rescue => e
129
+ begin
130
+ file_rename(@chunk, new_chunk_path, @path, ->(new_io) { @chunk = new_io }) if File.exist?(new_chunk_path)
131
+ file_rename(@meta, new_meta_path, @meta_path, ->(new_io) { @meta = new_io }) if File.exist?(new_meta_path)
132
+ rescue => re
133
+ # See above
134
+ raise "can't enqueue buffer metadata and failed to restore. This may causes inconsistent state: path = #{@meta_path}, error = '#{e}', retry error = '#{re}'"
135
+ else
136
+ raise "can't enqueue buffer metadata: path = #{@meta_path}, error = '#{e}'"
137
+ end
138
+ end
139
+
140
+ @path = new_chunk_path
141
+ @meta_path = new_meta_path
142
+
143
+ super
144
+ end
145
+
146
+ def close
147
+ super
148
+ size = @chunk.size
149
+ @chunk.close
150
+ @meta.close if @meta # meta may be missing if chunk is queued at first
151
+ if size == 0
152
+ File.unlink(@path, @meta_path)
153
+ end
154
+ end
155
+
156
+ def purge
157
+ super
158
+ @chunk.close
159
+ @meta.close if @meta
160
+ @bytesize = @size = @adding_bytes = @adding_size = 0
161
+ File.unlink(@path, @meta_path)
162
+ end
163
+
164
+ def read(**kwargs)
165
+ @chunk.seek(0, IO::SEEK_SET)
166
+ @chunk.read
167
+ end
168
+
169
+ def open(**kwargs, &block)
170
+ @chunk.seek(0, IO::SEEK_SET)
171
+ val = yield @chunk
172
+ @chunk.seek(0, IO::SEEK_END) if self.staged?
173
+ val
174
+ end
175
+
176
+ def self.assume_chunk_state(path)
177
+ if /\.(b|q)([0-9a-f]+)\.[^\/]*\Z/n =~ path # //n switch means explicit 'ASCII-8BIT' pattern
178
+ $1 == 'b' ? :staged : :queued
179
+ else
180
+ # files which matches to glob of buffer file pattern
181
+ # it includes files which are created by out_file
182
+ :unknown
183
+ end
184
+ end
185
+
186
+ def self.generate_stage_chunk_path(path, unique_id)
187
+ pos = path.index('.*.')
188
+ raise "BUG: buffer chunk path on stage MUST have '.*.'" unless pos
189
+
190
+ prefix = path[0...pos]
191
+ suffix = path[(pos+3)..-1]
192
+
193
+ chunk_id = Fluent::UniqueId.hex(unique_id)
194
+ state = 'b'
195
+ "#{prefix}.#{state}#{chunk_id}.#{suffix}"
196
+ end
197
+
198
+ def self.generate_queued_chunk_path(path, unique_id)
199
+ chunk_id = Fluent::UniqueId.hex(unique_id)
200
+ if path.index(".b#{chunk_id}.")
201
+ path.sub(".b#{chunk_id}.", ".q#{chunk_id}.")
202
+ else # for unexpected cases (ex: users rename files while opened by fluentd)
203
+ path + ".q#{chunk_id}.chunk"
204
+ end
205
+ end
206
+
207
+ # used only for queued v0.12 buffer path
208
+ def self.unique_id_from_path(path)
209
+ if /\.(b|q)([0-9a-f]+)\.[^\/]*\Z/n =~ path # //n switch means explicit 'ASCII-8BIT' pattern
210
+ return $2.scan(/../).map{|x| x.to_i(16) }.pack('C*')
211
+ end
212
+ nil
213
+ end
214
+
215
+ def restore_metadata(bindata)
216
+ data = restore_metadata_with_new_format(bindata)
217
+
218
+ unless data
219
+ # old type of restore
220
+ data = Fluent::MessagePackFactory.msgpack_unpacker(symbolize_keys: true).feed(bindata).read rescue {}
221
+ end
222
+
223
+ now = Fluent::Clock.real_now
224
+
225
+ @unique_id = data[:id] || self.class.unique_id_from_path(@path) || @unique_id
226
+ @size = data[:s] || 0
227
+ @created_at = data.fetch(:c, now.to_i)
228
+ @modified_at = data.fetch(:m, now.to_i)
229
+
230
+ @metadata.timekey = data[:timekey]
231
+ @metadata.tag = data[:tag]
232
+ @metadata.variables = data[:variables]
233
+ @metadata.seq = data[:seq] || 0
234
+ end
235
+
236
+ def restore_metadata_partially(chunk)
237
+ @unique_id = self.class.unique_id_from_path(chunk.path) || @unique_id
238
+ @size = 0
239
+ @created_at = chunk.ctime.to_i # birthtime isn't supported on Windows (and Travis?)
240
+ @modified_at = chunk.mtime.to_i
241
+
242
+ @metadata.timekey = nil
243
+ @metadata.tag = nil
244
+ @metadata.variables = nil
245
+ @metadata.seq = 0
246
+ end
247
+
248
+ def write_metadata(update: true)
249
+ data = @metadata.to_h.merge({
250
+ id: @unique_id,
251
+ s: (update ? @size + @adding_size : @size),
252
+ c: @created_at,
253
+ m: (update ? Fluent::Clock.real_now : @modified_at),
254
+ })
255
+ bin = Fluent::MessagePackFactory.thread_local_msgpack_packer.pack(data).full_pack
256
+ size = [bin.bytesize].pack('N')
257
+ @meta.seek(0, IO::SEEK_SET)
258
+ @meta.write(BUFFER_HEADER + size + bin)
259
+ end
260
+
261
+ def file_rename(file, old_path, new_path, callback=nil)
262
+ pos = file.pos
263
+ if Fluent.windows?
264
+ file.close
265
+ File.rename(old_path, new_path)
266
+ file = File.open(new_path, 'rb', @permission)
267
+ else
268
+ File.rename(old_path, new_path)
269
+ file.reopen(new_path, 'rb')
270
+ end
271
+ file.set_encoding(Encoding::ASCII_8BIT)
272
+ file.sync = true
273
+ file.binmode
274
+ file.pos = pos
275
+ callback.call(file) if callback
276
+ end
277
+
278
+ def create_new_chunk(path, perm)
279
+ @path = self.class.generate_stage_chunk_path(path, @unique_id)
280
+ @meta_path = @path + '.meta'
281
+ begin
282
+ @chunk = File.open(@path, 'wb+', perm)
283
+ @chunk.set_encoding(Encoding::ASCII_8BIT)
284
+ @chunk.sync = true
285
+ @chunk.binmode
286
+ rescue => e
287
+ # Here assumes "Too many open files" like recoverable error so raising BufferOverflowError.
288
+ # If other cases are possible, we will change erorr handling with proper classes.
289
+ raise BufferOverflowError, "can't create buffer file for #{path}. Stop creating buffer files: error = #{e}"
290
+ end
291
+ begin
292
+ @meta = File.open(@meta_path, 'wb', perm)
293
+ @meta.set_encoding(Encoding::ASCII_8BIT)
294
+ @meta.sync = true
295
+ @meta.binmode
296
+ write_metadata(update: false)
297
+ rescue => e
298
+ # This case is easier than enqueued!. Just removing pre-create buffer file
299
+ @chunk.close rescue nil
300
+ File.unlink(@path) rescue nil
301
+
302
+ if @meta
303
+ # ensure to unlink when #write_metadata fails
304
+ @meta.close rescue nil
305
+ File.unlink(@meta_path) rescue nil
306
+ end
307
+
308
+ # Same as @chunk case. See above
309
+ raise BufferOverflowError, "can't create buffer metadata for #{path}. Stop creating buffer files: error = #{e}"
310
+ end
311
+
312
+ @state = :unstaged
313
+ @bytesize = 0
314
+ @commit_position = @chunk.pos # must be 0
315
+ @adding_bytes = 0
316
+ @adding_size = 0
317
+ end
318
+
319
+ def load_existing_staged_chunk(path)
320
+ @path = path
321
+ @meta_path = @path + '.meta'
322
+
323
+ @meta = nil
324
+ # staging buffer chunk without metadata is classic buffer chunk file
325
+ # and it should be enqueued immediately
326
+ if File.exist?(@meta_path)
327
+ raise FileChunkError, "staged file chunk is empty" if File.size(@path).zero?
328
+
329
+ @chunk = File.open(@path, 'rb+')
330
+ @chunk.set_encoding(Encoding::ASCII_8BIT)
331
+ @chunk.sync = true
332
+ @chunk.seek(0, IO::SEEK_END)
333
+ @chunk.binmode
334
+
335
+ @meta = File.open(@meta_path, 'rb+')
336
+ @meta.set_encoding(Encoding::ASCII_8BIT)
337
+ @meta.sync = true
338
+ @meta.binmode
339
+ begin
340
+ restore_metadata(@meta.read)
341
+ rescue => e
342
+ @chunk.close
343
+ @meta.close
344
+ raise FileChunkError, "staged meta file is broken. #{e.message}"
345
+ end
346
+ @meta.seek(0, IO::SEEK_SET)
347
+
348
+ @state = :staged
349
+ @bytesize = @chunk.size
350
+ @commit_position = @chunk.pos
351
+ @adding_bytes = 0
352
+ @adding_size = 0
353
+ else
354
+ # classic buffer chunk - read only chunk
355
+ @chunk = File.open(@path, 'rb')
356
+ @chunk.set_encoding(Encoding::ASCII_8BIT)
357
+ @chunk.binmode
358
+ @chunk.seek(0, IO::SEEK_SET)
359
+ @state = :queued
360
+ @bytesize = @chunk.size
361
+
362
+ restore_metadata_partially(@chunk)
363
+
364
+ @commit_position = @chunk.size
365
+ @unique_id = self.class.unique_id_from_path(@path) || @unique_id
366
+ end
367
+ end
368
+
369
+ def load_existing_enqueued_chunk(path)
370
+ @path = path
371
+ raise FileChunkError, "enqueued file chunk is empty" if File.size(@path).zero?
372
+
373
+ @chunk = File.open(@path, 'rb')
374
+ @chunk.set_encoding(Encoding::ASCII_8BIT)
375
+ @chunk.binmode
376
+ @chunk.seek(0, IO::SEEK_SET)
377
+ @bytesize = @chunk.size
378
+ @commit_position = @chunk.size
379
+
380
+ @meta_path = @path + '.meta'
381
+ if File.readable?(@meta_path)
382
+ begin
383
+ restore_metadata(File.open(@meta_path){|f| f.set_encoding(Encoding::ASCII_8BIT); f.binmode; f.read })
384
+ rescue => e
385
+ @chunk.close
386
+ raise FileChunkError, "enqueued meta file is broken. #{e.message}"
387
+ end
388
+ else
389
+ restore_metadata_partially(@chunk)
390
+ end
391
+ @state = :queued
392
+ end
393
+
394
+ private
395
+
396
+ def restore_metadata_with_new_format(chunk)
397
+ if chunk.size <= 6 # size of BUFFER_HEADER (2) + size of data size(4)
398
+ return nil
399
+ end
400
+
401
+ if chunk.slice(0, 2) == BUFFER_HEADER
402
+ size = chunk.slice(2, 4).unpack('N').first
403
+ if size
404
+ return Fluent::MessagePackFactory.msgpack_unpacker(symbolize_keys: true).feed(chunk.slice(6, size)).read rescue nil
405
+ end
406
+ end
407
+
408
+ nil
409
+ end
410
+ end
411
+ end
412
+ end
413
+ end