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,901 @@
|
|
1
|
+
require_relative '../helper'
|
2
|
+
|
3
|
+
# require 'fluent/command/fluentd'
|
4
|
+
# don't require it... it runs immediately
|
5
|
+
|
6
|
+
require 'fileutils'
|
7
|
+
require 'timeout'
|
8
|
+
|
9
|
+
class TestFluentdCommand < ::Test::Unit::TestCase
|
10
|
+
TMP_DIR = File.expand_path(File.dirname(__FILE__) + "/../tmp/command/fluentd#{ENV['TEST_ENV_NUMBER']}")
|
11
|
+
SUPERVISOR_PID_PATTERN = /starting fluentd-[.0-9]+ pid=(\d+)/
|
12
|
+
WORKER_PID_PATTERN = /starting fluentd worker pid=(\d+) /
|
13
|
+
|
14
|
+
setup do
|
15
|
+
FileUtils.rm_rf(TMP_DIR)
|
16
|
+
FileUtils.mkdir_p(TMP_DIR)
|
17
|
+
@supervisor_pid = nil
|
18
|
+
@worker_pids = []
|
19
|
+
end
|
20
|
+
|
21
|
+
def process_exist?(pid)
|
22
|
+
begin
|
23
|
+
r = Process.waitpid(pid, Process::WNOHANG)
|
24
|
+
return true if r.nil?
|
25
|
+
false
|
26
|
+
rescue SystemCallError
|
27
|
+
false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_conf_file(name, content, ext_enc = 'utf-8')
|
32
|
+
conf_path = File.join(TMP_DIR, name)
|
33
|
+
File.open(conf_path, "w:#{ext_enc}:utf-8") do |file|
|
34
|
+
file.write content
|
35
|
+
end
|
36
|
+
conf_path
|
37
|
+
end
|
38
|
+
|
39
|
+
def create_plugin_file(name, content)
|
40
|
+
file_path = File.join(TMP_DIR, 'plugin', name)
|
41
|
+
FileUtils.mkdir_p(File.dirname(file_path))
|
42
|
+
File.open(file_path, 'w') do |file|
|
43
|
+
file.write content
|
44
|
+
end
|
45
|
+
file_path
|
46
|
+
end
|
47
|
+
|
48
|
+
def create_cmdline(conf_path, *fluentd_options)
|
49
|
+
cmd_path = File.expand_path(File.dirname(__FILE__) + "../../../bin/fluentd")
|
50
|
+
["bundle", "exec", "ruby", cmd_path, "-c", conf_path, *fluentd_options]
|
51
|
+
end
|
52
|
+
|
53
|
+
def execute_command(cmdline, chdir=TMP_DIR)
|
54
|
+
null_stream = File.open(File::NULL, 'w')
|
55
|
+
gemfile_path = File.expand_path(File.dirname(__FILE__) + "../../../Gemfile")
|
56
|
+
|
57
|
+
env = {
|
58
|
+
"BUNDLE_GEMFILE" => gemfile_path,
|
59
|
+
}
|
60
|
+
cmdname = cmdline.shift
|
61
|
+
arg0 = "testing-fluentd"
|
62
|
+
# p(here: "executing process", env: env, cmdname: cmdname, arg0: arg0, args: cmdline)
|
63
|
+
IO.popen(env, [[cmdname, arg0], *cmdline], chdir: chdir, err: [:child, :out]) do |io|
|
64
|
+
pid = io.pid
|
65
|
+
begin
|
66
|
+
yield pid, io
|
67
|
+
# p(here: "execute command", pid: pid, worker_pids: @worker_pids)
|
68
|
+
ensure
|
69
|
+
Process.kill(:KILL, pid) rescue nil
|
70
|
+
if @supervisor_pid
|
71
|
+
Process.kill(:KILL, @supervisor_pid) rescue nil
|
72
|
+
end
|
73
|
+
@worker_pids.each do |cpid|
|
74
|
+
Process.kill(:KILL, cpid) rescue nil
|
75
|
+
end
|
76
|
+
# p(here: "execute command", pid: pid, exist: process_exist?(pid), worker_pids: @worker_pids, exists: @worker_pids.map{|i| process_exist?(i) })
|
77
|
+
Timeout.timeout(10){ sleep 0.1 while process_exist?(pid) }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
ensure
|
81
|
+
null_stream.close rescue nil
|
82
|
+
end
|
83
|
+
|
84
|
+
def assert_log_matches(cmdline, *pattern_list, patterns_not_match: [], timeout: 10)
|
85
|
+
matched = false
|
86
|
+
assert_error_msg = "matched correctly"
|
87
|
+
stdio_buf = ""
|
88
|
+
begin
|
89
|
+
execute_command(cmdline) do |pid, stdout|
|
90
|
+
begin
|
91
|
+
waiting(timeout) do
|
92
|
+
while process_exist?(pid) && !matched
|
93
|
+
readables, _, _ = IO.select([stdout], nil, nil, 1)
|
94
|
+
next unless readables
|
95
|
+
break if readables.first.eof?
|
96
|
+
|
97
|
+
buf = readables.first.readpartial(1024)
|
98
|
+
# puts buf
|
99
|
+
stdio_buf << buf
|
100
|
+
lines = stdio_buf.split("\n")
|
101
|
+
if pattern_list.all?{|ptn| lines.any?{|line| ptn.is_a?(Regexp) ? ptn.match(line) : line.include?(ptn) } }
|
102
|
+
matched = true
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
ensure
|
107
|
+
if SUPERVISOR_PID_PATTERN =~ stdio_buf
|
108
|
+
@supervisor_pid = $1.to_i
|
109
|
+
end
|
110
|
+
stdio_buf.scan(WORKER_PID_PATTERN) do |worker_pid|
|
111
|
+
@worker_pids << worker_pid.first.to_i
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
rescue Timeout::Error
|
116
|
+
assert_error_msg = "execution timeout with command out:\n" + stdio_buf
|
117
|
+
rescue => e
|
118
|
+
assert_error_msg = "unexpected error in launching fluentd: #{e.inspect}\n" + stdio_buf
|
119
|
+
end
|
120
|
+
assert matched, assert_error_msg
|
121
|
+
|
122
|
+
unless patterns_not_match.empty?
|
123
|
+
lines = stdio_buf.split("\n")
|
124
|
+
patterns_not_match.each do |ptn|
|
125
|
+
matched_wrongly = if ptn.is_a? Regexp
|
126
|
+
lines.any?{|line| ptn.match(line) }
|
127
|
+
else
|
128
|
+
lines.any?{|line| line.include?(ptn) }
|
129
|
+
end
|
130
|
+
assert_false matched_wrongly, "pattern exists in logs wrongly:\n" + stdio_buf
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def assert_fluentd_fails_to_start(cmdline, *pattern_list, timeout: 10)
|
136
|
+
# empty_list.all?{ ... } is always true
|
137
|
+
matched = false
|
138
|
+
running = false
|
139
|
+
assert_error_msg = "failed to start correctly"
|
140
|
+
stdio_buf = ""
|
141
|
+
begin
|
142
|
+
execute_command(cmdline) do |pid, stdout|
|
143
|
+
begin
|
144
|
+
waiting(timeout) do
|
145
|
+
while process_exist?(pid) && !running
|
146
|
+
readables, _, _ = IO.select([stdout], nil, nil, 1)
|
147
|
+
next unless readables
|
148
|
+
next if readables.first.eof?
|
149
|
+
|
150
|
+
stdio_buf << readables.first.readpartial(1024)
|
151
|
+
lines = stdio_buf.split("\n")
|
152
|
+
if lines.any?{|line| line.include?("fluentd worker is now running") }
|
153
|
+
running = true
|
154
|
+
end
|
155
|
+
if pattern_list.all?{|ptn| lines.any?{|line| ptn.is_a?(Regexp) ? ptn.match(line) : line.include?(ptn) } }
|
156
|
+
matched = true
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
ensure
|
161
|
+
if SUPERVISOR_PID_PATTERN =~ stdio_buf
|
162
|
+
@supervisor_pid = $1.to_i
|
163
|
+
end
|
164
|
+
stdio_buf.scan(WORKER_PID_PATTERN) do |worker_pid|
|
165
|
+
@worker_pids << worker_pid.first.to_i
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
rescue Timeout::Error
|
170
|
+
assert_error_msg = "execution timeout with command out:\n" + stdio_buf
|
171
|
+
rescue => e
|
172
|
+
assert_error_msg = "unexpected error in launching fluentd: #{e.inspect}\n" + stdio_buf
|
173
|
+
assert false, assert_error_msg
|
174
|
+
end
|
175
|
+
assert !running, "fluentd started to run incorrectly:\n" + stdio_buf
|
176
|
+
unless matched
|
177
|
+
assert_error_msg = "fluentd failed to start, without specified regular expressions:\n" + stdio_buf
|
178
|
+
end
|
179
|
+
assert matched, assert_error_msg
|
180
|
+
end
|
181
|
+
|
182
|
+
sub_test_case 'with valid configuration' do
|
183
|
+
test 'runs successfully' do
|
184
|
+
conf = <<CONF
|
185
|
+
<source>
|
186
|
+
@type dummy
|
187
|
+
@id dummy
|
188
|
+
@label @dummydata
|
189
|
+
tag dummy
|
190
|
+
dummy {"message": "yay!"}
|
191
|
+
</source>
|
192
|
+
<label @dummydata>
|
193
|
+
<match dummy>
|
194
|
+
@type null
|
195
|
+
@id blackhole
|
196
|
+
</match>
|
197
|
+
</label>
|
198
|
+
CONF
|
199
|
+
conf_path = create_conf_file('valid.conf', conf)
|
200
|
+
assert File.exist?(conf_path)
|
201
|
+
|
202
|
+
assert_log_matches(create_cmdline(conf_path), "fluentd worker is now running", 'worker=0')
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
sub_test_case 'with --conf-encoding' do
|
207
|
+
test 'runs successfully' do
|
208
|
+
conf = <<CONF
|
209
|
+
# テスト
|
210
|
+
<source>
|
211
|
+
@type dummy
|
212
|
+
tag dummy
|
213
|
+
dummy {"message": "yay!"}
|
214
|
+
</source>
|
215
|
+
<match dummy>
|
216
|
+
@type null
|
217
|
+
</match>
|
218
|
+
CONF
|
219
|
+
conf_path = create_conf_file('shift_jis.conf', conf, 'shift_jis')
|
220
|
+
assert_log_matches(create_cmdline(conf_path, '--conf-encoding', 'shift_jis'), "fluentd worker is now running", 'worker=0')
|
221
|
+
end
|
222
|
+
|
223
|
+
test 'failed to run by invalid encoding' do
|
224
|
+
conf = <<CONF
|
225
|
+
# テスト
|
226
|
+
<source>
|
227
|
+
@type dummy
|
228
|
+
tag dummy
|
229
|
+
dummy {"message": "yay!"}
|
230
|
+
</source>
|
231
|
+
<match dummy>
|
232
|
+
@type null
|
233
|
+
</match>
|
234
|
+
CONF
|
235
|
+
conf_path = create_conf_file('shift_jis.conf', conf, 'shift_jis')
|
236
|
+
assert_fluentd_fails_to_start(create_cmdline(conf_path), "invalid byte sequence in UTF-8")
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
sub_test_case 'with system configuration about root directory' do
|
241
|
+
setup do
|
242
|
+
@root_path = File.join(TMP_DIR, "rootpath")
|
243
|
+
FileUtils.rm_rf(@root_path)
|
244
|
+
@conf = <<CONF
|
245
|
+
<system>
|
246
|
+
root_dir #{@root_path}
|
247
|
+
</system>
|
248
|
+
<source>
|
249
|
+
@type dummy
|
250
|
+
@id dummy
|
251
|
+
@label @dummydata
|
252
|
+
tag dummy
|
253
|
+
dummy {"message": "yay!"}
|
254
|
+
</source>
|
255
|
+
<label @dummydata>
|
256
|
+
<match dummy>
|
257
|
+
@type null
|
258
|
+
@id blackhole
|
259
|
+
</match>
|
260
|
+
</label>
|
261
|
+
CONF
|
262
|
+
end
|
263
|
+
|
264
|
+
test 'use the specified existing directory as root' do
|
265
|
+
FileUtils.mkdir_p(@root_path)
|
266
|
+
conf_path = create_conf_file('existing_root_dir.conf', @conf)
|
267
|
+
assert Dir.exist?(@root_path)
|
268
|
+
|
269
|
+
assert_log_matches(create_cmdline(conf_path), "fluentd worker is now running", 'worker=0')
|
270
|
+
end
|
271
|
+
|
272
|
+
test 'creates the specified root directory if missing' do
|
273
|
+
conf_path = create_conf_file('missing_root_dir.conf', @conf)
|
274
|
+
assert_false Dir.exist?(@root_path)
|
275
|
+
|
276
|
+
assert_log_matches(create_cmdline(conf_path), "fluentd worker is now running", 'worker=0')
|
277
|
+
assert Dir.exist?(@root_path)
|
278
|
+
end
|
279
|
+
|
280
|
+
test 'fails to launch fluentd if specified root path is invalid path for directory' do
|
281
|
+
File.open(@root_path, 'w') do |_|
|
282
|
+
# create file and close it
|
283
|
+
end
|
284
|
+
conf_path = create_conf_file('existing_root_dir.conf', @conf)
|
285
|
+
|
286
|
+
assert_fluentd_fails_to_start(
|
287
|
+
create_cmdline(conf_path),
|
288
|
+
"non directory entry exists:#{@root_path} (Fluent::InvalidRootDirectory)",
|
289
|
+
)
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
sub_test_case 'configured to route log events to plugins' do
|
294
|
+
setup do
|
295
|
+
@basic_conf = <<CONF
|
296
|
+
<source>
|
297
|
+
@type dummy
|
298
|
+
@id dummy
|
299
|
+
tag dummy
|
300
|
+
dummy {"message": "yay!"}
|
301
|
+
</source>
|
302
|
+
<match dummy>
|
303
|
+
@type null
|
304
|
+
@id blackhole
|
305
|
+
</match>
|
306
|
+
CONF
|
307
|
+
end
|
308
|
+
|
309
|
+
test 'by top level <match fluent.*> section' do
|
310
|
+
conf = @basic_conf + <<CONF
|
311
|
+
<match fluent.**>
|
312
|
+
@type stdout
|
313
|
+
</match>
|
314
|
+
CONF
|
315
|
+
conf_path = create_conf_file('logevent_1.conf', conf)
|
316
|
+
assert_log_matches(
|
317
|
+
create_cmdline(conf_path),
|
318
|
+
"fluentd worker is now running",
|
319
|
+
'fluent.info: {"worker":0,"message":"fluentd worker is now running worker=0"}',
|
320
|
+
patterns_not_match: ['[warn]: some tags for log events are not defined (to be ignored) tags=["fluent.trace", "fluent.debug"]'],
|
321
|
+
)
|
322
|
+
end
|
323
|
+
|
324
|
+
test 'by top level <match> section with warning for missing log levels (and warnings for each log event records)' do
|
325
|
+
conf = @basic_conf + <<CONF
|
326
|
+
<match fluent.warn fluent.error fluent.fatal>
|
327
|
+
@type stdout
|
328
|
+
</match>
|
329
|
+
CONF
|
330
|
+
conf_path = create_conf_file('logevent_2.conf', conf)
|
331
|
+
assert_log_matches(
|
332
|
+
create_cmdline(conf_path),
|
333
|
+
"fluentd worker is now running",
|
334
|
+
'[warn]: #0 match for some tags of log events are not defined (to be ignored) tags=["fluent.trace", "fluent.debug", "fluent.info"]',
|
335
|
+
'[warn]: #0 no patterns matched tag="fluent.info"',
|
336
|
+
)
|
337
|
+
end
|
338
|
+
|
339
|
+
test 'by <label @FLUENT_LOG> section' do
|
340
|
+
conf = @basic_conf + <<CONF
|
341
|
+
<label @FLUENT_LOG>
|
342
|
+
<match **>
|
343
|
+
@type stdout
|
344
|
+
</match>
|
345
|
+
</label>
|
346
|
+
CONF
|
347
|
+
conf_path = create_conf_file('logevent_3.conf', conf)
|
348
|
+
assert_log_matches(
|
349
|
+
create_cmdline(conf_path),
|
350
|
+
"fluentd worker is now running",
|
351
|
+
'fluent.info: {"worker":0,"message":"fluentd worker is now running worker=0"}',
|
352
|
+
patterns_not_match: ['[warn]: some tags for log events are not defined (to be ignored)'],
|
353
|
+
)
|
354
|
+
end
|
355
|
+
|
356
|
+
test 'by <label> section with warning for missing log levels' do
|
357
|
+
conf = @basic_conf + <<CONF
|
358
|
+
<label @FLUENT_LOG>
|
359
|
+
<match fluent.{trace,debug}>
|
360
|
+
@type null
|
361
|
+
</match>
|
362
|
+
<match fluent.warn fluent.error>
|
363
|
+
@type stdout
|
364
|
+
</match>
|
365
|
+
</label>
|
366
|
+
CONF
|
367
|
+
conf_path = create_conf_file('logevent_4.conf', conf)
|
368
|
+
assert_log_matches(
|
369
|
+
create_cmdline(conf_path),
|
370
|
+
"fluentd worker is now running",
|
371
|
+
'[warn]: #0 match for some tags of log events are not defined (to be ignored) tags=["fluent.info", "fluent.fatal"]',
|
372
|
+
patterns_not_match: ['[warn]: no patterns matched tag="fluent.info"'],
|
373
|
+
)
|
374
|
+
end
|
375
|
+
end
|
376
|
+
|
377
|
+
sub_test_case 'configured to suppress configuration dump' do
|
378
|
+
setup do
|
379
|
+
@basic_conf = <<CONF
|
380
|
+
<source>
|
381
|
+
@type dummy
|
382
|
+
@id dummy
|
383
|
+
@label @dummydata
|
384
|
+
tag dummy
|
385
|
+
dummy {"message": "yay!"}
|
386
|
+
</source>
|
387
|
+
<label @dummydata>
|
388
|
+
<match dummy>
|
389
|
+
@type null
|
390
|
+
@id blackhole
|
391
|
+
</match>
|
392
|
+
</label>
|
393
|
+
CONF
|
394
|
+
end
|
395
|
+
|
396
|
+
test 'configured by system config' do
|
397
|
+
conf = <<SYSTEM + @basic_conf
|
398
|
+
<system>
|
399
|
+
suppress_config_dump
|
400
|
+
</system>
|
401
|
+
SYSTEM
|
402
|
+
conf_path = create_conf_file('suppress_conf_dump_1.conf', conf)
|
403
|
+
assert_log_matches(create_cmdline(conf_path), "fluentd worker is now running", patterns_not_match: ["tag dummy"])
|
404
|
+
end
|
405
|
+
|
406
|
+
test 'configured by command line option' do
|
407
|
+
conf_path = create_conf_file('suppress_conf_dump_2.conf', @basic_conf)
|
408
|
+
assert_log_matches(create_cmdline(conf_path, '--suppress-config-dump'), "fluentd worker is now running", patterns_not_match: ["tag dummy"])
|
409
|
+
end
|
410
|
+
|
411
|
+
test 'configured as false by system config, but overridden as true by command line option' do
|
412
|
+
conf = <<SYSTEM + @basic_conf
|
413
|
+
<system>
|
414
|
+
suppress_config_dump false
|
415
|
+
</system>
|
416
|
+
SYSTEM
|
417
|
+
conf_path = create_conf_file('suppress_conf_dump_3.conf', conf)
|
418
|
+
assert_log_matches(create_cmdline(conf_path, '--suppress-config-dump'), "fluentd worker is now running", patterns_not_match: ["tag dummy"])
|
419
|
+
end
|
420
|
+
end
|
421
|
+
|
422
|
+
sub_test_case 'configuration with wrong plugin type' do
|
423
|
+
test 'failed to start' do
|
424
|
+
conf = <<CONF
|
425
|
+
<source>
|
426
|
+
@type
|
427
|
+
@id dummy
|
428
|
+
@label @dummydata
|
429
|
+
tag dummy
|
430
|
+
dummy {"message": "yay!"}
|
431
|
+
</source>
|
432
|
+
<label @dummydata>
|
433
|
+
<match dummy>
|
434
|
+
@type null
|
435
|
+
@id blackhole
|
436
|
+
</match>
|
437
|
+
</label>
|
438
|
+
CONF
|
439
|
+
conf_path = create_conf_file('type_missing.conf', conf)
|
440
|
+
assert File.exist?(conf_path)
|
441
|
+
|
442
|
+
assert_fluentd_fails_to_start(
|
443
|
+
create_cmdline(conf_path),
|
444
|
+
"config error",
|
445
|
+
"error=\"Unknown input plugin ''. Run 'gem search -rd fluent-plugin' to find plugins",
|
446
|
+
)
|
447
|
+
end
|
448
|
+
end
|
449
|
+
|
450
|
+
sub_test_case 'configuration to load plugin file with syntax error' do
|
451
|
+
test 'failed to start' do
|
452
|
+
script = "require 'fluent/plugin/input'\n"
|
453
|
+
script << "module Fluent::Plugin\n"
|
454
|
+
script << " class BuggyInput < Input\n"
|
455
|
+
script << " Fluent::Plugin.register_input('buggy', self)\n"
|
456
|
+
script << " end\n"
|
457
|
+
plugin_path = create_plugin_file('in_buggy.rb', script)
|
458
|
+
|
459
|
+
conf = <<CONF
|
460
|
+
<source>
|
461
|
+
@type buggy
|
462
|
+
@id dummy
|
463
|
+
@label @dummydata
|
464
|
+
tag dummy
|
465
|
+
dummy {"message": "yay!"}
|
466
|
+
</source>
|
467
|
+
<label @dummydata>
|
468
|
+
<match dummy>
|
469
|
+
@type null
|
470
|
+
@id blackhole
|
471
|
+
</match>
|
472
|
+
</label>
|
473
|
+
CONF
|
474
|
+
conf_path = create_conf_file('buggy_plugin.conf', conf)
|
475
|
+
assert File.exist?(conf_path)
|
476
|
+
|
477
|
+
assert_fluentd_fails_to_start(
|
478
|
+
create_cmdline(conf_path, "-p", File.dirname(plugin_path)),
|
479
|
+
"in_buggy.rb:5: syntax error, unexpected end-of-input, expecting"
|
480
|
+
)
|
481
|
+
end
|
482
|
+
end
|
483
|
+
|
484
|
+
sub_test_case 'configuration to load plugin which raises unrecoverable error in #start' do
|
485
|
+
test 'failed to start' do
|
486
|
+
script = "require 'fluent/plugin/input'\n"
|
487
|
+
script << "require 'fluent/error'\n"
|
488
|
+
script << "module Fluent::Plugin\n"
|
489
|
+
script << " class CrashingInput < Input\n"
|
490
|
+
script << " Fluent::Plugin.register_input('crashing', self)\n"
|
491
|
+
script << " def start\n"
|
492
|
+
script << " raise Fluent::UnrecoverableError"
|
493
|
+
script << " end\n"
|
494
|
+
script << " end\n"
|
495
|
+
script << "end\n"
|
496
|
+
plugin_path = create_plugin_file('in_crashing.rb', script)
|
497
|
+
|
498
|
+
conf = <<CONF
|
499
|
+
<source>
|
500
|
+
@type crashing
|
501
|
+
@id dummy
|
502
|
+
@label @dummydata
|
503
|
+
tag dummy
|
504
|
+
dummy {"message": "yay!"}
|
505
|
+
</source>
|
506
|
+
<label @dummydata>
|
507
|
+
<match dummy>
|
508
|
+
@type null
|
509
|
+
@id blackhole
|
510
|
+
</match>
|
511
|
+
</label>
|
512
|
+
CONF
|
513
|
+
conf_path = create_conf_file('crashing_plugin.conf', conf)
|
514
|
+
assert File.exist?(conf_path)
|
515
|
+
|
516
|
+
assert_fluentd_fails_to_start(
|
517
|
+
create_cmdline(conf_path, "-p", File.dirname(plugin_path)),
|
518
|
+
'unexpected error error_class=Fluent::UnrecoverableError error="an unrecoverable error occurs in Fluentd process"',
|
519
|
+
)
|
520
|
+
end
|
521
|
+
end
|
522
|
+
|
523
|
+
sub_test_case 'configured to run 2 workers' do
|
524
|
+
setup do
|
525
|
+
@root_path = File.join(TMP_DIR, "rootpath")
|
526
|
+
FileUtils.rm_rf(@root_path)
|
527
|
+
FileUtils.mkdir_p(@root_path)
|
528
|
+
end
|
529
|
+
|
530
|
+
test 'success to start the number of workers specified in configuration' do
|
531
|
+
conf = <<'CONF'
|
532
|
+
<system>
|
533
|
+
workers 2
|
534
|
+
root_dir #{@root_path}
|
535
|
+
</system>
|
536
|
+
<source>
|
537
|
+
@type dummy
|
538
|
+
@id "dummy#{worker_id}" # check worker_id works or not with actual command
|
539
|
+
@label @dummydata
|
540
|
+
tag dummy
|
541
|
+
dummy {"message": "yay!"}
|
542
|
+
</source>
|
543
|
+
<label @dummydata>
|
544
|
+
<match dummy>
|
545
|
+
@type null
|
546
|
+
@id blackhole
|
547
|
+
</match>
|
548
|
+
</label>
|
549
|
+
CONF
|
550
|
+
conf_path = create_conf_file('workers1.conf', conf)
|
551
|
+
assert Dir.exist?(@root_path)
|
552
|
+
|
553
|
+
assert_log_matches(
|
554
|
+
create_cmdline(conf_path),
|
555
|
+
"#0 fluentd worker is now running worker=0",
|
556
|
+
"#1 fluentd worker is now running worker=1"
|
557
|
+
)
|
558
|
+
end
|
559
|
+
|
560
|
+
test 'success to start the number of workers specified by command line option' do
|
561
|
+
conf = <<CONF
|
562
|
+
<system>
|
563
|
+
root_dir #{@root_path}
|
564
|
+
</system>
|
565
|
+
<source>
|
566
|
+
@type dummy
|
567
|
+
@id dummy
|
568
|
+
@label @dummydata
|
569
|
+
tag dummy
|
570
|
+
dummy {"message": "yay!"}
|
571
|
+
</source>
|
572
|
+
<label @dummydata>
|
573
|
+
<match dummy>
|
574
|
+
@type null
|
575
|
+
@id blackhole
|
576
|
+
</match>
|
577
|
+
</label>
|
578
|
+
CONF
|
579
|
+
conf_path = create_conf_file('workers2.conf', conf)
|
580
|
+
assert_log_matches(
|
581
|
+
create_cmdline(conf_path, '--workers', '2'),
|
582
|
+
"#0 fluentd worker is now running worker=0",
|
583
|
+
"#1 fluentd worker is now running worker=1"
|
584
|
+
)
|
585
|
+
end
|
586
|
+
|
587
|
+
test 'failed to start workers when configured plugins do not support multi worker configuration' do
|
588
|
+
script = "require 'fluent/plugin/input'\n"
|
589
|
+
script << "module Fluent::Plugin\n"
|
590
|
+
script << " class SingleInput < Input\n"
|
591
|
+
script << " Fluent::Plugin.register_input('single', self)\n"
|
592
|
+
script << " def multi_workers_ready?\n"
|
593
|
+
script << " false\n"
|
594
|
+
script << " end\n"
|
595
|
+
script << " end\n"
|
596
|
+
script << "end\n"
|
597
|
+
plugin_path = create_plugin_file('in_single.rb', script)
|
598
|
+
|
599
|
+
conf = <<CONF
|
600
|
+
<system>
|
601
|
+
workers 2
|
602
|
+
</system>
|
603
|
+
<source>
|
604
|
+
@type single
|
605
|
+
@id single
|
606
|
+
@label @dummydata
|
607
|
+
</source>
|
608
|
+
<label @dummydata>
|
609
|
+
<match dummy>
|
610
|
+
@type null
|
611
|
+
@id blackhole
|
612
|
+
</match>
|
613
|
+
</label>
|
614
|
+
CONF
|
615
|
+
conf_path = create_conf_file('workers_invalid1.conf', conf)
|
616
|
+
assert_fluentd_fails_to_start(
|
617
|
+
create_cmdline(conf_path, "-p", File.dirname(plugin_path)),
|
618
|
+
"Plugin 'single' does not support multi workers configuration (Fluent::Plugin::SingleInput)",
|
619
|
+
)
|
620
|
+
end
|
621
|
+
|
622
|
+
test 'failed to start workers when file buffer is configured in non-workers way' do
|
623
|
+
conf = <<CONF
|
624
|
+
<system>
|
625
|
+
workers 2
|
626
|
+
</system>
|
627
|
+
<source>
|
628
|
+
@type single
|
629
|
+
@id single
|
630
|
+
@label @dummydata
|
631
|
+
</source>
|
632
|
+
<label @dummydata>
|
633
|
+
<match dummy>
|
634
|
+
@type null
|
635
|
+
@id blackhole
|
636
|
+
<buffer>
|
637
|
+
@type file
|
638
|
+
path #{File.join(@root_path, "buf", "file.*.log")}
|
639
|
+
</buffer>
|
640
|
+
</match>
|
641
|
+
</label>
|
642
|
+
CONF
|
643
|
+
conf_path = create_conf_file('workers_invalid2.conf', conf)
|
644
|
+
assert_fluentd_fails_to_start(
|
645
|
+
create_cmdline(conf_path),
|
646
|
+
"[blackhole] file buffer with multi workers should be configured to use directory 'path', or system root_dir and plugin id",
|
647
|
+
"config error file=\"#{conf_path}\" error_class=Fluent::ConfigError error=\"Plugin 'file' does not support multi workers configuration (Fluent::Plugin::FileBuffer)\"",
|
648
|
+
)
|
649
|
+
end
|
650
|
+
|
651
|
+
test 'failed to start workers when configured plugins as children of MultiOutput do not support multi worker configuration' do
|
652
|
+
script = <<-EOC
|
653
|
+
require 'fluent/plugin/output'
|
654
|
+
module Fluent::Plugin
|
655
|
+
class SingleOutput < Output
|
656
|
+
Fluent::Plugin.register_output('single', self)
|
657
|
+
def multi_workers_ready?
|
658
|
+
false
|
659
|
+
end
|
660
|
+
def write(chunk)
|
661
|
+
end
|
662
|
+
end
|
663
|
+
end
|
664
|
+
EOC
|
665
|
+
plugin_path = create_plugin_file('out_single.rb', script)
|
666
|
+
|
667
|
+
conf = <<CONF
|
668
|
+
<system>
|
669
|
+
workers 2
|
670
|
+
</system>
|
671
|
+
<source>
|
672
|
+
@type single
|
673
|
+
@id single
|
674
|
+
@label @dummydata
|
675
|
+
</source>
|
676
|
+
<label @dummydata>
|
677
|
+
<match dummy>
|
678
|
+
@type copy
|
679
|
+
<store>
|
680
|
+
@type single
|
681
|
+
</store>
|
682
|
+
<store>
|
683
|
+
@type single
|
684
|
+
</store>
|
685
|
+
</match>
|
686
|
+
</label>
|
687
|
+
CONF
|
688
|
+
conf_path = create_conf_file('workers_invalid3.conf', conf)
|
689
|
+
assert_fluentd_fails_to_start(
|
690
|
+
create_cmdline(conf_path, "-p", File.dirname(plugin_path)),
|
691
|
+
"Plugin 'single' does not support multi workers configuration (Fluent::Plugin::SingleOutput)",
|
692
|
+
)
|
693
|
+
end
|
694
|
+
|
695
|
+
test 'success to start a worker with worker specific configuration' do
|
696
|
+
conf = <<CONF
|
697
|
+
<system>
|
698
|
+
workers 2
|
699
|
+
root_dir #{@root_path}
|
700
|
+
</system>
|
701
|
+
<source>
|
702
|
+
@type dummy
|
703
|
+
@id dummy
|
704
|
+
@label @dummydata
|
705
|
+
tag dummy
|
706
|
+
dummy {"message": "yay!"}
|
707
|
+
</source>
|
708
|
+
<worker 1>
|
709
|
+
<source>
|
710
|
+
@type dummy
|
711
|
+
@id dummy_in_worker
|
712
|
+
@label @dummydata
|
713
|
+
tag dummy
|
714
|
+
dummy {"message": "yay!"}
|
715
|
+
</source>
|
716
|
+
</worker>
|
717
|
+
<label @dummydata>
|
718
|
+
<match dummy>
|
719
|
+
@type null
|
720
|
+
@id blackhole
|
721
|
+
</match>
|
722
|
+
</label>
|
723
|
+
CONF
|
724
|
+
conf_path = create_conf_file('worker_section0.conf', conf)
|
725
|
+
assert Dir.exist?(@root_path)
|
726
|
+
|
727
|
+
assert_log_matches(
|
728
|
+
create_cmdline(conf_path),
|
729
|
+
"#0 fluentd worker is now running worker=0",
|
730
|
+
"#1 fluentd worker is now running worker=1",
|
731
|
+
/(?!#\d) adding source type="dummy"/,
|
732
|
+
'#1 adding source type="dummy"'
|
733
|
+
)
|
734
|
+
end
|
735
|
+
|
736
|
+
test 'success to start workers when configured plugins only for specific worker do not support multi worker configuration' do
|
737
|
+
script = <<-EOC
|
738
|
+
require 'fluent/plugin/input'
|
739
|
+
module Fluent::Plugin
|
740
|
+
class SingleInput < Input
|
741
|
+
Fluent::Plugin.register_input('single', self)
|
742
|
+
def multi_workers_ready?
|
743
|
+
false
|
744
|
+
end
|
745
|
+
end
|
746
|
+
end
|
747
|
+
EOC
|
748
|
+
plugin_path = create_plugin_file('in_single.rb', script)
|
749
|
+
|
750
|
+
conf = <<CONF
|
751
|
+
<system>
|
752
|
+
workers 2
|
753
|
+
</system>
|
754
|
+
<worker 1>
|
755
|
+
<source>
|
756
|
+
@type single
|
757
|
+
@id single
|
758
|
+
@label @dummydata
|
759
|
+
</source>
|
760
|
+
</worker>
|
761
|
+
<label @dummydata>
|
762
|
+
<match dummy>
|
763
|
+
@type null
|
764
|
+
@id blackhole
|
765
|
+
</match>
|
766
|
+
</label>
|
767
|
+
CONF
|
768
|
+
conf_path = create_conf_file('worker_section1.conf', conf)
|
769
|
+
assert Dir.exist?(@root_path)
|
770
|
+
|
771
|
+
assert_log_matches(
|
772
|
+
create_cmdline(conf_path, "-p", File.dirname(plugin_path)),
|
773
|
+
"#0 fluentd worker is now running worker=0",
|
774
|
+
"#1 fluentd worker is now running worker=1",
|
775
|
+
'#1 adding source type="single"'
|
776
|
+
)
|
777
|
+
end
|
778
|
+
|
779
|
+
test 'success to start workers when file buffer is configured in non-workers way only for specific worker' do
|
780
|
+
conf = <<CONF
|
781
|
+
<system>
|
782
|
+
workers 2
|
783
|
+
</system>
|
784
|
+
<source>
|
785
|
+
@type dummy
|
786
|
+
@id dummy
|
787
|
+
tag dummy
|
788
|
+
dummy {"message": "yay!"}
|
789
|
+
</source>
|
790
|
+
<worker 1>
|
791
|
+
<match dummy>
|
792
|
+
@type null
|
793
|
+
@id blackhole
|
794
|
+
<buffer>
|
795
|
+
@type file
|
796
|
+
path #{File.join(@root_path, "buf", "file.*.log")}
|
797
|
+
</buffer>
|
798
|
+
</match>
|
799
|
+
</worker>
|
800
|
+
CONF
|
801
|
+
conf_path = create_conf_file('worker_section2.conf', conf)
|
802
|
+
assert_log_matches(
|
803
|
+
create_cmdline(conf_path),
|
804
|
+
"#0 fluentd worker is now running worker=0",
|
805
|
+
"#1 fluentd worker is now running worker=1",
|
806
|
+
'#1 adding match pattern="dummy" type="null"'
|
807
|
+
)
|
808
|
+
end
|
809
|
+
|
810
|
+
test 'success to start workers when configured plugins as a chidren of MultiOutput only for specific worker do not support multi worker configuration' do
|
811
|
+
script = <<-EOC
|
812
|
+
require 'fluent/plugin/output'
|
813
|
+
module Fluent::Plugin
|
814
|
+
class SingleOutput < Output
|
815
|
+
Fluent::Plugin.register_output('single', self)
|
816
|
+
def multi_workers_ready?
|
817
|
+
false
|
818
|
+
end
|
819
|
+
def write(chunk)
|
820
|
+
end
|
821
|
+
end
|
822
|
+
end
|
823
|
+
EOC
|
824
|
+
plugin_path = create_plugin_file('out_single.rb', script)
|
825
|
+
|
826
|
+
conf = <<CONF
|
827
|
+
<system>
|
828
|
+
workers 2
|
829
|
+
</system>
|
830
|
+
<source>
|
831
|
+
@type dummy
|
832
|
+
@id dummy
|
833
|
+
tag dummy
|
834
|
+
dummy {"message": "yay!"}
|
835
|
+
</source>
|
836
|
+
<worker 1>
|
837
|
+
<match dummy>
|
838
|
+
@type copy
|
839
|
+
<store>
|
840
|
+
@type single
|
841
|
+
</store>
|
842
|
+
<store>
|
843
|
+
@type single
|
844
|
+
</store>
|
845
|
+
</match>
|
846
|
+
</worker>
|
847
|
+
CONF
|
848
|
+
conf_path = create_conf_file('worker_section3.conf', conf)
|
849
|
+
assert_log_matches(
|
850
|
+
create_cmdline(conf_path, "-p", File.dirname(plugin_path)),
|
851
|
+
"#0 fluentd worker is now running worker=0",
|
852
|
+
"#1 fluentd worker is now running worker=1",
|
853
|
+
'#1 adding match pattern="dummy" type="copy"'
|
854
|
+
)
|
855
|
+
end
|
856
|
+
end
|
857
|
+
|
858
|
+
sub_test_case 'config dump' do
|
859
|
+
test 'all secret parameters in worker section is sealed' do
|
860
|
+
script = <<-EOC
|
861
|
+
require 'fluent/plugin/input'
|
862
|
+
module Fluent::Plugin
|
863
|
+
class FakeInput < Input
|
864
|
+
Fluent::Plugin.register_input('fake', self)
|
865
|
+
config_param :secret, :string, secret: true
|
866
|
+
end
|
867
|
+
end
|
868
|
+
EOC
|
869
|
+
plugin_path = create_plugin_file('in_fake.rb', script)
|
870
|
+
|
871
|
+
conf = <<CONF
|
872
|
+
<system>
|
873
|
+
workers 2
|
874
|
+
</system>
|
875
|
+
<worker 0>
|
876
|
+
<source>
|
877
|
+
@type fake
|
878
|
+
secret secret0
|
879
|
+
</source>
|
880
|
+
<match>
|
881
|
+
@type null
|
882
|
+
</match>
|
883
|
+
</worker>
|
884
|
+
<worker 1>
|
885
|
+
<source>
|
886
|
+
@type fake
|
887
|
+
secret secret1
|
888
|
+
</source>
|
889
|
+
<match>
|
890
|
+
@type null
|
891
|
+
</match>
|
892
|
+
</worker>
|
893
|
+
CONF
|
894
|
+
conf_path = create_conf_file('secret_in_worker.conf', conf)
|
895
|
+
assert File.exist?(conf_path)
|
896
|
+
|
897
|
+
assert_log_matches(create_cmdline(conf_path, "-p", File.dirname(plugin_path)),
|
898
|
+
"secret xxxxxx", patterns_not_match: ["secret secret0", "secret secret1"])
|
899
|
+
end
|
900
|
+
end
|
901
|
+
end
|