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,240 @@
|
|
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/compressable'
|
19
|
+
require 'fluent/unique_id'
|
20
|
+
require 'fluent/event'
|
21
|
+
require 'fluent/ext_monitor_require'
|
22
|
+
|
23
|
+
require 'tempfile'
|
24
|
+
require 'zlib'
|
25
|
+
|
26
|
+
module Fluent
|
27
|
+
module Plugin
|
28
|
+
class Buffer # fluent/plugin/buffer is already loaded
|
29
|
+
class Chunk
|
30
|
+
include MonitorMixin
|
31
|
+
include UniqueId::Mixin
|
32
|
+
|
33
|
+
# Chunks has 2 part:
|
34
|
+
# * metadata: contains metadata which should be restored after resume (if possible)
|
35
|
+
# v: {key=>value,key=>value,...} (optional)
|
36
|
+
# t: tag as string (optional)
|
37
|
+
# k: time slice key (optional)
|
38
|
+
#
|
39
|
+
# id: unique_id of chunk (*)
|
40
|
+
# s: size (number of events in chunk) (*)
|
41
|
+
# c: created_at as unix time (*)
|
42
|
+
# m: modified_at as unix time (*)
|
43
|
+
# (*): fields automatically injected by chunk itself
|
44
|
+
# * data: binary data, combined records represented as String, maybe compressed
|
45
|
+
|
46
|
+
# NOTE: keys of metadata are named with a single letter
|
47
|
+
# to decread bytesize of metadata I/O
|
48
|
+
|
49
|
+
# TODO: CompressedPackedMessage of forward protocol?
|
50
|
+
|
51
|
+
def initialize(metadata, compress: :text)
|
52
|
+
super()
|
53
|
+
@unique_id = generate_unique_id
|
54
|
+
@metadata = metadata
|
55
|
+
|
56
|
+
# state: unstaged/staged/queued/closed
|
57
|
+
@state = :unstaged
|
58
|
+
|
59
|
+
@size = 0
|
60
|
+
@created_at = Fluent::Clock.real_now
|
61
|
+
@modified_at = Fluent::Clock.real_now
|
62
|
+
|
63
|
+
extend Decompressable if compress == :gzip
|
64
|
+
end
|
65
|
+
|
66
|
+
attr_reader :unique_id, :metadata, :state
|
67
|
+
|
68
|
+
def raw_create_at
|
69
|
+
@created_at
|
70
|
+
end
|
71
|
+
|
72
|
+
def raw_modified_at
|
73
|
+
@modified_at
|
74
|
+
end
|
75
|
+
|
76
|
+
# for compatibility
|
77
|
+
def created_at
|
78
|
+
@created_at_object ||= Time.at(@created_at)
|
79
|
+
end
|
80
|
+
|
81
|
+
# for compatibility
|
82
|
+
def modified_at
|
83
|
+
@modified_at_object ||= Time.at(@modified_at)
|
84
|
+
end
|
85
|
+
|
86
|
+
# data is array of formatted record string
|
87
|
+
def append(data, **kwargs)
|
88
|
+
raise ArgumentError, '`compress: gzip` can be used for Compressable module' if kwargs[:compress] == :gzip
|
89
|
+
adding = ''.b
|
90
|
+
data.each do |d|
|
91
|
+
adding << d.b
|
92
|
+
end
|
93
|
+
concat(adding, data.size)
|
94
|
+
end
|
95
|
+
|
96
|
+
# for event streams which is packed or zipped (and we want not to unpack/uncompress)
|
97
|
+
def concat(bulk, records)
|
98
|
+
raise NotImplementedError, "Implement this method in child class"
|
99
|
+
end
|
100
|
+
|
101
|
+
def commit
|
102
|
+
raise NotImplementedError, "Implement this method in child class"
|
103
|
+
end
|
104
|
+
|
105
|
+
def rollback
|
106
|
+
raise NotImplementedError, "Implement this method in child class"
|
107
|
+
end
|
108
|
+
|
109
|
+
def bytesize
|
110
|
+
raise NotImplementedError, "Implement this method in child class"
|
111
|
+
end
|
112
|
+
|
113
|
+
def size
|
114
|
+
raise NotImplementedError, "Implement this method in child class"
|
115
|
+
end
|
116
|
+
alias :length :size
|
117
|
+
|
118
|
+
def empty?
|
119
|
+
size == 0
|
120
|
+
end
|
121
|
+
|
122
|
+
def writable?
|
123
|
+
@state == :staged || @state == :unstaged
|
124
|
+
end
|
125
|
+
|
126
|
+
def unstaged?
|
127
|
+
@state == :unstaged
|
128
|
+
end
|
129
|
+
|
130
|
+
def staged?
|
131
|
+
@state == :staged
|
132
|
+
end
|
133
|
+
|
134
|
+
def queued?
|
135
|
+
@state == :queued
|
136
|
+
end
|
137
|
+
|
138
|
+
def closed?
|
139
|
+
@state == :closed
|
140
|
+
end
|
141
|
+
|
142
|
+
def staged!
|
143
|
+
@state = :staged
|
144
|
+
self
|
145
|
+
end
|
146
|
+
|
147
|
+
def unstaged!
|
148
|
+
@state = :unstaged
|
149
|
+
self
|
150
|
+
end
|
151
|
+
|
152
|
+
def enqueued!
|
153
|
+
@state = :queued
|
154
|
+
self
|
155
|
+
end
|
156
|
+
|
157
|
+
def close
|
158
|
+
@state = :closed
|
159
|
+
self
|
160
|
+
end
|
161
|
+
|
162
|
+
def purge
|
163
|
+
@state = :closed
|
164
|
+
self
|
165
|
+
end
|
166
|
+
|
167
|
+
def read(**kwargs)
|
168
|
+
raise ArgumentError, '`compressed: gzip` can be used for Compressable module' if kwargs[:compressed] == :gzip
|
169
|
+
raise NotImplementedError, "Implement this method in child class"
|
170
|
+
end
|
171
|
+
|
172
|
+
def open(**kwargs, &block)
|
173
|
+
raise ArgumentError, '`compressed: gzip` can be used for Compressable module' if kwargs[:compressed] == :gzip
|
174
|
+
raise NotImplementedError, "Implement this method in child class"
|
175
|
+
end
|
176
|
+
|
177
|
+
def write_to(io, **kwargs)
|
178
|
+
raise ArgumentError, '`compressed: gzip` can be used for Compressable module' if kwargs[:compressed] == :gzip
|
179
|
+
open do |i|
|
180
|
+
IO.copy_stream(i, io)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
module Decompressable
|
185
|
+
include Fluent::Plugin::Compressable
|
186
|
+
|
187
|
+
def append(data, **kwargs)
|
188
|
+
if kwargs[:compress] == :gzip
|
189
|
+
io = StringIO.new
|
190
|
+
Zlib::GzipWriter.wrap(io) do |gz|
|
191
|
+
data.each do |d|
|
192
|
+
gz.write d
|
193
|
+
end
|
194
|
+
end
|
195
|
+
concat(io.string, data.size)
|
196
|
+
else
|
197
|
+
super
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def open(**kwargs, &block)
|
202
|
+
if kwargs[:compressed] == :gzip
|
203
|
+
super
|
204
|
+
else
|
205
|
+
super(**kwargs) do |chunk_io|
|
206
|
+
output_io = if chunk_io.is_a?(StringIO)
|
207
|
+
StringIO.new
|
208
|
+
else
|
209
|
+
Tempfile.new('decompressed-data')
|
210
|
+
end
|
211
|
+
output_io.binmode if output_io.is_a?(Tempfile)
|
212
|
+
decompress(input_io: chunk_io, output_io: output_io)
|
213
|
+
output_io.seek(0, IO::SEEK_SET)
|
214
|
+
yield output_io
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def read(**kwargs)
|
220
|
+
if kwargs[:compressed] == :gzip
|
221
|
+
super
|
222
|
+
else
|
223
|
+
decompress(super)
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def write_to(io, **kwargs)
|
228
|
+
open(compressed: :gzip) do |chunk_io|
|
229
|
+
if kwargs[:compressed] == :gzip
|
230
|
+
IO.copy_stream(chunk_io, io)
|
231
|
+
else
|
232
|
+
decompress(input_io: chunk_io, output_io: io)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
@@ -0,0 +1,413 @@
|
|
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/chunk'
|
18
|
+
require 'fluent/unique_id'
|
19
|
+
require 'fluent/msgpack_factory'
|
20
|
+
|
21
|
+
module Fluent
|
22
|
+
module Plugin
|
23
|
+
class Buffer
|
24
|
+
class FileChunk < Chunk
|
25
|
+
class FileChunkError < StandardError; end
|
26
|
+
|
27
|
+
BUFFER_HEADER = "\xc1\x00".force_encoding(Encoding::ASCII_8BIT).freeze
|
28
|
+
|
29
|
+
### buffer path user specified : /path/to/directory/user_specified_prefix.*.log
|
30
|
+
### buffer chunk path : /path/to/directory/user_specified_prefix.b513b61c9791029c2513b61c9791029c2.log
|
31
|
+
### buffer chunk metadata path : /path/to/directory/user_specified_prefix.b513b61c9791029c2513b61c9791029c2.log.meta
|
32
|
+
|
33
|
+
# NOTE: Old style buffer path of time sliced output plugins had a part of key: prefix.20150414.b513b61...suffix
|
34
|
+
# But this part is not used now for any purpose. (Now metadata is used instead.)
|
35
|
+
|
36
|
+
# state: b/q - 'b'(on stage, compatible with v0.12), 'q'(enqueued)
|
37
|
+
# path_prefix: path prefix string, ended with '.'
|
38
|
+
# path_suffix: path suffix string, like '.log' (or any other user specified)
|
39
|
+
|
40
|
+
attr_reader :path, :permission
|
41
|
+
|
42
|
+
def initialize(metadata, path, mode, perm: nil, compress: :text)
|
43
|
+
super(metadata, compress: compress)
|
44
|
+
perm ||= Fluent::DEFAULT_FILE_PERMISSION
|
45
|
+
@permission = perm.is_a?(String) ? perm.to_i(8) : perm
|
46
|
+
@bytesize = @size = @adding_bytes = @adding_size = 0
|
47
|
+
@meta = nil
|
48
|
+
|
49
|
+
case mode
|
50
|
+
when :create then create_new_chunk(path, @permission)
|
51
|
+
when :staged then load_existing_staged_chunk(path)
|
52
|
+
when :queued then load_existing_enqueued_chunk(path)
|
53
|
+
else
|
54
|
+
raise ArgumentError, "Invalid file chunk mode: #{mode}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def concat(bulk, bulk_size)
|
59
|
+
raise "BUG: concatenating to unwritable chunk, now '#{self.state}'" unless self.writable?
|
60
|
+
|
61
|
+
bulk.force_encoding(Encoding::ASCII_8BIT)
|
62
|
+
@chunk.write bulk
|
63
|
+
@adding_bytes += bulk.bytesize
|
64
|
+
@adding_size += bulk_size
|
65
|
+
true
|
66
|
+
end
|
67
|
+
|
68
|
+
def commit
|
69
|
+
write_metadata # this should be at first: of course, this operation may fail
|
70
|
+
|
71
|
+
@commit_position = @chunk.pos
|
72
|
+
@size += @adding_size
|
73
|
+
@bytesize += @adding_bytes
|
74
|
+
@adding_bytes = @adding_size = 0
|
75
|
+
@modified_at = Fluent::Clock.real_now
|
76
|
+
@modified_at_object = nil
|
77
|
+
|
78
|
+
true
|
79
|
+
end
|
80
|
+
|
81
|
+
def rollback
|
82
|
+
if @chunk.pos != @commit_position
|
83
|
+
@chunk.seek(@commit_position, IO::SEEK_SET)
|
84
|
+
@chunk.truncate(@commit_position)
|
85
|
+
end
|
86
|
+
@adding_bytes = @adding_size = 0
|
87
|
+
true
|
88
|
+
end
|
89
|
+
|
90
|
+
def bytesize
|
91
|
+
@bytesize + @adding_bytes
|
92
|
+
end
|
93
|
+
|
94
|
+
def size
|
95
|
+
@size + @adding_size
|
96
|
+
end
|
97
|
+
|
98
|
+
def empty?
|
99
|
+
@bytesize == 0
|
100
|
+
end
|
101
|
+
|
102
|
+
def enqueued!
|
103
|
+
return unless self.staged?
|
104
|
+
|
105
|
+
new_chunk_path = self.class.generate_queued_chunk_path(@path, @unique_id)
|
106
|
+
new_meta_path = new_chunk_path + '.meta'
|
107
|
+
|
108
|
+
write_metadata(update: false) # re-write metadata w/ finalized records
|
109
|
+
|
110
|
+
begin
|
111
|
+
file_rename(@chunk, @path, new_chunk_path, ->(new_io) { @chunk = new_io })
|
112
|
+
rescue => e
|
113
|
+
begin
|
114
|
+
file_rename(@chunk, new_chunk_path, @path, ->(new_io) { @chunk = new_io }) if File.exist?(new_chunk_path)
|
115
|
+
rescue => re
|
116
|
+
# In this point, restore buffer state is hard because previous `file_rename` failed by resource problem.
|
117
|
+
# Retry is one possible approach but it may cause livelock under limited resources or high load environment.
|
118
|
+
# So we ignore such errors for now and log better message instead.
|
119
|
+
# "Too many open files" should be fixed by proper buffer configuration and system setting.
|
120
|
+
raise "can't enqueue buffer file and failed to restore. This may causes inconsistent state: path = #{@path}, error = '#{e}', retry error = '#{re}'"
|
121
|
+
else
|
122
|
+
raise "can't enqueue buffer file: path = #{@path}, error = '#{e}'"
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
begin
|
127
|
+
file_rename(@meta, @meta_path, new_meta_path, ->(new_io) { @meta = new_io })
|
128
|
+
rescue => e
|
129
|
+
begin
|
130
|
+
file_rename(@chunk, new_chunk_path, @path, ->(new_io) { @chunk = new_io }) if File.exist?(new_chunk_path)
|
131
|
+
file_rename(@meta, new_meta_path, @meta_path, ->(new_io) { @meta = new_io }) if File.exist?(new_meta_path)
|
132
|
+
rescue => re
|
133
|
+
# See above
|
134
|
+
raise "can't enqueue buffer metadata and failed to restore. This may causes inconsistent state: path = #{@meta_path}, error = '#{e}', retry error = '#{re}'"
|
135
|
+
else
|
136
|
+
raise "can't enqueue buffer metadata: path = #{@meta_path}, error = '#{e}'"
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
@path = new_chunk_path
|
141
|
+
@meta_path = new_meta_path
|
142
|
+
|
143
|
+
super
|
144
|
+
end
|
145
|
+
|
146
|
+
def close
|
147
|
+
super
|
148
|
+
size = @chunk.size
|
149
|
+
@chunk.close
|
150
|
+
@meta.close if @meta # meta may be missing if chunk is queued at first
|
151
|
+
if size == 0
|
152
|
+
File.unlink(@path, @meta_path)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def purge
|
157
|
+
super
|
158
|
+
@chunk.close
|
159
|
+
@meta.close if @meta
|
160
|
+
@bytesize = @size = @adding_bytes = @adding_size = 0
|
161
|
+
File.unlink(@path, @meta_path)
|
162
|
+
end
|
163
|
+
|
164
|
+
def read(**kwargs)
|
165
|
+
@chunk.seek(0, IO::SEEK_SET)
|
166
|
+
@chunk.read
|
167
|
+
end
|
168
|
+
|
169
|
+
def open(**kwargs, &block)
|
170
|
+
@chunk.seek(0, IO::SEEK_SET)
|
171
|
+
val = yield @chunk
|
172
|
+
@chunk.seek(0, IO::SEEK_END) if self.staged?
|
173
|
+
val
|
174
|
+
end
|
175
|
+
|
176
|
+
def self.assume_chunk_state(path)
|
177
|
+
if /\.(b|q)([0-9a-f]+)\.[^\/]*\Z/n =~ path # //n switch means explicit 'ASCII-8BIT' pattern
|
178
|
+
$1 == 'b' ? :staged : :queued
|
179
|
+
else
|
180
|
+
# files which matches to glob of buffer file pattern
|
181
|
+
# it includes files which are created by out_file
|
182
|
+
:unknown
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def self.generate_stage_chunk_path(path, unique_id)
|
187
|
+
pos = path.index('.*.')
|
188
|
+
raise "BUG: buffer chunk path on stage MUST have '.*.'" unless pos
|
189
|
+
|
190
|
+
prefix = path[0...pos]
|
191
|
+
suffix = path[(pos+3)..-1]
|
192
|
+
|
193
|
+
chunk_id = Fluent::UniqueId.hex(unique_id)
|
194
|
+
state = 'b'
|
195
|
+
"#{prefix}.#{state}#{chunk_id}.#{suffix}"
|
196
|
+
end
|
197
|
+
|
198
|
+
def self.generate_queued_chunk_path(path, unique_id)
|
199
|
+
chunk_id = Fluent::UniqueId.hex(unique_id)
|
200
|
+
if path.index(".b#{chunk_id}.")
|
201
|
+
path.sub(".b#{chunk_id}.", ".q#{chunk_id}.")
|
202
|
+
else # for unexpected cases (ex: users rename files while opened by fluentd)
|
203
|
+
path + ".q#{chunk_id}.chunk"
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
# used only for queued v0.12 buffer path
|
208
|
+
def self.unique_id_from_path(path)
|
209
|
+
if /\.(b|q)([0-9a-f]+)\.[^\/]*\Z/n =~ path # //n switch means explicit 'ASCII-8BIT' pattern
|
210
|
+
return $2.scan(/../).map{|x| x.to_i(16) }.pack('C*')
|
211
|
+
end
|
212
|
+
nil
|
213
|
+
end
|
214
|
+
|
215
|
+
def restore_metadata(bindata)
|
216
|
+
data = restore_metadata_with_new_format(bindata)
|
217
|
+
|
218
|
+
unless data
|
219
|
+
# old type of restore
|
220
|
+
data = Fluent::MessagePackFactory.msgpack_unpacker(symbolize_keys: true).feed(bindata).read rescue {}
|
221
|
+
end
|
222
|
+
|
223
|
+
now = Fluent::Clock.real_now
|
224
|
+
|
225
|
+
@unique_id = data[:id] || self.class.unique_id_from_path(@path) || @unique_id
|
226
|
+
@size = data[:s] || 0
|
227
|
+
@created_at = data.fetch(:c, now.to_i)
|
228
|
+
@modified_at = data.fetch(:m, now.to_i)
|
229
|
+
|
230
|
+
@metadata.timekey = data[:timekey]
|
231
|
+
@metadata.tag = data[:tag]
|
232
|
+
@metadata.variables = data[:variables]
|
233
|
+
@metadata.seq = data[:seq] || 0
|
234
|
+
end
|
235
|
+
|
236
|
+
def restore_metadata_partially(chunk)
|
237
|
+
@unique_id = self.class.unique_id_from_path(chunk.path) || @unique_id
|
238
|
+
@size = 0
|
239
|
+
@created_at = chunk.ctime.to_i # birthtime isn't supported on Windows (and Travis?)
|
240
|
+
@modified_at = chunk.mtime.to_i
|
241
|
+
|
242
|
+
@metadata.timekey = nil
|
243
|
+
@metadata.tag = nil
|
244
|
+
@metadata.variables = nil
|
245
|
+
@metadata.seq = 0
|
246
|
+
end
|
247
|
+
|
248
|
+
def write_metadata(update: true)
|
249
|
+
data = @metadata.to_h.merge({
|
250
|
+
id: @unique_id,
|
251
|
+
s: (update ? @size + @adding_size : @size),
|
252
|
+
c: @created_at,
|
253
|
+
m: (update ? Fluent::Clock.real_now : @modified_at),
|
254
|
+
})
|
255
|
+
bin = Fluent::MessagePackFactory.thread_local_msgpack_packer.pack(data).full_pack
|
256
|
+
size = [bin.bytesize].pack('N')
|
257
|
+
@meta.seek(0, IO::SEEK_SET)
|
258
|
+
@meta.write(BUFFER_HEADER + size + bin)
|
259
|
+
end
|
260
|
+
|
261
|
+
def file_rename(file, old_path, new_path, callback=nil)
|
262
|
+
pos = file.pos
|
263
|
+
if Fluent.windows?
|
264
|
+
file.close
|
265
|
+
File.rename(old_path, new_path)
|
266
|
+
file = File.open(new_path, 'rb', @permission)
|
267
|
+
else
|
268
|
+
File.rename(old_path, new_path)
|
269
|
+
file.reopen(new_path, 'rb')
|
270
|
+
end
|
271
|
+
file.set_encoding(Encoding::ASCII_8BIT)
|
272
|
+
file.sync = true
|
273
|
+
file.binmode
|
274
|
+
file.pos = pos
|
275
|
+
callback.call(file) if callback
|
276
|
+
end
|
277
|
+
|
278
|
+
def create_new_chunk(path, perm)
|
279
|
+
@path = self.class.generate_stage_chunk_path(path, @unique_id)
|
280
|
+
@meta_path = @path + '.meta'
|
281
|
+
begin
|
282
|
+
@chunk = File.open(@path, 'wb+', perm)
|
283
|
+
@chunk.set_encoding(Encoding::ASCII_8BIT)
|
284
|
+
@chunk.sync = true
|
285
|
+
@chunk.binmode
|
286
|
+
rescue => e
|
287
|
+
# Here assumes "Too many open files" like recoverable error so raising BufferOverflowError.
|
288
|
+
# If other cases are possible, we will change erorr handling with proper classes.
|
289
|
+
raise BufferOverflowError, "can't create buffer file for #{path}. Stop creating buffer files: error = #{e}"
|
290
|
+
end
|
291
|
+
begin
|
292
|
+
@meta = File.open(@meta_path, 'wb', perm)
|
293
|
+
@meta.set_encoding(Encoding::ASCII_8BIT)
|
294
|
+
@meta.sync = true
|
295
|
+
@meta.binmode
|
296
|
+
write_metadata(update: false)
|
297
|
+
rescue => e
|
298
|
+
# This case is easier than enqueued!. Just removing pre-create buffer file
|
299
|
+
@chunk.close rescue nil
|
300
|
+
File.unlink(@path) rescue nil
|
301
|
+
|
302
|
+
if @meta
|
303
|
+
# ensure to unlink when #write_metadata fails
|
304
|
+
@meta.close rescue nil
|
305
|
+
File.unlink(@meta_path) rescue nil
|
306
|
+
end
|
307
|
+
|
308
|
+
# Same as @chunk case. See above
|
309
|
+
raise BufferOverflowError, "can't create buffer metadata for #{path}. Stop creating buffer files: error = #{e}"
|
310
|
+
end
|
311
|
+
|
312
|
+
@state = :unstaged
|
313
|
+
@bytesize = 0
|
314
|
+
@commit_position = @chunk.pos # must be 0
|
315
|
+
@adding_bytes = 0
|
316
|
+
@adding_size = 0
|
317
|
+
end
|
318
|
+
|
319
|
+
def load_existing_staged_chunk(path)
|
320
|
+
@path = path
|
321
|
+
@meta_path = @path + '.meta'
|
322
|
+
|
323
|
+
@meta = nil
|
324
|
+
# staging buffer chunk without metadata is classic buffer chunk file
|
325
|
+
# and it should be enqueued immediately
|
326
|
+
if File.exist?(@meta_path)
|
327
|
+
raise FileChunkError, "staged file chunk is empty" if File.size(@path).zero?
|
328
|
+
|
329
|
+
@chunk = File.open(@path, 'rb+')
|
330
|
+
@chunk.set_encoding(Encoding::ASCII_8BIT)
|
331
|
+
@chunk.sync = true
|
332
|
+
@chunk.seek(0, IO::SEEK_END)
|
333
|
+
@chunk.binmode
|
334
|
+
|
335
|
+
@meta = File.open(@meta_path, 'rb+')
|
336
|
+
@meta.set_encoding(Encoding::ASCII_8BIT)
|
337
|
+
@meta.sync = true
|
338
|
+
@meta.binmode
|
339
|
+
begin
|
340
|
+
restore_metadata(@meta.read)
|
341
|
+
rescue => e
|
342
|
+
@chunk.close
|
343
|
+
@meta.close
|
344
|
+
raise FileChunkError, "staged meta file is broken. #{e.message}"
|
345
|
+
end
|
346
|
+
@meta.seek(0, IO::SEEK_SET)
|
347
|
+
|
348
|
+
@state = :staged
|
349
|
+
@bytesize = @chunk.size
|
350
|
+
@commit_position = @chunk.pos
|
351
|
+
@adding_bytes = 0
|
352
|
+
@adding_size = 0
|
353
|
+
else
|
354
|
+
# classic buffer chunk - read only chunk
|
355
|
+
@chunk = File.open(@path, 'rb')
|
356
|
+
@chunk.set_encoding(Encoding::ASCII_8BIT)
|
357
|
+
@chunk.binmode
|
358
|
+
@chunk.seek(0, IO::SEEK_SET)
|
359
|
+
@state = :queued
|
360
|
+
@bytesize = @chunk.size
|
361
|
+
|
362
|
+
restore_metadata_partially(@chunk)
|
363
|
+
|
364
|
+
@commit_position = @chunk.size
|
365
|
+
@unique_id = self.class.unique_id_from_path(@path) || @unique_id
|
366
|
+
end
|
367
|
+
end
|
368
|
+
|
369
|
+
def load_existing_enqueued_chunk(path)
|
370
|
+
@path = path
|
371
|
+
raise FileChunkError, "enqueued file chunk is empty" if File.size(@path).zero?
|
372
|
+
|
373
|
+
@chunk = File.open(@path, 'rb')
|
374
|
+
@chunk.set_encoding(Encoding::ASCII_8BIT)
|
375
|
+
@chunk.binmode
|
376
|
+
@chunk.seek(0, IO::SEEK_SET)
|
377
|
+
@bytesize = @chunk.size
|
378
|
+
@commit_position = @chunk.size
|
379
|
+
|
380
|
+
@meta_path = @path + '.meta'
|
381
|
+
if File.readable?(@meta_path)
|
382
|
+
begin
|
383
|
+
restore_metadata(File.open(@meta_path){|f| f.set_encoding(Encoding::ASCII_8BIT); f.binmode; f.read })
|
384
|
+
rescue => e
|
385
|
+
@chunk.close
|
386
|
+
raise FileChunkError, "enqueued meta file is broken. #{e.message}"
|
387
|
+
end
|
388
|
+
else
|
389
|
+
restore_metadata_partially(@chunk)
|
390
|
+
end
|
391
|
+
@state = :queued
|
392
|
+
end
|
393
|
+
|
394
|
+
private
|
395
|
+
|
396
|
+
def restore_metadata_with_new_format(chunk)
|
397
|
+
if chunk.size <= 6 # size of BUFFER_HEADER (2) + size of data size(4)
|
398
|
+
return nil
|
399
|
+
end
|
400
|
+
|
401
|
+
if chunk.slice(0, 2) == BUFFER_HEADER
|
402
|
+
size = chunk.slice(2, 4).unpack('N').first
|
403
|
+
if size
|
404
|
+
return Fluent::MessagePackFactory.msgpack_unpacker(symbolize_keys: true).feed(chunk.slice(6, size)).read rescue nil
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
nil
|
409
|
+
end
|
410
|
+
end
|
411
|
+
end
|
412
|
+
end
|
413
|
+
end
|