fluentd 1.14.4-x64-mingw-ucrt
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 +7 -0
- data/.deepsource.toml +13 -0
- data/.drone.yml +35 -0
- data/.github/ISSUE_TEMPLATE/bug_report.yaml +70 -0
- data/.github/ISSUE_TEMPLATE/config.yml +5 -0
- data/.github/ISSUE_TEMPLATE/feature_request.yaml +38 -0
- data/.github/ISSUE_TEMPLATE.md +17 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- data/.github/workflows/issue-auto-closer.yml +12 -0
- data/.github/workflows/linux-test.yaml +36 -0
- data/.github/workflows/macos-test.yaml +30 -0
- data/.github/workflows/stale-actions.yml +22 -0
- data/.github/workflows/windows-test.yaml +46 -0
- data/.gitignore +30 -0
- data/.gitlab-ci.yml +103 -0
- data/ADOPTERS.md +5 -0
- data/AUTHORS +2 -0
- data/CHANGELOG.md +2409 -0
- data/CONTRIBUTING.md +45 -0
- data/GOVERNANCE.md +55 -0
- data/Gemfile +9 -0
- data/GithubWorkflow.md +78 -0
- data/LICENSE +202 -0
- data/MAINTAINERS.md +11 -0
- data/README.md +97 -0
- data/Rakefile +79 -0
- data/SECURITY.md +18 -0
- data/bin/fluent-binlog-reader +7 -0
- data/bin/fluent-ca-generate +6 -0
- data/bin/fluent-cap-ctl +7 -0
- data/bin/fluent-cat +5 -0
- data/bin/fluent-ctl +7 -0
- data/bin/fluent-debug +5 -0
- data/bin/fluent-gem +9 -0
- data/bin/fluent-plugin-config-format +5 -0
- data/bin/fluent-plugin-generate +5 -0
- data/bin/fluentd +15 -0
- data/code-of-conduct.md +3 -0
- data/docs/SECURITY_AUDIT.pdf +0 -0
- data/example/copy_roundrobin.conf +39 -0
- data/example/counter.conf +18 -0
- data/example/filter_stdout.conf +22 -0
- data/example/in_forward.conf +14 -0
- data/example/in_forward_client.conf +37 -0
- data/example/in_forward_shared_key.conf +15 -0
- data/example/in_forward_tls.conf +14 -0
- data/example/in_forward_users.conf +24 -0
- data/example/in_forward_workers.conf +21 -0
- data/example/in_http.conf +16 -0
- data/example/in_out_forward.conf +17 -0
- data/example/in_sample_blocks.conf +17 -0
- data/example/in_sample_with_compression.conf +23 -0
- data/example/in_syslog.conf +15 -0
- data/example/in_tail.conf +14 -0
- data/example/in_tcp.conf +13 -0
- data/example/in_udp.conf +13 -0
- data/example/logevents.conf +25 -0
- data/example/multi_filters.conf +61 -0
- data/example/out_copy.conf +20 -0
- data/example/out_exec_filter.conf +42 -0
- data/example/out_file.conf +13 -0
- data/example/out_forward.conf +35 -0
- data/example/out_forward_buf_file.conf +23 -0
- data/example/out_forward_client.conf +109 -0
- data/example/out_forward_heartbeat_none.conf +16 -0
- data/example/out_forward_sd.conf +17 -0
- data/example/out_forward_shared_key.conf +36 -0
- data/example/out_forward_tls.conf +18 -0
- data/example/out_forward_users.conf +65 -0
- data/example/out_null.conf +36 -0
- data/example/sd.yaml +8 -0
- data/example/secondary_file.conf +42 -0
- data/example/suppress_config_dump.conf +7 -0
- data/example/v0_12_filter.conf +78 -0
- data/example/v1_literal_example.conf +36 -0
- data/example/worker_section.conf +36 -0
- data/fluent.conf +139 -0
- data/fluentd.gemspec +55 -0
- data/lib/fluent/agent.rb +168 -0
- data/lib/fluent/capability.rb +87 -0
- data/lib/fluent/clock.rb +66 -0
- data/lib/fluent/command/binlog_reader.rb +244 -0
- data/lib/fluent/command/bundler_injection.rb +45 -0
- data/lib/fluent/command/ca_generate.rb +184 -0
- data/lib/fluent/command/cap_ctl.rb +174 -0
- data/lib/fluent/command/cat.rb +365 -0
- data/lib/fluent/command/ctl.rb +177 -0
- data/lib/fluent/command/debug.rb +103 -0
- data/lib/fluent/command/fluentd.rb +374 -0
- data/lib/fluent/command/plugin_config_formatter.rb +308 -0
- data/lib/fluent/command/plugin_generator.rb +365 -0
- data/lib/fluent/compat/call_super_mixin.rb +76 -0
- data/lib/fluent/compat/detach_process_mixin.rb +33 -0
- data/lib/fluent/compat/exec_util.rb +129 -0
- data/lib/fluent/compat/file_util.rb +54 -0
- data/lib/fluent/compat/filter.rb +68 -0
- data/lib/fluent/compat/formatter.rb +111 -0
- data/lib/fluent/compat/formatter_utils.rb +85 -0
- data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
- data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
- data/lib/fluent/compat/input.rb +49 -0
- data/lib/fluent/compat/output.rb +721 -0
- data/lib/fluent/compat/output_chain.rb +60 -0
- data/lib/fluent/compat/parser.rb +310 -0
- data/lib/fluent/compat/parser_utils.rb +40 -0
- data/lib/fluent/compat/propagate_default.rb +62 -0
- data/lib/fluent/compat/record_filter_mixin.rb +34 -0
- data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
- data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
- data/lib/fluent/compat/socket_util.rb +165 -0
- data/lib/fluent/compat/string_util.rb +34 -0
- data/lib/fluent/compat/structured_format_mixin.rb +26 -0
- data/lib/fluent/compat/type_converter.rb +90 -0
- data/lib/fluent/config/basic_parser.rb +123 -0
- data/lib/fluent/config/configure_proxy.rb +424 -0
- data/lib/fluent/config/dsl.rb +152 -0
- data/lib/fluent/config/element.rb +265 -0
- data/lib/fluent/config/error.rb +32 -0
- data/lib/fluent/config/literal_parser.rb +286 -0
- data/lib/fluent/config/parser.rb +107 -0
- data/lib/fluent/config/section.rb +272 -0
- data/lib/fluent/config/types.rb +249 -0
- data/lib/fluent/config/v1_parser.rb +192 -0
- data/lib/fluent/config.rb +76 -0
- data/lib/fluent/configurable.rb +201 -0
- data/lib/fluent/counter/base_socket.rb +44 -0
- data/lib/fluent/counter/client.rb +297 -0
- data/lib/fluent/counter/error.rb +86 -0
- data/lib/fluent/counter/mutex_hash.rb +163 -0
- data/lib/fluent/counter/server.rb +273 -0
- data/lib/fluent/counter/store.rb +205 -0
- data/lib/fluent/counter/validator.rb +145 -0
- data/lib/fluent/counter.rb +23 -0
- data/lib/fluent/daemon.rb +15 -0
- data/lib/fluent/daemonizer.rb +88 -0
- data/lib/fluent/engine.rb +253 -0
- data/lib/fluent/env.rb +40 -0
- data/lib/fluent/error.rb +34 -0
- data/lib/fluent/event.rb +326 -0
- data/lib/fluent/event_router.rb +297 -0
- data/lib/fluent/ext_monitor_require.rb +28 -0
- data/lib/fluent/filter.rb +21 -0
- data/lib/fluent/fluent_log_event_router.rb +141 -0
- data/lib/fluent/formatter.rb +23 -0
- data/lib/fluent/input.rb +21 -0
- data/lib/fluent/label.rb +46 -0
- data/lib/fluent/load.rb +34 -0
- data/lib/fluent/log.rb +713 -0
- data/lib/fluent/match.rb +187 -0
- data/lib/fluent/mixin.rb +31 -0
- data/lib/fluent/msgpack_factory.rb +106 -0
- data/lib/fluent/oj_options.rb +62 -0
- data/lib/fluent/output.rb +29 -0
- data/lib/fluent/output_chain.rb +23 -0
- data/lib/fluent/parser.rb +23 -0
- data/lib/fluent/plugin/bare_output.rb +104 -0
- data/lib/fluent/plugin/base.rb +197 -0
- data/lib/fluent/plugin/buf_file.rb +213 -0
- data/lib/fluent/plugin/buf_file_single.rb +225 -0
- data/lib/fluent/plugin/buf_memory.rb +34 -0
- data/lib/fluent/plugin/buffer/chunk.rb +240 -0
- data/lib/fluent/plugin/buffer/file_chunk.rb +413 -0
- data/lib/fluent/plugin/buffer/file_single_chunk.rb +311 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
- data/lib/fluent/plugin/buffer.rb +918 -0
- data/lib/fluent/plugin/compressable.rb +96 -0
- data/lib/fluent/plugin/exec_util.rb +22 -0
- data/lib/fluent/plugin/file_util.rb +22 -0
- data/lib/fluent/plugin/file_wrapper.rb +187 -0
- data/lib/fluent/plugin/filter.rb +127 -0
- data/lib/fluent/plugin/filter_grep.rb +189 -0
- data/lib/fluent/plugin/filter_parser.rb +130 -0
- data/lib/fluent/plugin/filter_record_transformer.rb +324 -0
- data/lib/fluent/plugin/filter_stdout.rb +53 -0
- data/lib/fluent/plugin/formatter.rb +75 -0
- data/lib/fluent/plugin/formatter_csv.rb +78 -0
- data/lib/fluent/plugin/formatter_hash.rb +35 -0
- data/lib/fluent/plugin/formatter_json.rb +59 -0
- data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
- data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
- data/lib/fluent/plugin/formatter_out_file.rb +53 -0
- data/lib/fluent/plugin/formatter_single_value.rb +36 -0
- data/lib/fluent/plugin/formatter_stdout.rb +76 -0
- data/lib/fluent/plugin/formatter_tsv.rb +40 -0
- data/lib/fluent/plugin/in_debug_agent.rb +71 -0
- data/lib/fluent/plugin/in_dummy.rb +18 -0
- data/lib/fluent/plugin/in_exec.rb +110 -0
- data/lib/fluent/plugin/in_forward.rb +473 -0
- data/lib/fluent/plugin/in_gc_stat.rb +72 -0
- data/lib/fluent/plugin/in_http.rb +667 -0
- data/lib/fluent/plugin/in_monitor_agent.rb +412 -0
- data/lib/fluent/plugin/in_object_space.rb +93 -0
- data/lib/fluent/plugin/in_sample.rb +141 -0
- data/lib/fluent/plugin/in_syslog.rb +276 -0
- data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
- data/lib/fluent/plugin/in_tail.rb +1228 -0
- data/lib/fluent/plugin/in_tcp.rb +181 -0
- data/lib/fluent/plugin/in_udp.rb +92 -0
- data/lib/fluent/plugin/in_unix.rb +195 -0
- data/lib/fluent/plugin/input.rb +75 -0
- data/lib/fluent/plugin/metrics.rb +119 -0
- data/lib/fluent/plugin/metrics_local.rb +96 -0
- data/lib/fluent/plugin/multi_output.rb +195 -0
- data/lib/fluent/plugin/out_copy.rb +120 -0
- data/lib/fluent/plugin/out_exec.rb +105 -0
- data/lib/fluent/plugin/out_exec_filter.rb +319 -0
- data/lib/fluent/plugin/out_file.rb +334 -0
- data/lib/fluent/plugin/out_forward/ack_handler.rb +161 -0
- data/lib/fluent/plugin/out_forward/connection_manager.rb +113 -0
- data/lib/fluent/plugin/out_forward/error.rb +28 -0
- data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
- data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
- data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
- data/lib/fluent/plugin/out_forward/socket_cache.rb +140 -0
- data/lib/fluent/plugin/out_forward.rb +826 -0
- data/lib/fluent/plugin/out_http.rb +275 -0
- data/lib/fluent/plugin/out_null.rb +74 -0
- data/lib/fluent/plugin/out_relabel.rb +32 -0
- data/lib/fluent/plugin/out_roundrobin.rb +84 -0
- data/lib/fluent/plugin/out_secondary_file.rb +131 -0
- data/lib/fluent/plugin/out_stdout.rb +74 -0
- data/lib/fluent/plugin/out_stream.rb +130 -0
- data/lib/fluent/plugin/output.rb +1556 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
- data/lib/fluent/plugin/parser.rb +275 -0
- data/lib/fluent/plugin/parser_apache.rb +28 -0
- data/lib/fluent/plugin/parser_apache2.rb +88 -0
- data/lib/fluent/plugin/parser_apache_error.rb +26 -0
- data/lib/fluent/plugin/parser_csv.rb +114 -0
- data/lib/fluent/plugin/parser_json.rb +96 -0
- data/lib/fluent/plugin/parser_ltsv.rb +51 -0
- data/lib/fluent/plugin/parser_msgpack.rb +50 -0
- data/lib/fluent/plugin/parser_multiline.rb +152 -0
- data/lib/fluent/plugin/parser_nginx.rb +28 -0
- data/lib/fluent/plugin/parser_none.rb +36 -0
- data/lib/fluent/plugin/parser_regexp.rb +68 -0
- data/lib/fluent/plugin/parser_syslog.rb +496 -0
- data/lib/fluent/plugin/parser_tsv.rb +42 -0
- data/lib/fluent/plugin/sd_file.rb +156 -0
- data/lib/fluent/plugin/sd_srv.rb +135 -0
- data/lib/fluent/plugin/sd_static.rb +58 -0
- data/lib/fluent/plugin/service_discovery.rb +65 -0
- data/lib/fluent/plugin/socket_util.rb +22 -0
- data/lib/fluent/plugin/storage.rb +84 -0
- data/lib/fluent/plugin/storage_local.rb +162 -0
- data/lib/fluent/plugin/string_util.rb +22 -0
- data/lib/fluent/plugin.rb +206 -0
- data/lib/fluent/plugin_helper/cert_option.rb +191 -0
- data/lib/fluent/plugin_helper/child_process.rb +366 -0
- data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
- data/lib/fluent/plugin_helper/counter.rb +51 -0
- data/lib/fluent/plugin_helper/event_emitter.rb +100 -0
- data/lib/fluent/plugin_helper/event_loop.rb +170 -0
- data/lib/fluent/plugin_helper/extract.rb +104 -0
- data/lib/fluent/plugin_helper/formatter.rb +147 -0
- data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
- data/lib/fluent/plugin_helper/http_server/compat/server.rb +92 -0
- data/lib/fluent/plugin_helper/http_server/compat/ssl_context_extractor.rb +52 -0
- data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
- data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
- data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
- data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
- data/lib/fluent/plugin_helper/http_server/server.rb +93 -0
- data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
- data/lib/fluent/plugin_helper/http_server.rb +135 -0
- data/lib/fluent/plugin_helper/inject.rb +154 -0
- data/lib/fluent/plugin_helper/metrics.rb +129 -0
- data/lib/fluent/plugin_helper/parser.rb +147 -0
- data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
- data/lib/fluent/plugin_helper/retry_state.rb +209 -0
- data/lib/fluent/plugin_helper/server.rb +801 -0
- data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
- data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
- data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
- data/lib/fluent/plugin_helper/socket.rb +277 -0
- data/lib/fluent/plugin_helper/socket_option.rb +98 -0
- data/lib/fluent/plugin_helper/storage.rb +349 -0
- data/lib/fluent/plugin_helper/thread.rb +180 -0
- data/lib/fluent/plugin_helper/timer.rb +92 -0
- data/lib/fluent/plugin_helper.rb +75 -0
- data/lib/fluent/plugin_id.rb +93 -0
- data/lib/fluent/process.rb +22 -0
- data/lib/fluent/registry.rb +116 -0
- data/lib/fluent/root_agent.rb +372 -0
- data/lib/fluent/rpc.rb +94 -0
- data/lib/fluent/static_config_analysis.rb +194 -0
- data/lib/fluent/supervisor.rb +1054 -0
- data/lib/fluent/system_config.rb +187 -0
- data/lib/fluent/test/base.rb +78 -0
- data/lib/fluent/test/driver/base.rb +225 -0
- data/lib/fluent/test/driver/base_owned.rb +83 -0
- data/lib/fluent/test/driver/base_owner.rb +135 -0
- data/lib/fluent/test/driver/event_feeder.rb +98 -0
- data/lib/fluent/test/driver/filter.rb +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/storage.rb +30 -0
- data/lib/fluent/test/driver/test_event_router.rb +45 -0
- data/lib/fluent/test/filter_test.rb +77 -0
- data/lib/fluent/test/formatter_test.rb +65 -0
- data/lib/fluent/test/helpers.rb +134 -0
- data/lib/fluent/test/input_test.rb +174 -0
- data/lib/fluent/test/log.rb +79 -0
- data/lib/fluent/test/output_test.rb +156 -0
- data/lib/fluent/test/parser_test.rb +70 -0
- data/lib/fluent/test/startup_shutdown.rb +46 -0
- data/lib/fluent/test.rb +58 -0
- data/lib/fluent/time.rb +512 -0
- data/lib/fluent/timezone.rb +171 -0
- data/lib/fluent/tls.rb +81 -0
- data/lib/fluent/unique_id.rb +39 -0
- data/lib/fluent/variable_store.rb +40 -0
- data/lib/fluent/version.rb +21 -0
- data/lib/fluent/winsvc.rb +103 -0
- data/templates/new_gem/Gemfile +3 -0
- data/templates/new_gem/README.md.erb +43 -0
- data/templates/new_gem/Rakefile +13 -0
- data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
- data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
- data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
- data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
- data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
- data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
- data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
- data/templates/new_gem/test/helper.rb.erb +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/new_gem/test/plugin/test_storage.rb.erb +18 -0
- data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
- data/templates/plugin_config_formatter/param.md-table.erb +10 -0
- data/templates/plugin_config_formatter/param.md.erb +34 -0
- data/templates/plugin_config_formatter/section.md.erb +12 -0
- data/test/command/test_binlog_reader.rb +362 -0
- data/test/command/test_ca_generate.rb +70 -0
- data/test/command/test_cap_ctl.rb +100 -0
- data/test/command/test_cat.rb +128 -0
- data/test/command/test_ctl.rb +57 -0
- data/test/command/test_fluentd.rb +1106 -0
- data/test/command/test_plugin_config_formatter.rb +398 -0
- data/test/command/test_plugin_generator.rb +109 -0
- data/test/compat/test_calls_super.rb +166 -0
- data/test/compat/test_parser.rb +92 -0
- data/test/config/assertions.rb +42 -0
- data/test/config/test_config_parser.rb +551 -0
- data/test/config/test_configurable.rb +1784 -0
- data/test/config/test_configure_proxy.rb +604 -0
- data/test/config/test_dsl.rb +415 -0
- data/test/config/test_element.rb +518 -0
- data/test/config/test_literal_parser.rb +309 -0
- data/test/config/test_plugin_configuration.rb +56 -0
- data/test/config/test_section.rb +191 -0
- data/test/config/test_system_config.rb +199 -0
- data/test/config/test_types.rb +408 -0
- data/test/counter/test_client.rb +563 -0
- data/test/counter/test_error.rb +44 -0
- data/test/counter/test_mutex_hash.rb +179 -0
- data/test/counter/test_server.rb +589 -0
- data/test/counter/test_store.rb +258 -0
- data/test/counter/test_validator.rb +137 -0
- data/test/helper.rb +155 -0
- data/test/helpers/fuzzy_assert.rb +89 -0
- data/test/helpers/process_extenstion.rb +33 -0
- data/test/plugin/data/2010/01/20100102-030405.log +0 -0
- data/test/plugin/data/2010/01/20100102-030406.log +0 -0
- data/test/plugin/data/2010/01/20100102.log +0 -0
- data/test/plugin/data/log/bar +0 -0
- data/test/plugin/data/log/foo/bar.log +0 -0
- data/test/plugin/data/log/foo/bar2 +0 -0
- data/test/plugin/data/log/test.log +0 -0
- data/test/plugin/data/sd_file/config +11 -0
- data/test/plugin/data/sd_file/config.json +17 -0
- data/test/plugin/data/sd_file/config.yaml +11 -0
- data/test/plugin/data/sd_file/config.yml +11 -0
- data/test/plugin/data/sd_file/invalid_config.yml +7 -0
- data/test/plugin/in_tail/test_fifo.rb +121 -0
- data/test/plugin/in_tail/test_io_handler.rb +140 -0
- data/test/plugin/in_tail/test_position_file.rb +379 -0
- data/test/plugin/out_forward/test_ack_handler.rb +101 -0
- data/test/plugin/out_forward/test_connection_manager.rb +145 -0
- data/test/plugin/out_forward/test_handshake_protocol.rb +112 -0
- data/test/plugin/out_forward/test_load_balancer.rb +106 -0
- data/test/plugin/out_forward/test_socket_cache.rb +149 -0
- data/test/plugin/test_bare_output.rb +131 -0
- data/test/plugin/test_base.rb +115 -0
- data/test/plugin/test_buf_file.rb +1275 -0
- data/test/plugin/test_buf_file_single.rb +833 -0
- data/test/plugin/test_buf_memory.rb +42 -0
- data/test/plugin/test_buffer.rb +1383 -0
- data/test/plugin/test_buffer_chunk.rb +198 -0
- data/test/plugin/test_buffer_file_chunk.rb +871 -0
- data/test/plugin/test_buffer_file_single_chunk.rb +611 -0
- data/test/plugin/test_buffer_memory_chunk.rb +339 -0
- data/test/plugin/test_compressable.rb +87 -0
- data/test/plugin/test_file_util.rb +96 -0
- data/test/plugin/test_file_wrapper.rb +126 -0
- data/test/plugin/test_filter.rb +368 -0
- data/test/plugin/test_filter_grep.rb +697 -0
- data/test/plugin/test_filter_parser.rb +731 -0
- data/test/plugin/test_filter_record_transformer.rb +577 -0
- data/test/plugin/test_filter_stdout.rb +207 -0
- data/test/plugin/test_formatter_csv.rb +136 -0
- data/test/plugin/test_formatter_hash.rb +38 -0
- data/test/plugin/test_formatter_json.rb +61 -0
- data/test/plugin/test_formatter_ltsv.rb +70 -0
- data/test/plugin/test_formatter_msgpack.rb +28 -0
- data/test/plugin/test_formatter_out_file.rb +116 -0
- data/test/plugin/test_formatter_single_value.rb +44 -0
- data/test/plugin/test_formatter_tsv.rb +76 -0
- data/test/plugin/test_in_debug_agent.rb +49 -0
- data/test/plugin/test_in_exec.rb +261 -0
- data/test/plugin/test_in_forward.rb +1180 -0
- data/test/plugin/test_in_gc_stat.rb +62 -0
- data/test/plugin/test_in_http.rb +1080 -0
- data/test/plugin/test_in_monitor_agent.rb +923 -0
- data/test/plugin/test_in_object_space.rb +60 -0
- data/test/plugin/test_in_sample.rb +190 -0
- data/test/plugin/test_in_syslog.rb +505 -0
- data/test/plugin/test_in_tail.rb +2363 -0
- data/test/plugin/test_in_tcp.rb +243 -0
- data/test/plugin/test_in_udp.rb +268 -0
- data/test/plugin/test_in_unix.rb +181 -0
- data/test/plugin/test_input.rb +137 -0
- data/test/plugin/test_metadata.rb +89 -0
- data/test/plugin/test_metrics.rb +294 -0
- data/test/plugin/test_metrics_local.rb +96 -0
- data/test/plugin/test_multi_output.rb +204 -0
- data/test/plugin/test_out_copy.rb +308 -0
- data/test/plugin/test_out_exec.rb +312 -0
- data/test/plugin/test_out_exec_filter.rb +606 -0
- data/test/plugin/test_out_file.rb +1037 -0
- data/test/plugin/test_out_forward.rb +1348 -0
- data/test/plugin/test_out_http.rb +428 -0
- data/test/plugin/test_out_null.rb +105 -0
- data/test/plugin/test_out_relabel.rb +28 -0
- data/test/plugin/test_out_roundrobin.rb +146 -0
- data/test/plugin/test_out_secondary_file.rb +458 -0
- data/test/plugin/test_out_stdout.rb +205 -0
- data/test/plugin/test_out_stream.rb +103 -0
- data/test/plugin/test_output.rb +1065 -0
- data/test/plugin/test_output_as_buffered.rb +2024 -0
- data/test/plugin/test_output_as_buffered_backup.rb +363 -0
- data/test/plugin/test_output_as_buffered_compress.rb +165 -0
- data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
- data/test/plugin/test_output_as_buffered_retries.rb +919 -0
- data/test/plugin/test_output_as_buffered_secondary.rb +882 -0
- data/test/plugin/test_output_as_standard.rb +374 -0
- data/test/plugin/test_owned_by.rb +35 -0
- data/test/plugin/test_parser.rb +399 -0
- data/test/plugin/test_parser_apache.rb +42 -0
- data/test/plugin/test_parser_apache2.rb +47 -0
- data/test/plugin/test_parser_apache_error.rb +45 -0
- data/test/plugin/test_parser_csv.rb +200 -0
- data/test/plugin/test_parser_json.rb +138 -0
- data/test/plugin/test_parser_labeled_tsv.rb +160 -0
- data/test/plugin/test_parser_multiline.rb +111 -0
- data/test/plugin/test_parser_nginx.rb +88 -0
- data/test/plugin/test_parser_none.rb +52 -0
- data/test/plugin/test_parser_regexp.rb +289 -0
- data/test/plugin/test_parser_syslog.rb +650 -0
- data/test/plugin/test_parser_tsv.rb +122 -0
- data/test/plugin/test_sd_file.rb +228 -0
- data/test/plugin/test_sd_srv.rb +230 -0
- data/test/plugin/test_storage.rb +167 -0
- data/test/plugin/test_storage_local.rb +335 -0
- data/test/plugin/test_string_util.rb +26 -0
- data/test/plugin_helper/data/cert/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/cert-with-CRLF.pem +19 -0
- data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
- data/test/plugin_helper/data/cert/cert.pem +19 -0
- data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +20 -0
- data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/cert_chains/cert.pem +40 -0
- data/test/plugin_helper/data/cert/empty.pem +0 -0
- data/test/plugin_helper/data/cert/generate_cert.rb +125 -0
- data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +30 -0
- data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +20 -0
- data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +20 -0
- data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +30 -0
- data/test/plugin_helper/data/cert/with_ca/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +21 -0
- data/test/plugin_helper/data/cert/with_ca/cert.pem +21 -0
- data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +30 -0
- data/test/plugin_helper/data/cert/without_ca/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +20 -0
- data/test/plugin_helper/data/cert/without_ca/cert.pem +20 -0
- data/test/plugin_helper/http_server/test_app.rb +65 -0
- data/test/plugin_helper/http_server/test_route.rb +32 -0
- data/test/plugin_helper/service_discovery/test_manager.rb +93 -0
- data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +21 -0
- data/test/plugin_helper/test_cert_option.rb +25 -0
- data/test/plugin_helper/test_child_process.rb +840 -0
- data/test/plugin_helper/test_compat_parameters.rb +358 -0
- data/test/plugin_helper/test_event_emitter.rb +80 -0
- data/test/plugin_helper/test_event_loop.rb +52 -0
- data/test/plugin_helper/test_extract.rb +194 -0
- data/test/plugin_helper/test_formatter.rb +255 -0
- data/test/plugin_helper/test_http_server_helper.rb +372 -0
- data/test/plugin_helper/test_inject.rb +561 -0
- data/test/plugin_helper/test_metrics.rb +137 -0
- data/test/plugin_helper/test_parser.rb +264 -0
- data/test/plugin_helper/test_record_accessor.rb +238 -0
- data/test/plugin_helper/test_retry_state.rb +442 -0
- data/test/plugin_helper/test_server.rb +1823 -0
- data/test/plugin_helper/test_service_discovery.rb +165 -0
- data/test/plugin_helper/test_socket.rb +146 -0
- data/test/plugin_helper/test_storage.rb +542 -0
- data/test/plugin_helper/test_thread.rb +164 -0
- data/test/plugin_helper/test_timer.rb +130 -0
- data/test/scripts/exec_script.rb +32 -0
- data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
- data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
- data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
- data/test/scripts/fluent/plugin/out_test.rb +81 -0
- data/test/scripts/fluent/plugin/out_test2.rb +80 -0
- data/test/scripts/fluent/plugin/parser_known.rb +4 -0
- data/test/test_capability.rb +74 -0
- data/test/test_clock.rb +164 -0
- data/test/test_config.rb +202 -0
- data/test/test_configdsl.rb +148 -0
- data/test/test_daemonizer.rb +91 -0
- data/test/test_engine.rb +203 -0
- data/test/test_event.rb +531 -0
- data/test/test_event_router.rb +331 -0
- data/test/test_event_time.rb +199 -0
- data/test/test_filter.rb +121 -0
- data/test/test_fluent_log_event_router.rb +99 -0
- data/test/test_formatter.rb +366 -0
- data/test/test_input.rb +31 -0
- data/test/test_log.rb +994 -0
- data/test/test_logger_initializer.rb +46 -0
- data/test/test_match.rb +148 -0
- data/test/test_mixin.rb +351 -0
- data/test/test_msgpack_factory.rb +18 -0
- data/test/test_oj_options.rb +55 -0
- data/test/test_output.rb +278 -0
- data/test/test_plugin.rb +251 -0
- data/test/test_plugin_classes.rb +370 -0
- data/test/test_plugin_helper.rb +81 -0
- data/test/test_plugin_id.rb +119 -0
- data/test/test_process.rb +14 -0
- data/test/test_root_agent.rb +951 -0
- data/test/test_static_config_analysis.rb +177 -0
- data/test/test_supervisor.rb +601 -0
- data/test/test_test_drivers.rb +136 -0
- data/test/test_time_formatter.rb +301 -0
- data/test/test_time_parser.rb +362 -0
- data/test/test_tls.rb +65 -0
- data/test/test_unique_id.rb +47 -0
- data/test/test_variable_store.rb +65 -0
- metadata +1261 -0
@@ -0,0 +1,349 @@
|
|
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 'forwardable'
|
18
|
+
|
19
|
+
require 'fluent/plugin'
|
20
|
+
require 'fluent/plugin/storage'
|
21
|
+
require 'fluent/plugin_helper/timer'
|
22
|
+
require 'fluent/config/element'
|
23
|
+
require 'fluent/configurable'
|
24
|
+
|
25
|
+
module Fluent
|
26
|
+
module PluginHelper
|
27
|
+
module Storage
|
28
|
+
include Fluent::PluginHelper::Timer
|
29
|
+
|
30
|
+
StorageState = Struct.new(:storage, :running)
|
31
|
+
|
32
|
+
def storage_create(usage: '', type: nil, conf: nil, default_type: nil)
|
33
|
+
if conf && conf.respond_to?(:arg) && !conf.arg.empty?
|
34
|
+
usage = conf.arg
|
35
|
+
end
|
36
|
+
if !usage.empty? && usage !~ /^[a-zA-Z][-_.a-zA-Z0-9]*$/
|
37
|
+
raise Fluent::ConfigError, "Argument in <storage ARG> uses invalid characters: '#{usage}'"
|
38
|
+
end
|
39
|
+
|
40
|
+
s = @_storages[usage]
|
41
|
+
if s && s.running
|
42
|
+
return s.storage
|
43
|
+
elsif s
|
44
|
+
# storage is already created, but not loaded / started
|
45
|
+
else # !s
|
46
|
+
type = if type
|
47
|
+
type
|
48
|
+
elsif conf && conf.respond_to?(:[])
|
49
|
+
raise Fluent::ConfigError, "@type is required in <storage>" unless conf['@type']
|
50
|
+
conf['@type']
|
51
|
+
elsif default_type
|
52
|
+
default_type
|
53
|
+
else
|
54
|
+
raise ArgumentError, "BUG: both type and conf are not specified"
|
55
|
+
end
|
56
|
+
storage = Plugin.new_storage(type, parent: self)
|
57
|
+
config = case conf
|
58
|
+
when Fluent::Config::Element
|
59
|
+
conf
|
60
|
+
when Hash
|
61
|
+
# in code, programmer may use symbols as keys, but Element needs strings
|
62
|
+
conf = Hash[conf.map{|k,v| [k.to_s, v]}]
|
63
|
+
Fluent::Config::Element.new('storage', usage, conf, [])
|
64
|
+
when nil
|
65
|
+
Fluent::Config::Element.new('storage', usage, {'@type' => type}, [])
|
66
|
+
else
|
67
|
+
raise ArgumentError, "BUG: conf must be a Element, Hash (or unspecified), but '#{conf.class}'"
|
68
|
+
end
|
69
|
+
storage.configure(config)
|
70
|
+
if @_storages_started
|
71
|
+
storage.start
|
72
|
+
end
|
73
|
+
s = @_storages[usage] = StorageState.new(wrap_instance(storage), false)
|
74
|
+
end
|
75
|
+
|
76
|
+
s.storage
|
77
|
+
end
|
78
|
+
|
79
|
+
module StorageParams
|
80
|
+
include Fluent::Configurable
|
81
|
+
# minimum section definition to instantiate storage plugin instances
|
82
|
+
config_section :storage, required: false, multi: true, param_name: :storage_configs, init: true do
|
83
|
+
config_argument :usage, :string, default: ''
|
84
|
+
config_param :@type, :string, default: Fluent::Plugin::Storage::DEFAULT_TYPE
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.included(mod)
|
89
|
+
mod.include StorageParams
|
90
|
+
end
|
91
|
+
|
92
|
+
attr_reader :_storages # for tests
|
93
|
+
|
94
|
+
def initialize
|
95
|
+
super
|
96
|
+
@_storages_started = false
|
97
|
+
@_storages = {} # usage => storage_state
|
98
|
+
end
|
99
|
+
|
100
|
+
def configure(conf)
|
101
|
+
super
|
102
|
+
|
103
|
+
@storage_configs.each do |section|
|
104
|
+
if !section.usage.empty? && section.usage !~ /^[a-zA-Z][-_.a-zA-Z0-9]*$/
|
105
|
+
raise Fluent::ConfigError, "Argument in <storage ARG> uses invalid characters: '#{section.usage}'"
|
106
|
+
end
|
107
|
+
if @_storages[section.usage]
|
108
|
+
raise Fluent::ConfigError, "duplicated storages configured: #{section.usage}"
|
109
|
+
end
|
110
|
+
storage = Plugin.new_storage(section[:@type], parent: self)
|
111
|
+
storage.configure(section.corresponding_config_element)
|
112
|
+
@_storages[section.usage] = StorageState.new(wrap_instance(storage), false)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def start
|
117
|
+
super
|
118
|
+
|
119
|
+
@_storages_started = true
|
120
|
+
@_storages.each_pair do |usage, s|
|
121
|
+
s.storage.start
|
122
|
+
s.storage.load
|
123
|
+
|
124
|
+
if s.storage.autosave && !s.storage.persistent
|
125
|
+
timer_execute(:storage_autosave, s.storage.autosave_interval, repeat: true) do
|
126
|
+
begin
|
127
|
+
s.storage.save
|
128
|
+
rescue => e
|
129
|
+
log.error "plugin storage failed to save its data", usage: usage, type: type, error: e
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
s.running = true
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def storage_operate(method_name, &block)
|
138
|
+
@_storages.each_pair do |usage, s|
|
139
|
+
begin
|
140
|
+
block.call(s) if block_given?
|
141
|
+
s.storage.__send__(method_name)
|
142
|
+
rescue => e
|
143
|
+
log.error "unexpected error while #{method_name}", usage: usage, storage: s.storage, error: e
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def stop
|
149
|
+
super
|
150
|
+
# timer stops automatically in super
|
151
|
+
storage_operate(:stop)
|
152
|
+
end
|
153
|
+
|
154
|
+
def before_shutdown
|
155
|
+
storage_operate(:before_shutdown)
|
156
|
+
super
|
157
|
+
end
|
158
|
+
|
159
|
+
def shutdown
|
160
|
+
storage_operate(:shutdown) do |s|
|
161
|
+
s.storage.save if s.storage.save_at_shutdown
|
162
|
+
end
|
163
|
+
super
|
164
|
+
end
|
165
|
+
|
166
|
+
def after_shutdown
|
167
|
+
storage_operate(:after_shutdown)
|
168
|
+
super
|
169
|
+
end
|
170
|
+
|
171
|
+
def close
|
172
|
+
storage_operate(:close){|s| s.running = false }
|
173
|
+
super
|
174
|
+
end
|
175
|
+
|
176
|
+
def terminate
|
177
|
+
storage_operate(:terminate)
|
178
|
+
@_storages = {}
|
179
|
+
super
|
180
|
+
end
|
181
|
+
|
182
|
+
def wrap_instance(storage)
|
183
|
+
if storage.persistent && storage.persistent_always?
|
184
|
+
storage
|
185
|
+
elsif storage.persistent
|
186
|
+
PersistentWrapper.new(storage)
|
187
|
+
elsif !storage.synchronized?
|
188
|
+
SynchronizeWrapper.new(storage)
|
189
|
+
else
|
190
|
+
storage
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
class PersistentWrapper
|
195
|
+
# PersistentWrapper always provides synchronized operations
|
196
|
+
extend Forwardable
|
197
|
+
|
198
|
+
def initialize(storage)
|
199
|
+
@storage = storage
|
200
|
+
@monitor = Monitor.new
|
201
|
+
end
|
202
|
+
|
203
|
+
def_delegators :@storage, :autosave_interval, :save_at_shutdown
|
204
|
+
def_delegators :@storage, :start, :stop, :before_shutdown, :shutdown, :after_shutdown, :close, :terminate
|
205
|
+
def_delegators :@storage, :started?, :stopped?, :before_shutdown?, :shutdown?, :after_shutdown?, :closed?, :terminated?
|
206
|
+
|
207
|
+
def method_missing(name, *args)
|
208
|
+
@monitor.synchronize{ @storage.__send__(name, *args) }
|
209
|
+
end
|
210
|
+
|
211
|
+
def persistent_always?
|
212
|
+
true
|
213
|
+
end
|
214
|
+
|
215
|
+
def persistent
|
216
|
+
true
|
217
|
+
end
|
218
|
+
|
219
|
+
def autosave
|
220
|
+
false
|
221
|
+
end
|
222
|
+
|
223
|
+
def synchronized?
|
224
|
+
true
|
225
|
+
end
|
226
|
+
|
227
|
+
def implementation
|
228
|
+
@storage
|
229
|
+
end
|
230
|
+
|
231
|
+
def load
|
232
|
+
@monitor.synchronize do
|
233
|
+
@storage.load
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
def save
|
238
|
+
@monitor.synchronize do
|
239
|
+
@storage.save
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
def get(key)
|
244
|
+
@monitor.synchronize do
|
245
|
+
@storage.load
|
246
|
+
@storage.get(key)
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
def fetch(key, defval)
|
251
|
+
@monitor.synchronize do
|
252
|
+
@storage.load
|
253
|
+
@storage.fetch(key, defval)
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
def put(key, value)
|
258
|
+
@monitor.synchronize do
|
259
|
+
@storage.load
|
260
|
+
@storage.put(key, value)
|
261
|
+
@storage.save
|
262
|
+
value
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
def delete(key)
|
267
|
+
@monitor.synchronize do
|
268
|
+
@storage.load
|
269
|
+
val = @storage.delete(key)
|
270
|
+
@storage.save
|
271
|
+
val
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
def update(key, &block)
|
276
|
+
@monitor.synchronize do
|
277
|
+
@storage.load
|
278
|
+
v = block.call(@storage.get(key))
|
279
|
+
@storage.put(key, v)
|
280
|
+
@storage.save
|
281
|
+
v
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
class SynchronizeWrapper
|
287
|
+
extend Forwardable
|
288
|
+
|
289
|
+
def initialize(storage)
|
290
|
+
@storage = storage
|
291
|
+
@monitor = Monitor.new
|
292
|
+
end
|
293
|
+
|
294
|
+
def_delegators :@storage, :persistent, :autosave, :autosave_interval, :save_at_shutdown
|
295
|
+
def_delegators :@storage, :persistent_always?
|
296
|
+
def_delegators :@storage, :start, :stop, :before_shutdown, :shutdown, :after_shutdown, :close, :terminate
|
297
|
+
def_delegators :@storage, :started?, :stopped?, :before_shutdown?, :shutdown?, :after_shutdown?, :closed?, :terminated?
|
298
|
+
|
299
|
+
def method_missing(name, *args)
|
300
|
+
@monitor.synchronize{ @storage.__send__(name, *args) }
|
301
|
+
end
|
302
|
+
|
303
|
+
def synchronized?
|
304
|
+
true
|
305
|
+
end
|
306
|
+
|
307
|
+
def implementation
|
308
|
+
@storage
|
309
|
+
end
|
310
|
+
|
311
|
+
def load
|
312
|
+
@monitor.synchronize do
|
313
|
+
@storage.load
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
def save
|
318
|
+
@monitor.synchronize do
|
319
|
+
@storage.save
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
def get(key)
|
324
|
+
@monitor.synchronize{ @storage.get(key) }
|
325
|
+
end
|
326
|
+
|
327
|
+
def fetch(key, defval)
|
328
|
+
@monitor.synchronize{ @storage.fetch(key, defval) }
|
329
|
+
end
|
330
|
+
|
331
|
+
def put(key, value)
|
332
|
+
@monitor.synchronize{ @storage.put(key, value) }
|
333
|
+
end
|
334
|
+
|
335
|
+
def delete(key)
|
336
|
+
@monitor.synchronize{ @storage.delete(key) }
|
337
|
+
end
|
338
|
+
|
339
|
+
def update(key, &block)
|
340
|
+
@monitor.synchronize do
|
341
|
+
v = block.call(@storage.get(key))
|
342
|
+
@storage.put(key, v)
|
343
|
+
v
|
344
|
+
end
|
345
|
+
end
|
346
|
+
end
|
347
|
+
end
|
348
|
+
end
|
349
|
+
end
|
@@ -0,0 +1,180 @@
|
|
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/clock'
|
18
|
+
|
19
|
+
module Fluent
|
20
|
+
module PluginHelper
|
21
|
+
module Thread
|
22
|
+
THREAD_DEFAULT_WAIT_SECONDS = 1
|
23
|
+
THREAD_SHUTDOWN_HARD_TIMEOUT_IN_TESTS = 100 # second
|
24
|
+
|
25
|
+
# stop : mark callback thread as stopped
|
26
|
+
# shutdown : [-]
|
27
|
+
# close : correct stopped threads
|
28
|
+
# terminate: kill all threads
|
29
|
+
|
30
|
+
attr_reader :_threads # for test driver
|
31
|
+
|
32
|
+
def thread_current_running?
|
33
|
+
# checker for code in callback of thread_create
|
34
|
+
::Thread.current[:_fluentd_plugin_helper_thread_running] || false
|
35
|
+
end
|
36
|
+
|
37
|
+
def thread_wait_until_start
|
38
|
+
until @_threads_mutex.synchronize{ @_threads.values.reduce(true){|r,t| r && t[:_fluentd_plugin_helper_thread_started] } }
|
39
|
+
sleep 0.1
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def thread_wait_until_stop
|
44
|
+
timeout_at = Fluent::Clock.now + THREAD_SHUTDOWN_HARD_TIMEOUT_IN_TESTS
|
45
|
+
until @_threads_mutex.synchronize{ @_threads.values.reduce(true){|r,t| r && !t[:_fluentd_plugin_helper_thread_running] } }
|
46
|
+
break if Fluent::Clock.now > timeout_at
|
47
|
+
sleep 0.1
|
48
|
+
end
|
49
|
+
@_threads_mutex.synchronize{ @_threads.values }.each do |t|
|
50
|
+
if t.alive?
|
51
|
+
puts "going to kill the thread still running: #{t[:_fluentd_plugin_helper_thread_title]}"
|
52
|
+
t.kill rescue nil
|
53
|
+
t[:_fluentd_plugin_helper_thread_running] = false
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Ruby 2.2.3 or earlier (and all 2.1.x) cause bug about Threading ("Stack consistency error")
|
59
|
+
# by passing splatted argument to `yield`
|
60
|
+
# https://bugs.ruby-lang.org/issues/11027
|
61
|
+
# We can enable to pass arguments after expire of Ruby 2.1 (& older 2.2.x)
|
62
|
+
# def thread_create(title, *args)
|
63
|
+
# Thread.new(*args) do |*t_args|
|
64
|
+
# yield *t_args
|
65
|
+
def thread_create(title)
|
66
|
+
raise ArgumentError, "BUG: title must be a symbol" unless title.is_a? Symbol
|
67
|
+
raise ArgumentError, "BUG: callback not specified" unless block_given?
|
68
|
+
m = Mutex.new
|
69
|
+
m.lock
|
70
|
+
thread = ::Thread.new do
|
71
|
+
m.lock # run thread after that thread is successfully set into @_threads
|
72
|
+
m.unlock
|
73
|
+
thread_exit = false
|
74
|
+
::Thread.current[:_fluentd_plugin_helper_thread_title] = title
|
75
|
+
::Thread.current[:_fluentd_plugin_helper_thread_started] = true
|
76
|
+
::Thread.current[:_fluentd_plugin_helper_thread_running] = true
|
77
|
+
begin
|
78
|
+
yield
|
79
|
+
thread_exit = true
|
80
|
+
rescue Exception => e
|
81
|
+
log.warn "thread exited by unexpected error", plugin: self.class, title: title, error: e
|
82
|
+
thread_exit = true
|
83
|
+
raise
|
84
|
+
ensure
|
85
|
+
@_threads_mutex.synchronize do
|
86
|
+
@_threads.delete(::Thread.current.object_id)
|
87
|
+
end
|
88
|
+
::Thread.current[:_fluentd_plugin_helper_thread_running] = false
|
89
|
+
if ::Thread.current.alive? && !thread_exit
|
90
|
+
log.warn "thread doesn't exit correctly (killed or other reason)", plugin: self.class, title: title, thread: ::Thread.current, error: $!
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
thread.abort_on_exception = true
|
95
|
+
thread.name = title.to_s if thread.respond_to?(:name)
|
96
|
+
@_threads_mutex.synchronize do
|
97
|
+
@_threads[thread.object_id] = thread
|
98
|
+
end
|
99
|
+
m.unlock
|
100
|
+
thread
|
101
|
+
end
|
102
|
+
|
103
|
+
def thread_exist?(title)
|
104
|
+
@_threads.values.select{|thread| title == thread[:_fluentd_plugin_helper_thread_title] }.size > 0
|
105
|
+
end
|
106
|
+
|
107
|
+
def thread_started?(title)
|
108
|
+
t = @_threads.values.select{|thread| title == thread[:_fluentd_plugin_helper_thread_title] }.first
|
109
|
+
t && t[:_fluentd_plugin_helper_thread_started]
|
110
|
+
end
|
111
|
+
|
112
|
+
def thread_running?(title)
|
113
|
+
t = @_threads.values.select{|thread| title == thread[:_fluentd_plugin_helper_thread_title] }.first
|
114
|
+
t && t[:_fluentd_plugin_helper_thread_running]
|
115
|
+
end
|
116
|
+
|
117
|
+
def initialize
|
118
|
+
super
|
119
|
+
@_threads_mutex = Mutex.new
|
120
|
+
@_threads = {}
|
121
|
+
@_thread_wait_seconds = THREAD_DEFAULT_WAIT_SECONDS
|
122
|
+
end
|
123
|
+
|
124
|
+
def stop
|
125
|
+
super
|
126
|
+
wakeup_threads = []
|
127
|
+
@_threads_mutex.synchronize do
|
128
|
+
@_threads.each_value do |thread|
|
129
|
+
thread[:_fluentd_plugin_helper_thread_running] = false
|
130
|
+
wakeup_threads << thread if thread.alive? && thread.status == "sleep"
|
131
|
+
end
|
132
|
+
end
|
133
|
+
wakeup_threads.each do |thread|
|
134
|
+
if thread.alive?
|
135
|
+
thread.wakeup
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def after_shutdown
|
141
|
+
super
|
142
|
+
wakeup_threads = []
|
143
|
+
@_threads_mutex.synchronize do
|
144
|
+
@_threads.each_value do |thread|
|
145
|
+
wakeup_threads << thread if thread.alive? && thread.status == "sleep"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
wakeup_threads.each do |thread|
|
149
|
+
thread.wakeup if thread.alive?
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def close
|
154
|
+
@_threads_mutex.synchronize{ @_threads.keys }.each do |obj_id|
|
155
|
+
thread = @_threads[obj_id]
|
156
|
+
if !thread || thread.join(@_thread_wait_seconds)
|
157
|
+
@_threads_mutex.synchronize{ @_threads.delete(obj_id) }
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
super
|
162
|
+
end
|
163
|
+
|
164
|
+
def terminate
|
165
|
+
super
|
166
|
+
@_threads_mutex.synchronize{ @_threads.keys }.each do |obj_id|
|
167
|
+
thread = @_threads[obj_id]
|
168
|
+
log.warn "killing existing thread", thread: thread
|
169
|
+
thread.kill if thread
|
170
|
+
end
|
171
|
+
@_threads_mutex.synchronize{ @_threads.keys }.each do |obj_id|
|
172
|
+
thread = @_threads[obj_id]
|
173
|
+
thread.join
|
174
|
+
@_threads_mutex.synchronize{ @_threads.delete(obj_id) }
|
175
|
+
end
|
176
|
+
@_thread_wait_seconds = nil
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
@@ -0,0 +1,92 @@
|
|
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/event_loop'
|
18
|
+
require 'set'
|
19
|
+
|
20
|
+
module Fluent
|
21
|
+
module PluginHelper
|
22
|
+
module Timer
|
23
|
+
include Fluent::PluginHelper::EventLoop
|
24
|
+
|
25
|
+
# stop : turn checker into false (callbacks not called anymore)
|
26
|
+
# shutdown : [-]
|
27
|
+
# close : [-]
|
28
|
+
# terminate: [-]
|
29
|
+
|
30
|
+
attr_reader :_timers # for tests
|
31
|
+
|
32
|
+
# interval: integer/float, repeat: true/false
|
33
|
+
def timer_execute(title, interval, repeat: true, &block)
|
34
|
+
raise ArgumentError, "BUG: title must be a symbol" unless title.is_a? Symbol
|
35
|
+
raise ArgumentError, "BUG: block not specified for callback" unless block_given?
|
36
|
+
checker = ->(){ @_timer_running }
|
37
|
+
detacher = ->(watcher){ event_loop_detach(watcher) }
|
38
|
+
timer = TimerWatcher.new(title, interval, repeat, log, checker, detacher, &block)
|
39
|
+
@_timers << title
|
40
|
+
event_loop_attach(timer)
|
41
|
+
timer
|
42
|
+
end
|
43
|
+
|
44
|
+
def timer_running?
|
45
|
+
defined?(@_timer_running) && @_timer_running
|
46
|
+
end
|
47
|
+
|
48
|
+
def initialize
|
49
|
+
super
|
50
|
+
@_timers ||= Set.new
|
51
|
+
end
|
52
|
+
|
53
|
+
def start
|
54
|
+
super
|
55
|
+
@_timer_running = true
|
56
|
+
end
|
57
|
+
|
58
|
+
def stop
|
59
|
+
super
|
60
|
+
@_timer_running = false
|
61
|
+
end
|
62
|
+
|
63
|
+
def terminate
|
64
|
+
super
|
65
|
+
@_timers = nil
|
66
|
+
end
|
67
|
+
|
68
|
+
class TimerWatcher < Coolio::TimerWatcher
|
69
|
+
def initialize(title, interval, repeat, log, checker, detacher, &callback)
|
70
|
+
@title = title
|
71
|
+
@callback = callback
|
72
|
+
@repeat = repeat
|
73
|
+
@log = log
|
74
|
+
@checker = checker
|
75
|
+
@detacher = detacher
|
76
|
+
super(interval, repeat)
|
77
|
+
end
|
78
|
+
|
79
|
+
def on_timer
|
80
|
+
@callback.call if @checker.call
|
81
|
+
rescue => e
|
82
|
+
@log.error "Unexpected error raised. Stopping the timer.", title: @title, error: e
|
83
|
+
@log.error_backtrace
|
84
|
+
detach
|
85
|
+
@log.error "Timer detached.", title: @title
|
86
|
+
ensure
|
87
|
+
@detacher.call(self) unless @repeat
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,75 @@
|
|
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/event_emitter'
|
18
|
+
require 'fluent/plugin_helper/thread'
|
19
|
+
require 'fluent/plugin_helper/event_loop'
|
20
|
+
require 'fluent/plugin_helper/timer'
|
21
|
+
require 'fluent/plugin_helper/child_process'
|
22
|
+
require 'fluent/plugin_helper/storage'
|
23
|
+
require 'fluent/plugin_helper/parser'
|
24
|
+
require 'fluent/plugin_helper/formatter'
|
25
|
+
require 'fluent/plugin_helper/http_server'
|
26
|
+
require 'fluent/plugin_helper/inject'
|
27
|
+
require 'fluent/plugin_helper/extract'
|
28
|
+
require 'fluent/plugin_helper/socket'
|
29
|
+
require 'fluent/plugin_helper/server'
|
30
|
+
require 'fluent/plugin_helper/counter'
|
31
|
+
require 'fluent/plugin_helper/retry_state'
|
32
|
+
require 'fluent/plugin_helper/record_accessor'
|
33
|
+
require 'fluent/plugin_helper/compat_parameters'
|
34
|
+
require 'fluent/plugin_helper/service_discovery'
|
35
|
+
require 'fluent/plugin_helper/metrics'
|
36
|
+
|
37
|
+
module Fluent
|
38
|
+
module PluginHelper
|
39
|
+
module Mixin
|
40
|
+
def self.included(mod)
|
41
|
+
mod.extend(Fluent::PluginHelper)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.extended(mod)
|
46
|
+
def mod.inherited(subclass)
|
47
|
+
subclass.module_eval do
|
48
|
+
@_plugin_helpers_list = []
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def helpers_internal(*snake_case_symbols)
|
54
|
+
helper_modules = []
|
55
|
+
snake_case_symbols.each do |name|
|
56
|
+
begin
|
57
|
+
helper_modules << Fluent::PluginHelper.const_get(name.to_s.split('_').map(&:capitalize).join)
|
58
|
+
rescue NameError
|
59
|
+
raise "Unknown plugin helper:#{name}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
include(*helper_modules)
|
63
|
+
end
|
64
|
+
|
65
|
+
def helpers(*snake_case_symbols)
|
66
|
+
@_plugin_helpers_list ||= []
|
67
|
+
@_plugin_helpers_list.concat(snake_case_symbols)
|
68
|
+
helpers_internal(*snake_case_symbols)
|
69
|
+
end
|
70
|
+
|
71
|
+
def plugin_helpers
|
72
|
+
@_plugin_helpers_list || []
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|