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,147 @@
|
|
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'
|
18
|
+
require 'fluent/plugin/parser'
|
19
|
+
require 'fluent/config/element'
|
20
|
+
require 'fluent/configurable'
|
21
|
+
|
22
|
+
module Fluent
|
23
|
+
module PluginHelper
|
24
|
+
module Parser
|
25
|
+
def parser_create(usage: '', type: nil, conf: nil, default_type: nil)
|
26
|
+
parser = @_parsers[usage]
|
27
|
+
return parser if parser && !type && !conf
|
28
|
+
|
29
|
+
type = if type
|
30
|
+
type
|
31
|
+
elsif conf && conf.respond_to?(:[])
|
32
|
+
raise Fluent::ConfigError, "@type is required in <parse>" unless conf['@type']
|
33
|
+
conf['@type']
|
34
|
+
elsif default_type
|
35
|
+
default_type
|
36
|
+
else
|
37
|
+
raise ArgumentError, "BUG: both type and conf are not specified"
|
38
|
+
end
|
39
|
+
parser = Fluent::Plugin.new_parser(type, parent: self)
|
40
|
+
config = case conf
|
41
|
+
when Fluent::Config::Element
|
42
|
+
conf
|
43
|
+
when Hash
|
44
|
+
# in code, programmer may use symbols as keys, but Element needs strings
|
45
|
+
conf = Hash[conf.map{|k,v| [k.to_s, v]}]
|
46
|
+
Fluent::Config::Element.new('parse', usage, conf, [])
|
47
|
+
when nil
|
48
|
+
Fluent::Config::Element.new('parse', usage, {}, [])
|
49
|
+
else
|
50
|
+
raise ArgumentError, "BUG: conf must be a Element, Hash (or unspecified), but '#{conf.class}'"
|
51
|
+
end
|
52
|
+
parser.configure(config)
|
53
|
+
if @_parsers_started
|
54
|
+
parser.start
|
55
|
+
end
|
56
|
+
|
57
|
+
@_parsers[usage] = parser
|
58
|
+
parser
|
59
|
+
end
|
60
|
+
|
61
|
+
module ParserParams
|
62
|
+
include Fluent::Configurable
|
63
|
+
# minimum section definition to instantiate parser plugin instances
|
64
|
+
config_section :parse, required: false, multi: true, init: true, param_name: :parser_configs do
|
65
|
+
config_argument :usage, :string, default: ''
|
66
|
+
config_param :@type, :string # config_set_default required for :@type
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.included(mod)
|
71
|
+
mod.include ParserParams
|
72
|
+
end
|
73
|
+
|
74
|
+
attr_reader :_parsers # for tests
|
75
|
+
|
76
|
+
def initialize
|
77
|
+
super
|
78
|
+
@_parsers_started = false
|
79
|
+
@_parsers = {} # usage => parser
|
80
|
+
end
|
81
|
+
|
82
|
+
def configure(conf)
|
83
|
+
super
|
84
|
+
|
85
|
+
@parser_configs.each do |section|
|
86
|
+
if @_parsers[section.usage]
|
87
|
+
raise Fluent::ConfigError, "duplicated parsers configured: #{section.usage}"
|
88
|
+
end
|
89
|
+
parser = Plugin.new_parser(section[:@type], parent: self)
|
90
|
+
parser.configure(section.corresponding_config_element)
|
91
|
+
@_parsers[section.usage] = parser
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def start
|
96
|
+
super
|
97
|
+
@_parsers_started = true
|
98
|
+
@_parsers.each_pair do |usage, parser|
|
99
|
+
parser.start
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def parser_operate(method_name, &block)
|
104
|
+
@_parsers.each_pair do |usage, parser|
|
105
|
+
begin
|
106
|
+
parser.send(method_name)
|
107
|
+
block.call(parser) if block_given?
|
108
|
+
rescue => e
|
109
|
+
log.error "unexpected error while #{method_name}", usage: usage, parser: parser, error: e
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def stop
|
115
|
+
super
|
116
|
+
parser_operate(:stop)
|
117
|
+
end
|
118
|
+
|
119
|
+
def before_shutdown
|
120
|
+
parser_operate(:before_shutdown)
|
121
|
+
super
|
122
|
+
end
|
123
|
+
|
124
|
+
def shutdown
|
125
|
+
parser_operate(:shutdown)
|
126
|
+
super
|
127
|
+
end
|
128
|
+
|
129
|
+
def after_shutdown
|
130
|
+
parser_operate(:after_shutdown)
|
131
|
+
super
|
132
|
+
end
|
133
|
+
|
134
|
+
def close
|
135
|
+
parser_operate(:close)
|
136
|
+
super
|
137
|
+
end
|
138
|
+
|
139
|
+
def terminate
|
140
|
+
parser_operate(:terminate)
|
141
|
+
@_parsers_started = false
|
142
|
+
@_parsers = {}
|
143
|
+
super
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,210 @@
|
|
1
|
+
#
|
2
|
+
# Fluentd
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
require 'fluent/config/error'
|
18
|
+
unless {}.respond_to?(:dig)
|
19
|
+
begin
|
20
|
+
# backport_dig is faster than dig_rb so prefer backport_dig.
|
21
|
+
require 'backport_dig'
|
22
|
+
rescue LoadError
|
23
|
+
require 'dig_rb'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module Fluent
|
28
|
+
module PluginHelper
|
29
|
+
module RecordAccessor
|
30
|
+
def record_accessor_create(param)
|
31
|
+
Accessor.new(param)
|
32
|
+
end
|
33
|
+
|
34
|
+
class Accessor
|
35
|
+
attr_reader :keys
|
36
|
+
|
37
|
+
def initialize(param)
|
38
|
+
@keys = Accessor.parse_parameter(param)
|
39
|
+
|
40
|
+
if @keys.is_a?(Array)
|
41
|
+
@last_key = @keys.last
|
42
|
+
@dig_keys = @keys[0..-2]
|
43
|
+
if @dig_keys.empty?
|
44
|
+
@keys = @keys.first
|
45
|
+
mcall = method(:call_index)
|
46
|
+
mdelete = method(:delete_top)
|
47
|
+
else
|
48
|
+
mcall = method(:call_dig)
|
49
|
+
mdelete = method(:delete_nest)
|
50
|
+
end
|
51
|
+
else
|
52
|
+
# Call [] for single key to reduce dig overhead
|
53
|
+
mcall = method(:call_index)
|
54
|
+
mdelete = method(:delete_top)
|
55
|
+
end
|
56
|
+
|
57
|
+
singleton_class.module_eval do
|
58
|
+
define_method(:call, mcall)
|
59
|
+
define_method(:delete, mdelete)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def call(r)
|
64
|
+
end
|
65
|
+
|
66
|
+
# To optimize the performance, use class_eval with pre-expanding @keys
|
67
|
+
# See https://gist.github.com/repeatedly/ab553ed260cd080bd01ec71da9427312
|
68
|
+
def call_dig(r)
|
69
|
+
r.dig(*@keys)
|
70
|
+
end
|
71
|
+
|
72
|
+
def call_index(r)
|
73
|
+
r[@keys]
|
74
|
+
end
|
75
|
+
|
76
|
+
def delete(r)
|
77
|
+
end
|
78
|
+
|
79
|
+
def delete_nest(r)
|
80
|
+
if target = r.dig(*@dig_keys)
|
81
|
+
if target.is_a?(Array)
|
82
|
+
target.delete_at(@last_key)
|
83
|
+
else
|
84
|
+
target.delete(@last_key)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
rescue
|
88
|
+
nil
|
89
|
+
end
|
90
|
+
|
91
|
+
def delete_top(r)
|
92
|
+
r.delete(@keys)
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.parse_parameter(param)
|
96
|
+
if param.start_with?('$.')
|
97
|
+
parse_dot_notation(param)
|
98
|
+
elsif param.start_with?('$[')
|
99
|
+
parse_bracket_notation(param)
|
100
|
+
else
|
101
|
+
param
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def self.parse_dot_notation(param)
|
106
|
+
result = []
|
107
|
+
keys = param[2..-1].split('.')
|
108
|
+
keys.each { |key|
|
109
|
+
if key.include?('[')
|
110
|
+
result.concat(parse_dot_array_op(key, param))
|
111
|
+
else
|
112
|
+
result << key
|
113
|
+
end
|
114
|
+
}
|
115
|
+
|
116
|
+
raise Fluent::ConfigError, "empty keys in dot notation" if result.empty?
|
117
|
+
validate_dot_keys(result)
|
118
|
+
|
119
|
+
result
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.validate_dot_keys(keys)
|
123
|
+
keys.each { |key|
|
124
|
+
next unless key.is_a?(String)
|
125
|
+
if /\s+/.match(key)
|
126
|
+
raise Fluent::ConfigError, "whitespace character is not allowed in dot notation. Use bracket notation: #{key}"
|
127
|
+
end
|
128
|
+
}
|
129
|
+
end
|
130
|
+
|
131
|
+
def self.parse_dot_array_op(key, param)
|
132
|
+
start = key.index('[')
|
133
|
+
result = if start.zero?
|
134
|
+
[]
|
135
|
+
else
|
136
|
+
[key[0..start - 1]]
|
137
|
+
end
|
138
|
+
key = key[start + 1..-1]
|
139
|
+
in_bracket = true
|
140
|
+
|
141
|
+
until key.empty?
|
142
|
+
if in_bracket
|
143
|
+
if i = key.index(']')
|
144
|
+
index_value = key[0..i - 1]
|
145
|
+
raise Fluent::ConfigError, "missing array index in '[]'. Invalid syntax: #{param}" if index_value == ']'
|
146
|
+
result << Integer(index_value)
|
147
|
+
key = key[i + 1..-1]
|
148
|
+
in_bracket = false
|
149
|
+
else
|
150
|
+
raise Fluent::ConfigError, "'[' found but ']' not found. Invalid syntax: #{param}"
|
151
|
+
end
|
152
|
+
else
|
153
|
+
if i = key.index('[')
|
154
|
+
key = key[i + 1..-1]
|
155
|
+
in_bracket = true
|
156
|
+
else
|
157
|
+
raise Fluent::ConfigError, "found more characters after ']'. Invalid syntax: #{param}"
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
result
|
163
|
+
end
|
164
|
+
|
165
|
+
def self.parse_bracket_notation(param)
|
166
|
+
orig_param = param
|
167
|
+
result = []
|
168
|
+
param = param[1..-1]
|
169
|
+
in_bracket = false
|
170
|
+
|
171
|
+
until param.empty?
|
172
|
+
if in_bracket
|
173
|
+
if param[0] == "'" || param[0] == '"'
|
174
|
+
if i = param.index("']") || param.index('"]')
|
175
|
+
raise Fluent::ConfigError, "Mismatched quotes. Invalid syntax: #{orig_param}" unless param[0] == param[i]
|
176
|
+
result << param[1..i - 1]
|
177
|
+
param = param[i + 2..-1]
|
178
|
+
in_bracket = false
|
179
|
+
else
|
180
|
+
raise Fluent::ConfigError, "Incomplete bracket. Invalid syntax: #{orig_param}"
|
181
|
+
end
|
182
|
+
else
|
183
|
+
if i = param.index(']')
|
184
|
+
index_value = param[0..i - 1]
|
185
|
+
raise Fluent::ConfigError, "missing array index in '[]'. Invalid syntax: #{param}" if index_value == ']'
|
186
|
+
result << Integer(index_value)
|
187
|
+
param = param[i + 1..-1]
|
188
|
+
in_bracket = false
|
189
|
+
else
|
190
|
+
raise Fluent::ConfigError, "'[' found but ']' not found. Invalid syntax: #{orig_param}"
|
191
|
+
end
|
192
|
+
end
|
193
|
+
else
|
194
|
+
if i = param.index('[')
|
195
|
+
param = param[i + 1..-1]
|
196
|
+
in_bracket = true
|
197
|
+
else
|
198
|
+
raise Fluent::ConfigError, "found more characters after ']'. Invalid syntax: #{orig_param}"
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
raise Fluent::ConfigError, "empty keys in bracket notation" if result.empty?
|
204
|
+
|
205
|
+
result
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
@@ -0,0 +1,205 @@
|
|
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
|
+
module Fluent
|
18
|
+
module PluginHelper
|
19
|
+
module RetryState
|
20
|
+
def retry_state_create(
|
21
|
+
title, retry_type, wait, timeout,
|
22
|
+
forever: false, max_steps: nil, backoff_base: 2, max_interval: nil, randomize: true, randomize_width: 0.125,
|
23
|
+
secondary: false, secondary_threshold: 0.8
|
24
|
+
)
|
25
|
+
case retry_type
|
26
|
+
when :exponential_backoff
|
27
|
+
ExponentialBackOffRetry.new(title, wait, timeout, forever, max_steps, randomize, randomize_width, backoff_base, max_interval, secondary, secondary_threshold)
|
28
|
+
when :periodic
|
29
|
+
PeriodicRetry.new(title, wait, timeout, forever, max_steps, randomize, randomize_width, secondary, secondary_threshold)
|
30
|
+
else
|
31
|
+
raise "BUG: unknown retry_type specified: '#{retry_type}'"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class RetryStateMachine
|
36
|
+
attr_reader :title, :start, :steps, :next_time, :timeout_at, :current, :secondary_transition_at, :secondary_transition_steps
|
37
|
+
|
38
|
+
def initialize(title, wait, timeout, forever, max_steps, randomize, randomize_width, secondary, secondary_threshold)
|
39
|
+
@title = title
|
40
|
+
|
41
|
+
@start = current_time
|
42
|
+
@steps = 0
|
43
|
+
@next_time = nil # should be initialized for first retry by child class
|
44
|
+
|
45
|
+
@timeout = timeout
|
46
|
+
@timeout_at = @start + timeout
|
47
|
+
@current = :primary
|
48
|
+
|
49
|
+
if randomize_width < 0 || randomize_width > 0.5
|
50
|
+
raise "BUG: randomize_width MUST be between 0 and 0.5"
|
51
|
+
end
|
52
|
+
|
53
|
+
@randomize = randomize
|
54
|
+
@randomize_width = randomize_width
|
55
|
+
|
56
|
+
@forever = forever
|
57
|
+
@max_steps = max_steps
|
58
|
+
|
59
|
+
@secondary = secondary
|
60
|
+
@secondary_threshold = secondary_threshold
|
61
|
+
if @secondary
|
62
|
+
raise "BUG: secondary_transition_threshold MUST be between 0 and 1" if @secondary_threshold <= 0 || @secondary_threshold >= 1
|
63
|
+
max_retry_timeout = timeout
|
64
|
+
if max_steps
|
65
|
+
timeout_by_max_steps = calc_max_retry_timeout(max_steps)
|
66
|
+
max_retry_timeout = timeout_by_max_steps if timeout_by_max_steps < max_retry_timeout
|
67
|
+
end
|
68
|
+
@secondary_transition_at = @start + max_retry_timeout * @secondary_threshold
|
69
|
+
@secondary_transition_steps = nil
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def current_time
|
74
|
+
Time.now
|
75
|
+
end
|
76
|
+
|
77
|
+
def randomize(interval)
|
78
|
+
return interval unless @randomize
|
79
|
+
|
80
|
+
interval + (interval * @randomize_width * (2 * rand - 1.0))
|
81
|
+
end
|
82
|
+
|
83
|
+
def calc_next_time
|
84
|
+
if @forever || !@secondary # primary
|
85
|
+
naive = naive_next_time(@steps)
|
86
|
+
if @forever
|
87
|
+
naive
|
88
|
+
elsif naive >= @timeout_at
|
89
|
+
@timeout_at
|
90
|
+
else
|
91
|
+
naive
|
92
|
+
end
|
93
|
+
elsif @current == :primary && @secondary
|
94
|
+
naive = naive_next_time(@steps)
|
95
|
+
if naive >= @secondary_transition_at
|
96
|
+
@secondary_transition_at
|
97
|
+
else
|
98
|
+
naive
|
99
|
+
end
|
100
|
+
elsif @current == :secondary
|
101
|
+
naive = naive_next_time(@steps - @secondary_transition_steps + 1)
|
102
|
+
if naive >= @timeout_at
|
103
|
+
@timeout_at
|
104
|
+
else
|
105
|
+
naive
|
106
|
+
end
|
107
|
+
else
|
108
|
+
raise "BUG: it's out of design"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def naive_next_time(retry_times)
|
113
|
+
raise NotImplementedError
|
114
|
+
end
|
115
|
+
|
116
|
+
def secondary?
|
117
|
+
!@forever && @secondary && (@current == :secondary || current_time >= @secondary_transition_at)
|
118
|
+
end
|
119
|
+
|
120
|
+
def step
|
121
|
+
@steps += 1
|
122
|
+
if !@forever && @secondary && @current != :secondary && current_time >= @secondary_transition_at
|
123
|
+
@current = :secondary
|
124
|
+
@secondary_transition_steps = @steps
|
125
|
+
end
|
126
|
+
@next_time = calc_next_time
|
127
|
+
nil
|
128
|
+
end
|
129
|
+
|
130
|
+
def limit?
|
131
|
+
if @forever
|
132
|
+
false
|
133
|
+
else
|
134
|
+
@next_time >= @timeout_at || !!(@max_steps && @steps >= @max_steps)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
class ExponentialBackOffRetry < RetryStateMachine
|
140
|
+
def initialize(title, wait, timeout, forever, max_steps, randomize, randomize_width, backoff_base, max_interval, secondary, secondary_threshold)
|
141
|
+
@constant_factor = wait
|
142
|
+
@backoff_base = backoff_base
|
143
|
+
@max_interval = max_interval
|
144
|
+
|
145
|
+
super(title, wait, timeout, forever, max_steps, randomize, randomize_width, secondary, secondary_threshold)
|
146
|
+
|
147
|
+
@next_time = @start + @constant_factor
|
148
|
+
end
|
149
|
+
|
150
|
+
def naive_next_time(retry_next_times)
|
151
|
+
intr = calc_interval(retry_next_times)
|
152
|
+
current_time + randomize(intr)
|
153
|
+
end
|
154
|
+
|
155
|
+
def calc_max_retry_timeout(max_steps)
|
156
|
+
result = 0
|
157
|
+
max_steps.times { |i|
|
158
|
+
result += calc_interval(i)
|
159
|
+
}
|
160
|
+
result
|
161
|
+
end
|
162
|
+
|
163
|
+
def calc_interval(num)
|
164
|
+
interval = raw_interval(num - 1)
|
165
|
+
if @max_interval && interval > @max_interval
|
166
|
+
@max_interval
|
167
|
+
else
|
168
|
+
if interval.finite?
|
169
|
+
interval
|
170
|
+
else
|
171
|
+
# Calculate previous finite value to avoid inf related errors. If this re-computing is heavy, use cache.
|
172
|
+
until interval.finite?
|
173
|
+
num -= 1
|
174
|
+
interval = raw_interval(num - 1)
|
175
|
+
end
|
176
|
+
interval
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
def raw_interval(num)
|
182
|
+
@constant_factor.to_f * (@backoff_base ** (num))
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
class PeriodicRetry < RetryStateMachine
|
187
|
+
def initialize(title, wait, timeout, forever, max_steps, randomize, randomize_width, secondary, secondary_threshold)
|
188
|
+
@retry_wait = wait
|
189
|
+
|
190
|
+
super(title, wait, timeout, forever, max_steps, randomize, randomize_width, secondary, secondary_threshold)
|
191
|
+
|
192
|
+
@next_time = @start + @retry_wait
|
193
|
+
end
|
194
|
+
|
195
|
+
def naive_next_time(retry_next_times)
|
196
|
+
current_time + randomize(@retry_wait)
|
197
|
+
end
|
198
|
+
|
199
|
+
def calc_max_retry_timeout(max_steps)
|
200
|
+
@retry_wait * max_steps
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|