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,197 @@
|
|
1
|
+
#
|
2
|
+
# Fluentd
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
require 'fluent/plugin'
|
18
|
+
require 'fluent/configurable'
|
19
|
+
require 'fluent/system_config'
|
20
|
+
|
21
|
+
module Fluent
|
22
|
+
module Plugin
|
23
|
+
class Base
|
24
|
+
include Configurable
|
25
|
+
include SystemConfig::Mixin
|
26
|
+
|
27
|
+
State = Struct.new(:configure, :start, :after_start, :stop, :before_shutdown, :shutdown, :after_shutdown, :close, :terminate)
|
28
|
+
|
29
|
+
attr_accessor :under_plugin_development
|
30
|
+
|
31
|
+
def initialize
|
32
|
+
@log = nil
|
33
|
+
super
|
34
|
+
@_state = State.new(false, false, false, false, false, false, false, false, false)
|
35
|
+
@_context_router = nil
|
36
|
+
@_fluentd_worker_id = nil
|
37
|
+
@under_plugin_development = false
|
38
|
+
end
|
39
|
+
|
40
|
+
def has_router?
|
41
|
+
false
|
42
|
+
end
|
43
|
+
|
44
|
+
def plugin_root_dir
|
45
|
+
nil # override this in plugin_id.rb
|
46
|
+
end
|
47
|
+
|
48
|
+
def fluentd_worker_id
|
49
|
+
return @_fluentd_worker_id if @_fluentd_worker_id
|
50
|
+
@_fluentd_worker_id = (ENV['SERVERENGINE_WORKER_ID'] || 0).to_i
|
51
|
+
@_fluentd_worker_id
|
52
|
+
end
|
53
|
+
|
54
|
+
def configure(conf)
|
55
|
+
if Fluent::Engine.supervisor_mode || (conf.respond_to?(:for_this_worker?) && conf.for_this_worker?)
|
56
|
+
workers = if conf.target_worker_ids && !conf.target_worker_ids.empty?
|
57
|
+
conf.target_worker_ids.size
|
58
|
+
else
|
59
|
+
1
|
60
|
+
end
|
61
|
+
system_config_override(workers: workers)
|
62
|
+
end
|
63
|
+
super(conf, system_config.strict_config_value)
|
64
|
+
@_state ||= State.new(false, false, false, false, false, false, false, false, false)
|
65
|
+
@_state.configure = true
|
66
|
+
self
|
67
|
+
end
|
68
|
+
|
69
|
+
def multi_workers_ready?
|
70
|
+
true
|
71
|
+
end
|
72
|
+
|
73
|
+
def string_safe_encoding(str)
|
74
|
+
unless str.valid_encoding?
|
75
|
+
log.info "invalid byte sequence is replaced in `#{str}`" if self.respond_to?(:log)
|
76
|
+
str = str.scrub('?')
|
77
|
+
end
|
78
|
+
yield str
|
79
|
+
end
|
80
|
+
|
81
|
+
def context_router=(router)
|
82
|
+
@_context_router = router
|
83
|
+
end
|
84
|
+
|
85
|
+
def context_router
|
86
|
+
@_context_router
|
87
|
+
end
|
88
|
+
|
89
|
+
def start
|
90
|
+
# By initialization order, plugin logger is created before set log_event_enabled.
|
91
|
+
# It causes '@id' specified plugin, it uses plugin logger instead of global logger, ignores `<label @FLUENT_LOG>` setting.
|
92
|
+
# This is adhoc approach but impact is minimal.
|
93
|
+
if @log.is_a?(Fluent::PluginLogger) && $log.respond_to?(:log_event_enabled) # log_event_enabled check for tests
|
94
|
+
@log.log_event_enabled = $log.log_event_enabled
|
95
|
+
end
|
96
|
+
@_state.start = true
|
97
|
+
self
|
98
|
+
end
|
99
|
+
|
100
|
+
def after_start
|
101
|
+
@_state.after_start = true
|
102
|
+
self
|
103
|
+
end
|
104
|
+
|
105
|
+
def stop
|
106
|
+
@_state.stop = true
|
107
|
+
self
|
108
|
+
end
|
109
|
+
|
110
|
+
def before_shutdown
|
111
|
+
@_state.before_shutdown = true
|
112
|
+
self
|
113
|
+
end
|
114
|
+
|
115
|
+
def shutdown
|
116
|
+
@_state.shutdown = true
|
117
|
+
self
|
118
|
+
end
|
119
|
+
|
120
|
+
def after_shutdown
|
121
|
+
@_state.after_shutdown = true
|
122
|
+
self
|
123
|
+
end
|
124
|
+
|
125
|
+
def close
|
126
|
+
@_state.close = true
|
127
|
+
self
|
128
|
+
end
|
129
|
+
|
130
|
+
def terminate
|
131
|
+
@_state.terminate = true
|
132
|
+
self
|
133
|
+
end
|
134
|
+
|
135
|
+
def configured?
|
136
|
+
@_state.configure
|
137
|
+
end
|
138
|
+
|
139
|
+
def started?
|
140
|
+
@_state.start
|
141
|
+
end
|
142
|
+
|
143
|
+
def after_started?
|
144
|
+
@_state.after_start
|
145
|
+
end
|
146
|
+
|
147
|
+
def stopped?
|
148
|
+
@_state.stop
|
149
|
+
end
|
150
|
+
|
151
|
+
def before_shutdown?
|
152
|
+
@_state.before_shutdown
|
153
|
+
end
|
154
|
+
|
155
|
+
def shutdown?
|
156
|
+
@_state.shutdown
|
157
|
+
end
|
158
|
+
|
159
|
+
def after_shutdown?
|
160
|
+
@_state.after_shutdown
|
161
|
+
end
|
162
|
+
|
163
|
+
def closed?
|
164
|
+
@_state.close
|
165
|
+
end
|
166
|
+
|
167
|
+
def terminated?
|
168
|
+
@_state.terminate
|
169
|
+
end
|
170
|
+
|
171
|
+
def called_in_test?
|
172
|
+
caller_locations.each do |location|
|
173
|
+
# Thread::Backtrace::Location#path returns base filename or absolute path.
|
174
|
+
# #absolute_path returns absolute_path always.
|
175
|
+
# https://bugs.ruby-lang.org/issues/12159
|
176
|
+
if location.absolute_path =~ /\/test_[^\/]+\.rb$/ # location.path =~ /test_.+\.rb$/
|
177
|
+
return true
|
178
|
+
end
|
179
|
+
end
|
180
|
+
false
|
181
|
+
end
|
182
|
+
|
183
|
+
def inspect
|
184
|
+
# Plugin instances are sometimes too big to dump because it may have too many thins (buffer,storage, ...)
|
185
|
+
# Original commit comment says that:
|
186
|
+
# To emulate normal inspect behavior `ruby -e'o=Object.new;p o;p (o.__id__<<1).to_s(16)'`.
|
187
|
+
# https://github.com/ruby/ruby/blob/trunk/gc.c#L788
|
188
|
+
"#<%s:%014x>" % [self.class.name, '0x%014x' % (__id__ << 1)]
|
189
|
+
end
|
190
|
+
|
191
|
+
def reloadable_plugin?
|
192
|
+
# Engine can't capture all class variables. so it's forbbiden to use class variables in each plugins if enabling reload.
|
193
|
+
self.class.class_variables.empty?
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
@@ -0,0 +1,213 @@
|
|
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
|
+
|
19
|
+
require 'fluent/plugin/buffer'
|
20
|
+
require 'fluent/plugin/buffer/file_chunk'
|
21
|
+
require 'fluent/system_config'
|
22
|
+
require 'fluent/variable_store'
|
23
|
+
|
24
|
+
module Fluent
|
25
|
+
module Plugin
|
26
|
+
class FileBuffer < Fluent::Plugin::Buffer
|
27
|
+
Plugin.register_buffer('file', self)
|
28
|
+
|
29
|
+
include SystemConfig::Mixin
|
30
|
+
|
31
|
+
DEFAULT_CHUNK_LIMIT_SIZE = 256 * 1024 * 1024 # 256MB
|
32
|
+
DEFAULT_TOTAL_LIMIT_SIZE = 64 * 1024 * 1024 * 1024 # 64GB, same with v0.12 (TimeSlicedOutput + buf_file)
|
33
|
+
|
34
|
+
desc 'The path where buffer chunks are stored.'
|
35
|
+
config_param :path, :string, default: nil
|
36
|
+
desc 'The suffix of buffer chunks'
|
37
|
+
config_param :path_suffix, :string, default: '.log'
|
38
|
+
|
39
|
+
config_set_default :chunk_limit_size, DEFAULT_CHUNK_LIMIT_SIZE
|
40
|
+
config_set_default :total_limit_size, DEFAULT_TOTAL_LIMIT_SIZE
|
41
|
+
|
42
|
+
config_param :file_permission, :string, default: nil # '0644' (Fluent::DEFAULT_FILE_PERMISSION)
|
43
|
+
config_param :dir_permission, :string, default: nil # '0755' (Fluent::DEFAULT_DIR_PERMISSION)
|
44
|
+
|
45
|
+
def initialize
|
46
|
+
super
|
47
|
+
@symlink_path = nil
|
48
|
+
@multi_workers_available = false
|
49
|
+
@additional_resume_path = nil
|
50
|
+
@buffer_path = nil
|
51
|
+
@variable_store = nil
|
52
|
+
end
|
53
|
+
|
54
|
+
def configure(conf)
|
55
|
+
super
|
56
|
+
|
57
|
+
@variable_store = Fluent::VariableStore.fetch_or_build(:buf_file)
|
58
|
+
|
59
|
+
multi_workers_configured = owner.system_config.workers > 1 ? true : false
|
60
|
+
|
61
|
+
using_plugin_root_dir = false
|
62
|
+
unless @path
|
63
|
+
if root_dir = owner.plugin_root_dir
|
64
|
+
@path = File.join(root_dir, 'buffer')
|
65
|
+
using_plugin_root_dir = true # plugin_root_dir path contains worker id
|
66
|
+
else
|
67
|
+
raise Fluent::ConfigError, "buffer path is not configured. specify 'path' in <buffer>"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
type_of_owner = Plugin.lookup_type_from_class(@_owner.class)
|
72
|
+
if @variable_store.has_key?(@path) && !called_in_test?
|
73
|
+
type_using_this_path = @variable_store[@path]
|
74
|
+
raise ConfigError, "Other '#{type_using_this_path}' plugin already use same buffer path: type = #{type_of_owner}, buffer path = #{@path}"
|
75
|
+
end
|
76
|
+
|
77
|
+
@buffer_path = @path
|
78
|
+
@variable_store[@buffer_path] = type_of_owner
|
79
|
+
|
80
|
+
specified_directory_exists = File.exist?(@path) && File.directory?(@path)
|
81
|
+
unexisting_path_for_directory = !File.exist?(@path) && !@path.include?('.*')
|
82
|
+
|
83
|
+
if specified_directory_exists || unexisting_path_for_directory # directory
|
84
|
+
if using_plugin_root_dir || !multi_workers_configured
|
85
|
+
@path = File.join(@path, "buffer.*#{@path_suffix}")
|
86
|
+
else
|
87
|
+
@path = File.join(@path, "worker#{fluentd_worker_id}", "buffer.*#{@path_suffix}")
|
88
|
+
if fluentd_worker_id == 0
|
89
|
+
# worker 0 always checks unflushed buffer chunks to be resumed (might be created while non-multi-worker configuration)
|
90
|
+
@additional_resume_path = File.join(File.expand_path("../../", @path), "buffer.*#{@path_suffix}")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
@multi_workers_available = true
|
94
|
+
else # specified path is file path
|
95
|
+
if File.basename(@path).include?('.*.')
|
96
|
+
# valid file path
|
97
|
+
elsif File.basename(@path).end_with?('.*')
|
98
|
+
@path = @path + @path_suffix
|
99
|
+
else
|
100
|
+
# existing file will be ignored
|
101
|
+
@path = @path + ".*#{@path_suffix}"
|
102
|
+
end
|
103
|
+
@multi_workers_available = false
|
104
|
+
end
|
105
|
+
|
106
|
+
if @dir_permission
|
107
|
+
@dir_permission = @dir_permission.to_i(8) if @dir_permission.is_a?(String)
|
108
|
+
else
|
109
|
+
@dir_permission = system_config.dir_permission || Fluent::DEFAULT_DIR_PERMISSION
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# This method is called only when multi worker is configured
|
114
|
+
def multi_workers_ready?
|
115
|
+
unless @multi_workers_available
|
116
|
+
log.error "file buffer with multi workers should be configured to use directory 'path', or system root_dir and plugin id"
|
117
|
+
end
|
118
|
+
@multi_workers_available
|
119
|
+
end
|
120
|
+
|
121
|
+
def start
|
122
|
+
FileUtils.mkdir_p File.dirname(@path), mode: @dir_permission
|
123
|
+
|
124
|
+
super
|
125
|
+
end
|
126
|
+
|
127
|
+
def stop
|
128
|
+
if @variable_store
|
129
|
+
@variable_store.delete(@buffer_path)
|
130
|
+
end
|
131
|
+
|
132
|
+
super
|
133
|
+
end
|
134
|
+
|
135
|
+
def persistent?
|
136
|
+
true
|
137
|
+
end
|
138
|
+
|
139
|
+
def resume
|
140
|
+
stage = {}
|
141
|
+
queue = []
|
142
|
+
|
143
|
+
patterns = [@path]
|
144
|
+
patterns.unshift @additional_resume_path if @additional_resume_path
|
145
|
+
Dir.glob(escaped_patterns(patterns)) do |path|
|
146
|
+
next unless File.file?(path)
|
147
|
+
|
148
|
+
log.debug { "restoring buffer file: path = #{path}" }
|
149
|
+
|
150
|
+
m = new_metadata() # this metadata will be overwritten by resuming .meta file content
|
151
|
+
# so it should not added into @metadata_list for now
|
152
|
+
mode = Fluent::Plugin::Buffer::FileChunk.assume_chunk_state(path)
|
153
|
+
if mode == :unknown
|
154
|
+
log.debug "unknown state chunk found", path: path
|
155
|
+
next
|
156
|
+
end
|
157
|
+
|
158
|
+
begin
|
159
|
+
chunk = Fluent::Plugin::Buffer::FileChunk.new(m, path, mode, compress: @compress) # file chunk resumes contents of metadata
|
160
|
+
rescue Fluent::Plugin::Buffer::FileChunk::FileChunkError => e
|
161
|
+
handle_broken_files(path, mode, e)
|
162
|
+
next
|
163
|
+
end
|
164
|
+
|
165
|
+
case chunk.state
|
166
|
+
when :staged
|
167
|
+
# unstaged chunk created at Buffer#write_step_by_step is identified as the staged chunk here because FileChunk#assume_chunk_state checks only the file name.
|
168
|
+
# https://github.com/fluent/fluentd/blob/9d113029d4550ce576d8825bfa9612aa3e55bff0/lib/fluent/plugin/buffer.rb#L663
|
169
|
+
# This case can happen when fluentd process is killed by signal or other reasons between creating unstaged chunks and changing them to staged mode in Buffer#write
|
170
|
+
# these chunks(unstaged chunks) has shared the same metadata
|
171
|
+
# So perform enqueue step again https://github.com/fluent/fluentd/blob/9d113029d4550ce576d8825bfa9612aa3e55bff0/lib/fluent/plugin/buffer.rb#L364
|
172
|
+
if chunk_size_full?(chunk) || stage.key?(chunk.metadata)
|
173
|
+
chunk.metadata.seq = 0 # metadata.seq should be 0 for counting @queued_num
|
174
|
+
queue << chunk.enqueued!
|
175
|
+
else
|
176
|
+
stage[chunk.metadata] = chunk
|
177
|
+
end
|
178
|
+
when :queued
|
179
|
+
queue << chunk
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
queue.sort_by!{ |chunk| chunk.modified_at }
|
184
|
+
|
185
|
+
return stage, queue
|
186
|
+
end
|
187
|
+
|
188
|
+
def generate_chunk(metadata)
|
189
|
+
# FileChunk generates real path with unique_id
|
190
|
+
perm = @file_permission || system_config.file_permission
|
191
|
+
chunk = Fluent::Plugin::Buffer::FileChunk.new(metadata, @path, :create, perm: perm, compress: @compress)
|
192
|
+
log.debug "Created new chunk", chunk_id: dump_unique_id_hex(chunk.unique_id), metadata: metadata
|
193
|
+
|
194
|
+
return chunk
|
195
|
+
end
|
196
|
+
|
197
|
+
def handle_broken_files(path, mode, e)
|
198
|
+
log.error "found broken chunk file during resume. Deleted corresponding files:", :path => path, :mode => mode, :err_msg => e.message
|
199
|
+
# After support 'backup_dir' feature, these files are moved to backup_dir instead of unlink.
|
200
|
+
File.unlink(path, path + '.meta') rescue nil
|
201
|
+
end
|
202
|
+
|
203
|
+
private
|
204
|
+
|
205
|
+
def escaped_patterns(patterns)
|
206
|
+
patterns.map { |pattern|
|
207
|
+
# '{' '}' are special character in Dir.glob
|
208
|
+
pattern.gsub(/[\{\}]/) { |c| "\\#{c}" }
|
209
|
+
}
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
@@ -0,0 +1,225 @@
|
|
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
|
+
|
19
|
+
require 'fluent/plugin/buffer'
|
20
|
+
require 'fluent/plugin/buffer/file_single_chunk'
|
21
|
+
require 'fluent/system_config'
|
22
|
+
require 'fluent/variable_store'
|
23
|
+
|
24
|
+
module Fluent
|
25
|
+
module Plugin
|
26
|
+
class FileSingleBuffer < Fluent::Plugin::Buffer
|
27
|
+
Plugin.register_buffer('file_single', self)
|
28
|
+
|
29
|
+
include SystemConfig::Mixin
|
30
|
+
|
31
|
+
DEFAULT_CHUNK_LIMIT_SIZE = 256 * 1024 * 1024 # 256MB
|
32
|
+
DEFAULT_TOTAL_LIMIT_SIZE = 64 * 1024 * 1024 * 1024 # 64GB
|
33
|
+
|
34
|
+
PATH_SUFFIX = ".#{Fluent::Plugin::Buffer::FileSingleChunk::PATH_EXT}"
|
35
|
+
|
36
|
+
desc 'The path where buffer chunks are stored.'
|
37
|
+
config_param :path, :string, default: nil
|
38
|
+
desc 'Calculate the number of record in chunk during resume'
|
39
|
+
config_param :calc_num_records, :bool, default: true
|
40
|
+
desc 'The format of chunk. This is used to calculate the number of record'
|
41
|
+
config_param :chunk_format, :enum, list: [:msgpack, :text, :auto], default: :auto
|
42
|
+
|
43
|
+
config_set_default :chunk_limit_size, DEFAULT_CHUNK_LIMIT_SIZE
|
44
|
+
config_set_default :total_limit_size, DEFAULT_TOTAL_LIMIT_SIZE
|
45
|
+
|
46
|
+
desc 'The permission of chunk file. If no specified, <system> setting or 0644 is used'
|
47
|
+
config_param :file_permission, :string, default: nil
|
48
|
+
desc 'The permission of chunk directory. If no specified, <system> setting or 0755 is used'
|
49
|
+
config_param :dir_permission, :string, default: nil
|
50
|
+
|
51
|
+
def initialize
|
52
|
+
super
|
53
|
+
|
54
|
+
@multi_workers_available = false
|
55
|
+
@additional_resume_path = nil
|
56
|
+
@variable_store = nil
|
57
|
+
end
|
58
|
+
|
59
|
+
def configure(conf)
|
60
|
+
super
|
61
|
+
|
62
|
+
@variable_store = Fluent::VariableStore.fetch_or_build(:buf_file_single)
|
63
|
+
|
64
|
+
if @chunk_format == :auto
|
65
|
+
@chunk_format = owner.formatted_to_msgpack_binary? ? :msgpack : :text
|
66
|
+
end
|
67
|
+
|
68
|
+
@key_in_path = nil
|
69
|
+
if owner.chunk_keys.empty?
|
70
|
+
log.debug "use event tag for buffer key"
|
71
|
+
else
|
72
|
+
if owner.chunk_key_tag
|
73
|
+
raise Fluent::ConfigError, "chunk keys must be tag or one field"
|
74
|
+
elsif owner.chunk_keys.size > 1
|
75
|
+
raise Fluent::ConfigError, "2 or more chunk keys is not allowed"
|
76
|
+
else
|
77
|
+
@key_in_path = owner.chunk_keys.first.to_sym
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
multi_workers_configured = owner.system_config.workers > 1
|
82
|
+
using_plugin_root_dir = false
|
83
|
+
unless @path
|
84
|
+
if root_dir = owner.plugin_root_dir
|
85
|
+
@path = File.join(root_dir, 'buffer')
|
86
|
+
using_plugin_root_dir = true # plugin_root_dir path contains worker id
|
87
|
+
else
|
88
|
+
raise Fluent::ConfigError, "buffer path is not configured. specify 'path' in <buffer>"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
specified_directory_exists = File.exist?(@path) && File.directory?(@path)
|
93
|
+
unexisting_path_for_directory = !File.exist?(@path) && !@path.include?('.*')
|
94
|
+
|
95
|
+
if specified_directory_exists || unexisting_path_for_directory # directory
|
96
|
+
if using_plugin_root_dir || !multi_workers_configured
|
97
|
+
@path = File.join(@path, "fsb.*#{PATH_SUFFIX}")
|
98
|
+
else
|
99
|
+
@path = File.join(@path, "worker#{fluentd_worker_id}", "fsb.*#{PATH_SUFFIX}")
|
100
|
+
if fluentd_worker_id == 0
|
101
|
+
# worker 0 always checks unflushed buffer chunks to be resumed (might be created while non-multi-worker configuration)
|
102
|
+
@additional_resume_path = File.join(File.expand_path("../../", @path), "fsb.*#{PATH_SUFFIX}")
|
103
|
+
end
|
104
|
+
end
|
105
|
+
@multi_workers_available = true
|
106
|
+
else # specified path is file path
|
107
|
+
if File.basename(@path).include?('.*.')
|
108
|
+
new_path = File.join(File.dirname(@path), "fsb.*#{PATH_SUFFIX}")
|
109
|
+
log.warn "file_single doesn't allow user specified 'prefix.*.suffix' style path. Use '#{new_path}' for file instead: #{@path}"
|
110
|
+
@path = new_path
|
111
|
+
elsif File.basename(@path).end_with?('.*')
|
112
|
+
@path = @path + PATH_SUFFIX
|
113
|
+
else
|
114
|
+
# existing file will be ignored
|
115
|
+
@path = @path + ".*#{PATH_SUFFIX}"
|
116
|
+
end
|
117
|
+
@multi_workers_available = false
|
118
|
+
end
|
119
|
+
|
120
|
+
type_of_owner = Plugin.lookup_type_from_class(@_owner.class)
|
121
|
+
if @variable_store.has_key?(@path) && !called_in_test?
|
122
|
+
type_using_this_path = @variable_store[@path]
|
123
|
+
raise Fluent::ConfigError, "Other '#{type_using_this_path}' plugin already uses same buffer path: type = #{type_of_owner}, buffer path = #{@path}"
|
124
|
+
end
|
125
|
+
|
126
|
+
@variable_store[@path] = type_of_owner
|
127
|
+
@dir_permission = if @dir_permission
|
128
|
+
@dir_permission.to_i(8)
|
129
|
+
else
|
130
|
+
system_config.dir_permission || Fluent::DEFAULT_DIR_PERMISSION
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# This method is called only when multi worker is configured
|
135
|
+
def multi_workers_ready?
|
136
|
+
unless @multi_workers_available
|
137
|
+
log.error "file_single buffer with multi workers should be configured to use directory 'path', or system root_dir and plugin id"
|
138
|
+
end
|
139
|
+
@multi_workers_available
|
140
|
+
end
|
141
|
+
|
142
|
+
def start
|
143
|
+
FileUtils.mkdir_p(File.dirname(@path), mode: @dir_permission)
|
144
|
+
|
145
|
+
super
|
146
|
+
end
|
147
|
+
|
148
|
+
def stop
|
149
|
+
if @variable_store
|
150
|
+
@variable_store.delete(@path)
|
151
|
+
end
|
152
|
+
|
153
|
+
super
|
154
|
+
end
|
155
|
+
|
156
|
+
def persistent?
|
157
|
+
true
|
158
|
+
end
|
159
|
+
|
160
|
+
def resume
|
161
|
+
stage = {}
|
162
|
+
queue = []
|
163
|
+
|
164
|
+
patterns = [@path]
|
165
|
+
patterns.unshift @additional_resume_path if @additional_resume_path
|
166
|
+
Dir.glob(escaped_patterns(patterns)) do |path|
|
167
|
+
next unless File.file?(path)
|
168
|
+
|
169
|
+
log.debug { "restoring buffer file: path = #{path}" }
|
170
|
+
|
171
|
+
m = new_metadata() # this metadata will be updated in FileSingleChunk.new
|
172
|
+
mode = Fluent::Plugin::Buffer::FileSingleChunk.assume_chunk_state(path)
|
173
|
+
if mode == :unknown
|
174
|
+
log.debug "unknown state chunk found", path: path
|
175
|
+
next
|
176
|
+
end
|
177
|
+
|
178
|
+
begin
|
179
|
+
chunk = Fluent::Plugin::Buffer::FileSingleChunk.new(m, path, mode, @key_in_path, compress: @compress)
|
180
|
+
chunk.restore_size(@chunk_format) if @calc_num_records
|
181
|
+
rescue Fluent::Plugin::Buffer::FileSingleChunk::FileChunkError => e
|
182
|
+
handle_broken_files(path, mode, e)
|
183
|
+
next
|
184
|
+
end
|
185
|
+
|
186
|
+
case chunk.state
|
187
|
+
when :staged
|
188
|
+
stage[chunk.metadata] = chunk
|
189
|
+
when :queued
|
190
|
+
queue << chunk
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
queue.sort_by!(&:modified_at)
|
195
|
+
|
196
|
+
return stage, queue
|
197
|
+
end
|
198
|
+
|
199
|
+
def generate_chunk(metadata)
|
200
|
+
# FileChunk generates real path with unique_id
|
201
|
+
perm = @file_permission || system_config.file_permission
|
202
|
+
chunk = Fluent::Plugin::Buffer::FileSingleChunk.new(metadata, @path, :create, @key_in_path, perm: perm, compress: @compress)
|
203
|
+
|
204
|
+
log.debug "Created new chunk", chunk_id: dump_unique_id_hex(chunk.unique_id), metadata: metadata
|
205
|
+
|
206
|
+
chunk
|
207
|
+
end
|
208
|
+
|
209
|
+
def handle_broken_files(path, mode, e)
|
210
|
+
log.error "found broken chunk file during resume. Delete corresponding files:", path: path, mode: mode, err_msg: e.message
|
211
|
+
# After support 'backup_dir' feature, these files are moved to backup_dir instead of unlink.
|
212
|
+
File.unlink(path) rescue nil
|
213
|
+
end
|
214
|
+
|
215
|
+
private
|
216
|
+
|
217
|
+
def escaped_patterns(patterns)
|
218
|
+
patterns.map { |pattern|
|
219
|
+
# '{' '}' are special character in Dir.glob
|
220
|
+
pattern.gsub(/[\{\}]/) { |c| "\\#{c}" }
|
221
|
+
}
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#
|
2
|
+
# Fluentd
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
require 'fluent/plugin/buffer'
|
18
|
+
require 'fluent/plugin/buffer/memory_chunk'
|
19
|
+
|
20
|
+
module Fluent
|
21
|
+
module Plugin
|
22
|
+
class MemoryBuffer < Fluent::Plugin::Buffer
|
23
|
+
Plugin.register_buffer('memory', self)
|
24
|
+
|
25
|
+
def resume
|
26
|
+
return {}, []
|
27
|
+
end
|
28
|
+
|
29
|
+
def generate_chunk(metadata)
|
30
|
+
Fluent::Plugin::Buffer::MemoryChunk.new(metadata, compress: @compress)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|