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,364 @@
|
|
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_helper/thread'
|
18
|
+
require 'fluent/plugin_helper/timer'
|
19
|
+
require 'fluent/clock'
|
20
|
+
|
21
|
+
require 'open3'
|
22
|
+
require 'timeout'
|
23
|
+
|
24
|
+
module Fluent
|
25
|
+
module PluginHelper
|
26
|
+
module ChildProcess
|
27
|
+
include Fluent::PluginHelper::Thread
|
28
|
+
include Fluent::PluginHelper::Timer
|
29
|
+
|
30
|
+
CHILD_PROCESS_LOOP_CHECK_INTERVAL = 0.2 # sec
|
31
|
+
CHILD_PROCESS_DEFAULT_EXIT_TIMEOUT = 10 # sec
|
32
|
+
CHILD_PROCESS_DEFAULT_KILL_TIMEOUT = 60 # sec
|
33
|
+
|
34
|
+
MODE_PARAMS = [:read, :write, :stderr, :read_with_stderr]
|
35
|
+
STDERR_OPTIONS = [:discard, :connect]
|
36
|
+
|
37
|
+
# stop : mark callback thread as stopped
|
38
|
+
# shutdown : close write IO to child processes (STDIN of child processes), send TERM (KILL for Windows) to all child processes
|
39
|
+
# close : send KILL to all child processes
|
40
|
+
# terminate: [-]
|
41
|
+
|
42
|
+
attr_reader :_child_process_processes # for tests
|
43
|
+
|
44
|
+
def child_process_running?
|
45
|
+
# checker for code in callback of child_process_execute
|
46
|
+
::Thread.current[:_fluentd_plugin_helper_child_process_running] || false
|
47
|
+
end
|
48
|
+
|
49
|
+
def child_process_id
|
50
|
+
::Thread.current[:_fluentd_plugin_helper_child_process_pid]
|
51
|
+
end
|
52
|
+
|
53
|
+
def child_process_exist?(pid)
|
54
|
+
pinfo = @_child_process_processes[pid]
|
55
|
+
return false unless pinfo
|
56
|
+
|
57
|
+
return false if pinfo.exit_status
|
58
|
+
|
59
|
+
true
|
60
|
+
end
|
61
|
+
|
62
|
+
# on_exit_callback = ->(status){ ... }
|
63
|
+
# status is an instance of Process::Status
|
64
|
+
# On Windows, exitstatus=0 and termsig=nil even when child process was killed.
|
65
|
+
def child_process_execute(
|
66
|
+
title, command,
|
67
|
+
arguments: nil, subprocess_name: nil, interval: nil, immediate: false, parallel: false,
|
68
|
+
mode: [:read, :write], stderr: :discard, env: {}, unsetenv: false, chdir: nil,
|
69
|
+
internal_encoding: 'utf-8', external_encoding: 'ascii-8bit', scrub: true, replace_string: nil,
|
70
|
+
wait_timeout: nil, on_exit_callback: nil,
|
71
|
+
&block
|
72
|
+
)
|
73
|
+
raise ArgumentError, "BUG: title must be a symbol" unless title.is_a? Symbol
|
74
|
+
raise ArgumentError, "BUG: arguments required if subprocess name is replaced" if subprocess_name && !arguments
|
75
|
+
|
76
|
+
mode ||= []
|
77
|
+
mode = [] unless block
|
78
|
+
raise ArgumentError, "BUG: invalid mode specification" unless mode.all?{|m| MODE_PARAMS.include?(m) }
|
79
|
+
raise ArgumentError, "BUG: read_with_stderr is exclusive with :read and :stderr" if mode.include?(:read_with_stderr) && (mode.include?(:read) || mode.include?(:stderr))
|
80
|
+
raise ArgumentError, "BUG: invalid stderr handling specification" unless STDERR_OPTIONS.include?(stderr)
|
81
|
+
|
82
|
+
raise ArgumentError, "BUG: number of block arguments are different from size of mode" if block && block.arity != mode.size
|
83
|
+
|
84
|
+
running = false
|
85
|
+
callback = ->(*args) {
|
86
|
+
running = true
|
87
|
+
begin
|
88
|
+
block && block.call(*args)
|
89
|
+
ensure
|
90
|
+
running = false
|
91
|
+
end
|
92
|
+
}
|
93
|
+
|
94
|
+
retval = nil
|
95
|
+
execute_child_process = ->(){
|
96
|
+
child_process_execute_once(
|
97
|
+
title, command, arguments,
|
98
|
+
subprocess_name, mode, stderr, env, unsetenv, chdir,
|
99
|
+
internal_encoding, external_encoding, scrub, replace_string,
|
100
|
+
wait_timeout, on_exit_callback,
|
101
|
+
&callback
|
102
|
+
)
|
103
|
+
}
|
104
|
+
|
105
|
+
if immediate || !interval
|
106
|
+
retval = execute_child_process.call
|
107
|
+
end
|
108
|
+
|
109
|
+
if interval
|
110
|
+
timer_execute(:child_process_execute, interval, repeat: true) do
|
111
|
+
if !parallel && running
|
112
|
+
log.warn "previous child process is still running. skipped.", title: title, command: command, arguments: arguments, interval: interval, parallel: parallel
|
113
|
+
else
|
114
|
+
execute_child_process.call
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
retval # nil if interval
|
120
|
+
end
|
121
|
+
|
122
|
+
def initialize
|
123
|
+
super
|
124
|
+
# plugins MAY configure this parameter
|
125
|
+
@_child_process_exit_timeout = CHILD_PROCESS_DEFAULT_EXIT_TIMEOUT
|
126
|
+
@_child_process_kill_timeout = CHILD_PROCESS_DEFAULT_KILL_TIMEOUT
|
127
|
+
@_child_process_mutex = Mutex.new
|
128
|
+
@_child_process_processes = {} # pid => ProcessInfo
|
129
|
+
end
|
130
|
+
|
131
|
+
def stop
|
132
|
+
@_child_process_mutex.synchronize{ @_child_process_processes.keys }.each do |pid|
|
133
|
+
process_info = @_child_process_processes[pid]
|
134
|
+
if process_info
|
135
|
+
process_info.thread[:_fluentd_plugin_helper_child_process_running] = false
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
super
|
140
|
+
end
|
141
|
+
|
142
|
+
def shutdown
|
143
|
+
@_child_process_mutex.synchronize{ @_child_process_processes.keys }.each do |pid|
|
144
|
+
process_info = @_child_process_processes[pid]
|
145
|
+
next if !process_info
|
146
|
+
process_info.writeio && process_info.writeio.close rescue nil
|
147
|
+
end
|
148
|
+
|
149
|
+
super
|
150
|
+
|
151
|
+
@_child_process_mutex.synchronize{ @_child_process_processes.keys }.each do |pid|
|
152
|
+
process_info = @_child_process_processes[pid]
|
153
|
+
next if !process_info
|
154
|
+
child_process_kill(process_info)
|
155
|
+
end
|
156
|
+
|
157
|
+
exit_wait_timeout = Fluent::Clock.now + @_child_process_exit_timeout
|
158
|
+
while Fluent::Clock.now < exit_wait_timeout
|
159
|
+
process_exists = false
|
160
|
+
@_child_process_mutex.synchronize{ @_child_process_processes.keys }.each do |pid|
|
161
|
+
unless @_child_process_processes[pid].exit_status
|
162
|
+
process_exists = true
|
163
|
+
break
|
164
|
+
end
|
165
|
+
end
|
166
|
+
if process_exists
|
167
|
+
sleep CHILD_PROCESS_LOOP_CHECK_INTERVAL
|
168
|
+
else
|
169
|
+
break
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def close
|
175
|
+
while true
|
176
|
+
pids = @_child_process_mutex.synchronize{ @_child_process_processes.keys }
|
177
|
+
break if pids.size < 1
|
178
|
+
|
179
|
+
living_process_exist = false
|
180
|
+
pids.each do |pid|
|
181
|
+
process_info = @_child_process_processes[pid]
|
182
|
+
next if !process_info || process_info.exit_status
|
183
|
+
|
184
|
+
living_process_exist = true
|
185
|
+
|
186
|
+
process_info.killed_at ||= Fluent::Clock.now # for illegular case (e.g., created after shutdown)
|
187
|
+
timeout_at = process_info.killed_at + @_child_process_kill_timeout
|
188
|
+
now = Fluent::Clock.now
|
189
|
+
next if now < timeout_at
|
190
|
+
|
191
|
+
child_process_kill(process_info, force: true)
|
192
|
+
end
|
193
|
+
|
194
|
+
break if living_process_exist
|
195
|
+
|
196
|
+
sleep CHILD_PROCESS_LOOP_CHECK_INTERVAL
|
197
|
+
end
|
198
|
+
|
199
|
+
super
|
200
|
+
end
|
201
|
+
|
202
|
+
def terminate
|
203
|
+
@_child_process_processes = {}
|
204
|
+
|
205
|
+
super
|
206
|
+
end
|
207
|
+
|
208
|
+
def child_process_kill(pinfo, force: false)
|
209
|
+
return if !pinfo
|
210
|
+
pinfo.killed_at = Fluent::Clock.now unless force
|
211
|
+
|
212
|
+
pid = pinfo.pid
|
213
|
+
begin
|
214
|
+
if !pinfo.exit_status && child_process_exist?(pid)
|
215
|
+
signal = (Fluent.windows? || force) ? :KILL : :TERM
|
216
|
+
Process.kill(signal, pinfo.pid)
|
217
|
+
end
|
218
|
+
rescue Errno::ECHILD, Errno::ESRCH
|
219
|
+
# ignore
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
ProcessInfo = Struct.new(
|
224
|
+
:title,
|
225
|
+
:thread, :pid,
|
226
|
+
:readio, :readio_in_use, :writeio, :writeio_in_use, :stderrio, :stderrio_in_use,
|
227
|
+
:wait_thread, :alive, :killed_at, :exit_status,
|
228
|
+
:on_exit_callback, :on_exit_callback_mutex,
|
229
|
+
)
|
230
|
+
|
231
|
+
def child_process_execute_once(
|
232
|
+
title, command, arguments, subprocess_name, mode, stderr, env, unsetenv, chdir,
|
233
|
+
internal_encoding, external_encoding, scrub, replace_string, wait_timeout, on_exit_callback, &block
|
234
|
+
)
|
235
|
+
spawn_args = if arguments || subprocess_name
|
236
|
+
[ env, (subprocess_name ? [command, subprocess_name] : command), *(arguments || []) ]
|
237
|
+
else
|
238
|
+
[ env, command ]
|
239
|
+
end
|
240
|
+
spawn_opts = {
|
241
|
+
unsetenv_others: unsetenv,
|
242
|
+
}
|
243
|
+
if chdir
|
244
|
+
spawn_opts[:chdir] = chdir
|
245
|
+
end
|
246
|
+
|
247
|
+
encoding_options = {}
|
248
|
+
if scrub
|
249
|
+
encoding_options[:invalid] = encoding_options[:undef] = :replace
|
250
|
+
if replace_string
|
251
|
+
encoding_options[:replace] = replace_string
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
log.debug "Executing command", title: title, spawn: spawn_args, mode: mode, stderr: stderr
|
256
|
+
|
257
|
+
readio = writeio = stderrio = wait_thread = nil
|
258
|
+
readio_in_use = writeio_in_use = stderrio_in_use = false
|
259
|
+
|
260
|
+
if !mode.include?(:stderr) && !mode.include?(:read_with_stderr) && stderr != :discard # connect
|
261
|
+
writeio, readio, wait_thread = *Open3.popen2(*spawn_args, spawn_opts)
|
262
|
+
elsif mode.include?(:read_with_stderr)
|
263
|
+
writeio, readio, wait_thread = *Open3.popen2e(*spawn_args, spawn_opts)
|
264
|
+
else
|
265
|
+
writeio, readio, stderrio, wait_thread = *Open3.popen3(*spawn_args, spawn_opts)
|
266
|
+
end
|
267
|
+
|
268
|
+
if mode.include?(:write)
|
269
|
+
writeio.set_encoding(external_encoding, internal_encoding, encoding_options)
|
270
|
+
writeio_in_use = true
|
271
|
+
else
|
272
|
+
writeio.reopen(IO::NULL) if writeio
|
273
|
+
end
|
274
|
+
if mode.include?(:read) || mode.include?(:read_with_stderr)
|
275
|
+
readio.set_encoding(external_encoding, internal_encoding, encoding_options)
|
276
|
+
readio_in_use = true
|
277
|
+
else
|
278
|
+
readio.reopen(IO::NULL) if readio
|
279
|
+
end
|
280
|
+
if mode.include?(:stderr)
|
281
|
+
stderrio.set_encoding(external_encoding, internal_encoding, encoding_options)
|
282
|
+
stderrio_in_use = true
|
283
|
+
else
|
284
|
+
stderrio.reopen(IO::NULL) if stderrio && stderrio == :discard
|
285
|
+
end
|
286
|
+
|
287
|
+
pid = wait_thread.pid # wait_thread => Process::Waiter
|
288
|
+
|
289
|
+
io_objects = []
|
290
|
+
mode.each do |m|
|
291
|
+
io_obj = case m
|
292
|
+
when :read then readio
|
293
|
+
when :write then writeio
|
294
|
+
when :read_with_stderr then readio
|
295
|
+
when :stderr then stderrio
|
296
|
+
else
|
297
|
+
raise "BUG: invalid mode must be checked before here: '#{m}'"
|
298
|
+
end
|
299
|
+
io_objects << io_obj
|
300
|
+
end
|
301
|
+
|
302
|
+
m = Mutex.new
|
303
|
+
m.lock
|
304
|
+
thread = thread_create :child_process_callback do
|
305
|
+
m.lock # run after plugin thread get pid, thread instance and i/o
|
306
|
+
m.unlock
|
307
|
+
begin
|
308
|
+
@_child_process_processes[pid].alive = true
|
309
|
+
block.call(*io_objects) if block_given?
|
310
|
+
writeio.close if writeio
|
311
|
+
rescue EOFError => e
|
312
|
+
log.debug "Process exit and I/O closed", title: title, pid: pid, command: command, arguments: arguments
|
313
|
+
rescue IOError => e
|
314
|
+
if e.message == 'stream closed' || e.message == 'closed stream' # "closed stream" is of ruby 2.1
|
315
|
+
log.debug "Process I/O stream closed", title: title, pid: pid, command: command, arguments: arguments
|
316
|
+
else
|
317
|
+
log.error "Unexpected I/O error for child process", title: title, pid: pid, command: command, arguments: arguments, error: e
|
318
|
+
end
|
319
|
+
rescue Errno::EPIPE => e
|
320
|
+
log.debug "Broken pipe, child process unexpectedly exits", title: title, pid: pid, command: command, arguments: arguments
|
321
|
+
rescue => e
|
322
|
+
log.warn "Unexpected error while processing I/O for child process", title: title, pid: pid, command: command, error: e
|
323
|
+
end
|
324
|
+
|
325
|
+
if wait_timeout
|
326
|
+
if wait_thread.join(wait_timeout) # Thread#join returns nil when limit expires
|
327
|
+
# wait_thread successfully exits
|
328
|
+
@_child_process_processes[pid].exit_status = wait_thread.value
|
329
|
+
else
|
330
|
+
log.warn "child process timed out", title: title, pid: pid, command: command, arguments: arguments
|
331
|
+
child_process_kill(@_child_process_processes[pid], force: true)
|
332
|
+
@_child_process_processes[pid].exit_status = wait_thread.value
|
333
|
+
end
|
334
|
+
else
|
335
|
+
@_child_process_processes[pid].exit_status = wait_thread.value # with join
|
336
|
+
end
|
337
|
+
process_info = @_child_process_mutex.synchronize{ @_child_process_processes.delete(pid) }
|
338
|
+
|
339
|
+
cb = process_info.on_exit_callback_mutex.synchronize do
|
340
|
+
cback = process_info.on_exit_callback
|
341
|
+
process_info.on_exit_callback = nil
|
342
|
+
cback
|
343
|
+
end
|
344
|
+
if cb
|
345
|
+
cb.call(process_info.exit_status) rescue nil
|
346
|
+
end
|
347
|
+
end
|
348
|
+
thread[:_fluentd_plugin_helper_child_process_running] = true
|
349
|
+
thread[:_fluentd_plugin_helper_child_process_pid] = pid
|
350
|
+
pinfo = ProcessInfo.new(
|
351
|
+
title, thread, pid,
|
352
|
+
readio, readio_in_use, writeio, writeio_in_use, stderrio, stderrio_in_use,
|
353
|
+
wait_thread, false, nil, nil, on_exit_callback, Mutex.new
|
354
|
+
)
|
355
|
+
|
356
|
+
@_child_process_mutex.synchronize do
|
357
|
+
@_child_process_processes[pid] = pinfo
|
358
|
+
end
|
359
|
+
m.unlock
|
360
|
+
pid
|
361
|
+
end
|
362
|
+
end
|
363
|
+
end
|
364
|
+
end
|
@@ -0,0 +1,333 @@
|
|
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/config/types'
|
18
|
+
require 'fluent/config/element'
|
19
|
+
|
20
|
+
module Fluent
|
21
|
+
module PluginHelper
|
22
|
+
module CompatParameters
|
23
|
+
# This plugin helper is to bring old-fashioned buffer/other
|
24
|
+
# configuration parameters to v0.14 plugin API configurations.
|
25
|
+
# This helper is mainly to convert plugins from v0.12 API
|
26
|
+
# to v0.14 API safely, without breaking user deployment.
|
27
|
+
|
28
|
+
BUFFER_PARAMS = {
|
29
|
+
"buffer_type" => "@type",
|
30
|
+
"buffer_path" => "path",
|
31
|
+
"num_threads" => "flush_thread_count",
|
32
|
+
"flush_interval" => "flush_interval",
|
33
|
+
"try_flush_interval" => "flush_thread_interval",
|
34
|
+
"queued_chunk_flush_interval" => "flush_thread_burst_interval",
|
35
|
+
"disable_retry_limit" => "retry_forever",
|
36
|
+
"retry_limit" => "retry_max_times",
|
37
|
+
"max_retry_wait" => "retry_max_interval",
|
38
|
+
"buffer_chunk_limit" => "chunk_limit_size",
|
39
|
+
"buffer_queue_limit" => "queue_limit_length",
|
40
|
+
"buffer_queue_full_action" => "overflow_action",
|
41
|
+
"flush_at_shutdown" => "flush_at_shutdown",
|
42
|
+
}
|
43
|
+
|
44
|
+
BUFFER_TIME_SLICED_PARAMS = {
|
45
|
+
"time_slice_format" => nil,
|
46
|
+
"time_slice_wait" => "timekey_wait",
|
47
|
+
"timezone" => "timekey_zone",
|
48
|
+
}
|
49
|
+
|
50
|
+
PARSER_PARAMS = {
|
51
|
+
"format" => nil,
|
52
|
+
"types" => nil,
|
53
|
+
"types_delimiter" => nil,
|
54
|
+
"types_label_delimiter" => nil,
|
55
|
+
"keys" => "keys", # CSVParser, TSVParser (old ValuesParser)
|
56
|
+
"time_key" => "time_key",
|
57
|
+
"time_format" => "time_format",
|
58
|
+
"localtime" => nil,
|
59
|
+
"utc" => nil,
|
60
|
+
"delimiter" => "delimiter",
|
61
|
+
"keep_time_key" => "keep_time_key",
|
62
|
+
"null_empty_string" => "null_empty_string",
|
63
|
+
"null_value_pattern" => "null_value_pattern",
|
64
|
+
"json_parser" => "json_parser", # JSONParser
|
65
|
+
"label_delimiter" => "label_delimiter", # LabeledTSVParser
|
66
|
+
"format_firstline" => "format_firstline", # MultilineParser
|
67
|
+
"message_key" => "message_key", # NoneParser
|
68
|
+
"with_priority" => "with_priority", # SyslogParser
|
69
|
+
"message_format" => "message_format", # SyslogParser
|
70
|
+
"rfc5424_time_format" => "rfc5424_time_format", # SyslogParser
|
71
|
+
# There has been no parsers which can handle timezone in v0.12
|
72
|
+
}
|
73
|
+
|
74
|
+
INJECT_PARAMS = {
|
75
|
+
"include_time_key" => nil,
|
76
|
+
"time_key" => "time_key",
|
77
|
+
"time_format" => "time_format",
|
78
|
+
"timezone" => "timezone",
|
79
|
+
"include_tag_key" => nil,
|
80
|
+
"tag_key" => "tag_key",
|
81
|
+
"localtime" => nil,
|
82
|
+
"utc" => nil,
|
83
|
+
}
|
84
|
+
|
85
|
+
EXTRACT_PARAMS = {
|
86
|
+
"time_key" => "time_key",
|
87
|
+
"time_format" => "time_format",
|
88
|
+
"timezone" => "timezone",
|
89
|
+
"tag_key" => "tag_key",
|
90
|
+
"localtime" => nil,
|
91
|
+
"utc" => nil,
|
92
|
+
}
|
93
|
+
|
94
|
+
FORMATTER_PARAMS = {
|
95
|
+
"format" => "@type",
|
96
|
+
"delimiter" => "delimiter",
|
97
|
+
"force_quotes" => "force_quotes", # CsvFormatter
|
98
|
+
"keys" => "keys", # TSVFormatter
|
99
|
+
"fields" => "fields", # CsvFormatter
|
100
|
+
"json_parser" => "json_parser", # JSONFormatter
|
101
|
+
"label_delimiter" => "label_delimiter", # LabeledTSVFormatter
|
102
|
+
"output_time" => "output_time", # OutFileFormatter
|
103
|
+
"output_tag" => "output_tag", # OutFileFormatter
|
104
|
+
"localtime" => "localtime", # OutFileFormatter
|
105
|
+
"utc" => "utc", # OutFileFormatter
|
106
|
+
"timezone" => "timezone", # OutFileFormatter
|
107
|
+
"message_key" => "message_key", # SingleValueFormatter
|
108
|
+
"add_newline" => "add_newline", # SingleValueFormatter
|
109
|
+
"output_type" => "output_type", # StdoutFormatter
|
110
|
+
}
|
111
|
+
|
112
|
+
def compat_parameters_convert(conf, *types, **kwargs)
|
113
|
+
types.each do |type|
|
114
|
+
case type
|
115
|
+
when :buffer
|
116
|
+
compat_parameters_buffer(conf, **kwargs)
|
117
|
+
when :inject
|
118
|
+
compat_parameters_inject(conf)
|
119
|
+
when :extract
|
120
|
+
compat_parameters_extract(conf)
|
121
|
+
when :parser
|
122
|
+
compat_parameters_parser(conf)
|
123
|
+
when :formatter
|
124
|
+
compat_parameters_formatter(conf)
|
125
|
+
else
|
126
|
+
raise "BUG: unknown compat_parameters type: #{type}"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
conf
|
131
|
+
end
|
132
|
+
|
133
|
+
def compat_parameters_buffer(conf, default_chunk_key: '')
|
134
|
+
# return immediately if <buffer> section exists, or any buffer-related parameters don't exist
|
135
|
+
return unless conf.elements('buffer').empty?
|
136
|
+
return if (BUFFER_PARAMS.keys + BUFFER_TIME_SLICED_PARAMS.keys).all?{|k| !conf.has_key?(k) }
|
137
|
+
|
138
|
+
# TODO: warn obsolete parameters if these are deprecated
|
139
|
+
buffer_params = BUFFER_PARAMS.merge(BUFFER_TIME_SLICED_PARAMS)
|
140
|
+
hash = compat_parameters_copy_to_subsection_attributes(conf, buffer_params) do |compat_key, value|
|
141
|
+
if compat_key == 'buffer_queue_full_action' && value == 'exception'
|
142
|
+
'throw_exception'
|
143
|
+
else
|
144
|
+
value
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
chunk_key = default_chunk_key
|
149
|
+
|
150
|
+
if conf.has_key?('time_slice_format')
|
151
|
+
chunk_key = 'time'
|
152
|
+
hash['timekey'] = case conf['time_slice_format']
|
153
|
+
when /\%S/ then 1
|
154
|
+
when /\%M/ then 60
|
155
|
+
when /\%H/ then 3600
|
156
|
+
when /\%d/ then 86400
|
157
|
+
else
|
158
|
+
raise Fluent::ConfigError, "time_slice_format only with %Y or %m is too long"
|
159
|
+
end
|
160
|
+
if conf.has_key?('localtime') || conf.has_key?('utc')
|
161
|
+
if conf.has_key?('localtime') && conf.has_key?('utc')
|
162
|
+
raise Fluent::ConfigError, "both of utc and localtime are specified, use only one of them"
|
163
|
+
elsif conf.has_key?('localtime')
|
164
|
+
hash['timekey_use_utc'] = !(Fluent::Config.bool_value(conf['localtime']))
|
165
|
+
elsif conf.has_key?('utc')
|
166
|
+
hash['timekey_use_utc'] = Fluent::Config.bool_value(conf['utc'])
|
167
|
+
end
|
168
|
+
end
|
169
|
+
else
|
170
|
+
if chunk_key == 'time'
|
171
|
+
hash['timekey'] = 86400 # TimeSliceOutput.time_slice_format default value is '%Y%m%d'
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
e = Fluent::Config::Element.new('buffer', chunk_key, hash, [])
|
176
|
+
conf.elements << e
|
177
|
+
|
178
|
+
conf
|
179
|
+
end
|
180
|
+
|
181
|
+
def compat_parameters_inject(conf)
|
182
|
+
return unless conf.elements('inject').empty?
|
183
|
+
return if INJECT_PARAMS.keys.all?{|k| !conf.has_key?(k) }
|
184
|
+
|
185
|
+
# TODO: warn obsolete parameters if these are deprecated
|
186
|
+
hash = compat_parameters_copy_to_subsection_attributes(conf, INJECT_PARAMS)
|
187
|
+
|
188
|
+
if conf.has_key?('include_time_key') && Fluent::Config.bool_value(conf['include_time_key'])
|
189
|
+
hash['time_key'] ||= 'time'
|
190
|
+
hash['time_type'] ||= 'string'
|
191
|
+
end
|
192
|
+
if conf.has_key?('time_as_epoch') && Fluent::Config.bool_value(conf['time_as_epoch'])
|
193
|
+
hash['time_key'] ||= 'time'
|
194
|
+
hash['time_type'] = 'unixtime'
|
195
|
+
end
|
196
|
+
if conf.has_key?('localtime') || conf.has_key?('utc')
|
197
|
+
if conf.has_key?('localtime') && conf.has_key?('utc')
|
198
|
+
raise Fluent::ConfigError, "both of utc and localtime are specified, use only one of them"
|
199
|
+
elsif conf.has_key?('localtime')
|
200
|
+
hash['localtime'] = Fluent::Config.bool_value(conf['localtime'])
|
201
|
+
elsif conf.has_key?('utc')
|
202
|
+
hash['localtime'] = !(Fluent::Config.bool_value(conf['utc']))
|
203
|
+
# Specifying "localtime false" means using UTC in TimeFormatter
|
204
|
+
# And specifying "utc" is different from specifying "timezone +0000"(it's not always UTC).
|
205
|
+
# There are difference between "Z" and "+0000" in timezone formatting.
|
206
|
+
# TODO: add kwargs to TimeFormatter to specify "using localtime", "using UTC" or "using specified timezone" in more explicit way
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
if conf.has_key?('include_tag_key') && Fluent::Config.bool_value(conf['include_tag_key'])
|
211
|
+
hash['tag_key'] ||= 'tag'
|
212
|
+
end
|
213
|
+
|
214
|
+
e = Fluent::Config::Element.new('inject', '', hash, [])
|
215
|
+
conf.elements << e
|
216
|
+
|
217
|
+
conf
|
218
|
+
end
|
219
|
+
|
220
|
+
def compat_parameters_extract(conf)
|
221
|
+
return unless conf.elements('extract').empty?
|
222
|
+
return if EXTRACT_PARAMS.keys.all?{|k| !conf.has_key?(k) } && !conf.has_key?('format')
|
223
|
+
|
224
|
+
# TODO: warn obsolete parameters if these are deprecated
|
225
|
+
hash = compat_parameters_copy_to_subsection_attributes(conf, EXTRACT_PARAMS)
|
226
|
+
|
227
|
+
if conf.has_key?('time_as_epoch') && Fluent::Config.bool_value(conf['time_as_epoch'])
|
228
|
+
hash['time_key'] ||= 'time'
|
229
|
+
hash['time_type'] = 'unixtime'
|
230
|
+
elsif conf.has_key?('format') && conf["format"].start_with?("/") && conf["format"].end_with?("/") # old-style regexp parser
|
231
|
+
hash['time_key'] ||= 'time'
|
232
|
+
hash['time_type'] ||= 'string'
|
233
|
+
end
|
234
|
+
if conf.has_key?('localtime') || conf.has_key?('utc')
|
235
|
+
if conf.has_key?('localtime') && conf.has_key?('utc')
|
236
|
+
raise Fluent::ConfigError, "both of utc and localtime are specified, use only one of them"
|
237
|
+
elsif conf.has_key?('localtime')
|
238
|
+
hash['localtime'] = Fluent::Config.bool_value(conf['localtime'])
|
239
|
+
elsif conf.has_key?('utc')
|
240
|
+
hash['localtime'] = !(Fluent::Config.bool_value(conf['utc']))
|
241
|
+
# Specifying "localtime false" means using UTC in TimeFormatter
|
242
|
+
# And specifying "utc" is different from specifying "timezone +0000"(it's not always UTC).
|
243
|
+
# There are difference between "Z" and "+0000" in timezone formatting.
|
244
|
+
# TODO: add kwargs to TimeFormatter to specify "using localtime", "using UTC" or "using specified timezone" in more explicit way
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
e = Fluent::Config::Element.new('extract', '', hash, [])
|
249
|
+
conf.elements << e
|
250
|
+
|
251
|
+
conf
|
252
|
+
end
|
253
|
+
|
254
|
+
def compat_parameters_parser(conf)
|
255
|
+
return unless conf.elements('parse').empty?
|
256
|
+
return if PARSER_PARAMS.keys.all?{|k| !conf.has_key?(k) }
|
257
|
+
|
258
|
+
# TODO: warn obsolete parameters if these are deprecated
|
259
|
+
hash = compat_parameters_copy_to_subsection_attributes(conf, PARSER_PARAMS)
|
260
|
+
|
261
|
+
if conf["format"]
|
262
|
+
if conf["format"].start_with?("/") && conf["format"].end_with?("/")
|
263
|
+
hash["@type"] = "regexp"
|
264
|
+
hash["expression"] = conf["format"][1..-2]
|
265
|
+
else
|
266
|
+
hash["@type"] = conf["format"]
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
if conf["types"]
|
271
|
+
delimiter = conf["types_delimiter"] || ','
|
272
|
+
label_delimiter = conf["types_label_delimiter"] || ':'
|
273
|
+
types = {}
|
274
|
+
conf['types'].split(delimiter).each do |pair|
|
275
|
+
key, value = pair.split(label_delimiter, 2)
|
276
|
+
types[key] = value
|
277
|
+
end
|
278
|
+
hash["types"] = JSON.dump(types)
|
279
|
+
end
|
280
|
+
if conf.has_key?('localtime') || conf.has_key?('utc')
|
281
|
+
if conf.has_key?('localtime') && conf.has_key?('utc')
|
282
|
+
raise Fluent::ConfigError, "both of utc and localtime are specified, use only one of them"
|
283
|
+
elsif conf.has_key?('localtime')
|
284
|
+
hash['localtime'] = Fluent::Config.bool_value(conf['localtime'])
|
285
|
+
elsif conf.has_key?('utc')
|
286
|
+
hash['localtime'] = !(Fluent::Config.bool_value(conf['utc']))
|
287
|
+
# Specifying "localtime false" means using UTC in TimeFormatter
|
288
|
+
# And specifying "utc" is different from specifying "timezone +0000"(it's not always UTC).
|
289
|
+
# There are difference between "Z" and "+0000" in timezone formatting.
|
290
|
+
# TODO: add kwargs to TimeFormatter to specify "using localtime", "using UTC" or "using specified timezone" in more explicit way
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
e = Fluent::Config::Element.new('parse', '', hash, [])
|
295
|
+
conf.elements << e
|
296
|
+
|
297
|
+
conf
|
298
|
+
end
|
299
|
+
|
300
|
+
def compat_parameters_formatter(conf)
|
301
|
+
return unless conf.elements('format').empty?
|
302
|
+
return if FORMATTER_PARAMS.keys.all?{|k| !conf.has_key?(k) }
|
303
|
+
|
304
|
+
# TODO: warn obsolete parameters if these are deprecated
|
305
|
+
hash = compat_parameters_copy_to_subsection_attributes(conf, FORMATTER_PARAMS)
|
306
|
+
|
307
|
+
if conf.has_key?('time_as_epoch') && Fluent::Config.bool_value(conf['time_as_epoch'])
|
308
|
+
hash['time_type'] = 'unixtime'
|
309
|
+
end
|
310
|
+
|
311
|
+
e = Fluent::Config::Element.new('format', '', hash, [])
|
312
|
+
conf.elements << e
|
313
|
+
|
314
|
+
conf
|
315
|
+
end
|
316
|
+
|
317
|
+
def compat_parameters_copy_to_subsection_attributes(conf, params, &block)
|
318
|
+
hash = {}
|
319
|
+
params.each do |compat, current|
|
320
|
+
next unless current
|
321
|
+
if conf.has_key?(compat)
|
322
|
+
if block_given?
|
323
|
+
hash[current] = block.call(compat, conf[compat])
|
324
|
+
else
|
325
|
+
hash[current] = conf[compat]
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|
329
|
+
hash
|
330
|
+
end
|
331
|
+
end
|
332
|
+
end
|
333
|
+
end
|