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,106 @@
|
|
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/parser'
|
18
|
+
require 'fluent/plugin/parser_regexp'
|
19
|
+
|
20
|
+
module Fluent
|
21
|
+
module Plugin
|
22
|
+
class MultilineParser < Parser
|
23
|
+
Plugin.register_parser('multiline', self)
|
24
|
+
|
25
|
+
desc 'Specify regexp pattern for start line of multiple lines'
|
26
|
+
config_param :format_firstline, :string, default: nil
|
27
|
+
|
28
|
+
FORMAT_MAX_NUM = 20
|
29
|
+
|
30
|
+
def configure(conf)
|
31
|
+
super
|
32
|
+
|
33
|
+
formats = parse_formats(conf).compact.map { |f| f[1..-2] }.join
|
34
|
+
begin
|
35
|
+
regexp = Regexp.new(formats, Regexp::MULTILINE)
|
36
|
+
if regexp.named_captures.empty?
|
37
|
+
raise "No named captures"
|
38
|
+
end
|
39
|
+
regexp_conf = Fluent::Config::Element.new("", "", { "expression" => "/#{formats}/m" }, [])
|
40
|
+
@parser = Fluent::Plugin::RegexpParser.new
|
41
|
+
@parser.configure(conf + regexp_conf)
|
42
|
+
rescue => e
|
43
|
+
raise Fluent::ConfigError, "Invalid regexp '#{formats}': #{e}"
|
44
|
+
end
|
45
|
+
|
46
|
+
if @format_firstline
|
47
|
+
check_format_regexp(@format_firstline, 'format_firstline')
|
48
|
+
@firstline_regex = Regexp.new(@format_firstline[1..-2])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def parse(text, &block)
|
53
|
+
@parser.call(text, &block)
|
54
|
+
end
|
55
|
+
|
56
|
+
def has_firstline?
|
57
|
+
!!@format_firstline
|
58
|
+
end
|
59
|
+
|
60
|
+
def firstline?(text)
|
61
|
+
@firstline_regex.match(text)
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def parse_formats(conf)
|
67
|
+
check_format_range(conf)
|
68
|
+
|
69
|
+
prev_format = nil
|
70
|
+
(1..FORMAT_MAX_NUM).map { |i|
|
71
|
+
format = conf["format#{i}"]
|
72
|
+
if (i > 1) && prev_format.nil? && !format.nil?
|
73
|
+
raise Fluent::ConfigError, "Jump of format index found. format#{i - 1} is missing."
|
74
|
+
end
|
75
|
+
prev_format = format
|
76
|
+
next if format.nil?
|
77
|
+
|
78
|
+
check_format_regexp(format, "format#{i}")
|
79
|
+
format
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
def check_format_range(conf)
|
84
|
+
invalid_formats = conf.keys.select { |k|
|
85
|
+
m = k.match(/^format(\d+)$/)
|
86
|
+
m ? !((1..FORMAT_MAX_NUM).include?(m[1].to_i)) : false
|
87
|
+
}
|
88
|
+
unless invalid_formats.empty?
|
89
|
+
raise Fluent::ConfigError, "Invalid formatN found. N should be 1 - #{FORMAT_MAX_NUM}: " + invalid_formats.join(",")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def check_format_regexp(format, key)
|
94
|
+
if format[0] == '/' && format[-1] == '/'
|
95
|
+
begin
|
96
|
+
Regexp.new(format[1..-2], Regexp::MULTILINE)
|
97
|
+
rescue => e
|
98
|
+
raise Fluent::ConfigError, "Invalid regexp in #{key}: #{e}"
|
99
|
+
end
|
100
|
+
else
|
101
|
+
raise Fluent::ConfigError, "format should be Regexp, need //, in #{key}: '#{format}'"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,28 @@
|
|
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/parser_regexp'
|
18
|
+
|
19
|
+
module Fluent
|
20
|
+
module Plugin
|
21
|
+
class NginxParser < RegexpParser
|
22
|
+
Plugin.register_parser("nginx", self)
|
23
|
+
|
24
|
+
config_set_default :expression, /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)"(?:\s+\"?(?<http_x_forwarded_for>[^\"]*)\"?)?)?$/
|
25
|
+
config_set_default :time_format, "%d/%b/%Y:%H:%M:%S %z"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,36 @@
|
|
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/parser'
|
18
|
+
|
19
|
+
require 'fluent/time'
|
20
|
+
|
21
|
+
module Fluent
|
22
|
+
module Plugin
|
23
|
+
class NoneParser < Parser
|
24
|
+
Plugin.register_parser('none', self)
|
25
|
+
|
26
|
+
desc 'Field name to contain logs'
|
27
|
+
config_param :message_key, :string, default: 'message'
|
28
|
+
|
29
|
+
def parse(text)
|
30
|
+
record = {@message_key => text}
|
31
|
+
time = @estimate_current_event ? Fluent::EventTime.now : nil
|
32
|
+
yield time, record
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,68 @@
|
|
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/parser'
|
18
|
+
|
19
|
+
module Fluent
|
20
|
+
module Plugin
|
21
|
+
class RegexpParser < Parser
|
22
|
+
Plugin.register_parser("regexp", self)
|
23
|
+
|
24
|
+
desc 'Regular expression for matching logs'
|
25
|
+
config_param :expression, :regexp
|
26
|
+
desc 'Ignore case in matching'
|
27
|
+
config_param :ignorecase, :bool, default: false, deprecated: "Use /pattern/i instead, this option is no longer effective"
|
28
|
+
desc 'Build regular expression as a multline mode'
|
29
|
+
config_param :multiline, :bool, default: false, deprecated: "Use /pattern/m instead, this option is no longer effective"
|
30
|
+
|
31
|
+
config_set_default :time_key, 'time'
|
32
|
+
|
33
|
+
def configure(conf)
|
34
|
+
super
|
35
|
+
# For compat layer
|
36
|
+
if @ignorecase || @multiline
|
37
|
+
options = 0
|
38
|
+
options |= Regexp::IGNORECASE if @ignorecase
|
39
|
+
options |= Regexp::MULTILINE if @multiline
|
40
|
+
@expression = Regexp.compile(@expression.source, options)
|
41
|
+
end
|
42
|
+
@regexp = @expression # For backward compatibility
|
43
|
+
|
44
|
+
if @expression.named_captures.empty?
|
45
|
+
raise Fluent::ConfigError, "No named captures in 'expression' parameter. The regexp must have at least one named capture"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def parse(text)
|
50
|
+
m = @expression.match(text)
|
51
|
+
unless m
|
52
|
+
yield nil, nil
|
53
|
+
return
|
54
|
+
end
|
55
|
+
|
56
|
+
r = {}
|
57
|
+
m.names.each do |name|
|
58
|
+
if value = m[name]
|
59
|
+
r[name] = value
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
time, record = convert_values(parse_time(r), r)
|
64
|
+
yield time, record
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,142 @@
|
|
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/parser'
|
18
|
+
|
19
|
+
require 'fluent/time'
|
20
|
+
|
21
|
+
module Fluent
|
22
|
+
module Plugin
|
23
|
+
class SyslogParser < Parser
|
24
|
+
Plugin.register_parser('syslog', self)
|
25
|
+
|
26
|
+
# From existence TextParser pattern
|
27
|
+
REGEXP = /^(?<time>[^ ]*\s*[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[^ :\[]*)(?:\[(?<pid>[0-9]+)\])?(?:[^\:]*\:)? *(?<message>.*)$/
|
28
|
+
# From in_syslog default pattern
|
29
|
+
REGEXP_WITH_PRI = /^\<(?<pri>[0-9]+)\>(?<time>[^ ]* {1,2}[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[^ :\[]*)(?:\[(?<pid>[0-9]+)\])?(?:[^\:]*\:)? *(?<message>.*)$/
|
30
|
+
REGEXP_RFC5424 = /\A^(?<time>[^ ]+) (?<host>[!-~]{1,255}) (?<ident>[!-~]{1,48}) (?<pid>[!-~]{1,128}) (?<msgid>[!-~]{1,32}) (?<extradata>(?:\-|\[(.*)\]))(?: (?<message>.+))?$\z/
|
31
|
+
REGEXP_RFC5424_WITH_PRI = /\A^\<(?<pri>[0-9]{1,3})\>[1-9]\d{0,2} (?<time>[^ ]+) (?<host>[!-~]{1,255}) (?<ident>[!-~]{1,48}) (?<pid>[!-~]{1,128}) (?<msgid>[!-~]{1,32}) (?<extradata>(?:\-|\[(.*)\]))(?: (?<message>.+))?$\z/
|
32
|
+
REGEXP_DETECT_RFC5424 = /^\<.*\>[1-9]\d{0,2}/
|
33
|
+
|
34
|
+
config_set_default :time_format, "%b %d %H:%M:%S"
|
35
|
+
desc 'If the incoming logs have priority prefix, e.g. <9>, set true'
|
36
|
+
config_param :with_priority, :bool, default: false
|
37
|
+
desc 'Specify protocol format'
|
38
|
+
config_param :message_format, :enum, list: [:rfc3164, :rfc5424, :auto], default: :rfc3164
|
39
|
+
desc 'Specify time format for event time for rfc5424 protocol'
|
40
|
+
config_param :rfc5424_time_format, :string, default: "%Y-%m-%dT%H:%M:%S.%L%z"
|
41
|
+
|
42
|
+
def initialize
|
43
|
+
super
|
44
|
+
@mutex = Mutex.new
|
45
|
+
end
|
46
|
+
|
47
|
+
def configure(conf)
|
48
|
+
super
|
49
|
+
|
50
|
+
@time_parser_rfc3164 = @time_parser_rfc5424 = nil
|
51
|
+
@time_parser_rfc5424_without_subseconds = nil
|
52
|
+
@support_rfc5424_without_subseconds = false
|
53
|
+
@regexp = case @message_format
|
54
|
+
when :rfc3164
|
55
|
+
class << self
|
56
|
+
alias_method :parse, :parse_plain
|
57
|
+
end
|
58
|
+
@with_priority ? REGEXP_WITH_PRI : REGEXP
|
59
|
+
when :rfc5424
|
60
|
+
class << self
|
61
|
+
alias_method :parse, :parse_plain
|
62
|
+
end
|
63
|
+
@time_format = @rfc5424_time_format unless conf.has_key?('time_format')
|
64
|
+
@support_rfc5424_without_subseconds = true
|
65
|
+
@with_priority ? REGEXP_RFC5424_WITH_PRI : REGEXP_RFC5424
|
66
|
+
when :auto
|
67
|
+
class << self
|
68
|
+
alias_method :parse, :parse_auto
|
69
|
+
end
|
70
|
+
@time_parser_rfc3164 = time_parser_create(format: @time_format)
|
71
|
+
@time_parser_rfc5424 = time_parser_create(format: @rfc5424_time_format)
|
72
|
+
nil
|
73
|
+
end
|
74
|
+
@time_parser = time_parser_create
|
75
|
+
@time_parser_rfc5424_without_subseconds = time_parser_create(format: "%Y-%m-%dT%H:%M:%S%z")
|
76
|
+
end
|
77
|
+
|
78
|
+
def patterns
|
79
|
+
{'format' => @regexp, 'time_format' => @time_format}
|
80
|
+
end
|
81
|
+
|
82
|
+
def parse(text)
|
83
|
+
# This is overwritten in configure
|
84
|
+
end
|
85
|
+
|
86
|
+
def parse_auto(text, &block)
|
87
|
+
if REGEXP_DETECT_RFC5424.match(text)
|
88
|
+
@regexp = @with_priority ? REGEXP_RFC5424_WITH_PRI : REGEXP_RFC5424
|
89
|
+
@time_parser = @time_parser_rfc5424
|
90
|
+
@support_rfc5424_without_subseconds = true
|
91
|
+
else
|
92
|
+
@regexp = @with_priority ? REGEXP_WITH_PRI : REGEXP
|
93
|
+
@time_parser = @time_parser_rfc3164
|
94
|
+
end
|
95
|
+
parse_plain(text, &block)
|
96
|
+
end
|
97
|
+
|
98
|
+
def parse_plain(text, &block)
|
99
|
+
m = @regexp.match(text)
|
100
|
+
unless m
|
101
|
+
yield nil, nil
|
102
|
+
return
|
103
|
+
end
|
104
|
+
|
105
|
+
time = nil
|
106
|
+
record = {}
|
107
|
+
|
108
|
+
m.names.each { |name|
|
109
|
+
if value = m[name]
|
110
|
+
case name
|
111
|
+
when "pri"
|
112
|
+
record['pri'] = value.to_i
|
113
|
+
when "time"
|
114
|
+
time = @mutex.synchronize do
|
115
|
+
time_str = value.squeeze(' ')
|
116
|
+
begin
|
117
|
+
@time_parser.parse(time_str)
|
118
|
+
rescue Fluent::TimeParser::TimeParseError => e
|
119
|
+
if @support_rfc5424_without_subseconds
|
120
|
+
log.trace(e)
|
121
|
+
@time_parser_rfc5424_without_subseconds.parse(time_str)
|
122
|
+
else
|
123
|
+
raise
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
record[name] = value if @keep_time_key
|
128
|
+
else
|
129
|
+
record[name] = value
|
130
|
+
end
|
131
|
+
end
|
132
|
+
}
|
133
|
+
|
134
|
+
if @estimate_current_event
|
135
|
+
time ||= Fluent::EventTime.now
|
136
|
+
end
|
137
|
+
|
138
|
+
yield time, record
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -0,0 +1,42 @@
|
|
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/parser'
|
18
|
+
|
19
|
+
module Fluent
|
20
|
+
module Plugin
|
21
|
+
class TSVParser < Parser
|
22
|
+
Plugin.register_parser('tsv', self)
|
23
|
+
|
24
|
+
desc 'Names of fields included in each lines'
|
25
|
+
config_param :keys, :array, value_type: :string
|
26
|
+
desc 'The delimiter character (or string) of TSV values'
|
27
|
+
config_param :delimiter, :string, default: "\t"
|
28
|
+
|
29
|
+
def configure(conf)
|
30
|
+
super
|
31
|
+
@key_num = @keys.length
|
32
|
+
end
|
33
|
+
|
34
|
+
def parse(text)
|
35
|
+
values = text.split(@delimiter, @key_num)
|
36
|
+
r = Hash[@keys.zip(values)]
|
37
|
+
time, record = convert_values(parse_time(r), r)
|
38
|
+
yield time, record
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -14,149 +14,9 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
|
17
|
-
require '
|
18
|
-
|
19
|
-
require 'cool.io'
|
20
|
-
|
21
|
-
require 'fluent/plugin'
|
17
|
+
require 'fluent/compat/socket_util'
|
22
18
|
|
23
19
|
module Fluent
|
24
|
-
|
25
|
-
|
26
|
-
if IPAddr.new(IPSocket.getaddress(host)).ipv4?
|
27
|
-
UDPSocket.new
|
28
|
-
else
|
29
|
-
UDPSocket.new(Socket::AF_INET6)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
module_function :create_udp_socket
|
33
|
-
|
34
|
-
class UdpHandler < Coolio::IO
|
35
|
-
def initialize(io, log, body_size_limit, callback, resolve_hostname = false)
|
36
|
-
super(io)
|
37
|
-
@io = io
|
38
|
-
@io.do_not_reverse_lookup = !resolve_hostname
|
39
|
-
@log = log
|
40
|
-
@body_size_limit = body_size_limit
|
41
|
-
@callback = callback
|
42
|
-
end
|
43
|
-
|
44
|
-
def on_readable
|
45
|
-
msg, addr = @io.recvfrom_nonblock(@body_size_limit)
|
46
|
-
msg.chomp!
|
47
|
-
@callback.call(msg, addr)
|
48
|
-
rescue => e
|
49
|
-
@log.error "unexpected error", error: e, error_class: e.class
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
class TcpHandler < Coolio::Socket
|
54
|
-
PEERADDR_FAILED = ["?", "?", "name resolusion failed", "?"]
|
55
|
-
|
56
|
-
def initialize(io, log, delimiter, callback, resolve_hostname = false)
|
57
|
-
super(io)
|
58
|
-
if io.is_a?(TCPSocket)
|
59
|
-
io.do_not_reverse_lookup = resolve_hostname
|
60
|
-
@addr = (io.peeraddr rescue PEERADDR_FAILED)
|
61
|
-
|
62
|
-
opt = [1, @timeout.to_i].pack('I!I!') # { int l_onoff; int l_linger; }
|
63
|
-
io.setsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER, opt)
|
64
|
-
end
|
65
|
-
@delimiter = delimiter
|
66
|
-
@callback = callback
|
67
|
-
@log = log
|
68
|
-
@log.trace { "accepted fluent socket object_id=#{self.object_id}" }
|
69
|
-
@buffer = "".force_encoding('ASCII-8BIT')
|
70
|
-
end
|
71
|
-
|
72
|
-
def on_connect
|
73
|
-
end
|
74
|
-
|
75
|
-
def on_read(data)
|
76
|
-
@buffer << data
|
77
|
-
pos = 0
|
78
|
-
|
79
|
-
while i = @buffer.index(@delimiter, pos)
|
80
|
-
msg = @buffer[pos...i]
|
81
|
-
@callback.call(msg, @addr)
|
82
|
-
pos = i + @delimiter.length
|
83
|
-
end
|
84
|
-
@buffer.slice!(0, pos) if pos > 0
|
85
|
-
rescue => e
|
86
|
-
@log.error "unexpected error", error: e, error_class: e.class
|
87
|
-
close
|
88
|
-
end
|
89
|
-
|
90
|
-
def on_close
|
91
|
-
@log.trace { "closed fluent socket object_id=#{self.object_id}" }
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
class BaseInput < Fluent::Input
|
96
|
-
def initialize
|
97
|
-
super
|
98
|
-
require 'fluent/parser'
|
99
|
-
end
|
100
|
-
|
101
|
-
desc 'Tag of output events.'
|
102
|
-
config_param :tag, :string
|
103
|
-
desc 'The format of the payload.'
|
104
|
-
config_param :format, :string
|
105
|
-
desc 'The port to listen to.'
|
106
|
-
config_param :port, :integer, default: 5150
|
107
|
-
desc 'The bind address to listen to.'
|
108
|
-
config_param :bind, :string, default: '0.0.0.0'
|
109
|
-
desc "Deprecated parameter. Use source_hostname_key instead"
|
110
|
-
config_param :source_host_key, :string, default: nil, deprecated: "Use source_hostname_key instead"
|
111
|
-
desc "The field name of the client's hostname."
|
112
|
-
config_param :source_hostname_key, :string, default: nil
|
113
|
-
config_param :blocking_timeout, :time, default: 0.5
|
114
|
-
|
115
|
-
def configure(conf)
|
116
|
-
super
|
117
|
-
|
118
|
-
@source_hostname_key = @source_host_key if @source_host_key
|
119
|
-
@parser = Plugin.new_parser(@format)
|
120
|
-
@parser.configure(conf)
|
121
|
-
end
|
122
|
-
|
123
|
-
def start
|
124
|
-
@loop = Coolio::Loop.new
|
125
|
-
@handler = listen(method(:on_message))
|
126
|
-
@loop.attach(@handler)
|
127
|
-
@thread = Thread.new(&method(:run))
|
128
|
-
end
|
129
|
-
|
130
|
-
def shutdown
|
131
|
-
@loop.watchers.each { |w| w.detach }
|
132
|
-
@loop.stop
|
133
|
-
@handler.close
|
134
|
-
@thread.join
|
135
|
-
end
|
136
|
-
|
137
|
-
def run
|
138
|
-
@loop.run(@blocking_timeout)
|
139
|
-
rescue => e
|
140
|
-
log.error "unexpected error", error: e, error_class: e.class
|
141
|
-
log.error_backtrace
|
142
|
-
end
|
143
|
-
|
144
|
-
private
|
145
|
-
|
146
|
-
def on_message(msg, addr)
|
147
|
-
@parser.parse(msg) { |time, record|
|
148
|
-
unless time && record
|
149
|
-
log.warn "pattern not match: #{msg.inspect}"
|
150
|
-
return
|
151
|
-
end
|
152
|
-
|
153
|
-
record[@source_hostname_key] = addr[2] if @source_hostname_key
|
154
|
-
router.emit(@tag, time, record)
|
155
|
-
}
|
156
|
-
rescue => e
|
157
|
-
log.error msg.dump, error: e, error_class: e.class, host: addr[3]
|
158
|
-
log.error_backtrace
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
20
|
+
# obsolete
|
21
|
+
SocketUtil = Fluent::Compat::SocketUtil
|
162
22
|
end
|
@@ -0,0 +1,84 @@
|
|
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/base'
|
18
|
+
require 'fluent/plugin/owned_by_mixin'
|
19
|
+
|
20
|
+
module Fluent
|
21
|
+
module Plugin
|
22
|
+
class Storage < Base
|
23
|
+
include OwnedByMixin
|
24
|
+
|
25
|
+
DEFAULT_TYPE = 'local'
|
26
|
+
|
27
|
+
configured_in :storage
|
28
|
+
|
29
|
+
config_param :persistent, :bool, default: false # load/save with all operations
|
30
|
+
config_param :autosave, :bool, default: true
|
31
|
+
config_param :autosave_interval, :time, default: 10
|
32
|
+
config_param :save_at_shutdown, :bool, default: true
|
33
|
+
|
34
|
+
def self.validate_key(key)
|
35
|
+
raise ArgumentError, "key must be a string (or symbol for to_s)" unless key.is_a?(String) || key.is_a?(Symbol)
|
36
|
+
key.to_s
|
37
|
+
end
|
38
|
+
|
39
|
+
attr_accessor :log
|
40
|
+
|
41
|
+
def persistent_always?
|
42
|
+
false
|
43
|
+
end
|
44
|
+
|
45
|
+
def synchronized?
|
46
|
+
false
|
47
|
+
end
|
48
|
+
|
49
|
+
def implementation
|
50
|
+
self
|
51
|
+
end
|
52
|
+
|
53
|
+
def load
|
54
|
+
# load storage data from any data source, or initialize storage internally
|
55
|
+
end
|
56
|
+
|
57
|
+
def save
|
58
|
+
# save internal data store into data source (to be loaded)
|
59
|
+
end
|
60
|
+
|
61
|
+
def get(key)
|
62
|
+
raise NotImplementedError, "Implement this method in child class"
|
63
|
+
end
|
64
|
+
|
65
|
+
def fetch(key, defval)
|
66
|
+
raise NotImplementedError, "Implement this method in child class"
|
67
|
+
end
|
68
|
+
|
69
|
+
def put(key, value)
|
70
|
+
# return value
|
71
|
+
raise NotImplementedError, "Implement this method in child class"
|
72
|
+
end
|
73
|
+
|
74
|
+
def delete(key)
|
75
|
+
# return deleted value
|
76
|
+
raise NotImplementedError, "Implement this method in child class"
|
77
|
+
end
|
78
|
+
|
79
|
+
def update(key, &block) # transactional get-and-update
|
80
|
+
raise NotImplementedError, "Implement this method in child class"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|