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,104 @@
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/event'
18
+ require 'fluent/time'
19
+ require 'fluent/configurable'
20
+
21
+ module Fluent
22
+ module PluginHelper
23
+ module Extract
24
+ def extract_tag_from_record(record)
25
+ return nil unless @_extract_enabled
26
+
27
+ if @_extract_tag_key && record.has_key?(@_extract_tag_key)
28
+ v = @_extract_keep_tag_key ? record[@_extract_tag_key] : record.delete(@_extract_tag_key)
29
+ return v.to_s
30
+ end
31
+
32
+ nil
33
+ end
34
+
35
+ def extract_time_from_record(record)
36
+ return nil unless @_extract_enabled
37
+
38
+ if @_extract_time_key && record.has_key?(@_extract_time_key)
39
+ v = @_extract_keep_time_key ? record[@_extract_time_key] : record.delete(@_extract_time_key)
40
+ return @_extract_time_parser.call(v)
41
+ end
42
+
43
+ nil
44
+ end
45
+
46
+ module ExtractParams
47
+ include Fluent::Configurable
48
+ config_section :extract, required: false, multi: false, param_name: :extract_config do
49
+ config_param :tag_key, :string, default: nil
50
+ config_param :keep_tag_key, :bool, default: false
51
+ config_param :time_key, :string, default: nil
52
+ config_param :keep_time_key, :bool, default: false
53
+
54
+ # To avoid defining :time_type twice
55
+ config_param :time_type, :enum, list: [:float, :unixtime, :string], default: :float
56
+
57
+ Fluent::TimeMixin::TIME_PARAMETERS.each do |name, type, opts|
58
+ config_param(name, type, **opts)
59
+ end
60
+ end
61
+ end
62
+
63
+ def self.included(mod)
64
+ mod.include ExtractParams
65
+ end
66
+
67
+ def initialize
68
+ super
69
+ @_extract_enabled = false
70
+ @_extract_tag_key = nil
71
+ @_extract_keep_tag_key = nil
72
+ @_extract_time_key = nil
73
+ @_extract_keep_time_key = nil
74
+ @_extract_time_parser = nil
75
+ end
76
+
77
+ def configure(conf)
78
+ super
79
+
80
+ if @extract_config
81
+ @_extract_tag_key = @extract_config.tag_key
82
+ @_extract_keep_tag_key = @extract_config.keep_tag_key
83
+ @_extract_time_key = @extract_config.time_key
84
+ if @_extract_time_key
85
+ @_extract_keep_time_key = @extract_config.keep_time_key
86
+ @_extract_time_parser = case @extract_config.time_type
87
+ when :float then Fluent::NumericTimeParser.new(:float)
88
+ when :unixtime then Fluent::NumericTimeParser.new(:unixtime)
89
+ else
90
+ localtime = @extract_config.localtime && !@extract_config.utc
91
+ Fluent::TimeParser.new(@extract_config.time_format, localtime, @extract_config.timezone)
92
+ end
93
+ else
94
+ if @extract_config.time_format
95
+ log.warn "'time_format' specified without 'time_key', will be ignored"
96
+ end
97
+ end
98
+
99
+ @_extract_enabled = @_extract_tag_key || @_extract_time_key
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,147 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'fluent/plugin'
18
+ require 'fluent/plugin/formatter'
19
+ require 'fluent/config/element'
20
+ require 'fluent/configurable'
21
+
22
+ module Fluent
23
+ module PluginHelper
24
+ module Formatter
25
+ def formatter_create(usage: '', type: nil, conf: nil, default_type: nil)
26
+ formatter = @_formatters[usage]
27
+ return formatter if formatter && !type && !conf
28
+
29
+ type = if type
30
+ type
31
+ elsif conf && conf.respond_to?(:[])
32
+ raise Fluent::ConfigError, "@type is required in <format>" unless conf['@type']
33
+ conf['@type']
34
+ elsif default_type
35
+ default_type
36
+ else
37
+ raise ArgumentError, "BUG: both type and conf are not specified"
38
+ end
39
+ formatter = Fluent::Plugin.new_formatter(type, parent: self)
40
+ config = case conf
41
+ when Fluent::Config::Element
42
+ conf
43
+ when Hash
44
+ # in code, programmer may use symbols as keys, but Element needs strings
45
+ conf = Hash[conf.map{|k,v| [k.to_s, v]}]
46
+ Fluent::Config::Element.new('format', usage, conf, [])
47
+ when nil
48
+ Fluent::Config::Element.new('format', usage, {}, [])
49
+ else
50
+ raise ArgumentError, "BUG: conf must be a Element, Hash (or unspecified), but '#{conf.class}'"
51
+ end
52
+ formatter.configure(config)
53
+ if @_formatters_started
54
+ formatter.start
55
+ end
56
+
57
+ @_formatters[usage] = formatter
58
+ formatter
59
+ end
60
+
61
+ module FormatterParams
62
+ include Fluent::Configurable
63
+ # minimum section definition to instantiate formatter plugin instances
64
+ config_section :format, required: false, multi: true, init: true, param_name: :formatter_configs do
65
+ config_argument :usage, :string, default: ''
66
+ config_param :@type, :string # config_set_default required for :@type
67
+ end
68
+ end
69
+
70
+ def self.included(mod)
71
+ mod.include FormatterParams
72
+ end
73
+
74
+ attr_reader :_formatters # for tests
75
+
76
+ def initialize
77
+ super
78
+ @_formatters_started = false
79
+ @_formatters = {} # usage => formatter
80
+ end
81
+
82
+ def configure(conf)
83
+ super
84
+
85
+ @formatter_configs.each do |section|
86
+ if @_formatters[section.usage]
87
+ raise Fluent::ConfigError, "duplicated formatter configured: #{section.usage}"
88
+ end
89
+ formatter = Plugin.new_formatter(section[:@type], parent: self)
90
+ formatter.configure(section.corresponding_config_element)
91
+ @_formatters[section.usage] = formatter
92
+ end
93
+ end
94
+
95
+ def start
96
+ super
97
+ @_formatters_started = true
98
+ @_formatters.each_pair do |usage, formatter|
99
+ formatter.start
100
+ end
101
+ end
102
+
103
+ def formatter_operate(method_name, &block)
104
+ @_formatters.each_pair do |usage, formatter|
105
+ begin
106
+ formatter.__send__(method_name)
107
+ block.call(formatter) if block_given?
108
+ rescue => e
109
+ log.error "unexpected error while #{method_name}", usage: usage, formatter: formatter, error: e
110
+ end
111
+ end
112
+ end
113
+
114
+ def stop
115
+ super
116
+ formatter_operate(:stop)
117
+ end
118
+
119
+ def before_shutdown
120
+ formatter_operate(:before_shutdown)
121
+ super
122
+ end
123
+
124
+ def shutdown
125
+ formatter_operate(:shutdown)
126
+ super
127
+ end
128
+
129
+ def after_shutdown
130
+ formatter_operate(:after_shutdown)
131
+ super
132
+ end
133
+
134
+ def close
135
+ formatter_operate(:close)
136
+ super
137
+ end
138
+
139
+ def terminate
140
+ formatter_operate(:terminate)
141
+ @_formatters_started = false
142
+ @_formatters = {}
143
+ super
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,81 @@
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 'async/http/protocol'
18
+ require 'fluent/plugin_helper/http_server/methods'
19
+ require 'fluent/plugin_helper/http_server/request'
20
+
21
+ module Fluent
22
+ module PluginHelper
23
+ module HttpServer
24
+ class App
25
+ def initialize(router, logger)
26
+ @logger = logger
27
+ @router = router
28
+ end
29
+
30
+ # Required method by async-http
31
+ def call(request)
32
+ method = request.method
33
+ resp =
34
+ case method
35
+ when HttpServer::Methods::GET
36
+ get(request)
37
+ when HttpServer::Methods::HEAD
38
+ head(request)
39
+ when HttpServer::Methods::POST
40
+ post(request)
41
+ when HttpServer::Methods::PATCH
42
+ patch(request)
43
+ when HttpServer::Methods::PUT
44
+ put(request)
45
+ when HttpServer::Methods::DELETE
46
+ delete(request)
47
+ when HttpServer::Methods::OPTIONS
48
+ options(request)
49
+ when HttpServer::Methods::CONNECT
50
+ connect(request)
51
+ when HttpServer::Methods::TRACE
52
+ trace(request)
53
+ else
54
+ raise "Unknown method #{method}"
55
+ end
56
+ Protocol::HTTP::Response[*resp]
57
+ rescue => e
58
+ @logger.error(e)
59
+ Protocol::HTTP::Response[500, { 'Content-Type' => 'text/plain' }, 'Internal Server Error']
60
+ end
61
+
62
+ HttpServer::Methods::ALL.map { |e| e.downcase.to_sym }.each do |name|
63
+ define_method(name) do |request|
64
+ req = Request.new(request)
65
+
66
+ path = req.path
67
+ canonical_path =
68
+ if path.size >= 2 && !path.end_with?('/')
69
+ "#{path}/"
70
+ else
71
+ path
72
+ end
73
+ @router.route!(name, canonical_path, req)
74
+ ensure
75
+ request.body&.close
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,35 @@
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
+ module Fluent
18
+ module PluginHelper
19
+ module HttpServer
20
+ module Methods
21
+ GET = 'GET'.freeze
22
+ HEAD = 'HEAD'.freeze
23
+ POST = 'POST'.freeze
24
+ PUT = 'PUT'.freeze
25
+ PATCH = 'PATCH'.freeze
26
+ DELETE = 'DELETE'.freeze
27
+ OPTIONS = 'OPTIONS'.freeze
28
+ CONNECT = 'CONNECT'.freeze
29
+ TRACE = 'TRACE'.freeze
30
+
31
+ ALL = [GET, HEAD, POST, PUT, PATCH, DELETE, CONNECT, OPTIONS, TRACE].freeze
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,53 @@
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 'async/http/protocol'
19
+ require 'fluent/plugin_helper/http_server/methods'
20
+
21
+ module Fluent
22
+ module PluginHelper
23
+ module HttpServer
24
+ class Request
25
+ attr_reader :path, :query_string
26
+
27
+ def initialize(request)
28
+ @request = request
29
+ path = request.path
30
+ @path, @query_string = path.split('?', 2)
31
+ end
32
+
33
+ def headers
34
+ @request.headers
35
+ end
36
+
37
+ def query
38
+ if @query_string
39
+ hash = Hash.new { |h, k| h[k] = [] }
40
+ # For compatibility with CGI.parse
41
+ URI.decode_www_form(@query_string).each_with_object(hash) do |(key, value), h|
42
+ h[key] << value
43
+ end
44
+ end
45
+ end
46
+
47
+ def body
48
+ @request.body&.read
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,54 @@
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 'async/http/protocol'
18
+
19
+ module Fluent
20
+ module PluginHelper
21
+ module HttpServer
22
+ class Router
23
+ class NotFoundApp
24
+ def self.call(req)
25
+ [404, { 'Content-Type' => 'text/plain' }, "404 Not Found\n"]
26
+ end
27
+ end
28
+
29
+ def initialize(default_app = nil)
30
+ @router = { get: {}, head: {}, post: {}, put: {}, patch: {}, delete: {}, connect: {}, options: {}, trace: {} }
31
+ @default_app = default_app || NotFoundApp
32
+ end
33
+
34
+ # @param method [Symbol]
35
+ # @param path [String]
36
+ # @param app [Object]
37
+ def mount(method, path, app)
38
+ if @router[method].include?(path)
39
+ raise "#{path} is already mounted"
40
+ end
41
+
42
+ @router[method][path] = app
43
+ end
44
+
45
+ # @param method [Symbol]
46
+ # @param path [String]
47
+ # @param request [Fluent::PluginHelper::HttpServer::Request]
48
+ def route!(method, path, request)
49
+ @router.fetch(method).fetch(path, @default_app).call(request)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,116 @@
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 'async'
18
+ require 'async/http'
19
+ require 'async/http/endpoint'
20
+
21
+ require 'fluent/plugin_helper/http_server/app'
22
+ require 'fluent/plugin_helper/http_server/router'
23
+ require 'fluent/plugin_helper/http_server/methods'
24
+ require 'fluent/log/console_adapter'
25
+
26
+ module Fluent
27
+ module PluginHelper
28
+ module HttpServer
29
+ class Server
30
+ # @param logger [Logger]
31
+ # @param default_app [Object] This method must have #call.
32
+ # @param tls_context [OpenSSL::SSL::SSLContext]
33
+ def initialize(addr:, port:, logger:, default_app: nil, tls_context: nil)
34
+ # Normalize the address: strip brackets if present
35
+ # Brackets are only for URI formatting, not for socket binding
36
+ @addr = if addr.start_with?('[') && addr.end_with?(']')
37
+ addr[1..-2] # Remove surrounding brackets
38
+ else
39
+ addr
40
+ end
41
+ @port = port
42
+ @logger = logger
43
+
44
+ # TODO: support http2
45
+ scheme = tls_context ? 'https' : 'http'
46
+ # Handle IPv6 addresses properly in URI construction per RFC 3986
47
+ # Add brackets to IPv6 addresses for URI compliance (ip-literal per RFC 3986)
48
+ ip_literal = if @addr.include?(":")
49
+ "[#{@addr}]" # IPv6 address - add brackets
50
+ else
51
+ @addr # IPv4 or hostname - use directly
52
+ end
53
+ @uri = URI("#{scheme}://#{ip_literal}:#{@port}").to_s
54
+ @router = Router.new(default_app)
55
+ @server_task_queue = ::Thread::Queue.new
56
+ Console.logger = Fluent::Log::ConsoleAdapter.wrap(@logger)
57
+
58
+ opts = if tls_context
59
+ { ssl_context: tls_context }
60
+ else
61
+ {}
62
+ end
63
+ @server = Async::HTTP::Server.new(App.new(@router, @logger), Async::HTTP::Endpoint.parse(@uri, **opts))
64
+
65
+ if block_given?
66
+ yield(self)
67
+ end
68
+ end
69
+
70
+ def start(notify = nil)
71
+ Console.logger = Fluent::Log::ConsoleAdapter.wrap(@logger)
72
+ @logger.debug("Start async HTTP server listening #{@uri}")
73
+
74
+ Async do |task|
75
+ Console.logger = Fluent::Log::ConsoleAdapter.wrap(@logger)
76
+ begin
77
+ @server.endpoint.accept(&@server.method(:accept))
78
+ if notify
79
+ notify.push(:ready)
80
+ end
81
+
82
+ @server_task_queue.pop
83
+ rescue => e
84
+ @logger.error("Failed to run HTTP server listening #{@uri}: #{e.class}: #{e.message}")
85
+ raise unless notify
86
+ notify.push(e)
87
+ ensure
88
+ task.children&.each(&:stop)
89
+ end
90
+ end
91
+
92
+ @logger.debug('Finished HTTP server')
93
+ end
94
+
95
+ def stop
96
+ @logger.debug('closing HTTP server')
97
+ @server_task_queue.push(:stop)
98
+ end
99
+
100
+ HttpServer::Methods::ALL.map { |e| e.downcase.to_sym }.each do |name|
101
+ define_method(name) do |path, app = nil, &block|
102
+ unless path.end_with?('/')
103
+ path += '/'
104
+ end
105
+
106
+ if (block && app) || (!block && !app)
107
+ raise 'You must specify either app or block in the same time'
108
+ end
109
+
110
+ @router.mount(name, path, app || block)
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,41 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'fluent/plugin_helper/cert_option'
18
+
19
+ module Fluent
20
+ module PluginHelper
21
+ module HttpServer
22
+ # In order not to expose CertOption's methods unnecessary
23
+ class SSLContextBuilder
24
+ include Fluent::PluginHelper::CertOption
25
+
26
+ def initialize(log)
27
+ @log = log
28
+ end
29
+
30
+ # @param config [Fluent::Config::Section] @transport_config
31
+ def build(config)
32
+ cert_option_create_context(config.version, config.insecure, config.ciphers, config)
33
+ end
34
+
35
+ private
36
+
37
+ attr_reader :log
38
+ end
39
+ end
40
+ end
41
+ end