fluentd 0.12.40 → 1.6.2
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 +5 -5
- data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
- data/.github/ISSUE_TEMPLATE.md +17 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +13 -0
- data/.gitignore +5 -0
- data/.gitlab/cicd-template.yaml +10 -0
- data/.gitlab-ci.yml +147 -0
- data/.travis.yml +56 -20
- data/ADOPTERS.md +5 -0
- data/CHANGELOG.md +1369 -0
- data/CONTRIBUTING.md +16 -5
- data/GOVERNANCE.md +55 -0
- data/Gemfile +5 -0
- data/GithubWorkflow.md +78 -0
- data/LICENSE +202 -0
- data/MAINTAINERS.md +7 -0
- data/README.md +23 -11
- data/Rakefile +48 -2
- data/Vagrantfile +17 -0
- data/appveyor.yml +37 -0
- data/bin/fluent-binlog-reader +7 -0
- data/bin/fluent-ca-generate +6 -0
- data/bin/fluent-plugin-config-format +5 -0
- data/bin/fluent-plugin-generate +5 -0
- data/bin/fluentd +3 -0
- data/code-of-conduct.md +3 -0
- data/example/copy_roundrobin.conf +39 -0
- data/example/counter.conf +18 -0
- data/example/in_dummy_blocks.conf +17 -0
- data/example/in_dummy_with_compression.conf +23 -0
- data/example/in_forward.conf +7 -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 +3 -1
- data/example/in_out_forward.conf +17 -0
- data/example/logevents.conf +25 -0
- data/example/multi_filters.conf +61 -0
- data/example/out_exec_filter.conf +42 -0
- data/example/out_forward.conf +13 -13
- 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_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/secondary_file.conf +42 -0
- data/example/suppress_config_dump.conf +7 -0
- data/example/worker_section.conf +36 -0
- data/fluent.conf +29 -0
- data/fluentd.gemspec +21 -11
- data/lib/fluent/agent.rb +67 -90
- data/lib/fluent/clock.rb +62 -0
- data/lib/fluent/command/binlog_reader.rb +244 -0
- data/lib/fluent/command/ca_generate.rb +181 -0
- data/lib/fluent/command/cat.rb +42 -18
- data/lib/fluent/command/debug.rb +12 -10
- data/lib/fluent/command/fluentd.rb +153 -5
- data/lib/fluent/command/plugin_config_formatter.rb +292 -0
- data/lib/fluent/command/plugin_generator.rb +324 -0
- data/lib/fluent/compat/call_super_mixin.rb +67 -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 +718 -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/configure_proxy.rb +210 -62
- data/lib/fluent/config/dsl.rb +12 -5
- data/lib/fluent/config/element.rb +107 -9
- data/lib/fluent/config/literal_parser.rb +9 -3
- data/lib/fluent/config/parser.rb +4 -4
- data/lib/fluent/config/section.rb +51 -14
- data/lib/fluent/config/types.rb +28 -13
- data/lib/fluent/config/v1_parser.rb +3 -5
- data/lib/fluent/config.rb +23 -20
- data/lib/fluent/configurable.rb +79 -21
- data/lib/fluent/counter/base_socket.rb +46 -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/engine.rb +102 -65
- data/lib/fluent/env.rb +7 -3
- data/lib/fluent/error.rb +30 -0
- data/lib/fluent/event.rb +197 -21
- data/lib/fluent/event_router.rb +93 -10
- data/lib/fluent/filter.rb +2 -50
- data/lib/fluent/formatter.rb +4 -293
- data/lib/fluent/input.rb +2 -32
- data/lib/fluent/label.rb +10 -2
- data/lib/fluent/load.rb +3 -3
- data/lib/fluent/log.rb +348 -81
- data/lib/fluent/match.rb +37 -36
- data/lib/fluent/mixin.rb +12 -176
- data/lib/fluent/msgpack_factory.rb +62 -0
- data/lib/fluent/output.rb +10 -612
- data/lib/fluent/output_chain.rb +23 -0
- data/lib/fluent/parser.rb +4 -800
- data/lib/fluent/plugin/bare_output.rb +63 -0
- data/lib/fluent/plugin/base.rb +192 -0
- data/lib/fluent/plugin/buf_file.rb +128 -174
- data/lib/fluent/plugin/buf_memory.rb +9 -92
- data/lib/fluent/plugin/buffer/chunk.rb +221 -0
- data/lib/fluent/plugin/buffer/file_chunk.rb +383 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
- data/lib/fluent/plugin/buffer.rb +779 -0
- data/lib/fluent/plugin/compressable.rb +92 -0
- data/lib/fluent/plugin/exec_util.rb +3 -108
- data/lib/fluent/plugin/file_util.rb +4 -34
- data/lib/fluent/plugin/file_wrapper.rb +120 -0
- data/lib/fluent/plugin/filter.rb +93 -0
- data/lib/fluent/plugin/filter_grep.rb +117 -34
- data/lib/fluent/plugin/filter_parser.rb +85 -62
- data/lib/fluent/plugin/filter_record_transformer.rb +27 -39
- data/lib/fluent/plugin/filter_stdout.rb +15 -12
- data/lib/fluent/plugin/formatter.rb +50 -0
- data/lib/fluent/plugin/formatter_csv.rb +52 -0
- data/lib/fluent/plugin/formatter_hash.rb +33 -0
- data/lib/fluent/plugin/formatter_json.rb +55 -0
- data/lib/fluent/plugin/formatter_ltsv.rb +42 -0
- data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
- data/lib/fluent/plugin/formatter_out_file.rb +51 -0
- data/lib/fluent/plugin/formatter_single_value.rb +34 -0
- data/lib/fluent/plugin/formatter_stdout.rb +76 -0
- data/lib/fluent/plugin/formatter_tsv.rb +38 -0
- data/lib/fluent/plugin/in_debug_agent.rb +17 -6
- data/lib/fluent/plugin/in_dummy.rb +47 -20
- data/lib/fluent/plugin/in_exec.rb +55 -123
- data/lib/fluent/plugin/in_forward.rb +299 -216
- data/lib/fluent/plugin/in_gc_stat.rb +14 -36
- data/lib/fluent/plugin/in_http.rb +204 -91
- data/lib/fluent/plugin/in_monitor_agent.rb +186 -258
- data/lib/fluent/plugin/in_object_space.rb +13 -41
- data/lib/fluent/plugin/in_syslog.rb +112 -134
- data/lib/fluent/plugin/in_tail.rb +408 -745
- data/lib/fluent/plugin/in_tcp.rb +66 -9
- data/lib/fluent/plugin/in_udp.rb +60 -11
- data/lib/fluent/plugin/{in_stream.rb → in_unix.rb} +8 -4
- data/lib/fluent/plugin/input.rb +37 -0
- data/lib/fluent/plugin/multi_output.rb +158 -0
- data/lib/fluent/plugin/out_copy.rb +23 -35
- data/lib/fluent/plugin/out_exec.rb +67 -70
- data/lib/fluent/plugin/out_exec_filter.rb +204 -271
- data/lib/fluent/plugin/out_file.rb +267 -73
- data/lib/fluent/plugin/out_forward.rb +854 -325
- data/lib/fluent/plugin/out_null.rb +42 -9
- data/lib/fluent/plugin/out_relabel.rb +9 -5
- data/lib/fluent/plugin/out_roundrobin.rb +18 -37
- data/lib/fluent/plugin/out_secondary_file.rb +133 -0
- data/lib/fluent/plugin/out_stdout.rb +43 -10
- data/lib/fluent/plugin/out_stream.rb +7 -2
- data/lib/fluent/plugin/output.rb +1498 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
- data/lib/fluent/plugin/parser.rb +191 -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 +39 -0
- data/lib/fluent/plugin/parser_json.rb +94 -0
- data/lib/fluent/plugin/parser_ltsv.rb +49 -0
- data/lib/fluent/plugin/parser_msgpack.rb +50 -0
- data/lib/fluent/plugin/parser_multiline.rb +106 -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 +142 -0
- data/lib/fluent/plugin/parser_tsv.rb +42 -0
- data/lib/fluent/plugin/socket_util.rb +3 -143
- data/lib/fluent/plugin/storage.rb +84 -0
- data/lib/fluent/plugin/storage_local.rb +164 -0
- data/lib/fluent/plugin/string_util.rb +3 -15
- data/lib/fluent/plugin.rb +122 -121
- data/lib/fluent/plugin_helper/cert_option.rb +178 -0
- data/lib/fluent/plugin_helper/child_process.rb +364 -0
- data/lib/fluent/plugin_helper/compat_parameters.rb +333 -0
- data/lib/fluent/plugin_helper/counter.rb +51 -0
- data/lib/fluent/plugin_helper/event_emitter.rb +93 -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 +81 -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 +87 -0
- data/lib/fluent/plugin_helper/http_server.rb +76 -0
- data/lib/fluent/plugin_helper/inject.rb +151 -0
- data/lib/fluent/plugin_helper/parser.rb +147 -0
- data/lib/fluent/plugin_helper/record_accessor.rb +210 -0
- data/lib/fluent/plugin_helper/retry_state.rb +205 -0
- data/lib/fluent/plugin_helper/server.rb +807 -0
- data/lib/fluent/plugin_helper/socket.rb +250 -0
- data/lib/fluent/plugin_helper/socket_option.rb +80 -0
- data/lib/fluent/plugin_helper/storage.rb +349 -0
- data/lib/fluent/plugin_helper/thread.rb +179 -0
- data/lib/fluent/plugin_helper/timer.rb +92 -0
- data/lib/fluent/plugin_helper.rb +73 -0
- data/lib/fluent/plugin_id.rb +80 -0
- data/lib/fluent/process.rb +3 -489
- data/lib/fluent/registry.rb +52 -10
- data/lib/fluent/root_agent.rb +204 -42
- data/lib/fluent/supervisor.rb +597 -359
- data/lib/fluent/system_config.rb +131 -42
- data/lib/fluent/test/base.rb +6 -54
- data/lib/fluent/test/driver/base.rb +224 -0
- data/lib/fluent/test/driver/base_owned.rb +70 -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/test_event_router.rb +45 -0
- data/lib/fluent/test/filter_test.rb +0 -1
- data/lib/fluent/test/formatter_test.rb +4 -1
- data/lib/fluent/test/helpers.rb +58 -10
- data/lib/fluent/test/input_test.rb +27 -19
- data/lib/fluent/test/log.rb +79 -0
- data/lib/fluent/test/output_test.rb +28 -39
- data/lib/fluent/test/parser_test.rb +3 -1
- data/lib/fluent/test/startup_shutdown.rb +46 -0
- data/lib/fluent/test.rb +33 -1
- data/lib/fluent/time.rb +450 -1
- data/lib/fluent/timezone.rb +27 -3
- data/lib/fluent/{status.rb → unique_id.rb} +15 -24
- data/lib/fluent/version.rb +1 -1
- data/lib/fluent/winsvc.rb +85 -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/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/plugin_config_formatter/param.md-compact.erb +25 -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 +346 -0
- data/test/command/test_ca_generate.rb +70 -0
- data/test/command/test_fluentd.rb +901 -0
- data/test/command/test_plugin_config_formatter.rb +276 -0
- data/test/command/test_plugin_generator.rb +92 -0
- data/test/compat/test_calls_super.rb +166 -0
- data/test/compat/test_parser.rb +92 -0
- data/test/config/test_config_parser.rb +126 -2
- data/test/config/test_configurable.rb +946 -187
- data/test/config/test_configure_proxy.rb +424 -74
- data/test/config/test_dsl.rb +11 -11
- data/test/config/test_element.rb +500 -0
- data/test/config/test_literal_parser.rb +8 -0
- data/test/config/test_plugin_configuration.rb +56 -0
- data/test/config/test_section.rb +79 -7
- data/test/config/test_system_config.rb +122 -35
- data/test/config/test_types.rb +38 -0
- data/test/counter/test_client.rb +559 -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 +89 -6
- data/test/helpers/fuzzy_assert.rb +89 -0
- data/test/plugin/test_bare_output.rb +118 -0
- data/test/plugin/test_base.rb +115 -0
- data/test/plugin/test_buf_file.rb +823 -460
- data/test/plugin/test_buf_memory.rb +32 -194
- data/test/plugin/test_buffer.rb +1233 -0
- data/test/plugin/test_buffer_chunk.rb +198 -0
- data/test/plugin/test_buffer_file_chunk.rb +844 -0
- data/test/plugin/test_buffer_memory_chunk.rb +338 -0
- data/test/plugin/test_compressable.rb +84 -0
- data/test/plugin/test_filter.rb +357 -0
- data/test/plugin/test_filter_grep.rb +540 -29
- data/test/plugin/test_filter_parser.rb +439 -452
- data/test/plugin/test_filter_record_transformer.rb +123 -166
- data/test/plugin/test_filter_stdout.rb +160 -72
- data/test/plugin/test_formatter_csv.rb +111 -0
- data/test/plugin/test_formatter_hash.rb +35 -0
- data/test/plugin/test_formatter_json.rb +51 -0
- data/test/plugin/test_formatter_ltsv.rb +62 -0
- data/test/plugin/test_formatter_msgpack.rb +28 -0
- data/test/plugin/test_formatter_out_file.rb +95 -0
- data/test/plugin/test_formatter_single_value.rb +38 -0
- data/test/plugin/test_formatter_tsv.rb +68 -0
- data/test/plugin/test_in_debug_agent.rb +24 -1
- data/test/plugin/test_in_dummy.rb +111 -18
- data/test/plugin/test_in_exec.rb +200 -113
- data/test/plugin/test_in_forward.rb +990 -387
- data/test/plugin/test_in_gc_stat.rb +10 -8
- data/test/plugin/test_in_http.rb +600 -224
- data/test/plugin/test_in_monitor_agent.rb +690 -0
- data/test/plugin/test_in_object_space.rb +24 -8
- data/test/plugin/test_in_syslog.rb +154 -215
- data/test/plugin/test_in_tail.rb +1006 -707
- data/test/plugin/test_in_tcp.rb +125 -48
- data/test/plugin/test_in_udp.rb +204 -63
- data/test/plugin/{test_in_stream.rb → test_in_unix.rb} +14 -13
- data/test/plugin/test_input.rb +126 -0
- data/test/plugin/test_metadata.rb +89 -0
- data/test/plugin/test_multi_output.rb +180 -0
- data/test/plugin/test_out_copy.rb +117 -112
- data/test/plugin/test_out_exec.rb +258 -53
- data/test/plugin/test_out_exec_filter.rb +538 -115
- data/test/plugin/test_out_file.rb +865 -178
- data/test/plugin/test_out_forward.rb +998 -210
- 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 +36 -29
- data/test/plugin/test_out_secondary_file.rb +458 -0
- data/test/plugin/test_out_stdout.rb +135 -37
- data/test/plugin/test_out_stream.rb +18 -0
- data/test/plugin/test_output.rb +984 -0
- data/test/plugin/test_output_as_buffered.rb +2021 -0
- data/test/plugin/test_output_as_buffered_backup.rb +312 -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 +911 -0
- data/test/plugin/test_output_as_buffered_secondary.rb +874 -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 +359 -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 +103 -0
- data/test/plugin/test_parser_json.rb +138 -0
- data/test/plugin/test_parser_labeled_tsv.rb +145 -0
- data/test/plugin/test_parser_multiline.rb +100 -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 +441 -0
- data/test/plugin/test_parser_tsv.rb +122 -0
- data/test/plugin/test_storage.rb +167 -0
- data/test/plugin/test_storage_local.rb +335 -0
- data/test/plugin_helper/data/cert/cert-key.pem +27 -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/http_server/test_app.rb +65 -0
- data/test/plugin_helper/http_server/test_route.rb +32 -0
- data/test/plugin_helper/test_cert_option.rb +16 -0
- data/test/plugin_helper/test_child_process.rb +794 -0
- data/test/plugin_helper/test_compat_parameters.rb +353 -0
- data/test/plugin_helper/test_event_emitter.rb +51 -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 +205 -0
- data/test/plugin_helper/test_inject.rb +519 -0
- data/test/plugin_helper/test_parser.rb +264 -0
- data/test/plugin_helper/test_record_accessor.rb +197 -0
- data/test/plugin_helper/test_retry_state.rb +442 -0
- data/test/plugin_helper/test_server.rb +1714 -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 +132 -0
- data/test/scripts/exec_script.rb +0 -6
- 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/out_test.rb +23 -15
- data/test/scripts/fluent/plugin/out_test2.rb +80 -0
- data/test/test_clock.rb +164 -0
- data/test/test_config.rb +16 -7
- data/test/test_configdsl.rb +2 -2
- data/test/test_event.rb +360 -13
- data/test/test_event_router.rb +108 -11
- data/test/test_event_time.rb +199 -0
- data/test/test_filter.rb +48 -6
- data/test/test_formatter.rb +11 -391
- data/test/test_input.rb +1 -1
- data/test/test_log.rb +591 -31
- data/test/test_mixin.rb +1 -1
- data/test/test_output.rb +121 -185
- data/test/test_plugin.rb +251 -0
- data/test/test_plugin_classes.rb +177 -10
- data/test/test_plugin_helper.rb +81 -0
- data/test/test_plugin_id.rb +101 -0
- data/test/test_process.rb +8 -42
- data/test/test_root_agent.rb +766 -21
- data/test/test_supervisor.rb +481 -0
- data/test/test_test_drivers.rb +135 -0
- data/test/test_time_formatter.rb +282 -0
- data/test/test_time_parser.rb +231 -0
- data/test/test_unique_id.rb +47 -0
- metadata +454 -60
- data/COPYING +0 -14
- data/ChangeLog +0 -666
- data/lib/fluent/buffer.rb +0 -365
- data/lib/fluent/plugin/in_status.rb +0 -76
- data/test/plugin/test_in_status.rb +0 -38
- data/test/test_buffer.rb +0 -624
- data/test/test_parser.rb +0 -1305
@@ -0,0 +1,383 @@
|
|
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 path user specified : /path/to/directory/user_specified_prefix.*.log
|
28
|
+
### buffer chunk path : /path/to/directory/user_specified_prefix.b513b61c9791029c2513b61c9791029c2.log
|
29
|
+
### buffer chunk metadata path : /path/to/directory/user_specified_prefix.b513b61c9791029c2513b61c9791029c2.log.meta
|
30
|
+
|
31
|
+
# NOTE: Old style buffer path of time sliced output plugins had a part of key: prefix.20150414.b513b61...suffix
|
32
|
+
# But this part is not used now for any purpose. (Now metadata is used instead.)
|
33
|
+
|
34
|
+
# state: b/q - 'b'(on stage, compatible with v0.12), 'q'(enqueued)
|
35
|
+
# path_prefix: path prefix string, ended with '.'
|
36
|
+
# path_suffix: path suffix string, like '.log' (or any other user specified)
|
37
|
+
|
38
|
+
include SystemConfig::Mixin
|
39
|
+
include MessagePackFactory::Mixin
|
40
|
+
|
41
|
+
FILE_PERMISSION = 0644
|
42
|
+
|
43
|
+
attr_reader :path, :permission
|
44
|
+
|
45
|
+
def initialize(metadata, path, mode, perm: system_config.file_permission || FILE_PERMISSION, compress: :text)
|
46
|
+
super(metadata, compress: compress)
|
47
|
+
@permission = perm.is_a?(String) ? perm.to_i(8) : perm
|
48
|
+
@bytesize = @size = @adding_bytes = @adding_size = 0
|
49
|
+
@meta = nil
|
50
|
+
|
51
|
+
case mode
|
52
|
+
when :create then create_new_chunk(path, @permission)
|
53
|
+
when :staged then load_existing_staged_chunk(path)
|
54
|
+
when :queued then load_existing_enqueued_chunk(path)
|
55
|
+
else
|
56
|
+
raise ArgumentError, "Invalid file chunk mode: #{mode}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def concat(bulk, bulk_size)
|
61
|
+
raise "BUG: concatenating to unwritable chunk, now '#{self.state}'" unless self.writable?
|
62
|
+
|
63
|
+
bulk.force_encoding(Encoding::ASCII_8BIT)
|
64
|
+
@chunk.write bulk
|
65
|
+
@adding_bytes += bulk.bytesize
|
66
|
+
@adding_size += bulk_size
|
67
|
+
true
|
68
|
+
end
|
69
|
+
|
70
|
+
def commit
|
71
|
+
write_metadata # this should be at first: of course, this operation may fail
|
72
|
+
|
73
|
+
@commit_position = @chunk.pos
|
74
|
+
@size += @adding_size
|
75
|
+
@bytesize += @adding_bytes
|
76
|
+
@adding_bytes = @adding_size = 0
|
77
|
+
@modified_at = Time.now
|
78
|
+
|
79
|
+
true
|
80
|
+
end
|
81
|
+
|
82
|
+
def rollback
|
83
|
+
if @chunk.pos != @commit_position
|
84
|
+
@chunk.seek(@commit_position, IO::SEEK_SET)
|
85
|
+
@chunk.truncate(@commit_position)
|
86
|
+
end
|
87
|
+
@adding_bytes = @adding_size = 0
|
88
|
+
true
|
89
|
+
end
|
90
|
+
|
91
|
+
def bytesize
|
92
|
+
@bytesize + @adding_bytes
|
93
|
+
end
|
94
|
+
|
95
|
+
def size
|
96
|
+
@size + @adding_size
|
97
|
+
end
|
98
|
+
|
99
|
+
def empty?
|
100
|
+
@bytesize == 0
|
101
|
+
end
|
102
|
+
|
103
|
+
def enqueued!
|
104
|
+
return unless self.staged?
|
105
|
+
|
106
|
+
new_chunk_path = self.class.generate_queued_chunk_path(@path, @unique_id)
|
107
|
+
new_meta_path = new_chunk_path + '.meta'
|
108
|
+
|
109
|
+
write_metadata(update: false) # re-write metadata w/ finalized records
|
110
|
+
|
111
|
+
begin
|
112
|
+
file_rename(@chunk, @path, new_chunk_path, ->(new_io) { @chunk = new_io })
|
113
|
+
rescue => e
|
114
|
+
begin
|
115
|
+
file_rename(@chunk, new_chunk_path, @path, ->(new_io) { @chunk = new_io }) if File.exist?(new_chunk_path)
|
116
|
+
rescue => re
|
117
|
+
# In this point, restore buffer state is hard because previous `file_rename` failed by resource problem.
|
118
|
+
# Retry is one possible approach but it may cause livelock under limited resources or high load environment.
|
119
|
+
# So we ignore such errors for now and log better message instead.
|
120
|
+
# "Too many open files" should be fixed by proper buffer configuration and system setting.
|
121
|
+
raise "can't enqueue buffer file and failed to restore. This may causes inconsistent state: path = #{@path}, error = '#{e}', retry error = '#{re}'"
|
122
|
+
else
|
123
|
+
raise "can't enqueue buffer file: path = #{@path}, error = '#{e}'"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
begin
|
128
|
+
file_rename(@meta, @meta_path, new_meta_path, ->(new_io) { @meta = new_io })
|
129
|
+
rescue => e
|
130
|
+
begin
|
131
|
+
file_rename(@chunk, new_chunk_path, @path, ->(new_io) { @chunk = new_io }) if File.exist?(new_chunk_path)
|
132
|
+
file_rename(@meta, new_meta_path, @meta_path, ->(new_io) { @meta = new_io }) if File.exist?(new_meta_path)
|
133
|
+
rescue => re
|
134
|
+
# See above
|
135
|
+
raise "can't enqueue buffer metadata and failed to restore. This may causes inconsistent state: path = #{@meta_path}, error = '#{e}', retry error = '#{re}'"
|
136
|
+
else
|
137
|
+
raise "can't enqueue buffer metadata: path = #{@meta_path}, error = '#{e}'"
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
@path = new_chunk_path
|
142
|
+
@meta_path = new_meta_path
|
143
|
+
|
144
|
+
super
|
145
|
+
end
|
146
|
+
|
147
|
+
def close
|
148
|
+
super
|
149
|
+
size = @chunk.size
|
150
|
+
@chunk.close
|
151
|
+
@meta.close if @meta # meta may be missing if chunk is queued at first
|
152
|
+
if size == 0
|
153
|
+
File.unlink(@path, @meta_path)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def purge
|
158
|
+
super
|
159
|
+
@chunk.close
|
160
|
+
@meta.close if @meta
|
161
|
+
@bytesize = @size = @adding_bytes = @adding_size = 0
|
162
|
+
File.unlink(@path, @meta_path)
|
163
|
+
end
|
164
|
+
|
165
|
+
def read(**kwargs)
|
166
|
+
@chunk.seek(0, IO::SEEK_SET)
|
167
|
+
@chunk.read
|
168
|
+
end
|
169
|
+
|
170
|
+
def open(**kwargs, &block)
|
171
|
+
@chunk.seek(0, IO::SEEK_SET)
|
172
|
+
val = yield @chunk
|
173
|
+
@chunk.seek(0, IO::SEEK_END) if self.staged?
|
174
|
+
val
|
175
|
+
end
|
176
|
+
|
177
|
+
def self.assume_chunk_state(path)
|
178
|
+
if /\.(b|q)([0-9a-f]+)\.[^\/]*\Z/n =~ path # //n switch means explicit 'ASCII-8BIT' pattern
|
179
|
+
$1 == 'b' ? :staged : :queued
|
180
|
+
else
|
181
|
+
# files which matches to glob of buffer file pattern
|
182
|
+
# it includes files which are created by out_file
|
183
|
+
:unknown
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def self.generate_stage_chunk_path(path, unique_id)
|
188
|
+
pos = path.index('.*.')
|
189
|
+
raise "BUG: buffer chunk path on stage MUST have '.*.'" unless pos
|
190
|
+
|
191
|
+
prefix = path[0...pos]
|
192
|
+
suffix = path[(pos+3)..-1]
|
193
|
+
|
194
|
+
chunk_id = Fluent::UniqueId.hex(unique_id)
|
195
|
+
state = 'b'
|
196
|
+
"#{prefix}.#{state}#{chunk_id}.#{suffix}"
|
197
|
+
end
|
198
|
+
|
199
|
+
def self.generate_queued_chunk_path(path, unique_id)
|
200
|
+
chunk_id = Fluent::UniqueId.hex(unique_id)
|
201
|
+
if path.index(".b#{chunk_id}.")
|
202
|
+
path.sub(".b#{chunk_id}.", ".q#{chunk_id}.")
|
203
|
+
else # for unexpected cases (ex: users rename files while opened by fluentd)
|
204
|
+
path + ".q#{chunk_id}.chunk"
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
# used only for queued v0.12 buffer path
|
209
|
+
def self.unique_id_from_path(path)
|
210
|
+
if /\.(b|q)([0-9a-f]+)\.[^\/]*\Z/n =~ path # //n switch means explicit 'ASCII-8BIT' pattern
|
211
|
+
return $2.scan(/../).map{|x| x.to_i(16) }.pack('C*')
|
212
|
+
end
|
213
|
+
nil
|
214
|
+
end
|
215
|
+
|
216
|
+
def restore_metadata(bindata)
|
217
|
+
data = msgpack_unpacker(symbolize_keys: true).feed(bindata).read rescue {}
|
218
|
+
|
219
|
+
now = Time.now
|
220
|
+
|
221
|
+
@unique_id = data[:id] || self.class.unique_id_from_path(@path) || @unique_id
|
222
|
+
@size = data[:s] || 0
|
223
|
+
@created_at = Time.at(data.fetch(:c, now.to_i))
|
224
|
+
@modified_at = Time.at(data.fetch(:m, now.to_i))
|
225
|
+
|
226
|
+
@metadata.timekey = data[:timekey]
|
227
|
+
@metadata.tag = data[:tag]
|
228
|
+
@metadata.variables = data[:variables]
|
229
|
+
end
|
230
|
+
|
231
|
+
def restore_metadata_partially(chunk)
|
232
|
+
@unique_id = self.class.unique_id_from_path(chunk.path) || @unique_id
|
233
|
+
@size = 0
|
234
|
+
@created_at = chunk.ctime # birthtime isn't supported on Windows (and Travis?)
|
235
|
+
@modified_at = chunk.mtime
|
236
|
+
|
237
|
+
@metadata.timekey = nil
|
238
|
+
@metadata.tag = nil
|
239
|
+
@metadata.variables = nil
|
240
|
+
end
|
241
|
+
|
242
|
+
def write_metadata(update: true)
|
243
|
+
data = @metadata.to_h.merge({
|
244
|
+
id: @unique_id,
|
245
|
+
s: (update ? @size + @adding_size : @size),
|
246
|
+
c: @created_at.to_i,
|
247
|
+
m: (update ? Time.now : @modified_at).to_i,
|
248
|
+
})
|
249
|
+
bin = msgpack_packer.pack(data).to_s
|
250
|
+
@meta.seek(0, IO::SEEK_SET)
|
251
|
+
@meta.write(bin)
|
252
|
+
@meta.truncate(bin.bytesize)
|
253
|
+
end
|
254
|
+
|
255
|
+
def file_rename(file, old_path, new_path, callback=nil)
|
256
|
+
pos = file.pos
|
257
|
+
if Fluent.windows?
|
258
|
+
file.close
|
259
|
+
File.rename(old_path, new_path)
|
260
|
+
file = File.open(new_path, 'rb', @permission)
|
261
|
+
else
|
262
|
+
File.rename(old_path, new_path)
|
263
|
+
file.reopen(new_path, 'rb')
|
264
|
+
end
|
265
|
+
file.set_encoding(Encoding::ASCII_8BIT)
|
266
|
+
file.sync = true
|
267
|
+
file.binmode
|
268
|
+
file.pos = pos
|
269
|
+
callback.call(file) if callback
|
270
|
+
end
|
271
|
+
|
272
|
+
def create_new_chunk(path, perm)
|
273
|
+
@path = self.class.generate_stage_chunk_path(path, @unique_id)
|
274
|
+
@meta_path = @path + '.meta'
|
275
|
+
begin
|
276
|
+
@chunk = File.open(@path, 'wb+', perm)
|
277
|
+
@chunk.set_encoding(Encoding::ASCII_8BIT)
|
278
|
+
@chunk.sync = true
|
279
|
+
@chunk.binmode
|
280
|
+
rescue => e
|
281
|
+
# Here assumes "Too many open files" like recoverable error so raising BufferOverflowError.
|
282
|
+
# If other cases are possible, we will change erorr handling with proper classes.
|
283
|
+
raise BufferOverflowError, "can't create buffer file for #{path}. Stop creating buffer files: error = #{e}"
|
284
|
+
end
|
285
|
+
begin
|
286
|
+
@meta = File.open(@meta_path, 'wb', perm)
|
287
|
+
@meta.set_encoding(Encoding::ASCII_8BIT)
|
288
|
+
@meta.sync = true
|
289
|
+
@meta.binmode
|
290
|
+
write_metadata(update: false)
|
291
|
+
rescue => e
|
292
|
+
# This case is easier than enqueued!. Just removing pre-create buffer file
|
293
|
+
@chunk.close rescue nil
|
294
|
+
File.unlink(@path) rescue nil
|
295
|
+
# Same as @chunk case. See above
|
296
|
+
raise BufferOverflowError, "can't create buffer metadata for #{path}. Stop creating buffer files: error = #{e}"
|
297
|
+
end
|
298
|
+
|
299
|
+
@state = :unstaged
|
300
|
+
@bytesize = 0
|
301
|
+
@commit_position = @chunk.pos # must be 0
|
302
|
+
@adding_bytes = 0
|
303
|
+
@adding_size = 0
|
304
|
+
end
|
305
|
+
|
306
|
+
def load_existing_staged_chunk(path)
|
307
|
+
@path = path
|
308
|
+
@meta_path = @path + '.meta'
|
309
|
+
|
310
|
+
@meta = nil
|
311
|
+
# staging buffer chunk without metadata is classic buffer chunk file
|
312
|
+
# and it should be enqueued immediately
|
313
|
+
if File.exist?(@meta_path)
|
314
|
+
raise FileChunkError, "staged file chunk is empty" if File.size(@path).zero?
|
315
|
+
|
316
|
+
@chunk = File.open(@path, 'rb+')
|
317
|
+
@chunk.set_encoding(Encoding::ASCII_8BIT)
|
318
|
+
@chunk.sync = true
|
319
|
+
@chunk.seek(0, IO::SEEK_END)
|
320
|
+
@chunk.binmode
|
321
|
+
|
322
|
+
@meta = File.open(@meta_path, 'rb+')
|
323
|
+
@meta.set_encoding(Encoding::ASCII_8BIT)
|
324
|
+
@meta.sync = true
|
325
|
+
@meta.binmode
|
326
|
+
begin
|
327
|
+
restore_metadata(@meta.read)
|
328
|
+
rescue => e
|
329
|
+
@chunk.close
|
330
|
+
@meta.close
|
331
|
+
raise FileChunkError, "staged meta file is broken. #{e.message}"
|
332
|
+
end
|
333
|
+
@meta.seek(0, IO::SEEK_SET)
|
334
|
+
|
335
|
+
@state = :staged
|
336
|
+
@bytesize = @chunk.size
|
337
|
+
@commit_position = @chunk.pos
|
338
|
+
@adding_bytes = 0
|
339
|
+
@adding_size = 0
|
340
|
+
else
|
341
|
+
# classic buffer chunk - read only chunk
|
342
|
+
@chunk = File.open(@path, 'rb')
|
343
|
+
@chunk.set_encoding(Encoding::ASCII_8BIT)
|
344
|
+
@chunk.binmode
|
345
|
+
@chunk.seek(0, IO::SEEK_SET)
|
346
|
+
@state = :queued
|
347
|
+
@bytesize = @chunk.size
|
348
|
+
|
349
|
+
restore_metadata_partially(@chunk)
|
350
|
+
|
351
|
+
@commit_position = @chunk.size
|
352
|
+
@unique_id = self.class.unique_id_from_path(@path) || @unique_id
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
def load_existing_enqueued_chunk(path)
|
357
|
+
@path = path
|
358
|
+
raise FileChunkError, "enqueued file chunk is empty" if File.size(@path).zero?
|
359
|
+
|
360
|
+
@chunk = File.open(@path, 'rb')
|
361
|
+
@chunk.set_encoding(Encoding::ASCII_8BIT)
|
362
|
+
@chunk.binmode
|
363
|
+
@chunk.seek(0, IO::SEEK_SET)
|
364
|
+
@bytesize = @chunk.size
|
365
|
+
@commit_position = @chunk.size
|
366
|
+
|
367
|
+
@meta_path = @path + '.meta'
|
368
|
+
if File.readable?(@meta_path)
|
369
|
+
begin
|
370
|
+
restore_metadata(File.open(@meta_path){|f| f.set_encoding(Encoding::ASCII_8BIT); f.binmode; f.read })
|
371
|
+
rescue => e
|
372
|
+
@chunk.close
|
373
|
+
raise FileChunkError, "enqueued meta file is broken. #{e.message}"
|
374
|
+
end
|
375
|
+
else
|
376
|
+
restore_metadata_partially(@chunk)
|
377
|
+
end
|
378
|
+
@state = :queued
|
379
|
+
end
|
380
|
+
end
|
381
|
+
end
|
382
|
+
end
|
383
|
+
end
|
@@ -0,0 +1,90 @@
|
|
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
|
+
|
19
|
+
module Fluent
|
20
|
+
module Plugin
|
21
|
+
class Buffer
|
22
|
+
class MemoryChunk < Chunk
|
23
|
+
def initialize(metadata, compress: :text)
|
24
|
+
super
|
25
|
+
@chunk = ''.force_encoding(Encoding::ASCII_8BIT)
|
26
|
+
@chunk_bytes = 0
|
27
|
+
@adding_bytes = 0
|
28
|
+
@adding_size = 0
|
29
|
+
end
|
30
|
+
|
31
|
+
def concat(bulk, bulk_size)
|
32
|
+
raise "BUG: concatenating to unwritable chunk, now '#{self.state}'" unless self.writable?
|
33
|
+
|
34
|
+
bulk.force_encoding(Encoding::ASCII_8BIT)
|
35
|
+
@chunk << bulk
|
36
|
+
@adding_bytes += bulk.bytesize
|
37
|
+
@adding_size += bulk_size
|
38
|
+
true
|
39
|
+
end
|
40
|
+
|
41
|
+
def commit
|
42
|
+
@size += @adding_size
|
43
|
+
@chunk_bytes += @adding_bytes
|
44
|
+
|
45
|
+
@adding_bytes = @adding_size = 0
|
46
|
+
@modified_at = Time.now
|
47
|
+
true
|
48
|
+
end
|
49
|
+
|
50
|
+
def rollback
|
51
|
+
@chunk.slice!(@chunk_bytes, @adding_bytes)
|
52
|
+
@adding_bytes = @adding_size = 0
|
53
|
+
true
|
54
|
+
end
|
55
|
+
|
56
|
+
def bytesize
|
57
|
+
@chunk_bytes + @adding_bytes
|
58
|
+
end
|
59
|
+
|
60
|
+
def size
|
61
|
+
@size + @adding_size
|
62
|
+
end
|
63
|
+
|
64
|
+
def empty?
|
65
|
+
@chunk.empty?
|
66
|
+
end
|
67
|
+
|
68
|
+
def purge
|
69
|
+
super
|
70
|
+
@chunk = ''.force_encoding("ASCII-8BIT")
|
71
|
+
@chunk_bytes = @size = @adding_bytes = @adding_size = 0
|
72
|
+
true
|
73
|
+
end
|
74
|
+
|
75
|
+
def read(**kwargs)
|
76
|
+
@chunk
|
77
|
+
end
|
78
|
+
|
79
|
+
def open(**kwargs, &block)
|
80
|
+
StringIO.open(@chunk, &block)
|
81
|
+
end
|
82
|
+
|
83
|
+
def write_to(io, **kwargs)
|
84
|
+
# re-implementation to optimize not to create StringIO
|
85
|
+
io.write @chunk
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|