fluentd222 1.16.2-x86_64-linux
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.deepsource.toml +13 -0
- data/.github/ISSUE_TEMPLATE/bug_report.yaml +71 -0
- data/.github/ISSUE_TEMPLATE/config.yml +5 -0
- data/.github/ISSUE_TEMPLATE/feature_request.yaml +39 -0
- data/.github/ISSUE_TEMPLATE.md +17 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- data/.github/workflows/stale-actions.yml +24 -0
- data/.github/workflows/test-ruby-head.yaml +31 -0
- data/.github/workflows/test.yaml +32 -0
- data/.gitignore +30 -0
- data/ADOPTERS.md +5 -0
- data/AUTHORS +2 -0
- data/CHANGELOG.md +2720 -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 +13 -0
- data/README.md +75 -0
- data/Rakefile +79 -0
- data/SECURITY.md +14 -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 +54 -0
- data/lib/fluent/agent.rb +168 -0
- data/lib/fluent/capability.rb +87 -0
- data/lib/fluent/clock.rb +66 -0
- data/lib/fluent/command/binlog_reader.rb +244 -0
- data/lib/fluent/command/bundler_injection.rb +45 -0
- data/lib/fluent/command/ca_generate.rb +184 -0
- data/lib/fluent/command/cap_ctl.rb +174 -0
- data/lib/fluent/command/cat.rb +365 -0
- data/lib/fluent/command/ctl.rb +180 -0
- data/lib/fluent/command/debug.rb +103 -0
- data/lib/fluent/command/fluentd.rb +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 +44 -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/yaml_parser/fluent_value.rb +47 -0
- data/lib/fluent/config/yaml_parser/loader.rb +108 -0
- data/lib/fluent/config/yaml_parser/parser.rb +166 -0
- data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
- data/lib/fluent/config/yaml_parser.rb +56 -0
- data/lib/fluent/config.rb +89 -0
- data/lib/fluent/configurable.rb +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 +13 -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 +37 -0
- data/lib/fluent/event.rb +330 -0
- data/lib/fluent/event_router.rb +315 -0
- data/lib/fluent/ext_monitor_require.rb +28 -0
- data/lib/fluent/file_wrapper.rb +137 -0
- data/lib/fluent/filter.rb +21 -0
- data/lib/fluent/fluent_log_event_router.rb +139 -0
- data/lib/fluent/formatter.rb +23 -0
- data/lib/fluent/input.rb +21 -0
- data/lib/fluent/label.rb +46 -0
- data/lib/fluent/load.rb +34 -0
- data/lib/fluent/log/console_adapter.rb +66 -0
- data/lib/fluent/log.rb +752 -0
- data/lib/fluent/match.rb +187 -0
- data/lib/fluent/mixin.rb +31 -0
- data/lib/fluent/msgpack_factory.rb +111 -0
- data/lib/fluent/oj_options.rb +61 -0
- data/lib/fluent/output.rb +29 -0
- data/lib/fluent/output_chain.rb +23 -0
- data/lib/fluent/parser.rb +23 -0
- data/lib/fluent/plugin/bare_output.rb +104 -0
- data/lib/fluent/plugin/base.rb +214 -0
- data/lib/fluent/plugin/buf_file.rb +242 -0
- data/lib/fluent/plugin/buf_file_single.rb +254 -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 +310 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
- data/lib/fluent/plugin/buffer.rb +941 -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/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 +677 -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/group_watch.rb +204 -0
- data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
- data/lib/fluent/plugin/in_tail.rb +1299 -0
- data/lib/fluent/plugin/in_tcp.rb +226 -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 +340 -0
- data/lib/fluent/plugin/out_forward/ack_handler.rb +176 -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 +142 -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 +148 -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 +1603 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +41 -0
- data/lib/fluent/plugin/parser.rb +274 -0
- data/lib/fluent/plugin/parser_apache.rb +28 -0
- data/lib/fluent/plugin/parser_apache2.rb +88 -0
- data/lib/fluent/plugin/parser_apache_error.rb +26 -0
- data/lib/fluent/plugin/parser_csv.rb +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 +369 -0
- data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
- data/lib/fluent/plugin_helper/counter.rb +51 -0
- data/lib/fluent/plugin_helper/event_emitter.rb +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 +94 -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 +219 -0
- data/lib/fluent/plugin_helper/server.rb +828 -0
- data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
- data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
- data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
- data/lib/fluent/plugin_helper/socket.rb +288 -0
- data/lib/fluent/plugin_helper/socket_option.rb +98 -0
- data/lib/fluent/plugin_helper/storage.rb +349 -0
- data/lib/fluent/plugin_helper/thread.rb +180 -0
- data/lib/fluent/plugin_helper/timer.rb +92 -0
- data/lib/fluent/plugin_helper.rb +75 -0
- data/lib/fluent/plugin_id.rb +93 -0
- data/lib/fluent/process.rb +22 -0
- data/lib/fluent/registry.rb +117 -0
- data/lib/fluent/root_agent.rb +372 -0
- data/lib/fluent/rpc.rb +95 -0
- data/lib/fluent/static_config_analysis.rb +194 -0
- data/lib/fluent/supervisor.rb +1076 -0
- data/lib/fluent/system_config.rb +189 -0
- data/lib/fluent/test/base.rb +78 -0
- data/lib/fluent/test/driver/base.rb +231 -0
- data/lib/fluent/test/driver/base_owned.rb +83 -0
- data/lib/fluent/test/driver/base_owner.rb +135 -0
- data/lib/fluent/test/driver/event_feeder.rb +98 -0
- data/lib/fluent/test/driver/filter.rb +61 -0
- data/lib/fluent/test/driver/formatter.rb +30 -0
- data/lib/fluent/test/driver/input.rb +31 -0
- data/lib/fluent/test/driver/multi_output.rb +53 -0
- data/lib/fluent/test/driver/output.rb +102 -0
- data/lib/fluent/test/driver/parser.rb +30 -0
- data/lib/fluent/test/driver/storage.rb +30 -0
- data/lib/fluent/test/driver/test_event_router.rb +45 -0
- data/lib/fluent/test/filter_test.rb +77 -0
- data/lib/fluent/test/formatter_test.rb +65 -0
- data/lib/fluent/test/helpers.rb +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 +44 -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/win32api.rb +38 -0
- data/lib/fluent/winsvc.rb +100 -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 +7 -0
- data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
- data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
- data/templates/plugin_config_formatter/param.md-table.erb +10 -0
- data/templates/plugin_config_formatter/param.md.erb +34 -0
- data/templates/plugin_config_formatter/section.md.erb +12 -0
- 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 +56 -0
- data/test/command/test_fluentd.rb +1291 -0
- data/test/command/test_plugin_config_formatter.rb +397 -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 +195 -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/log/test_console_adapter.rb +110 -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 +150 -0
- data/test/plugin/in_tail/test_position_file.rb +346 -0
- data/test/plugin/out_forward/test_ack_handler.rb +140 -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 +174 -0
- data/test/plugin/test_bare_output.rb +131 -0
- data/test/plugin/test_base.rb +247 -0
- data/test/plugin/test_buf_file.rb +1314 -0
- data/test/plugin/test_buf_file_single.rb +898 -0
- data/test/plugin/test_buf_memory.rb +42 -0
- data/test/plugin/test_buffer.rb +1434 -0
- data/test/plugin/test_buffer_chunk.rb +209 -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_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 +1178 -0
- data/test/plugin/test_in_gc_stat.rb +62 -0
- data/test/plugin/test_in_http.rb +1102 -0
- data/test/plugin/test_in_monitor_agent.rb +922 -0
- data/test/plugin/test_in_object_space.rb +66 -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 +3125 -0
- data/test/plugin/test_in_tcp.rb +328 -0
- data/test/plugin/test_in_udp.rb +296 -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 +1038 -0
- data/test/plugin/test_out_forward.rb +1361 -0
- data/test/plugin/test_out_http.rb +429 -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 +1334 -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 +179 -0
- data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
- data/test/plugin/test_output_as_buffered_retries.rb +966 -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 +34 -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 +284 -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 +166 -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 +862 -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 +1006 -0
- data/test/plugin_helper/test_server.rb +1895 -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 +369 -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 +348 -0
- data/test/test_event_time.rb +199 -0
- data/test/test_file_wrapper.rb +53 -0
- data/test/test_filter.rb +121 -0
- data/test/test_fluent_log_event_router.rb +99 -0
- data/test/test_formatter.rb +369 -0
- data/test/test_input.rb +31 -0
- data/test/test_log.rb +1076 -0
- data/test/test_match.rb +148 -0
- data/test/test_mixin.rb +351 -0
- data/test/test_msgpack_factory.rb +50 -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 +821 -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 +1183 -0
@@ -0,0 +1,254 @@
|
|
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
|
+
exist_broken_file = false
|
164
|
+
|
165
|
+
patterns = [@path]
|
166
|
+
patterns.unshift @additional_resume_path if @additional_resume_path
|
167
|
+
Dir.glob(escaped_patterns(patterns)) do |path|
|
168
|
+
next unless File.file?(path)
|
169
|
+
|
170
|
+
if owner.respond_to?(:buffer_config) && owner.buffer_config&.flush_at_shutdown
|
171
|
+
# When `flush_at_shutdown` is `true`, the remaining chunk files during resuming are possibly broken
|
172
|
+
# since there may be a power failure or similar failure.
|
173
|
+
log.warn { "restoring buffer file: path = #{path}" }
|
174
|
+
else
|
175
|
+
log.debug { "restoring buffer file: path = #{path}" }
|
176
|
+
end
|
177
|
+
|
178
|
+
m = new_metadata() # this metadata will be updated in FileSingleChunk.new
|
179
|
+
mode = Fluent::Plugin::Buffer::FileSingleChunk.assume_chunk_state(path)
|
180
|
+
if mode == :unknown
|
181
|
+
log.debug "unknown state chunk found", path: path
|
182
|
+
next
|
183
|
+
end
|
184
|
+
|
185
|
+
begin
|
186
|
+
chunk = Fluent::Plugin::Buffer::FileSingleChunk.new(m, path, mode, @key_in_path, compress: @compress)
|
187
|
+
chunk.restore_size(@chunk_format) if @calc_num_records
|
188
|
+
rescue Fluent::Plugin::Buffer::FileSingleChunk::FileChunkError => e
|
189
|
+
exist_broken_file = true
|
190
|
+
handle_broken_files(path, mode, e)
|
191
|
+
next
|
192
|
+
end
|
193
|
+
|
194
|
+
case chunk.state
|
195
|
+
when :staged
|
196
|
+
stage[chunk.metadata] = chunk
|
197
|
+
when :queued
|
198
|
+
queue << chunk
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
queue.sort_by!(&:modified_at)
|
203
|
+
|
204
|
+
# If one of the files is corrupted, other files may also be corrupted and be undetected.
|
205
|
+
# The time priods of each chunk are helpful to check the data.
|
206
|
+
if exist_broken_file
|
207
|
+
log.info "Since a broken chunk file was found, it is possible that other files remaining at the time of resuming were also broken. Here is the list of the files."
|
208
|
+
(stage.values + queue).each { |chunk|
|
209
|
+
log.info " #{chunk.path}:", :created_at => chunk.created_at, :modified_at => chunk.modified_at
|
210
|
+
}
|
211
|
+
end
|
212
|
+
|
213
|
+
return stage, queue
|
214
|
+
end
|
215
|
+
|
216
|
+
def generate_chunk(metadata)
|
217
|
+
# FileChunk generates real path with unique_id
|
218
|
+
perm = @file_permission || system_config.file_permission
|
219
|
+
chunk = Fluent::Plugin::Buffer::FileSingleChunk.new(metadata, @path, :create, @key_in_path, perm: perm, compress: @compress)
|
220
|
+
|
221
|
+
log.debug "Created new chunk", chunk_id: dump_unique_id_hex(chunk.unique_id), metadata: metadata
|
222
|
+
|
223
|
+
chunk
|
224
|
+
end
|
225
|
+
|
226
|
+
def handle_broken_files(path, mode, e)
|
227
|
+
log.error "found broken chunk file during resume.", :path => path, :mode => mode, :err_msg => e.message
|
228
|
+
unique_id, _ = Fluent::Plugin::Buffer::FileSingleChunk.unique_id_and_key_from_path(path)
|
229
|
+
backup(unique_id) { |f|
|
230
|
+
File.open(path, 'rb') { |chunk|
|
231
|
+
chunk.set_encoding(Encoding::ASCII_8BIT)
|
232
|
+
chunk.sync = true
|
233
|
+
chunk.binmode
|
234
|
+
IO.copy_stream(chunk, f)
|
235
|
+
}
|
236
|
+
}
|
237
|
+
rescue => error
|
238
|
+
log.error "backup failed. Delete corresponding files.", :err_msg => error.message
|
239
|
+
ensure
|
240
|
+
log.warn "disable_chunk_backup is true. #{dump_unique_id_hex(unique_id)} chunk is thrown away." if @disable_chunk_backup
|
241
|
+
File.unlink(path) rescue nil
|
242
|
+
end
|
243
|
+
|
244
|
+
private
|
245
|
+
|
246
|
+
def escaped_patterns(patterns)
|
247
|
+
patterns.map { |pattern|
|
248
|
+
# '{' '}' are special character in Dir.glob
|
249
|
+
pattern.gsub(/[\{\}]/) { |c| "\\#{c}" }
|
250
|
+
}
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
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
|
@@ -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
|