fluentd 1.20.0-aarch64-mingw-ucrt

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +116 -0
  3. data/ADOPTERS.md +5 -0
  4. data/AGENTS.md +46 -0
  5. data/AUTHORS +2 -0
  6. data/CHANGELOG.md +3324 -0
  7. data/CONTRIBUTING.md +45 -0
  8. data/GOVERNANCE.md +55 -0
  9. data/GithubWorkflow.md +78 -0
  10. data/LICENSE +202 -0
  11. data/MAINTAINERS.md +19 -0
  12. data/README.md +73 -0
  13. data/Rakefile +89 -0
  14. data/SECURITY.md +47 -0
  15. data/bin/fluent-binlog-reader +7 -0
  16. data/bin/fluent-ca-generate +6 -0
  17. data/bin/fluent-cap-ctl +7 -0
  18. data/bin/fluent-cat +5 -0
  19. data/bin/fluent-ctl +7 -0
  20. data/bin/fluent-debug +5 -0
  21. data/bin/fluent-gem +9 -0
  22. data/bin/fluent-plugin-config-format +5 -0
  23. data/bin/fluent-plugin-generate +5 -0
  24. data/bin/fluentd +15 -0
  25. data/code-of-conduct.md +3 -0
  26. data/docs/SECURITY_AUDIT.pdf +0 -0
  27. data/example/copy_roundrobin.conf +39 -0
  28. data/example/counter.conf +18 -0
  29. data/example/filter_stdout.conf +22 -0
  30. data/example/in_forward.conf +14 -0
  31. data/example/in_forward_client.conf +37 -0
  32. data/example/in_forward_shared_key.conf +15 -0
  33. data/example/in_forward_tls.conf +14 -0
  34. data/example/in_forward_users.conf +24 -0
  35. data/example/in_forward_workers.conf +21 -0
  36. data/example/in_http.conf +16 -0
  37. data/example/in_out_forward.conf +17 -0
  38. data/example/in_sample_blocks.conf +17 -0
  39. data/example/in_sample_with_compression.conf +23 -0
  40. data/example/in_syslog.conf +15 -0
  41. data/example/in_tail.conf +14 -0
  42. data/example/in_tcp.conf +13 -0
  43. data/example/in_udp.conf +13 -0
  44. data/example/logevents.conf +25 -0
  45. data/example/multi_filters.conf +61 -0
  46. data/example/out_copy.conf +20 -0
  47. data/example/out_exec_filter.conf +42 -0
  48. data/example/out_file.conf +13 -0
  49. data/example/out_forward.conf +35 -0
  50. data/example/out_forward_buf_file.conf +23 -0
  51. data/example/out_forward_client.conf +109 -0
  52. data/example/out_forward_heartbeat_none.conf +16 -0
  53. data/example/out_forward_sd.conf +17 -0
  54. data/example/out_forward_shared_key.conf +36 -0
  55. data/example/out_forward_tls.conf +18 -0
  56. data/example/out_forward_users.conf +65 -0
  57. data/example/out_null.conf +36 -0
  58. data/example/sd.yaml +8 -0
  59. data/example/secondary_file.conf +42 -0
  60. data/example/suppress_config_dump.conf +7 -0
  61. data/example/v0_12_filter.conf +78 -0
  62. data/example/v1_literal_example.conf +36 -0
  63. data/example/worker_section.conf +36 -0
  64. data/fluent.conf +139 -0
  65. data/lib/fluent/agent.rb +168 -0
  66. data/lib/fluent/capability.rb +87 -0
  67. data/lib/fluent/clock.rb +66 -0
  68. data/lib/fluent/command/binlog_reader.rb +244 -0
  69. data/lib/fluent/command/bundler_injection.rb +45 -0
  70. data/lib/fluent/command/ca_generate.rb +184 -0
  71. data/lib/fluent/command/cap_ctl.rb +174 -0
  72. data/lib/fluent/command/cat.rb +365 -0
  73. data/lib/fluent/command/ctl.rb +180 -0
  74. data/lib/fluent/command/debug.rb +103 -0
  75. data/lib/fluent/command/fluentd.rb +385 -0
  76. data/lib/fluent/command/plugin_config_formatter.rb +308 -0
  77. data/lib/fluent/command/plugin_generator.rb +365 -0
  78. data/lib/fluent/compat/call_super_mixin.rb +76 -0
  79. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  80. data/lib/fluent/compat/exec_util.rb +144 -0
  81. data/lib/fluent/compat/file_util.rb +54 -0
  82. data/lib/fluent/compat/filter.rb +68 -0
  83. data/lib/fluent/compat/formatter.rb +117 -0
  84. data/lib/fluent/compat/formatter_utils.rb +85 -0
  85. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  86. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  87. data/lib/fluent/compat/input.rb +49 -0
  88. data/lib/fluent/compat/output.rb +721 -0
  89. data/lib/fluent/compat/output_chain.rb +60 -0
  90. data/lib/fluent/compat/parser.rb +310 -0
  91. data/lib/fluent/compat/parser_utils.rb +40 -0
  92. data/lib/fluent/compat/propagate_default.rb +62 -0
  93. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  94. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  95. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  96. data/lib/fluent/compat/socket_util.rb +165 -0
  97. data/lib/fluent/compat/string_util.rb +34 -0
  98. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  99. data/lib/fluent/compat/type_converter.rb +90 -0
  100. data/lib/fluent/config/basic_parser.rb +122 -0
  101. data/lib/fluent/config/configure_proxy.rb +424 -0
  102. data/lib/fluent/config/dsl.rb +152 -0
  103. data/lib/fluent/config/element.rb +265 -0
  104. data/lib/fluent/config/error.rb +44 -0
  105. data/lib/fluent/config/literal_parser.rb +305 -0
  106. data/lib/fluent/config/parser.rb +119 -0
  107. data/lib/fluent/config/section.rb +272 -0
  108. data/lib/fluent/config/types.rb +257 -0
  109. data/lib/fluent/config/v1_parser.rb +200 -0
  110. data/lib/fluent/config/yaml_parser/fluent_value.rb +47 -0
  111. data/lib/fluent/config/yaml_parser/loader.rb +124 -0
  112. data/lib/fluent/config/yaml_parser/parser.rb +179 -0
  113. data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
  114. data/lib/fluent/config/yaml_parser.rb +56 -0
  115. data/lib/fluent/config.rb +89 -0
  116. data/lib/fluent/configurable.rb +202 -0
  117. data/lib/fluent/counter/base_socket.rb +44 -0
  118. data/lib/fluent/counter/client.rb +297 -0
  119. data/lib/fluent/counter/error.rb +86 -0
  120. data/lib/fluent/counter/mutex_hash.rb +163 -0
  121. data/lib/fluent/counter/server.rb +273 -0
  122. data/lib/fluent/counter/store.rb +205 -0
  123. data/lib/fluent/counter/validator.rb +145 -0
  124. data/lib/fluent/counter.rb +23 -0
  125. data/lib/fluent/daemon.rb +14 -0
  126. data/lib/fluent/daemonizer.rb +88 -0
  127. data/lib/fluent/engine.rb +269 -0
  128. data/lib/fluent/env.rb +45 -0
  129. data/lib/fluent/error.rb +37 -0
  130. data/lib/fluent/event.rb +369 -0
  131. data/lib/fluent/event_router.rb +315 -0
  132. data/lib/fluent/ext_monitor_require.rb +28 -0
  133. data/lib/fluent/file_wrapper.rb +137 -0
  134. data/lib/fluent/filter.rb +21 -0
  135. data/lib/fluent/fluent_log_event_router.rb +139 -0
  136. data/lib/fluent/formatter.rb +23 -0
  137. data/lib/fluent/input.rb +21 -0
  138. data/lib/fluent/label.rb +46 -0
  139. data/lib/fluent/load.rb +33 -0
  140. data/lib/fluent/log/console_adapter.rb +66 -0
  141. data/lib/fluent/log.rb +775 -0
  142. data/lib/fluent/match.rb +187 -0
  143. data/lib/fluent/mixin.rb +31 -0
  144. data/lib/fluent/msgpack_factory.rb +111 -0
  145. data/lib/fluent/oj_options.rb +61 -0
  146. data/lib/fluent/output.rb +29 -0
  147. data/lib/fluent/output_chain.rb +23 -0
  148. data/lib/fluent/parser.rb +23 -0
  149. data/lib/fluent/plugin/bare_output.rb +88 -0
  150. data/lib/fluent/plugin/base.rb +219 -0
  151. data/lib/fluent/plugin/buf_file.rb +256 -0
  152. data/lib/fluent/plugin/buf_file_single.rb +272 -0
  153. data/lib/fluent/plugin/buf_memory.rb +34 -0
  154. data/lib/fluent/plugin/buffer/chunk.rb +313 -0
  155. data/lib/fluent/plugin/buffer/file_chunk.rb +432 -0
  156. data/lib/fluent/plugin/buffer/file_single_chunk.rb +325 -0
  157. data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
  158. data/lib/fluent/plugin/buffer.rb +1063 -0
  159. data/lib/fluent/plugin/compressable.rb +87 -0
  160. data/lib/fluent/plugin/exec_util.rb +22 -0
  161. data/lib/fluent/plugin/extractor.rb +132 -0
  162. data/lib/fluent/plugin/file_util.rb +22 -0
  163. data/lib/fluent/plugin/filter.rb +119 -0
  164. data/lib/fluent/plugin/filter_grep.rb +189 -0
  165. data/lib/fluent/plugin/filter_parser.rb +124 -0
  166. data/lib/fluent/plugin/filter_record_transformer.rb +325 -0
  167. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  168. data/lib/fluent/plugin/formatter.rb +75 -0
  169. data/lib/fluent/plugin/formatter_csv.rb +92 -0
  170. data/lib/fluent/plugin/formatter_hash.rb +35 -0
  171. data/lib/fluent/plugin/formatter_json.rb +62 -0
  172. data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
  173. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  174. data/lib/fluent/plugin/formatter_out_file.rb +55 -0
  175. data/lib/fluent/plugin/formatter_single_value.rb +36 -0
  176. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  177. data/lib/fluent/plugin/formatter_tsv.rb +40 -0
  178. data/lib/fluent/plugin/in_debug_agent.rb +71 -0
  179. data/lib/fluent/plugin/in_dummy.rb +18 -0
  180. data/lib/fluent/plugin/in_exec.rb +124 -0
  181. data/lib/fluent/plugin/in_forward.rb +489 -0
  182. data/lib/fluent/plugin/in_gc_stat.rb +72 -0
  183. data/lib/fluent/plugin/in_http.rb +737 -0
  184. data/lib/fluent/plugin/in_monitor_agent.rb +406 -0
  185. data/lib/fluent/plugin/in_object_space.rb +93 -0
  186. data/lib/fluent/plugin/in_sample.rb +148 -0
  187. data/lib/fluent/plugin/in_syslog.rb +346 -0
  188. data/lib/fluent/plugin/in_tail/compatibility.rb +111 -0
  189. data/lib/fluent/plugin/in_tail/dir_watcher.rb +713 -0
  190. data/lib/fluent/plugin/in_tail/group_watch.rb +204 -0
  191. data/lib/fluent/plugin/in_tail/io_handler.rb +391 -0
  192. data/lib/fluent/plugin/in_tail/line_feeder.rb +230 -0
  193. data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
  194. data/lib/fluent/plugin/in_tail/stat_watcher.rb +52 -0
  195. data/lib/fluent/plugin/in_tail/tail_watcher.rb +276 -0
  196. data/lib/fluent/plugin/in_tail/worker_pool.rb +298 -0
  197. data/lib/fluent/plugin/in_tail.rb +917 -0
  198. data/lib/fluent/plugin/in_tcp.rb +230 -0
  199. data/lib/fluent/plugin/in_udp.rb +101 -0
  200. data/lib/fluent/plugin/in_unix.rb +197 -0
  201. data/lib/fluent/plugin/input.rb +71 -0
  202. data/lib/fluent/plugin/metrics.rb +119 -0
  203. data/lib/fluent/plugin/metrics_local.rb +96 -0
  204. data/lib/fluent/plugin/multi_output.rb +179 -0
  205. data/lib/fluent/plugin/out_buffer.rb +40 -0
  206. data/lib/fluent/plugin/out_copy.rb +120 -0
  207. data/lib/fluent/plugin/out_exec.rb +105 -0
  208. data/lib/fluent/plugin/out_exec_filter.rb +319 -0
  209. data/lib/fluent/plugin/out_file.rb +371 -0
  210. data/lib/fluent/plugin/out_forward/ack_handler.rb +176 -0
  211. data/lib/fluent/plugin/out_forward/connection_manager.rb +131 -0
  212. data/lib/fluent/plugin/out_forward/error.rb +28 -0
  213. data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
  214. data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
  215. data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
  216. data/lib/fluent/plugin/out_forward/socket_cache.rb +177 -0
  217. data/lib/fluent/plugin/out_forward.rb +865 -0
  218. data/lib/fluent/plugin/out_http.rb +419 -0
  219. data/lib/fluent/plugin/out_null.rb +74 -0
  220. data/lib/fluent/plugin/out_relabel.rb +32 -0
  221. data/lib/fluent/plugin/out_roundrobin.rb +84 -0
  222. data/lib/fluent/plugin/out_secondary_file.rb +148 -0
  223. data/lib/fluent/plugin/out_stdout.rb +81 -0
  224. data/lib/fluent/plugin/out_stream.rb +130 -0
  225. data/lib/fluent/plugin/output.rb +1688 -0
  226. data/lib/fluent/plugin/owned_by_mixin.rb +41 -0
  227. data/lib/fluent/plugin/parser.rb +274 -0
  228. data/lib/fluent/plugin/parser_apache.rb +28 -0
  229. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  230. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  231. data/lib/fluent/plugin/parser_csv.rb +124 -0
  232. data/lib/fluent/plugin/parser_json.rb +118 -0
  233. data/lib/fluent/plugin/parser_ltsv.rb +49 -0
  234. data/lib/fluent/plugin/parser_msgpack.rb +72 -0
  235. data/lib/fluent/plugin/parser_multiline.rb +152 -0
  236. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  237. data/lib/fluent/plugin/parser_none.rb +36 -0
  238. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  239. data/lib/fluent/plugin/parser_syslog.rb +543 -0
  240. data/lib/fluent/plugin/parser_tsv.rb +47 -0
  241. data/lib/fluent/plugin/sd_file.rb +157 -0
  242. data/lib/fluent/plugin/sd_srv.rb +135 -0
  243. data/lib/fluent/plugin/sd_static.rb +58 -0
  244. data/lib/fluent/plugin/service_discovery.rb +65 -0
  245. data/lib/fluent/plugin/socket_util.rb +22 -0
  246. data/lib/fluent/plugin/storage.rb +84 -0
  247. data/lib/fluent/plugin/storage_local.rb +166 -0
  248. data/lib/fluent/plugin/string_util.rb +22 -0
  249. data/lib/fluent/plugin.rb +206 -0
  250. data/lib/fluent/plugin_helper/cert_option.rb +199 -0
  251. data/lib/fluent/plugin_helper/child_process.rb +369 -0
  252. data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
  253. data/lib/fluent/plugin_helper/counter.rb +51 -0
  254. data/lib/fluent/plugin_helper/event_emitter.rb +112 -0
  255. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  256. data/lib/fluent/plugin_helper/extract.rb +104 -0
  257. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  258. data/lib/fluent/plugin_helper/http_server/app.rb +81 -0
  259. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  260. data/lib/fluent/plugin_helper/http_server/request.rb +53 -0
  261. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  262. data/lib/fluent/plugin_helper/http_server/server.rb +116 -0
  263. data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
  264. data/lib/fluent/plugin_helper/http_server.rb +129 -0
  265. data/lib/fluent/plugin_helper/inject.rb +154 -0
  266. data/lib/fluent/plugin_helper/metrics.rb +136 -0
  267. data/lib/fluent/plugin_helper/parser.rb +147 -0
  268. data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
  269. data/lib/fluent/plugin_helper/retry_state.rb +219 -0
  270. data/lib/fluent/plugin_helper/server.rb +840 -0
  271. data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
  272. data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
  273. data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
  274. data/lib/fluent/plugin_helper/socket.rb +288 -0
  275. data/lib/fluent/plugin_helper/socket_option.rb +98 -0
  276. data/lib/fluent/plugin_helper/storage.rb +349 -0
  277. data/lib/fluent/plugin_helper/thread.rb +180 -0
  278. data/lib/fluent/plugin_helper/timer.rb +92 -0
  279. data/lib/fluent/plugin_helper.rb +75 -0
  280. data/lib/fluent/plugin_id.rb +93 -0
  281. data/lib/fluent/process.rb +22 -0
  282. data/lib/fluent/registry.rb +117 -0
  283. data/lib/fluent/root_agent.rb +468 -0
  284. data/lib/fluent/rpc.rb +95 -0
  285. data/lib/fluent/source_only_buffer_agent.rb +102 -0
  286. data/lib/fluent/static_config_analysis.rb +195 -0
  287. data/lib/fluent/supervisor.rb +1347 -0
  288. data/lib/fluent/system_config.rb +213 -0
  289. data/lib/fluent/test/base.rb +83 -0
  290. data/lib/fluent/test/driver/base.rb +231 -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 +61 -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 +138 -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 +44 -0
  310. data/lib/fluent/test.rb +61 -0
  311. data/lib/fluent/time.rb +513 -0
  312. data/lib/fluent/timezone.rb +171 -0
  313. data/lib/fluent/tls.rb +105 -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/win32api.rb +38 -0
  318. data/lib/fluent/winsvc.rb +130 -0
  319. data/templates/new_gem/.gitignore +8 -0
  320. data/templates/new_gem/Gemfile +3 -0
  321. data/templates/new_gem/README.md.erb +43 -0
  322. data/templates/new_gem/Rakefile +13 -0
  323. data/templates/new_gem/fluent-plugin.gemspec.erb +28 -0
  324. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  325. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  326. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  327. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  328. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  329. data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
  330. data/templates/new_gem/test/helper.rb.erb +7 -0
  331. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  332. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  333. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  334. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  335. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  336. data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
  337. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  338. data/templates/plugin_config_formatter/param.md-table.erb +10 -0
  339. data/templates/plugin_config_formatter/param.md.erb +34 -0
  340. data/templates/plugin_config_formatter/section.md.erb +12 -0
  341. metadata +996 -0
@@ -0,0 +1,325 @@
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 'uri'
18
+ require 'fluent/plugin/buffer/chunk'
19
+ require 'fluent/unique_id'
20
+ require 'fluent/msgpack_factory'
21
+
22
+ module Fluent
23
+ module Plugin
24
+ class Buffer
25
+ class FileSingleChunk < Chunk
26
+ class FileChunkError < StandardError; end
27
+
28
+ ## buffer path user specified : /path/to/directory
29
+ ## buffer chunk path : /path/to/directory/fsb.key.b513b61c9791029c2513b61c9791029c2.buf
30
+ ## state: b/q - 'b'(on stage), 'q'(enqueued)
31
+
32
+ PATH_EXT = 'buf'
33
+ PATH_SUFFIX = ".#{PATH_EXT}"
34
+ PATH_REGEXP = /\.(b|q)([0-9a-f]+)\.#{PATH_EXT}*\Z/n # //n switch means explicit 'ASCII-8BIT' pattern
35
+
36
+ attr_reader :path, :permission
37
+
38
+ def initialize(metadata, path, mode, key, perm: Fluent::DEFAULT_FILE_PERMISSION, compress: :text, decompression_size_limit: Compressable::DEFAULT_DECOMPRESSION_SIZE_LIMIT)
39
+ super(metadata, compress: compress, decompression_size_limit: decompression_size_limit)
40
+ @key = key
41
+ perm ||= Fluent::DEFAULT_FILE_PERMISSION
42
+ @permission = perm.is_a?(String) ? perm.to_i(8) : perm
43
+ @bytesize = @size = @adding_bytes = @adding_size = 0
44
+
45
+ case mode
46
+ when :create then create_new_chunk(path, metadata, @permission)
47
+ when :staged then load_existing_staged_chunk(path)
48
+ when :queued then load_existing_enqueued_chunk(path)
49
+ else
50
+ raise ArgumentError, "Invalid file chunk mode: #{mode}"
51
+ end
52
+ end
53
+
54
+ def concat(bulk, bulk_size)
55
+ raise "BUG: concatenating to unwritable chunk, now '#{self.state}'" unless self.writable?
56
+
57
+ bulk.force_encoding(Encoding::ASCII_8BIT)
58
+ @chunk.write(bulk)
59
+ @adding_bytes += bulk.bytesize
60
+ @adding_size += bulk_size
61
+ true
62
+ end
63
+
64
+ def commit
65
+ @commit_position = @chunk.pos
66
+ @size += @adding_size
67
+ @bytesize += @adding_bytes
68
+ @adding_bytes = @adding_size = 0
69
+ @modified_at = Fluent::Clock.real_now
70
+
71
+ true
72
+ end
73
+
74
+ def rollback
75
+ if @chunk.pos != @commit_position
76
+ @chunk.seek(@commit_position, IO::SEEK_SET)
77
+ @chunk.truncate(@commit_position)
78
+ end
79
+ @adding_bytes = @adding_size = 0
80
+ true
81
+ end
82
+
83
+ def bytesize
84
+ @bytesize + @adding_bytes
85
+ end
86
+
87
+ def size
88
+ @size + @adding_size
89
+ end
90
+
91
+ def empty?
92
+ @bytesize.zero?
93
+ end
94
+
95
+ def enqueued!
96
+ return self unless self.writable?
97
+
98
+ super
99
+ rename_to_queued_path
100
+ self
101
+ end
102
+
103
+ def rename_to_queued_path
104
+ new_chunk_path = self.class.generate_queued_chunk_path(@path, @unique_id)
105
+
106
+ begin
107
+ file_rename(@chunk, @path, new_chunk_path, ->(new_io) { @chunk = new_io })
108
+ rescue => e
109
+ begin
110
+ file_rename(@chunk, new_chunk_path, @path, ->(new_io) { @chunk = new_io }) if File.exist?(new_chunk_path)
111
+ rescue => re
112
+ # In this point, restore buffer state is hard because previous `file_rename` failed by resource problem.
113
+ # Retry is one possible approach but it may cause livelock under limited resources or high load environment.
114
+ # So we ignore such errors for now and log better message instead.
115
+ # "Too many open files" should be fixed by proper buffer configuration and system setting.
116
+ raise "can't enqueue buffer file and failed to restore. This may causes inconsistent state: path = #{@path}, error = '#{e}', retry error = '#{re}'"
117
+ else
118
+ raise "can't enqueue buffer file: path = #{@path}, error = '#{e}'"
119
+ end
120
+ end
121
+
122
+ @path = new_chunk_path
123
+ end
124
+ private :rename_to_queued_path
125
+
126
+ def close
127
+ super
128
+ size = @chunk.size
129
+ @chunk.close
130
+ if size == 0
131
+ File.unlink(@path)
132
+ end
133
+ end
134
+
135
+ def purge
136
+ super
137
+ @chunk.close
138
+ @bytesize = @size = @adding_bytes = @adding_size = 0
139
+ File.unlink(@path)
140
+ end
141
+
142
+ def read(**kwargs)
143
+ @chunk.seek(0, IO::SEEK_SET)
144
+ @chunk.read
145
+ end
146
+
147
+ def open(**kwargs, &block)
148
+ @chunk.seek(0, IO::SEEK_SET)
149
+ begin
150
+ yield @chunk
151
+ ensure
152
+ @chunk.seek(0, IO::SEEK_END) if self.staged?
153
+ end
154
+ end
155
+
156
+ def self.assume_chunk_state(path)
157
+ return :unknown unless path.end_with?(PATH_SUFFIX)
158
+
159
+ if PATH_REGEXP =~ path
160
+ $1 == 'b' ? :staged : :queued
161
+ else
162
+ # files which matches to glob of buffer file pattern
163
+ # it includes files which are created by out_file
164
+ :unknown
165
+ end
166
+ end
167
+
168
+ def self.unique_id_and_key_from_path(path)
169
+ base = File.basename(path)
170
+ res = PATH_REGEXP =~ base
171
+ return nil unless res
172
+
173
+ key = base[4..res - 1] # remove 'fsb.' and '.'
174
+ hex_id = $2 # remove '.' and '.buf'
175
+ unique_id = hex_id.scan(/../).map {|x| x.to_i(16) }.pack('C*')
176
+ [unique_id, key]
177
+ end
178
+
179
+ def self.generate_stage_chunk_path(path, key, unique_id)
180
+ pos = path.index('.*.')
181
+ raise "BUG: buffer chunk path on stage MUST have '.*.'" unless pos
182
+
183
+ prefix = path[0...pos]
184
+ suffix = path[(pos + 3)..-1]
185
+
186
+ chunk_id = Fluent::UniqueId.hex(unique_id)
187
+ "#{prefix}.#{key}.b#{chunk_id}.#{suffix}"
188
+ end
189
+
190
+ def self.generate_queued_chunk_path(path, unique_id)
191
+ chunk_id = Fluent::UniqueId.hex(unique_id)
192
+ staged_path = ".b#{chunk_id}."
193
+ if path.index(staged_path)
194
+ path.sub(staged_path, ".q#{chunk_id}.")
195
+ else # for unexpected cases (ex: users rename files while opened by fluentd)
196
+ path + ".q#{chunk_id}.chunk"
197
+ end
198
+ end
199
+
200
+ def restore_metadata
201
+ if res = self.class.unique_id_and_key_from_path(@path)
202
+ @unique_id = res.first
203
+ key = decode_key(res.last)
204
+ if @key
205
+ @metadata.variables = {@key => key}
206
+ else
207
+ @metadata.tag = key
208
+ end
209
+ else
210
+ raise FileChunkError, "Invalid chunk found. unique_id and key not exist: #{@path}"
211
+ end
212
+ @size = 0
213
+
214
+ stat = File.stat(@path)
215
+ @created_at = stat.ctime.to_i
216
+ @modified_at = stat.mtime.to_i
217
+ end
218
+
219
+ def restore_size(chunk_format)
220
+ count = 0
221
+ File.open(@path, 'rb') { |f|
222
+ if chunk_format == :msgpack
223
+ Fluent::MessagePackFactory.msgpack_unpacker(f).each { |d| count += 1 }
224
+ else
225
+ f.each_line { |l| count += 1 }
226
+ end
227
+ }
228
+ @size = count
229
+ end
230
+
231
+ def file_rename(file, old_path, new_path, callback = nil)
232
+ pos = file.pos
233
+ setup = ->(f) {
234
+ f.set_encoding(Encoding::ASCII_8BIT)
235
+ f.sync = true
236
+ f.binmode
237
+ f.pos = pos
238
+ callback.call(f) if callback
239
+ }
240
+ if Fluent.windows?
241
+ file.close
242
+ renamed = false
243
+ begin
244
+ File.rename(old_path, new_path)
245
+ renamed = true
246
+ ensure
247
+ setup.call(File.open(renamed ? new_path : old_path, 'rb', @permission))
248
+ end
249
+ else
250
+ File.rename(old_path, new_path)
251
+ file.reopen(new_path, 'rb')
252
+ setup.call(file)
253
+ end
254
+ end
255
+
256
+ ESCAPE_REGEXP = /[^-_.a-zA-Z0-9]/n
257
+
258
+ def encode_key(metadata)
259
+ k = @key ? metadata.variables[@key] : metadata.tag
260
+ k ||= ''
261
+ URI::RFC2396_PARSER.escape(k, ESCAPE_REGEXP)
262
+ end
263
+
264
+ def decode_key(key)
265
+ URI::RFC2396_PARSER.unescape(key)
266
+ end
267
+
268
+ def create_new_chunk(path, metadata, perm)
269
+ @path = self.class.generate_stage_chunk_path(path, encode_key(metadata), @unique_id)
270
+ begin
271
+ @chunk = File.open(@path, 'wb+', perm)
272
+ @chunk.set_encoding(Encoding::ASCII_8BIT)
273
+ @chunk.sync = true
274
+ @chunk.binmode
275
+ rescue => e
276
+ # Here assumes "Too many open files" like recoverable error so raising BufferOverflowError.
277
+ # If other cases are possible, we will change error handling with proper classes.
278
+ raise BufferOverflowError, "can't create buffer file for #{path}. Stop creating buffer files: error = #{e}"
279
+ end
280
+
281
+ @state = :unstaged
282
+ @bytesize = 0
283
+ @commit_position = @chunk.pos # must be 0
284
+ @adding_bytes = 0
285
+ @adding_size = 0
286
+ end
287
+
288
+ def load_existing_staged_chunk(path)
289
+ @path = path
290
+ raise FileChunkError, "staged file chunk is empty" if File.size(@path).zero?
291
+
292
+ @chunk = File.open(@path, 'rb+')
293
+ @chunk.set_encoding(Encoding::ASCII_8BIT)
294
+ @chunk.sync = true
295
+ @chunk.binmode
296
+ @chunk.seek(0, IO::SEEK_END)
297
+
298
+ restore_metadata
299
+
300
+ @state = :staged
301
+ @bytesize = @chunk.size
302
+ @commit_position = @chunk.pos
303
+ @adding_bytes = 0
304
+ @adding_size = 0
305
+ end
306
+
307
+ def load_existing_enqueued_chunk(path)
308
+ @path = path
309
+ raise FileChunkError, "enqueued file chunk is empty" if File.size(@path).zero?
310
+
311
+ @chunk = File.open(@path, 'rb')
312
+ @chunk.set_encoding(Encoding::ASCII_8BIT)
313
+ @chunk.binmode
314
+ @chunk.seek(0, IO::SEEK_SET)
315
+
316
+ restore_metadata
317
+
318
+ @state = :queued
319
+ @bytesize = @chunk.size
320
+ @commit_position = @chunk.size
321
+ end
322
+ end
323
+ end
324
+ end
325
+ end
@@ -0,0 +1,91 @@
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, decompression_size_limit: Compressable::DEFAULT_DECOMPRESSION_SIZE_LIMIT)
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 = Fluent::Clock.real_now
47
+ @modified_at_object = nil
48
+ true
49
+ end
50
+
51
+ def rollback
52
+ @chunk.slice!(@chunk_bytes, @adding_bytes)
53
+ @adding_bytes = @adding_size = 0
54
+ true
55
+ end
56
+
57
+ def bytesize
58
+ @chunk_bytes + @adding_bytes
59
+ end
60
+
61
+ def size
62
+ @size + @adding_size
63
+ end
64
+
65
+ def empty?
66
+ @chunk.empty?
67
+ end
68
+
69
+ def purge
70
+ super
71
+ @chunk.clear
72
+ @chunk_bytes = @size = @adding_bytes = @adding_size = 0
73
+ true
74
+ end
75
+
76
+ def read(**kwargs)
77
+ @chunk.dup
78
+ end
79
+
80
+ def open(**kwargs, &block)
81
+ StringIO.open(@chunk, &block)
82
+ end
83
+
84
+ def write_to(io, **kwargs)
85
+ # re-implementation to optimize not to create StringIO
86
+ io.write @chunk
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end