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.
- checksums.yaml +7 -0
- data/.rubocop.yml +116 -0
- data/ADOPTERS.md +5 -0
- data/AGENTS.md +46 -0
- data/AUTHORS +2 -0
- data/CHANGELOG.md +3324 -0
- data/CONTRIBUTING.md +45 -0
- data/GOVERNANCE.md +55 -0
- data/GithubWorkflow.md +78 -0
- data/LICENSE +202 -0
- data/MAINTAINERS.md +19 -0
- data/README.md +73 -0
- data/Rakefile +89 -0
- data/SECURITY.md +47 -0
- data/bin/fluent-binlog-reader +7 -0
- data/bin/fluent-ca-generate +6 -0
- data/bin/fluent-cap-ctl +7 -0
- data/bin/fluent-cat +5 -0
- data/bin/fluent-ctl +7 -0
- data/bin/fluent-debug +5 -0
- data/bin/fluent-gem +9 -0
- data/bin/fluent-plugin-config-format +5 -0
- data/bin/fluent-plugin-generate +5 -0
- data/bin/fluentd +15 -0
- data/code-of-conduct.md +3 -0
- data/docs/SECURITY_AUDIT.pdf +0 -0
- data/example/copy_roundrobin.conf +39 -0
- data/example/counter.conf +18 -0
- data/example/filter_stdout.conf +22 -0
- data/example/in_forward.conf +14 -0
- data/example/in_forward_client.conf +37 -0
- data/example/in_forward_shared_key.conf +15 -0
- data/example/in_forward_tls.conf +14 -0
- data/example/in_forward_users.conf +24 -0
- data/example/in_forward_workers.conf +21 -0
- data/example/in_http.conf +16 -0
- data/example/in_out_forward.conf +17 -0
- data/example/in_sample_blocks.conf +17 -0
- data/example/in_sample_with_compression.conf +23 -0
- data/example/in_syslog.conf +15 -0
- data/example/in_tail.conf +14 -0
- data/example/in_tcp.conf +13 -0
- data/example/in_udp.conf +13 -0
- data/example/logevents.conf +25 -0
- data/example/multi_filters.conf +61 -0
- data/example/out_copy.conf +20 -0
- data/example/out_exec_filter.conf +42 -0
- data/example/out_file.conf +13 -0
- data/example/out_forward.conf +35 -0
- data/example/out_forward_buf_file.conf +23 -0
- data/example/out_forward_client.conf +109 -0
- data/example/out_forward_heartbeat_none.conf +16 -0
- data/example/out_forward_sd.conf +17 -0
- data/example/out_forward_shared_key.conf +36 -0
- data/example/out_forward_tls.conf +18 -0
- data/example/out_forward_users.conf +65 -0
- data/example/out_null.conf +36 -0
- data/example/sd.yaml +8 -0
- data/example/secondary_file.conf +42 -0
- data/example/suppress_config_dump.conf +7 -0
- data/example/v0_12_filter.conf +78 -0
- data/example/v1_literal_example.conf +36 -0
- data/example/worker_section.conf +36 -0
- data/fluent.conf +139 -0
- data/lib/fluent/agent.rb +168 -0
- data/lib/fluent/capability.rb +87 -0
- data/lib/fluent/clock.rb +66 -0
- data/lib/fluent/command/binlog_reader.rb +244 -0
- data/lib/fluent/command/bundler_injection.rb +45 -0
- data/lib/fluent/command/ca_generate.rb +184 -0
- data/lib/fluent/command/cap_ctl.rb +174 -0
- data/lib/fluent/command/cat.rb +365 -0
- data/lib/fluent/command/ctl.rb +180 -0
- data/lib/fluent/command/debug.rb +103 -0
- data/lib/fluent/command/fluentd.rb +385 -0
- data/lib/fluent/command/plugin_config_formatter.rb +308 -0
- data/lib/fluent/command/plugin_generator.rb +365 -0
- data/lib/fluent/compat/call_super_mixin.rb +76 -0
- data/lib/fluent/compat/detach_process_mixin.rb +33 -0
- data/lib/fluent/compat/exec_util.rb +144 -0
- data/lib/fluent/compat/file_util.rb +54 -0
- data/lib/fluent/compat/filter.rb +68 -0
- data/lib/fluent/compat/formatter.rb +117 -0
- data/lib/fluent/compat/formatter_utils.rb +85 -0
- data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
- data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
- data/lib/fluent/compat/input.rb +49 -0
- data/lib/fluent/compat/output.rb +721 -0
- data/lib/fluent/compat/output_chain.rb +60 -0
- data/lib/fluent/compat/parser.rb +310 -0
- data/lib/fluent/compat/parser_utils.rb +40 -0
- data/lib/fluent/compat/propagate_default.rb +62 -0
- data/lib/fluent/compat/record_filter_mixin.rb +34 -0
- data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
- data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
- data/lib/fluent/compat/socket_util.rb +165 -0
- data/lib/fluent/compat/string_util.rb +34 -0
- data/lib/fluent/compat/structured_format_mixin.rb +26 -0
- data/lib/fluent/compat/type_converter.rb +90 -0
- data/lib/fluent/config/basic_parser.rb +122 -0
- data/lib/fluent/config/configure_proxy.rb +424 -0
- data/lib/fluent/config/dsl.rb +152 -0
- data/lib/fluent/config/element.rb +265 -0
- data/lib/fluent/config/error.rb +44 -0
- data/lib/fluent/config/literal_parser.rb +305 -0
- data/lib/fluent/config/parser.rb +119 -0
- data/lib/fluent/config/section.rb +272 -0
- data/lib/fluent/config/types.rb +257 -0
- data/lib/fluent/config/v1_parser.rb +200 -0
- data/lib/fluent/config/yaml_parser/fluent_value.rb +47 -0
- data/lib/fluent/config/yaml_parser/loader.rb +124 -0
- data/lib/fluent/config/yaml_parser/parser.rb +179 -0
- data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
- data/lib/fluent/config/yaml_parser.rb +56 -0
- data/lib/fluent/config.rb +89 -0
- data/lib/fluent/configurable.rb +202 -0
- data/lib/fluent/counter/base_socket.rb +44 -0
- data/lib/fluent/counter/client.rb +297 -0
- data/lib/fluent/counter/error.rb +86 -0
- data/lib/fluent/counter/mutex_hash.rb +163 -0
- data/lib/fluent/counter/server.rb +273 -0
- data/lib/fluent/counter/store.rb +205 -0
- data/lib/fluent/counter/validator.rb +145 -0
- data/lib/fluent/counter.rb +23 -0
- data/lib/fluent/daemon.rb +14 -0
- data/lib/fluent/daemonizer.rb +88 -0
- data/lib/fluent/engine.rb +269 -0
- data/lib/fluent/env.rb +45 -0
- data/lib/fluent/error.rb +37 -0
- data/lib/fluent/event.rb +369 -0
- data/lib/fluent/event_router.rb +315 -0
- data/lib/fluent/ext_monitor_require.rb +28 -0
- data/lib/fluent/file_wrapper.rb +137 -0
- data/lib/fluent/filter.rb +21 -0
- data/lib/fluent/fluent_log_event_router.rb +139 -0
- data/lib/fluent/formatter.rb +23 -0
- data/lib/fluent/input.rb +21 -0
- data/lib/fluent/label.rb +46 -0
- data/lib/fluent/load.rb +33 -0
- data/lib/fluent/log/console_adapter.rb +66 -0
- data/lib/fluent/log.rb +775 -0
- data/lib/fluent/match.rb +187 -0
- data/lib/fluent/mixin.rb +31 -0
- data/lib/fluent/msgpack_factory.rb +111 -0
- data/lib/fluent/oj_options.rb +61 -0
- data/lib/fluent/output.rb +29 -0
- data/lib/fluent/output_chain.rb +23 -0
- data/lib/fluent/parser.rb +23 -0
- data/lib/fluent/plugin/bare_output.rb +88 -0
- data/lib/fluent/plugin/base.rb +219 -0
- data/lib/fluent/plugin/buf_file.rb +256 -0
- data/lib/fluent/plugin/buf_file_single.rb +272 -0
- data/lib/fluent/plugin/buf_memory.rb +34 -0
- data/lib/fluent/plugin/buffer/chunk.rb +313 -0
- data/lib/fluent/plugin/buffer/file_chunk.rb +432 -0
- data/lib/fluent/plugin/buffer/file_single_chunk.rb +325 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
- data/lib/fluent/plugin/buffer.rb +1063 -0
- data/lib/fluent/plugin/compressable.rb +87 -0
- data/lib/fluent/plugin/exec_util.rb +22 -0
- data/lib/fluent/plugin/extractor.rb +132 -0
- data/lib/fluent/plugin/file_util.rb +22 -0
- data/lib/fluent/plugin/filter.rb +119 -0
- data/lib/fluent/plugin/filter_grep.rb +189 -0
- data/lib/fluent/plugin/filter_parser.rb +124 -0
- data/lib/fluent/plugin/filter_record_transformer.rb +325 -0
- data/lib/fluent/plugin/filter_stdout.rb +53 -0
- data/lib/fluent/plugin/formatter.rb +75 -0
- data/lib/fluent/plugin/formatter_csv.rb +92 -0
- data/lib/fluent/plugin/formatter_hash.rb +35 -0
- data/lib/fluent/plugin/formatter_json.rb +62 -0
- data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
- data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
- data/lib/fluent/plugin/formatter_out_file.rb +55 -0
- data/lib/fluent/plugin/formatter_single_value.rb +36 -0
- data/lib/fluent/plugin/formatter_stdout.rb +76 -0
- data/lib/fluent/plugin/formatter_tsv.rb +40 -0
- data/lib/fluent/plugin/in_debug_agent.rb +71 -0
- data/lib/fluent/plugin/in_dummy.rb +18 -0
- data/lib/fluent/plugin/in_exec.rb +124 -0
- data/lib/fluent/plugin/in_forward.rb +489 -0
- data/lib/fluent/plugin/in_gc_stat.rb +72 -0
- data/lib/fluent/plugin/in_http.rb +737 -0
- data/lib/fluent/plugin/in_monitor_agent.rb +406 -0
- data/lib/fluent/plugin/in_object_space.rb +93 -0
- data/lib/fluent/plugin/in_sample.rb +148 -0
- data/lib/fluent/plugin/in_syslog.rb +346 -0
- data/lib/fluent/plugin/in_tail/compatibility.rb +111 -0
- data/lib/fluent/plugin/in_tail/dir_watcher.rb +713 -0
- data/lib/fluent/plugin/in_tail/group_watch.rb +204 -0
- data/lib/fluent/plugin/in_tail/io_handler.rb +391 -0
- data/lib/fluent/plugin/in_tail/line_feeder.rb +230 -0
- data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
- data/lib/fluent/plugin/in_tail/stat_watcher.rb +52 -0
- data/lib/fluent/plugin/in_tail/tail_watcher.rb +276 -0
- data/lib/fluent/plugin/in_tail/worker_pool.rb +298 -0
- data/lib/fluent/plugin/in_tail.rb +917 -0
- data/lib/fluent/plugin/in_tcp.rb +230 -0
- data/lib/fluent/plugin/in_udp.rb +101 -0
- data/lib/fluent/plugin/in_unix.rb +197 -0
- data/lib/fluent/plugin/input.rb +71 -0
- data/lib/fluent/plugin/metrics.rb +119 -0
- data/lib/fluent/plugin/metrics_local.rb +96 -0
- data/lib/fluent/plugin/multi_output.rb +179 -0
- data/lib/fluent/plugin/out_buffer.rb +40 -0
- data/lib/fluent/plugin/out_copy.rb +120 -0
- data/lib/fluent/plugin/out_exec.rb +105 -0
- data/lib/fluent/plugin/out_exec_filter.rb +319 -0
- data/lib/fluent/plugin/out_file.rb +371 -0
- data/lib/fluent/plugin/out_forward/ack_handler.rb +176 -0
- data/lib/fluent/plugin/out_forward/connection_manager.rb +131 -0
- data/lib/fluent/plugin/out_forward/error.rb +28 -0
- data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
- data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
- data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
- data/lib/fluent/plugin/out_forward/socket_cache.rb +177 -0
- data/lib/fluent/plugin/out_forward.rb +865 -0
- data/lib/fluent/plugin/out_http.rb +419 -0
- data/lib/fluent/plugin/out_null.rb +74 -0
- data/lib/fluent/plugin/out_relabel.rb +32 -0
- data/lib/fluent/plugin/out_roundrobin.rb +84 -0
- data/lib/fluent/plugin/out_secondary_file.rb +148 -0
- data/lib/fluent/plugin/out_stdout.rb +81 -0
- data/lib/fluent/plugin/out_stream.rb +130 -0
- data/lib/fluent/plugin/output.rb +1688 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +41 -0
- data/lib/fluent/plugin/parser.rb +274 -0
- data/lib/fluent/plugin/parser_apache.rb +28 -0
- data/lib/fluent/plugin/parser_apache2.rb +88 -0
- data/lib/fluent/plugin/parser_apache_error.rb +26 -0
- data/lib/fluent/plugin/parser_csv.rb +124 -0
- data/lib/fluent/plugin/parser_json.rb +118 -0
- data/lib/fluent/plugin/parser_ltsv.rb +49 -0
- data/lib/fluent/plugin/parser_msgpack.rb +72 -0
- data/lib/fluent/plugin/parser_multiline.rb +152 -0
- data/lib/fluent/plugin/parser_nginx.rb +28 -0
- data/lib/fluent/plugin/parser_none.rb +36 -0
- data/lib/fluent/plugin/parser_regexp.rb +68 -0
- data/lib/fluent/plugin/parser_syslog.rb +543 -0
- data/lib/fluent/plugin/parser_tsv.rb +47 -0
- data/lib/fluent/plugin/sd_file.rb +157 -0
- data/lib/fluent/plugin/sd_srv.rb +135 -0
- data/lib/fluent/plugin/sd_static.rb +58 -0
- data/lib/fluent/plugin/service_discovery.rb +65 -0
- data/lib/fluent/plugin/socket_util.rb +22 -0
- data/lib/fluent/plugin/storage.rb +84 -0
- data/lib/fluent/plugin/storage_local.rb +166 -0
- data/lib/fluent/plugin/string_util.rb +22 -0
- data/lib/fluent/plugin.rb +206 -0
- data/lib/fluent/plugin_helper/cert_option.rb +199 -0
- data/lib/fluent/plugin_helper/child_process.rb +369 -0
- data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
- data/lib/fluent/plugin_helper/counter.rb +51 -0
- data/lib/fluent/plugin_helper/event_emitter.rb +112 -0
- data/lib/fluent/plugin_helper/event_loop.rb +170 -0
- data/lib/fluent/plugin_helper/extract.rb +104 -0
- data/lib/fluent/plugin_helper/formatter.rb +147 -0
- data/lib/fluent/plugin_helper/http_server/app.rb +81 -0
- data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
- data/lib/fluent/plugin_helper/http_server/request.rb +53 -0
- data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
- data/lib/fluent/plugin_helper/http_server/server.rb +116 -0
- data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
- data/lib/fluent/plugin_helper/http_server.rb +129 -0
- data/lib/fluent/plugin_helper/inject.rb +154 -0
- data/lib/fluent/plugin_helper/metrics.rb +136 -0
- data/lib/fluent/plugin_helper/parser.rb +147 -0
- data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
- data/lib/fluent/plugin_helper/retry_state.rb +219 -0
- data/lib/fluent/plugin_helper/server.rb +840 -0
- data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
- data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
- data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
- data/lib/fluent/plugin_helper/socket.rb +288 -0
- data/lib/fluent/plugin_helper/socket_option.rb +98 -0
- data/lib/fluent/plugin_helper/storage.rb +349 -0
- data/lib/fluent/plugin_helper/thread.rb +180 -0
- data/lib/fluent/plugin_helper/timer.rb +92 -0
- data/lib/fluent/plugin_helper.rb +75 -0
- data/lib/fluent/plugin_id.rb +93 -0
- data/lib/fluent/process.rb +22 -0
- data/lib/fluent/registry.rb +117 -0
- data/lib/fluent/root_agent.rb +468 -0
- data/lib/fluent/rpc.rb +95 -0
- data/lib/fluent/source_only_buffer_agent.rb +102 -0
- data/lib/fluent/static_config_analysis.rb +195 -0
- data/lib/fluent/supervisor.rb +1347 -0
- data/lib/fluent/system_config.rb +213 -0
- data/lib/fluent/test/base.rb +83 -0
- data/lib/fluent/test/driver/base.rb +231 -0
- data/lib/fluent/test/driver/base_owned.rb +83 -0
- data/lib/fluent/test/driver/base_owner.rb +135 -0
- data/lib/fluent/test/driver/event_feeder.rb +98 -0
- data/lib/fluent/test/driver/filter.rb +61 -0
- data/lib/fluent/test/driver/formatter.rb +30 -0
- data/lib/fluent/test/driver/input.rb +31 -0
- data/lib/fluent/test/driver/multi_output.rb +53 -0
- data/lib/fluent/test/driver/output.rb +102 -0
- data/lib/fluent/test/driver/parser.rb +30 -0
- data/lib/fluent/test/driver/storage.rb +30 -0
- data/lib/fluent/test/driver/test_event_router.rb +45 -0
- data/lib/fluent/test/filter_test.rb +77 -0
- data/lib/fluent/test/formatter_test.rb +65 -0
- data/lib/fluent/test/helpers.rb +138 -0
- data/lib/fluent/test/input_test.rb +174 -0
- data/lib/fluent/test/log.rb +79 -0
- data/lib/fluent/test/output_test.rb +156 -0
- data/lib/fluent/test/parser_test.rb +70 -0
- data/lib/fluent/test/startup_shutdown.rb +44 -0
- data/lib/fluent/test.rb +61 -0
- data/lib/fluent/time.rb +513 -0
- data/lib/fluent/timezone.rb +171 -0
- data/lib/fluent/tls.rb +105 -0
- data/lib/fluent/unique_id.rb +39 -0
- data/lib/fluent/variable_store.rb +40 -0
- data/lib/fluent/version.rb +21 -0
- data/lib/fluent/win32api.rb +38 -0
- data/lib/fluent/winsvc.rb +130 -0
- data/templates/new_gem/.gitignore +8 -0
- data/templates/new_gem/Gemfile +3 -0
- data/templates/new_gem/README.md.erb +43 -0
- data/templates/new_gem/Rakefile +13 -0
- data/templates/new_gem/fluent-plugin.gemspec.erb +28 -0
- data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
- data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
- data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
- data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
- data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
- data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
- data/templates/new_gem/test/helper.rb.erb +7 -0
- data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
- data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
- data/templates/plugin_config_formatter/param.md-table.erb +10 -0
- data/templates/plugin_config_formatter/param.md.erb +34 -0
- data/templates/plugin_config_formatter/section.md.erb +12 -0
- 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
|