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,419 @@
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 'net/http'
18
+ require 'uri'
19
+ require 'openssl'
20
+ require 'securerandom'
21
+ require 'fluent/tls'
22
+ require 'fluent/plugin/output'
23
+ require 'fluent/plugin_helper/socket'
24
+
25
+ module Fluent::Plugin
26
+ class HTTPOutput < Output
27
+ Fluent::Plugin.register_output('http', self)
28
+
29
+ class RetryableResponse < StandardError; end
30
+
31
+ ConnectionCache = Struct.new(:uri, :conn)
32
+
33
+ helpers :formatter
34
+
35
+ desc 'The endpoint for HTTP request, e.g. http://example.com/api'
36
+ config_param :endpoint, :string
37
+ desc 'The method for HTTP request'
38
+ config_param :http_method, :enum, list: [:put, :post], default: :post
39
+ desc 'The proxy for HTTP request'
40
+ config_param :proxy, :string, default: ENV['HTTP_PROXY'] || ENV['http_proxy']
41
+ desc 'Content-Type for HTTP request'
42
+ config_param :content_type, :string, default: nil
43
+ desc 'JSON array data format for HTTP request body'
44
+ config_param :json_array, :bool, default: false
45
+ desc 'Additional headers for HTTP request'
46
+ config_param :headers, :hash, default: nil
47
+ desc 'Additional placeholder based headers for HTTP request'
48
+ config_param :headers_from_placeholders, :hash, default: nil
49
+ desc 'Compress HTTP request body'
50
+ config_param :compress, :enum, list: [:text, :gzip], default: :text
51
+
52
+ desc 'Allowed hosts list for dynamic endpoints'
53
+ config_param :allowed_hosts, :array, default: []
54
+
55
+ desc 'The connection open timeout in seconds'
56
+ config_param :open_timeout, :integer, default: nil
57
+ desc 'The read timeout in seconds'
58
+ config_param :read_timeout, :integer, default: nil
59
+ desc 'The TLS timeout in seconds'
60
+ config_param :ssl_timeout, :integer, default: nil
61
+ desc 'Try to reuse connections'
62
+ config_param :reuse_connections, :bool, default: false
63
+
64
+ desc 'The CA certificate path for TLS'
65
+ config_param :tls_ca_cert_path, :string, default: nil
66
+ desc 'The client certificate path for TLS'
67
+ config_param :tls_client_cert_path, :string, default: nil
68
+ desc 'The client private key path for TLS'
69
+ config_param :tls_private_key_path, :string, default: nil
70
+ desc 'The client private key passphrase for TLS'
71
+ config_param :tls_private_key_passphrase, :string, default: nil, secret: true
72
+ desc 'The verify mode of TLS'
73
+ config_param :tls_verify_mode, :enum, list: [:none, :peer], default: :peer
74
+ desc 'The default version of TLS'
75
+ config_param :tls_version, :enum, list: Fluent::TLS::SUPPORTED_VERSIONS, default: Fluent::TLS::DEFAULT_VERSION
76
+ desc 'The cipher configuration of TLS'
77
+ config_param :tls_ciphers, :string, default: Fluent::TLS::CIPHERS_DEFAULT
78
+
79
+ desc 'Raise UnrecoverableError when the response is non success, 4xx/5xx'
80
+ config_param :error_response_as_unrecoverable, :bool, default: true
81
+ desc 'The list of retryable response code'
82
+ config_param :retryable_response_codes, :array, value_type: :integer, default: nil
83
+
84
+ config_section :format do
85
+ config_set_default :@type, 'json'
86
+ end
87
+
88
+ config_section :auth, required: false, multi: false do
89
+ desc 'The method for HTTP authentication'
90
+ config_param :method, :enum, list: [:basic, :aws_sigv4], default: :basic
91
+ desc 'The username for basic authentication'
92
+ config_param :username, :string, default: nil
93
+ desc 'The password for basic authentication'
94
+ config_param :password, :string, default: nil, secret: true
95
+ desc 'The AWS service to authenticate against'
96
+ config_param :aws_service, :string, default: nil
97
+ desc 'The AWS region to use when authenticating'
98
+ config_param :aws_region, :string, default: nil
99
+ desc 'The AWS role ARN to assume when authenticating'
100
+ config_param :aws_role_arn, :string, default: nil
101
+ end
102
+
103
+ # To prevent URI::InvalidURIError, we replace Fluentd placeholders with a dummy string.
104
+ # We use the ".invalid" TLD (RFC 2606) to ensure it is RFC-compliant for URI parsing,
105
+ # while guaranteeing it will never conflict with a real-world hostname.
106
+ REPLACED_ENDPOINT_PLACEHOLDER = "#{SecureRandom.uuid}.invalid".freeze
107
+
108
+ def connection_cache_id_thread_key
109
+ "#{plugin_id}_connection_cache_id"
110
+ end
111
+
112
+ def connection_cache_id_for_thread
113
+ Thread.current[connection_cache_id_thread_key]
114
+ end
115
+
116
+ def connection_cache_id_for_thread=(id)
117
+ Thread.current[connection_cache_id_thread_key] = id
118
+ end
119
+
120
+ def initialize
121
+ super
122
+
123
+ @uri = nil
124
+ @proxy_uri = nil
125
+ @formatter = nil
126
+
127
+ @connection_cache = []
128
+ @connection_cache_id_mutex = Mutex.new
129
+ @connection_cache_next_id = 0
130
+ end
131
+
132
+ def close
133
+ super
134
+
135
+ @connection_cache.each {|entry| entry.conn.finish if entry.conn&.started? }
136
+ end
137
+
138
+ def configure(conf)
139
+ super
140
+
141
+ @connection_cache = Array.new(actual_flush_thread_count, ConnectionCache.new("", nil)) if @reuse_connections
142
+
143
+ if @retryable_response_codes.nil?
144
+ log.warn('Status code 503 is going to be removed from default `retryable_response_codes` from fluentd v2. Please add it by yourself if you wish')
145
+ @retryable_response_codes = [503]
146
+ end
147
+
148
+ begin
149
+ # Replace all Fluentd placeholder syntaxes (${...} or %{...})
150
+ endpoint = @endpoint.gsub(%r([$%]{[^}]+}), REPLACED_ENDPOINT_PLACEHOLDER)
151
+ # If @endpoint has placeholder as host name, then, @endpoint_host == REPLACED_ENDPOINT_PLACEHOLDER
152
+ @endpoint_host = URI.parse(endpoint).host
153
+ rescue URI::InvalidURIError => e
154
+ raise Fluent::ConfigError, "Invalid endpoint URI: #{@endpoint} (#{e.message})"
155
+ end
156
+
157
+ @http_opt = setup_http_option
158
+ @proxy_uri = URI.parse(@proxy) if @proxy
159
+ @formatter = formatter_create
160
+ @content_type = setup_content_type unless @content_type
161
+
162
+ if @json_array
163
+ if @formatter_configs.first[:@type] != "json"
164
+ raise Fluent::ConfigError, "json_array option could be used with json formatter only"
165
+ end
166
+ define_singleton_method(:format, method(:format_json_array))
167
+ end
168
+
169
+ if @auth and @auth.method == :aws_sigv4
170
+ begin
171
+ require 'aws-sigv4'
172
+ require 'aws-sdk-core'
173
+ rescue LoadError
174
+ raise Fluent::ConfigError, "The aws-sdk-core and aws-sigv4 gems are required for aws_sigv4 auth. Run: gem install aws-sdk-core -v '~> 3.191'"
175
+ end
176
+
177
+ raise Fluent::ConfigError, "aws_service is required for aws_sigv4 auth" unless @auth.aws_service != nil
178
+ raise Fluent::ConfigError, "aws_region is required for aws_sigv4 auth" unless @auth.aws_region != nil
179
+
180
+ if @auth.aws_role_arn == nil
181
+ aws_credentials = Aws::CredentialProviderChain.new.resolve
182
+ else
183
+ aws_credentials = Aws::AssumeRoleCredentials.new(
184
+ client: Aws::STS::Client.new(
185
+ region: @auth.aws_region
186
+ ),
187
+ role_arn: @auth.aws_role_arn,
188
+ role_session_name: "fluentd"
189
+ )
190
+ end
191
+
192
+ @aws_signer = Aws::Sigv4::Signer.new(
193
+ service: @auth.aws_service,
194
+ region: @auth.aws_region,
195
+ credentials_provider: aws_credentials
196
+ )
197
+ end
198
+ end
199
+
200
+ def multi_workers_ready?
201
+ true
202
+ end
203
+
204
+ def formatted_to_msgpack_binary?
205
+ @formatter_configs.first[:@type] == 'msgpack'
206
+ end
207
+
208
+ def format(tag, time, record)
209
+ @formatter.format(tag, time, record)
210
+ end
211
+
212
+ def format_json_array(tag, time, record)
213
+ @formatter.format(tag, time, record) << ","
214
+ end
215
+
216
+ def write(chunk)
217
+ uri = parse_endpoint(chunk)
218
+ req = create_request(chunk, uri)
219
+
220
+ log.debug { "#{@http_method.capitalize} data to #{uri.to_s} with chunk(#{dump_unique_id_hex(chunk.unique_id)})" }
221
+
222
+ send_request(uri, req)
223
+ end
224
+
225
+ private
226
+
227
+ def setup_content_type
228
+ case @formatter_configs.first[:@type]
229
+ when 'json'
230
+ @json_array ? 'application/json' : 'application/x-ndjson'
231
+ when 'csv'
232
+ 'text/csv'
233
+ when 'tsv', 'ltsv'
234
+ 'text/tab-separated-values'
235
+ when 'msgpack'
236
+ 'application/x-msgpack'
237
+ when 'out_file', 'single_value', 'stdout', 'hash'
238
+ 'text/plain'
239
+ else
240
+ raise Fluent::ConfigError, "can't determine Content-Type from formatter type. Set content_type parameter explicitly"
241
+ end
242
+ end
243
+
244
+ def setup_http_option
245
+ use_ssl = @endpoint.start_with?('https')
246
+ opt = {
247
+ open_timeout: @open_timeout,
248
+ read_timeout: @read_timeout,
249
+ ssl_timeout: @ssl_timeout,
250
+ use_ssl: use_ssl
251
+ }
252
+
253
+ if use_ssl
254
+ if @tls_ca_cert_path
255
+ raise Fluent::ConfigError, "tls_ca_cert_path is wrong: #{@tls_ca_cert_path}" unless File.file?(@tls_ca_cert_path)
256
+ opt[:ca_file] = @tls_ca_cert_path
257
+ end
258
+ if @tls_client_cert_path
259
+ raise Fluent::ConfigError, "tls_client_cert_path is wrong: #{@tls_client_cert_path}" unless File.file?(@tls_client_cert_path)
260
+
261
+ bundle = File.read(@tls_client_cert_path)
262
+ bundle_certs = bundle.scan(/-----BEGIN CERTIFICATE-----(?:.|\n)+?-----END CERTIFICATE-----/)
263
+ opt[:cert] = OpenSSL::X509::Certificate.new(bundle_certs[0])
264
+
265
+ intermediate_certs = bundle_certs[1..-1]
266
+ if intermediate_certs
267
+ opt[:extra_chain_cert] = intermediate_certs.map { |cert| OpenSSL::X509::Certificate.new(cert) }
268
+ end
269
+ end
270
+ if @tls_private_key_path
271
+ raise Fluent::ConfigError, "tls_private_key_path is wrong: #{@tls_private_key_path}" unless File.file?(@tls_private_key_path)
272
+ opt[:key] = OpenSSL::PKey.read(File.read(@tls_private_key_path), @tls_private_key_passphrase)
273
+ end
274
+ opt[:verify_mode] = case @tls_verify_mode
275
+ when :none
276
+ OpenSSL::SSL::VERIFY_NONE
277
+ when :peer
278
+ OpenSSL::SSL::VERIFY_PEER
279
+ end
280
+ opt[:ciphers] = @tls_ciphers
281
+ opt = Fluent::TLS.set_version_to_options(opt, @tls_version, nil, nil)
282
+ end
283
+
284
+ opt
285
+ end
286
+
287
+ def parse_endpoint(chunk)
288
+ endpoint = extract_placeholders(@endpoint, chunk)
289
+ uri = URI.parse(endpoint)
290
+
291
+ if @endpoint_host != uri.host
292
+ if @allowed_hosts.empty?
293
+ raise Fluent::UnrecoverableError, "allowed_hosts is strictly required when using placeholders in the endpoint host"
294
+ end
295
+
296
+ unless @allowed_hosts.include?(uri.host)
297
+ raise Fluent::UnrecoverableError, "Not allowed host: #{uri.host}"
298
+ end
299
+ end
300
+
301
+ uri
302
+ end
303
+
304
+ def set_headers(req, uri, chunk)
305
+ if @headers
306
+ @headers.each do |k, v|
307
+ req[k] = v
308
+ end
309
+ end
310
+ if @headers_from_placeholders
311
+ @headers_from_placeholders.each do |k, v|
312
+ req[k] = extract_placeholders(v, chunk)
313
+ end
314
+ end
315
+ if @compress == :gzip
316
+ req['Content-Encoding'] = "gzip"
317
+ end
318
+ req['Content-Type'] = @content_type
319
+ end
320
+
321
+ def set_auth(req, uri)
322
+ return unless @auth
323
+
324
+ if @auth.method == :basic
325
+ req.basic_auth(@auth.username, @auth.password)
326
+ elsif @auth.method == :aws_sigv4
327
+ signature = @aws_signer.sign_request(
328
+ http_method: req.method,
329
+ url: uri.request_uri,
330
+ headers: {
331
+ 'Content-Type' => @content_type,
332
+ 'Host' => uri.host
333
+ },
334
+ body: req.body
335
+ )
336
+ req.add_field('x-amz-date', signature.headers['x-amz-date'])
337
+ req.add_field('x-amz-security-token', signature.headers['x-amz-security-token'])
338
+ req.add_field('x-amz-content-sha256', signature.headers['x-amz-content-sha256'])
339
+ req.add_field('authorization', signature.headers['authorization'])
340
+ end
341
+ end
342
+
343
+ def create_request(chunk, uri)
344
+ req = case @http_method
345
+ when :post
346
+ Net::HTTP::Post.new(uri.request_uri)
347
+ when :put
348
+ Net::HTTP::Put.new(uri.request_uri)
349
+ end
350
+ set_headers(req, uri, chunk)
351
+
352
+ req.body = @json_array ? "[#{chunk.read.chop}]" : chunk.read
353
+
354
+ if @compress == :gzip
355
+ gz = Zlib::GzipWriter.new(StringIO.new)
356
+ gz << req.body
357
+ req.body = gz.close.string
358
+ end
359
+
360
+ # At least one authentication method requires the body and other headers, so the order of this call matters
361
+ set_auth(req, uri)
362
+ req
363
+ end
364
+
365
+ def make_request_cached(uri, req)
366
+ id = self.connection_cache_id_for_thread
367
+ if id.nil?
368
+ @connection_cache_id_mutex.synchronize {
369
+ id = @connection_cache_next_id
370
+ @connection_cache_next_id += 1
371
+ }
372
+ self.connection_cache_id_for_thread = id
373
+ end
374
+ uri_str = uri.to_s
375
+ if @connection_cache[id].uri != uri_str
376
+ @connection_cache[id].conn.finish if @connection_cache[id].conn&.started?
377
+ http = if @proxy_uri
378
+ Net::HTTP.start(uri.host, uri.port, @proxy_uri.host, @proxy_uri.port, @proxy_uri.user, @proxy_uri.password, @http_opt)
379
+ else
380
+ Net::HTTP.start(uri.host, uri.port, @http_opt)
381
+ end
382
+ @connection_cache[id] = ConnectionCache.new(uri_str, http)
383
+ end
384
+ @connection_cache[id].conn.request(req)
385
+ end
386
+
387
+ def make_request(uri, req, &block)
388
+ if @proxy_uri
389
+ Net::HTTP.start(uri.host, uri.port, @proxy_uri.host, @proxy_uri.port, @proxy_uri.user, @proxy_uri.password, @http_opt, &block)
390
+ else
391
+ Net::HTTP.start(uri.host, uri.port, @http_opt, &block)
392
+ end
393
+ end
394
+
395
+ def send_request(uri, req)
396
+ res = if @reuse_connections
397
+ make_request_cached(uri, req)
398
+ else
399
+ make_request(uri, req) { |http| http.request(req) }
400
+ end
401
+
402
+ if res.is_a?(Net::HTTPSuccess)
403
+ log.debug { "#{res.code} #{res.message.rstrip}#{res.body.lstrip}" }
404
+ else
405
+ msg = "#{res.code} #{res.message.rstrip} #{res.body.lstrip}"
406
+
407
+ if @retryable_response_codes.include?(res.code.to_i)
408
+ raise RetryableResponse, msg
409
+ end
410
+
411
+ if @error_response_as_unrecoverable
412
+ raise Fluent::UnrecoverableError, msg
413
+ else
414
+ log.error "got error response from '#{@http_method.capitalize} #{uri.to_s}' : #{msg}"
415
+ end
416
+ end
417
+ end
418
+ end
419
+ end
@@ -0,0 +1,74 @@
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/output'
18
+
19
+ module Fluent::Plugin
20
+ class NullOutput < Output
21
+ # This plugin is for tests of non-buffered/buffered plugins
22
+ Fluent::Plugin.register_output('null', self)
23
+
24
+ desc "The parameter for testing to simulate output plugin which never succeed to flush."
25
+ config_param :never_flush, :bool, default: false
26
+
27
+ config_section :buffer do
28
+ config_set_default :chunk_keys, ['tag']
29
+ config_set_default :flush_at_shutdown, true
30
+ config_set_default :chunk_limit_size, 10 * 1024
31
+ end
32
+
33
+ def prefer_buffered_processing
34
+ false
35
+ end
36
+
37
+ def prefer_delayed_commit
38
+ @delayed
39
+ end
40
+
41
+ attr_accessor :feed_proc, :delayed
42
+
43
+ def initialize
44
+ super
45
+ @delayed = false
46
+ @feed_proc = nil
47
+ end
48
+
49
+ def multi_workers_ready?
50
+ true
51
+ end
52
+
53
+ def process(tag, es)
54
+ raise "failed to flush" if @never_flush
55
+ # Do nothing
56
+ end
57
+
58
+ def write(chunk)
59
+ raise "failed to flush" if @never_flush
60
+ if @feed_proc
61
+ @feed_proc.call(chunk)
62
+ end
63
+ end
64
+
65
+ def try_write(chunk)
66
+ raise "failed to flush" if @never_flush
67
+ if @feed_proc
68
+ @feed_proc.call(chunk)
69
+ end
70
+ # not to commit chunks for testing
71
+ # commit_write(chunk.unique_id)
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,32 @@
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/output'
18
+
19
+ module Fluent::Plugin
20
+ class RelabelOutput < Output
21
+ Fluent::Plugin.register_output('relabel', self)
22
+ helpers :event_emitter
23
+
24
+ def multi_workers_ready?
25
+ true
26
+ end
27
+
28
+ def process(tag, es)
29
+ router.emit_stream(tag, es)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,84 @@
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/multi_output'
18
+ require 'fluent/config/error'
19
+
20
+ module Fluent::Plugin
21
+ class RoundRobinOutput < MultiOutput
22
+ Fluent::Plugin.register_output('roundrobin', self)
23
+
24
+ config_section :store do
25
+ config_param :weight, :integer, default: 1
26
+ end
27
+
28
+ def initialize
29
+ super
30
+ @weights = []
31
+ end
32
+
33
+ attr_reader :weights
34
+
35
+ def configure(conf)
36
+ super
37
+
38
+ @stores.each do |store|
39
+ @weights << store.weight
40
+ end
41
+ @rr = -1 # starts from @output[0]
42
+ @rand_seed = Random.new.seed
43
+ end
44
+
45
+ def multi_workers_ready?
46
+ true
47
+ end
48
+
49
+ def start
50
+ super
51
+ rebuild_weight_array
52
+ end
53
+
54
+ def process(tag, es)
55
+ next_output.emit_events(tag, es)
56
+ end
57
+
58
+ private
59
+
60
+ def next_output
61
+ @rr = 0 if (@rr += 1) >= @weight_array.size
62
+ @weight_array[@rr]
63
+ end
64
+
65
+ def rebuild_weight_array
66
+ gcd = @weights.inject(0) {|r,w| r.gcd(w) }
67
+
68
+ weight_array = []
69
+ @outputs.zip(@weights).each {|output,weight|
70
+ (weight / gcd).times {
71
+ weight_array << output
72
+ }
73
+ }
74
+
75
+ # don't randomize order if all weight is 1 (=default)
76
+ if @weights.any? {|w| w > 1 }
77
+ r = Random.new(@rand_seed)
78
+ weight_array.sort_by! { r.rand }
79
+ end
80
+
81
+ @weight_array = weight_array
82
+ end
83
+ end
84
+ end