fluentd 1.14.4-x64-mingw-ucrt
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of fluentd might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/.deepsource.toml +13 -0
- data/.drone.yml +35 -0
- data/.github/ISSUE_TEMPLATE/bug_report.yaml +70 -0
- data/.github/ISSUE_TEMPLATE/config.yml +5 -0
- data/.github/ISSUE_TEMPLATE/feature_request.yaml +38 -0
- data/.github/ISSUE_TEMPLATE.md +17 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- data/.github/workflows/issue-auto-closer.yml +12 -0
- data/.github/workflows/linux-test.yaml +36 -0
- data/.github/workflows/macos-test.yaml +30 -0
- data/.github/workflows/stale-actions.yml +22 -0
- data/.github/workflows/windows-test.yaml +46 -0
- data/.gitignore +30 -0
- data/.gitlab-ci.yml +103 -0
- data/ADOPTERS.md +5 -0
- data/AUTHORS +2 -0
- data/CHANGELOG.md +2409 -0
- data/CONTRIBUTING.md +45 -0
- data/GOVERNANCE.md +55 -0
- data/Gemfile +9 -0
- data/GithubWorkflow.md +78 -0
- data/LICENSE +202 -0
- data/MAINTAINERS.md +11 -0
- data/README.md +97 -0
- data/Rakefile +79 -0
- data/SECURITY.md +18 -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/fluentd.gemspec +55 -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 +177 -0
- data/lib/fluent/command/debug.rb +103 -0
- data/lib/fluent/command/fluentd.rb +374 -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 +129 -0
- data/lib/fluent/compat/file_util.rb +54 -0
- data/lib/fluent/compat/filter.rb +68 -0
- data/lib/fluent/compat/formatter.rb +111 -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 +123 -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 +32 -0
- data/lib/fluent/config/literal_parser.rb +286 -0
- data/lib/fluent/config/parser.rb +107 -0
- data/lib/fluent/config/section.rb +272 -0
- data/lib/fluent/config/types.rb +249 -0
- data/lib/fluent/config/v1_parser.rb +192 -0
- data/lib/fluent/config.rb +76 -0
- data/lib/fluent/configurable.rb +201 -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 +15 -0
- data/lib/fluent/daemonizer.rb +88 -0
- data/lib/fluent/engine.rb +253 -0
- data/lib/fluent/env.rb +40 -0
- data/lib/fluent/error.rb +34 -0
- data/lib/fluent/event.rb +326 -0
- data/lib/fluent/event_router.rb +297 -0
- data/lib/fluent/ext_monitor_require.rb +28 -0
- data/lib/fluent/filter.rb +21 -0
- data/lib/fluent/fluent_log_event_router.rb +141 -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 +34 -0
- data/lib/fluent/log.rb +713 -0
- data/lib/fluent/match.rb +187 -0
- data/lib/fluent/mixin.rb +31 -0
- data/lib/fluent/msgpack_factory.rb +106 -0
- data/lib/fluent/oj_options.rb +62 -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 +104 -0
- data/lib/fluent/plugin/base.rb +197 -0
- data/lib/fluent/plugin/buf_file.rb +213 -0
- data/lib/fluent/plugin/buf_file_single.rb +225 -0
- data/lib/fluent/plugin/buf_memory.rb +34 -0
- data/lib/fluent/plugin/buffer/chunk.rb +240 -0
- data/lib/fluent/plugin/buffer/file_chunk.rb +413 -0
- data/lib/fluent/plugin/buffer/file_single_chunk.rb +311 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
- data/lib/fluent/plugin/buffer.rb +918 -0
- data/lib/fluent/plugin/compressable.rb +96 -0
- data/lib/fluent/plugin/exec_util.rb +22 -0
- data/lib/fluent/plugin/file_util.rb +22 -0
- data/lib/fluent/plugin/file_wrapper.rb +187 -0
- data/lib/fluent/plugin/filter.rb +127 -0
- data/lib/fluent/plugin/filter_grep.rb +189 -0
- data/lib/fluent/plugin/filter_parser.rb +130 -0
- data/lib/fluent/plugin/filter_record_transformer.rb +324 -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 +78 -0
- data/lib/fluent/plugin/formatter_hash.rb +35 -0
- data/lib/fluent/plugin/formatter_json.rb +59 -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 +53 -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 +110 -0
- data/lib/fluent/plugin/in_forward.rb +473 -0
- data/lib/fluent/plugin/in_gc_stat.rb +72 -0
- data/lib/fluent/plugin/in_http.rb +667 -0
- data/lib/fluent/plugin/in_monitor_agent.rb +412 -0
- data/lib/fluent/plugin/in_object_space.rb +93 -0
- data/lib/fluent/plugin/in_sample.rb +141 -0
- data/lib/fluent/plugin/in_syslog.rb +276 -0
- data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
- data/lib/fluent/plugin/in_tail.rb +1228 -0
- data/lib/fluent/plugin/in_tcp.rb +181 -0
- data/lib/fluent/plugin/in_udp.rb +92 -0
- data/lib/fluent/plugin/in_unix.rb +195 -0
- data/lib/fluent/plugin/input.rb +75 -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 +195 -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 +334 -0
- data/lib/fluent/plugin/out_forward/ack_handler.rb +161 -0
- data/lib/fluent/plugin/out_forward/connection_manager.rb +113 -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 +140 -0
- data/lib/fluent/plugin/out_forward.rb +826 -0
- data/lib/fluent/plugin/out_http.rb +275 -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 +131 -0
- data/lib/fluent/plugin/out_stdout.rb +74 -0
- data/lib/fluent/plugin/out_stream.rb +130 -0
- data/lib/fluent/plugin/output.rb +1556 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
- data/lib/fluent/plugin/parser.rb +275 -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 +114 -0
- data/lib/fluent/plugin/parser_json.rb +96 -0
- data/lib/fluent/plugin/parser_ltsv.rb +51 -0
- data/lib/fluent/plugin/parser_msgpack.rb +50 -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 +496 -0
- data/lib/fluent/plugin/parser_tsv.rb +42 -0
- data/lib/fluent/plugin/sd_file.rb +156 -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 +162 -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 +191 -0
- data/lib/fluent/plugin_helper/child_process.rb +366 -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 +100 -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 +79 -0
- data/lib/fluent/plugin_helper/http_server/compat/server.rb +92 -0
- data/lib/fluent/plugin_helper/http_server/compat/ssl_context_extractor.rb +52 -0
- data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
- data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
- data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
- data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
- data/lib/fluent/plugin_helper/http_server/server.rb +93 -0
- data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
- data/lib/fluent/plugin_helper/http_server.rb +135 -0
- data/lib/fluent/plugin_helper/inject.rb +154 -0
- data/lib/fluent/plugin_helper/metrics.rb +129 -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 +209 -0
- data/lib/fluent/plugin_helper/server.rb +801 -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 +277 -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 +116 -0
- data/lib/fluent/root_agent.rb +372 -0
- data/lib/fluent/rpc.rb +94 -0
- data/lib/fluent/static_config_analysis.rb +194 -0
- data/lib/fluent/supervisor.rb +1054 -0
- data/lib/fluent/system_config.rb +187 -0
- data/lib/fluent/test/base.rb +78 -0
- data/lib/fluent/test/driver/base.rb +225 -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 +57 -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 +134 -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 +46 -0
- data/lib/fluent/test.rb +58 -0
- data/lib/fluent/time.rb +512 -0
- data/lib/fluent/timezone.rb +171 -0
- data/lib/fluent/tls.rb +81 -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/winsvc.rb +103 -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 +27 -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 +8 -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
- data/test/command/test_binlog_reader.rb +362 -0
- data/test/command/test_ca_generate.rb +70 -0
- data/test/command/test_cap_ctl.rb +100 -0
- data/test/command/test_cat.rb +128 -0
- data/test/command/test_ctl.rb +57 -0
- data/test/command/test_fluentd.rb +1106 -0
- data/test/command/test_plugin_config_formatter.rb +398 -0
- data/test/command/test_plugin_generator.rb +109 -0
- data/test/compat/test_calls_super.rb +166 -0
- data/test/compat/test_parser.rb +92 -0
- data/test/config/assertions.rb +42 -0
- data/test/config/test_config_parser.rb +551 -0
- data/test/config/test_configurable.rb +1784 -0
- data/test/config/test_configure_proxy.rb +604 -0
- data/test/config/test_dsl.rb +415 -0
- data/test/config/test_element.rb +518 -0
- data/test/config/test_literal_parser.rb +309 -0
- data/test/config/test_plugin_configuration.rb +56 -0
- data/test/config/test_section.rb +191 -0
- data/test/config/test_system_config.rb +199 -0
- data/test/config/test_types.rb +408 -0
- data/test/counter/test_client.rb +563 -0
- data/test/counter/test_error.rb +44 -0
- data/test/counter/test_mutex_hash.rb +179 -0
- data/test/counter/test_server.rb +589 -0
- data/test/counter/test_store.rb +258 -0
- data/test/counter/test_validator.rb +137 -0
- data/test/helper.rb +155 -0
- data/test/helpers/fuzzy_assert.rb +89 -0
- data/test/helpers/process_extenstion.rb +33 -0
- data/test/plugin/data/2010/01/20100102-030405.log +0 -0
- data/test/plugin/data/2010/01/20100102-030406.log +0 -0
- data/test/plugin/data/2010/01/20100102.log +0 -0
- data/test/plugin/data/log/bar +0 -0
- data/test/plugin/data/log/foo/bar.log +0 -0
- data/test/plugin/data/log/foo/bar2 +0 -0
- data/test/plugin/data/log/test.log +0 -0
- data/test/plugin/data/sd_file/config +11 -0
- data/test/plugin/data/sd_file/config.json +17 -0
- data/test/plugin/data/sd_file/config.yaml +11 -0
- data/test/plugin/data/sd_file/config.yml +11 -0
- data/test/plugin/data/sd_file/invalid_config.yml +7 -0
- data/test/plugin/in_tail/test_fifo.rb +121 -0
- data/test/plugin/in_tail/test_io_handler.rb +140 -0
- data/test/plugin/in_tail/test_position_file.rb +379 -0
- data/test/plugin/out_forward/test_ack_handler.rb +101 -0
- data/test/plugin/out_forward/test_connection_manager.rb +145 -0
- data/test/plugin/out_forward/test_handshake_protocol.rb +112 -0
- data/test/plugin/out_forward/test_load_balancer.rb +106 -0
- data/test/plugin/out_forward/test_socket_cache.rb +149 -0
- data/test/plugin/test_bare_output.rb +131 -0
- data/test/plugin/test_base.rb +115 -0
- data/test/plugin/test_buf_file.rb +1275 -0
- data/test/plugin/test_buf_file_single.rb +833 -0
- data/test/plugin/test_buf_memory.rb +42 -0
- data/test/plugin/test_buffer.rb +1383 -0
- data/test/plugin/test_buffer_chunk.rb +198 -0
- data/test/plugin/test_buffer_file_chunk.rb +871 -0
- data/test/plugin/test_buffer_file_single_chunk.rb +611 -0
- data/test/plugin/test_buffer_memory_chunk.rb +339 -0
- data/test/plugin/test_compressable.rb +87 -0
- data/test/plugin/test_file_util.rb +96 -0
- data/test/plugin/test_file_wrapper.rb +126 -0
- data/test/plugin/test_filter.rb +368 -0
- data/test/plugin/test_filter_grep.rb +697 -0
- data/test/plugin/test_filter_parser.rb +731 -0
- data/test/plugin/test_filter_record_transformer.rb +577 -0
- data/test/plugin/test_filter_stdout.rb +207 -0
- data/test/plugin/test_formatter_csv.rb +136 -0
- data/test/plugin/test_formatter_hash.rb +38 -0
- data/test/plugin/test_formatter_json.rb +61 -0
- data/test/plugin/test_formatter_ltsv.rb +70 -0
- data/test/plugin/test_formatter_msgpack.rb +28 -0
- data/test/plugin/test_formatter_out_file.rb +116 -0
- data/test/plugin/test_formatter_single_value.rb +44 -0
- data/test/plugin/test_formatter_tsv.rb +76 -0
- data/test/plugin/test_in_debug_agent.rb +49 -0
- data/test/plugin/test_in_exec.rb +261 -0
- data/test/plugin/test_in_forward.rb +1180 -0
- data/test/plugin/test_in_gc_stat.rb +62 -0
- data/test/plugin/test_in_http.rb +1080 -0
- data/test/plugin/test_in_monitor_agent.rb +923 -0
- data/test/plugin/test_in_object_space.rb +60 -0
- data/test/plugin/test_in_sample.rb +190 -0
- data/test/plugin/test_in_syslog.rb +505 -0
- data/test/plugin/test_in_tail.rb +2363 -0
- data/test/plugin/test_in_tcp.rb +243 -0
- data/test/plugin/test_in_udp.rb +268 -0
- data/test/plugin/test_in_unix.rb +181 -0
- data/test/plugin/test_input.rb +137 -0
- data/test/plugin/test_metadata.rb +89 -0
- data/test/plugin/test_metrics.rb +294 -0
- data/test/plugin/test_metrics_local.rb +96 -0
- data/test/plugin/test_multi_output.rb +204 -0
- data/test/plugin/test_out_copy.rb +308 -0
- data/test/plugin/test_out_exec.rb +312 -0
- data/test/plugin/test_out_exec_filter.rb +606 -0
- data/test/plugin/test_out_file.rb +1037 -0
- data/test/plugin/test_out_forward.rb +1348 -0
- data/test/plugin/test_out_http.rb +428 -0
- data/test/plugin/test_out_null.rb +105 -0
- data/test/plugin/test_out_relabel.rb +28 -0
- data/test/plugin/test_out_roundrobin.rb +146 -0
- data/test/plugin/test_out_secondary_file.rb +458 -0
- data/test/plugin/test_out_stdout.rb +205 -0
- data/test/plugin/test_out_stream.rb +103 -0
- data/test/plugin/test_output.rb +1065 -0
- data/test/plugin/test_output_as_buffered.rb +2024 -0
- data/test/plugin/test_output_as_buffered_backup.rb +363 -0
- data/test/plugin/test_output_as_buffered_compress.rb +165 -0
- data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
- data/test/plugin/test_output_as_buffered_retries.rb +919 -0
- data/test/plugin/test_output_as_buffered_secondary.rb +882 -0
- data/test/plugin/test_output_as_standard.rb +374 -0
- data/test/plugin/test_owned_by.rb +35 -0
- data/test/plugin/test_parser.rb +399 -0
- data/test/plugin/test_parser_apache.rb +42 -0
- data/test/plugin/test_parser_apache2.rb +47 -0
- data/test/plugin/test_parser_apache_error.rb +45 -0
- data/test/plugin/test_parser_csv.rb +200 -0
- data/test/plugin/test_parser_json.rb +138 -0
- data/test/plugin/test_parser_labeled_tsv.rb +160 -0
- data/test/plugin/test_parser_multiline.rb +111 -0
- data/test/plugin/test_parser_nginx.rb +88 -0
- data/test/plugin/test_parser_none.rb +52 -0
- data/test/plugin/test_parser_regexp.rb +289 -0
- data/test/plugin/test_parser_syslog.rb +650 -0
- data/test/plugin/test_parser_tsv.rb +122 -0
- data/test/plugin/test_sd_file.rb +228 -0
- data/test/plugin/test_sd_srv.rb +230 -0
- data/test/plugin/test_storage.rb +167 -0
- data/test/plugin/test_storage_local.rb +335 -0
- data/test/plugin/test_string_util.rb +26 -0
- data/test/plugin_helper/data/cert/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/cert-with-CRLF.pem +19 -0
- data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
- data/test/plugin_helper/data/cert/cert.pem +19 -0
- data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +20 -0
- data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/cert_chains/cert.pem +40 -0
- data/test/plugin_helper/data/cert/empty.pem +0 -0
- data/test/plugin_helper/data/cert/generate_cert.rb +125 -0
- data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +30 -0
- data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +20 -0
- data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +20 -0
- data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +30 -0
- data/test/plugin_helper/data/cert/with_ca/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +21 -0
- data/test/plugin_helper/data/cert/with_ca/cert.pem +21 -0
- data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +30 -0
- data/test/plugin_helper/data/cert/without_ca/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +20 -0
- data/test/plugin_helper/data/cert/without_ca/cert.pem +20 -0
- data/test/plugin_helper/http_server/test_app.rb +65 -0
- data/test/plugin_helper/http_server/test_route.rb +32 -0
- data/test/plugin_helper/service_discovery/test_manager.rb +93 -0
- data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +21 -0
- data/test/plugin_helper/test_cert_option.rb +25 -0
- data/test/plugin_helper/test_child_process.rb +840 -0
- data/test/plugin_helper/test_compat_parameters.rb +358 -0
- data/test/plugin_helper/test_event_emitter.rb +80 -0
- data/test/plugin_helper/test_event_loop.rb +52 -0
- data/test/plugin_helper/test_extract.rb +194 -0
- data/test/plugin_helper/test_formatter.rb +255 -0
- data/test/plugin_helper/test_http_server_helper.rb +372 -0
- data/test/plugin_helper/test_inject.rb +561 -0
- data/test/plugin_helper/test_metrics.rb +137 -0
- data/test/plugin_helper/test_parser.rb +264 -0
- data/test/plugin_helper/test_record_accessor.rb +238 -0
- data/test/plugin_helper/test_retry_state.rb +442 -0
- data/test/plugin_helper/test_server.rb +1823 -0
- data/test/plugin_helper/test_service_discovery.rb +165 -0
- data/test/plugin_helper/test_socket.rb +146 -0
- data/test/plugin_helper/test_storage.rb +542 -0
- data/test/plugin_helper/test_thread.rb +164 -0
- data/test/plugin_helper/test_timer.rb +130 -0
- data/test/scripts/exec_script.rb +32 -0
- data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
- data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
- data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
- data/test/scripts/fluent/plugin/out_test.rb +81 -0
- data/test/scripts/fluent/plugin/out_test2.rb +80 -0
- data/test/scripts/fluent/plugin/parser_known.rb +4 -0
- data/test/test_capability.rb +74 -0
- data/test/test_clock.rb +164 -0
- data/test/test_config.rb +202 -0
- data/test/test_configdsl.rb +148 -0
- data/test/test_daemonizer.rb +91 -0
- data/test/test_engine.rb +203 -0
- data/test/test_event.rb +531 -0
- data/test/test_event_router.rb +331 -0
- data/test/test_event_time.rb +199 -0
- data/test/test_filter.rb +121 -0
- data/test/test_fluent_log_event_router.rb +99 -0
- data/test/test_formatter.rb +366 -0
- data/test/test_input.rb +31 -0
- data/test/test_log.rb +994 -0
- data/test/test_logger_initializer.rb +46 -0
- data/test/test_match.rb +148 -0
- data/test/test_mixin.rb +351 -0
- data/test/test_msgpack_factory.rb +18 -0
- data/test/test_oj_options.rb +55 -0
- data/test/test_output.rb +278 -0
- data/test/test_plugin.rb +251 -0
- data/test/test_plugin_classes.rb +370 -0
- data/test/test_plugin_helper.rb +81 -0
- data/test/test_plugin_id.rb +119 -0
- data/test/test_process.rb +14 -0
- data/test/test_root_agent.rb +951 -0
- data/test/test_static_config_analysis.rb +177 -0
- data/test/test_supervisor.rb +601 -0
- data/test/test_test_drivers.rb +136 -0
- data/test/test_time_formatter.rb +301 -0
- data/test/test_time_parser.rb +362 -0
- data/test/test_tls.rb +65 -0
- data/test/test_unique_id.rb +47 -0
- data/test/test_variable_store.rb +65 -0
- metadata +1261 -0
@@ -0,0 +1,275 @@
|
|
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 'fluent/tls'
|
21
|
+
require 'fluent/plugin/output'
|
22
|
+
require 'fluent/plugin_helper/socket'
|
23
|
+
|
24
|
+
# patch Net::HTTP to support extra_chain_cert which was added in Ruby feature #9758.
|
25
|
+
# see: https://github.com/ruby/ruby/commit/31af0dafba6d3769d2a39617c0dddedb97883712
|
26
|
+
unless Net::HTTP::SSL_IVNAMES.include?(:@extra_chain_cert)
|
27
|
+
class Net::HTTP
|
28
|
+
SSL_IVNAMES << :@extra_chain_cert
|
29
|
+
SSL_ATTRIBUTES << :extra_chain_cert
|
30
|
+
attr_accessor :extra_chain_cert
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
module Fluent::Plugin
|
35
|
+
class HTTPOutput < Output
|
36
|
+
Fluent::Plugin.register_output('http', self)
|
37
|
+
|
38
|
+
class RetryableResponse < StandardError; end
|
39
|
+
|
40
|
+
helpers :formatter
|
41
|
+
|
42
|
+
desc 'The endpoint for HTTP request, e.g. http://example.com/api'
|
43
|
+
config_param :endpoint, :string
|
44
|
+
desc 'The method for HTTP request'
|
45
|
+
config_param :http_method, :enum, list: [:put, :post], default: :post
|
46
|
+
desc 'The proxy for HTTP request'
|
47
|
+
config_param :proxy, :string, default: ENV['HTTP_PROXY'] || ENV['http_proxy']
|
48
|
+
desc 'Content-Type for HTTP request'
|
49
|
+
config_param :content_type, :string, default: nil
|
50
|
+
desc 'JSON array data format for HTTP request body'
|
51
|
+
config_param :json_array, :bool, default: false
|
52
|
+
desc 'Additional headers for HTTP request'
|
53
|
+
config_param :headers, :hash, default: nil
|
54
|
+
desc 'Additional placeholder based headers for HTTP request'
|
55
|
+
config_param :headers_from_placeholders, :hash, default: nil
|
56
|
+
|
57
|
+
desc 'The connection open timeout in seconds'
|
58
|
+
config_param :open_timeout, :integer, default: nil
|
59
|
+
desc 'The read timeout in seconds'
|
60
|
+
config_param :read_timeout, :integer, default: nil
|
61
|
+
desc 'The TLS timeout in seconds'
|
62
|
+
config_param :ssl_timeout, :integer, default: nil
|
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], 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
|
+
end
|
96
|
+
|
97
|
+
def initialize
|
98
|
+
super
|
99
|
+
|
100
|
+
@uri = nil
|
101
|
+
@proxy_uri = nil
|
102
|
+
@formatter = nil
|
103
|
+
end
|
104
|
+
|
105
|
+
def configure(conf)
|
106
|
+
super
|
107
|
+
|
108
|
+
if @retryable_response_codes.nil?
|
109
|
+
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')
|
110
|
+
@retryable_response_codes = [503]
|
111
|
+
end
|
112
|
+
|
113
|
+
@http_opt = setup_http_option
|
114
|
+
@proxy_uri = URI.parse(@proxy) if @proxy
|
115
|
+
@formatter = formatter_create
|
116
|
+
@content_type = setup_content_type unless @content_type
|
117
|
+
|
118
|
+
if @json_array
|
119
|
+
if @formatter_configs.first[:@type] != "json"
|
120
|
+
raise Fluent::ConfigError, "json_array option could be used with json formatter only"
|
121
|
+
end
|
122
|
+
define_singleton_method(:format, method(:format_json_array))
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def multi_workers_ready?
|
127
|
+
true
|
128
|
+
end
|
129
|
+
|
130
|
+
def formatted_to_msgpack_binary?
|
131
|
+
@formatter_configs.first[:@type] == 'msgpack'
|
132
|
+
end
|
133
|
+
|
134
|
+
def format(tag, time, record)
|
135
|
+
@formatter.format(tag, time, record)
|
136
|
+
end
|
137
|
+
|
138
|
+
def format_json_array(tag, time, record)
|
139
|
+
@formatter.format(tag, time, record) << ","
|
140
|
+
end
|
141
|
+
|
142
|
+
def write(chunk)
|
143
|
+
uri = parse_endpoint(chunk)
|
144
|
+
req = create_request(chunk, uri)
|
145
|
+
|
146
|
+
log.debug { "#{@http_method.capitalize} data to #{uri.to_s} with chunk(#{dump_unique_id_hex(chunk.unique_id)})" }
|
147
|
+
|
148
|
+
send_request(uri, req)
|
149
|
+
end
|
150
|
+
|
151
|
+
private
|
152
|
+
|
153
|
+
def setup_content_type
|
154
|
+
case @formatter_configs.first[:@type]
|
155
|
+
when 'json'
|
156
|
+
@json_array ? 'application/json' : 'application/x-ndjson'
|
157
|
+
when 'csv'
|
158
|
+
'text/csv'
|
159
|
+
when 'tsv', 'ltsv'
|
160
|
+
'text/tab-separated-values'
|
161
|
+
when 'msgpack'
|
162
|
+
'application/x-msgpack'
|
163
|
+
when 'out_file', 'single_value', 'stdout', 'hash'
|
164
|
+
'text/plain'
|
165
|
+
else
|
166
|
+
raise Fluent::ConfigError, "can't determine Content-Type from formatter type. Set content_type parameter explicitly"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def setup_http_option
|
171
|
+
use_ssl = @endpoint.start_with?('https')
|
172
|
+
opt = {
|
173
|
+
open_timeout: @open_timeout,
|
174
|
+
read_timeout: @read_timeout,
|
175
|
+
ssl_timeout: @ssl_timeout,
|
176
|
+
use_ssl: use_ssl
|
177
|
+
}
|
178
|
+
|
179
|
+
if use_ssl
|
180
|
+
if @tls_ca_cert_path
|
181
|
+
raise Fluent::ConfigError, "tls_ca_cert_path is wrong: #{@tls_ca_cert_path}" unless File.file?(@tls_ca_cert_path)
|
182
|
+
opt[:ca_file] = @tls_ca_cert_path
|
183
|
+
end
|
184
|
+
if @tls_client_cert_path
|
185
|
+
raise Fluent::ConfigError, "tls_client_cert_path is wrong: #{@tls_client_cert_path}" unless File.file?(@tls_client_cert_path)
|
186
|
+
|
187
|
+
bundle = File.read(@tls_client_cert_path)
|
188
|
+
bundle_certs = bundle.scan(/-----BEGIN CERTIFICATE-----(?:.|\n)+?-----END CERTIFICATE-----/)
|
189
|
+
opt[:cert] = OpenSSL::X509::Certificate.new(bundle_certs[0])
|
190
|
+
|
191
|
+
intermediate_certs = bundle_certs[1..-1]
|
192
|
+
if intermediate_certs
|
193
|
+
opt[:extra_chain_cert] = intermediate_certs.map { |cert| OpenSSL::X509::Certificate.new(cert) }
|
194
|
+
end
|
195
|
+
end
|
196
|
+
if @tls_private_key_path
|
197
|
+
raise Fluent::ConfigError, "tls_private_key_path is wrong: #{@tls_private_key_path}" unless File.file?(@tls_private_key_path)
|
198
|
+
opt[:key] = OpenSSL::PKey.read(File.read(@tls_private_key_path), @tls_private_key_passphrase)
|
199
|
+
end
|
200
|
+
opt[:verify_mode] = case @tls_verify_mode
|
201
|
+
when :none
|
202
|
+
OpenSSL::SSL::VERIFY_NONE
|
203
|
+
when :peer
|
204
|
+
OpenSSL::SSL::VERIFY_PEER
|
205
|
+
end
|
206
|
+
opt[:ciphers] = @tls_ciphers
|
207
|
+
opt[:ssl_version] = @tls_version
|
208
|
+
end
|
209
|
+
|
210
|
+
opt
|
211
|
+
end
|
212
|
+
|
213
|
+
def parse_endpoint(chunk)
|
214
|
+
endpoint = extract_placeholders(@endpoint, chunk)
|
215
|
+
URI.parse(endpoint)
|
216
|
+
end
|
217
|
+
|
218
|
+
def set_headers(req, chunk)
|
219
|
+
if @headers
|
220
|
+
@headers.each do |k, v|
|
221
|
+
req[k] = v
|
222
|
+
end
|
223
|
+
end
|
224
|
+
if @headers_from_placeholders
|
225
|
+
@headers_from_placeholders.each do |k, v|
|
226
|
+
req[k] = extract_placeholders(v, chunk)
|
227
|
+
end
|
228
|
+
end
|
229
|
+
req['Content-Type'] = @content_type
|
230
|
+
end
|
231
|
+
|
232
|
+
def create_request(chunk, uri)
|
233
|
+
req = case @http_method
|
234
|
+
when :post
|
235
|
+
Net::HTTP::Post.new(uri.request_uri)
|
236
|
+
when :put
|
237
|
+
Net::HTTP::Put.new(uri.request_uri)
|
238
|
+
end
|
239
|
+
if @auth
|
240
|
+
req.basic_auth(@auth.username, @auth.password)
|
241
|
+
end
|
242
|
+
set_headers(req, chunk)
|
243
|
+
req.body = @json_array ? "[#{chunk.read.chop}]" : chunk.read
|
244
|
+
req
|
245
|
+
end
|
246
|
+
|
247
|
+
def send_request(uri, req)
|
248
|
+
res = if @proxy_uri
|
249
|
+
Net::HTTP.start(uri.host, uri.port, @proxy_uri.host, @proxy_uri.port, @proxy_uri.user, @proxy_uri.password, @http_opt) { |http|
|
250
|
+
http.request(req)
|
251
|
+
}
|
252
|
+
else
|
253
|
+
Net::HTTP.start(uri.host, uri.port, @http_opt) { |http|
|
254
|
+
http.request(req)
|
255
|
+
}
|
256
|
+
end
|
257
|
+
|
258
|
+
if res.is_a?(Net::HTTPSuccess)
|
259
|
+
log.debug { "#{res.code} #{res.message.rstrip}#{res.body.lstrip}" }
|
260
|
+
else
|
261
|
+
msg = "#{res.code} #{res.message.rstrip} #{res.body.lstrip}"
|
262
|
+
|
263
|
+
if @retryable_response_codes.include?(res.code.to_i)
|
264
|
+
raise RetryableResponse, msg
|
265
|
+
end
|
266
|
+
|
267
|
+
if @error_response_as_unrecoverable
|
268
|
+
raise Fluent::UnrecoverableError, msg
|
269
|
+
else
|
270
|
+
log.error "got error response from '#{@http_method.capitalize} #{uri.to_s}' : #{msg}"
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
274
|
+
end
|
275
|
+
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
|
@@ -0,0 +1,131 @@
|
|
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 "fileutils"
|
18
|
+
require "fluent/plugin/file_util"
|
19
|
+
require "fluent/plugin/output"
|
20
|
+
require "fluent/config/error"
|
21
|
+
|
22
|
+
module Fluent::Plugin
|
23
|
+
class SecondaryFileOutput < Output
|
24
|
+
Fluent::Plugin.register_output("secondary_file", self)
|
25
|
+
|
26
|
+
PLACEHOLDER_REGEX = /\${(tag(\[\d+\])?|[\w.@-]+)}/
|
27
|
+
|
28
|
+
desc "The directory path of the output file."
|
29
|
+
config_param :directory, :string
|
30
|
+
desc "The basename of the output file."
|
31
|
+
config_param :basename, :string, default: "dump.bin"
|
32
|
+
desc "The flushed chunk is appended to existence file or not."
|
33
|
+
config_param :append, :bool, default: false
|
34
|
+
config_param :compress, :enum, list: [:text, :gzip], default: :text
|
35
|
+
|
36
|
+
def configure(conf)
|
37
|
+
super
|
38
|
+
|
39
|
+
unless @as_secondary
|
40
|
+
raise Fluent::ConfigError, "This plugin can only be used in the <secondary> section"
|
41
|
+
end
|
42
|
+
|
43
|
+
if @basename.include?("/")
|
44
|
+
raise Fluent::ConfigError, "basename should not include `/`"
|
45
|
+
end
|
46
|
+
|
47
|
+
@path_without_suffix = File.join(@directory, @basename)
|
48
|
+
validate_compatible_with_primary_buffer!(@path_without_suffix)
|
49
|
+
|
50
|
+
@suffix = case @compress
|
51
|
+
when :text
|
52
|
+
""
|
53
|
+
when :gzip
|
54
|
+
".gz"
|
55
|
+
end
|
56
|
+
|
57
|
+
test_path = @path_without_suffix
|
58
|
+
unless Fluent::FileUtil.writable_p?(test_path)
|
59
|
+
raise Fluent::ConfigError, "out_secondary_file: `#{@directory}` should be writable"
|
60
|
+
end
|
61
|
+
|
62
|
+
@dir_perm = system_config.dir_permission || Fluent::DEFAULT_DIR_PERMISSION
|
63
|
+
@file_perm = system_config.file_permission || Fluent::DEFAULT_FILE_PERMISSION
|
64
|
+
end
|
65
|
+
|
66
|
+
def multi_workers_ready?
|
67
|
+
### TODO: add hack to synchronize for multi workers
|
68
|
+
true
|
69
|
+
end
|
70
|
+
|
71
|
+
def write(chunk)
|
72
|
+
path_without_suffix = extract_placeholders(@path_without_suffix, chunk)
|
73
|
+
path = generate_path(path_without_suffix)
|
74
|
+
FileUtils.mkdir_p File.dirname(path), mode: @dir_perm
|
75
|
+
|
76
|
+
case @compress
|
77
|
+
when :text
|
78
|
+
File.open(path, "ab", @file_perm) {|f|
|
79
|
+
f.flock(File::LOCK_EX)
|
80
|
+
chunk.write_to(f)
|
81
|
+
}
|
82
|
+
when :gzip
|
83
|
+
File.open(path, "ab", @file_perm) {|f|
|
84
|
+
f.flock(File::LOCK_EX)
|
85
|
+
gz = Zlib::GzipWriter.new(f)
|
86
|
+
chunk.write_to(gz)
|
87
|
+
gz.close
|
88
|
+
}
|
89
|
+
end
|
90
|
+
|
91
|
+
path
|
92
|
+
end
|
93
|
+
|
94
|
+
private
|
95
|
+
|
96
|
+
def validate_compatible_with_primary_buffer!(path_without_suffix)
|
97
|
+
placeholders = path_without_suffix.scan(PLACEHOLDER_REGEX).flat_map(&:first) # to trim suffix [\d+]
|
98
|
+
|
99
|
+
if !@chunk_key_time && has_time_format?(path_without_suffix)
|
100
|
+
raise Fluent::ConfigError, "out_secondary_file: basename or directory has an incompatible placeholder, remove time formats, like `%Y%m%d`, from basename or directory"
|
101
|
+
end
|
102
|
+
|
103
|
+
if !@chunk_key_tag && (ph = placeholders.find { |placeholder| placeholder.match(/tag(\[\d+\])?/) })
|
104
|
+
raise Fluent::ConfigError, "out_secondary_file: basename or directory has an incompatible placeholder #{ph}, remove tag placeholder, like `${tag}`, from basename or directory"
|
105
|
+
end
|
106
|
+
|
107
|
+
vars = placeholders.reject { |placeholder| placeholder.match(/tag(\[\d+\])?/) || (placeholder == 'chunk_id') }
|
108
|
+
|
109
|
+
if ph = vars.find { |v| !@chunk_keys.include?(v) }
|
110
|
+
raise Fluent::ConfigError, "out_secondary_file: basename or directory has an incompatible placeholder #{ph}, remove variable placeholder, like `${varname}`, from basename or directory"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def has_time_format?(str)
|
115
|
+
str != Time.now.strftime(str)
|
116
|
+
end
|
117
|
+
|
118
|
+
def generate_path(path_without_suffix)
|
119
|
+
if @append
|
120
|
+
"#{path_without_suffix}#{@suffix}"
|
121
|
+
else
|
122
|
+
i = 0
|
123
|
+
loop do
|
124
|
+
path = "#{path_without_suffix}.#{i}#{@suffix}"
|
125
|
+
return path unless File.exist?(path)
|
126
|
+
i += 1
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
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 StdoutOutput < Output
|
21
|
+
Fluent::Plugin.register_output('stdout', self)
|
22
|
+
|
23
|
+
helpers :inject, :formatter, :compat_parameters
|
24
|
+
|
25
|
+
DEFAULT_LINE_FORMAT_TYPE = 'stdout'
|
26
|
+
DEFAULT_FORMAT_TYPE = 'json'
|
27
|
+
|
28
|
+
config_section :buffer do
|
29
|
+
config_set_default :chunk_keys, ['tag']
|
30
|
+
config_set_default :flush_at_shutdown, true
|
31
|
+
config_set_default :chunk_limit_size, 10 * 1024
|
32
|
+
end
|
33
|
+
|
34
|
+
config_section :format do
|
35
|
+
config_set_default :@type, DEFAULT_LINE_FORMAT_TYPE
|
36
|
+
config_set_default :output_type, DEFAULT_FORMAT_TYPE
|
37
|
+
end
|
38
|
+
|
39
|
+
def prefer_buffered_processing
|
40
|
+
false
|
41
|
+
end
|
42
|
+
|
43
|
+
def multi_workers_ready?
|
44
|
+
true
|
45
|
+
end
|
46
|
+
|
47
|
+
attr_accessor :formatter
|
48
|
+
|
49
|
+
def configure(conf)
|
50
|
+
compat_parameters_convert(conf, :inject, :formatter)
|
51
|
+
|
52
|
+
super
|
53
|
+
|
54
|
+
@formatter = formatter_create
|
55
|
+
end
|
56
|
+
|
57
|
+
def process(tag, es)
|
58
|
+
es = inject_values_to_event_stream(tag, es)
|
59
|
+
es.each {|time,record|
|
60
|
+
$log.write(format(tag, time, record))
|
61
|
+
}
|
62
|
+
$log.flush
|
63
|
+
end
|
64
|
+
|
65
|
+
def format(tag, time, record)
|
66
|
+
record = inject_values_to_record(tag, time, record)
|
67
|
+
@formatter.format(tag, time, record).chomp + "\n"
|
68
|
+
end
|
69
|
+
|
70
|
+
def write(chunk)
|
71
|
+
chunk.write_to($log)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|