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,65 @@
|
|
1
|
+
<source>
|
2
|
+
@type dummy
|
3
|
+
tag test
|
4
|
+
</source>
|
5
|
+
<source>
|
6
|
+
@type dummy
|
7
|
+
tag test2
|
8
|
+
</source>
|
9
|
+
<source>
|
10
|
+
@type dummy
|
11
|
+
tag test3
|
12
|
+
</source>
|
13
|
+
|
14
|
+
<match test>
|
15
|
+
@type forward
|
16
|
+
flush_interval 0
|
17
|
+
<security>
|
18
|
+
self_hostname output.testing.local
|
19
|
+
shared_key secure_communication_is_awesome
|
20
|
+
</security>
|
21
|
+
<server>
|
22
|
+
host 127.0.0.1
|
23
|
+
port 24224
|
24
|
+
username user1
|
25
|
+
password yes_this_is_user1
|
26
|
+
</server>
|
27
|
+
</match>
|
28
|
+
|
29
|
+
<match test2>
|
30
|
+
@type forward
|
31
|
+
flush_interval 0
|
32
|
+
<security>
|
33
|
+
self_hostname output-alt1.testing.local
|
34
|
+
shared_key secure_communication_is_awesome
|
35
|
+
</security>
|
36
|
+
<server>
|
37
|
+
host 127.0.0.1
|
38
|
+
port 24224
|
39
|
+
username user1
|
40
|
+
password yes_this_is_user1
|
41
|
+
</server>
|
42
|
+
<server>
|
43
|
+
host 127.0.0.1
|
44
|
+
port 24224
|
45
|
+
username user2
|
46
|
+
password yes_this_is_really_user2
|
47
|
+
</server>
|
48
|
+
</match>
|
49
|
+
|
50
|
+
<match test3>
|
51
|
+
@type forward
|
52
|
+
flush_interval 0
|
53
|
+
<security>
|
54
|
+
self_hostname output-fail.testing.local
|
55
|
+
shared_key secure_communication_is_awesome
|
56
|
+
</security>
|
57
|
+
<server>
|
58
|
+
host 127.0.0.1
|
59
|
+
port 24224
|
60
|
+
username user3
|
61
|
+
password no_there_are_not_such_user
|
62
|
+
# input plugin warns authentication erro:
|
63
|
+
# [warn]: Authentication failed address="127.0.0.1" hostname="output-fail.testing.local" username="user3"
|
64
|
+
</server>
|
65
|
+
</match>
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#
|
2
|
+
# bundle exec bin/fluentd -c example/out_buffered_null.conf
|
3
|
+
# (+ --emit-error-log-interval 10)
|
4
|
+
<source>
|
5
|
+
@type dummy
|
6
|
+
tag dummy
|
7
|
+
rate 500000000
|
8
|
+
dummy [
|
9
|
+
{"message": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
|
10
|
+
{"message": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"},
|
11
|
+
{"message": "ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"}
|
12
|
+
]
|
13
|
+
</source>
|
14
|
+
|
15
|
+
<match dummy.**>
|
16
|
+
@type null
|
17
|
+
<buffer>
|
18
|
+
flush_interval 60s
|
19
|
+
chunk_limit_size 1k
|
20
|
+
total_limit_size 4k
|
21
|
+
</buffer>
|
22
|
+
</match>
|
23
|
+
|
24
|
+
<label error_log>
|
25
|
+
<match **>
|
26
|
+
@type stdout
|
27
|
+
# <buffer>
|
28
|
+
# flush_interval 1s
|
29
|
+
# </buffer>
|
30
|
+
</match>
|
31
|
+
</label>
|
32
|
+
|
33
|
+
<match fluent.**>
|
34
|
+
@type relabel
|
35
|
+
@label error_log
|
36
|
+
</match>
|
@@ -0,0 +1,42 @@
|
|
1
|
+
<system>
|
2
|
+
rpc_endpoint 0.0.0.0:24444
|
3
|
+
</system>
|
4
|
+
|
5
|
+
<source>
|
6
|
+
@type dummy
|
7
|
+
tag test
|
8
|
+
</source>
|
9
|
+
|
10
|
+
<source>
|
11
|
+
@type forward
|
12
|
+
@label @raw
|
13
|
+
</source>
|
14
|
+
|
15
|
+
<label @raw>
|
16
|
+
<match>
|
17
|
+
@type stdout
|
18
|
+
</match>
|
19
|
+
</label>
|
20
|
+
|
21
|
+
<match test>
|
22
|
+
@type forward
|
23
|
+
|
24
|
+
<buffer time,tag,message>
|
25
|
+
@type memory
|
26
|
+
timekey 2s
|
27
|
+
timekey_wait 1s
|
28
|
+
flush_mode interval
|
29
|
+
flush_interval 1s
|
30
|
+
</buffer>
|
31
|
+
|
32
|
+
<server>
|
33
|
+
host 0.0.0.0
|
34
|
+
port 24224
|
35
|
+
</server>
|
36
|
+
|
37
|
+
<secondary>
|
38
|
+
@type secondary_file
|
39
|
+
directory log/secondary/
|
40
|
+
basename ${tag}_%Y%m%d%L_${message}
|
41
|
+
</secondary>
|
42
|
+
</match>
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<system>
|
2
|
+
workers 4
|
3
|
+
root_dir /path/fluentd/root
|
4
|
+
</system>
|
5
|
+
|
6
|
+
<source> # top-level sections works on all workers in parallel
|
7
|
+
@type forward
|
8
|
+
port 24224
|
9
|
+
</source>
|
10
|
+
|
11
|
+
<match all> # this sections also works on all workers in parallel
|
12
|
+
@type stdout
|
13
|
+
<inject>
|
14
|
+
worker_id_key worker_id
|
15
|
+
</inject>
|
16
|
+
</match>
|
17
|
+
|
18
|
+
<worker 0> # this section works only on first worker process
|
19
|
+
<source>
|
20
|
+
@type tail
|
21
|
+
format none
|
22
|
+
path /var/log/fluentd_test.log
|
23
|
+
pos_file /var/log/fluentd_test.pos
|
24
|
+
tag tail
|
25
|
+
rotate_wait 5
|
26
|
+
read_from_head true
|
27
|
+
refresh_interval 60
|
28
|
+
</source>
|
29
|
+
|
30
|
+
<match tail>
|
31
|
+
@type stdout
|
32
|
+
<inject>
|
33
|
+
worker_id_key worker_id
|
34
|
+
</inject>
|
35
|
+
</match>
|
36
|
+
</worker>
|
data/fluent.conf
CHANGED
@@ -31,6 +31,24 @@
|
|
31
31
|
# tag apache.access
|
32
32
|
#</source>
|
33
33
|
|
34
|
+
## Mutating event filter
|
35
|
+
## Add hostname and tag fields to apache.access tag events
|
36
|
+
#<filter apache.access>
|
37
|
+
# @type record_transformer
|
38
|
+
# <record>
|
39
|
+
# hostname ${hostname}
|
40
|
+
# tag ${tag}
|
41
|
+
# </record>
|
42
|
+
#</filter>
|
43
|
+
|
44
|
+
## Selecting event filter
|
45
|
+
## Remove unnecessary events from apache prefixed tag events
|
46
|
+
#<filter apache.**>
|
47
|
+
# @type grep
|
48
|
+
# include1 method GET # pass only GET in 'method' field
|
49
|
+
# exclude1 message debug # remove debug event
|
50
|
+
#</filter>
|
51
|
+
|
34
52
|
# Listen HTTP for monitoring
|
35
53
|
# http://localhost:24220/api/plugins
|
36
54
|
# http://localhost:24220/api/plugins?type=TYPE
|
@@ -108,3 +126,14 @@
|
|
108
126
|
# path /var/log/fluent/else
|
109
127
|
# compress gz
|
110
128
|
#</match>
|
129
|
+
|
130
|
+
## Label: For handling complex event routing
|
131
|
+
#<label @STAGING>
|
132
|
+
# <match system.**>
|
133
|
+
# @type forward
|
134
|
+
# @id staging_forward_output
|
135
|
+
# <server>
|
136
|
+
# host 192.168.0.101
|
137
|
+
# </server>
|
138
|
+
# </match>
|
139
|
+
#</label>
|
data/fluentd.gemspec
CHANGED
@@ -8,28 +8,38 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.email = ["frsyuki@gmail.com"]
|
9
9
|
gem.description = %q{Fluentd is an open source data collector designed to scale and simplify log management. It can collect, process and ship many kinds of data in near real-time.}
|
10
10
|
gem.summary = %q{Fluentd event collector}
|
11
|
-
gem.homepage = "
|
11
|
+
gem.homepage = "https://www.fluentd.org/"
|
12
12
|
|
13
13
|
gem.files = `git ls-files`.split($\)
|
14
14
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
15
15
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
16
16
|
gem.require_paths = ["lib"]
|
17
|
-
gem.has_rdoc = false
|
18
17
|
gem.license = "Apache-2.0"
|
19
18
|
|
20
|
-
gem.required_ruby_version = '>= 1
|
19
|
+
gem.required_ruby_version = '>= 2.1'
|
21
20
|
|
22
|
-
gem.add_runtime_dependency("msgpack", [">= 0.
|
23
|
-
gem.add_runtime_dependency("json", [">= 1.4.3"])
|
21
|
+
gem.add_runtime_dependency("msgpack", [">= 0.7.0", "< 2.0.0"])
|
24
22
|
gem.add_runtime_dependency("yajl-ruby", ["~> 1.0"])
|
25
|
-
gem.add_runtime_dependency("cool.io", [">= 1.
|
23
|
+
gem.add_runtime_dependency("cool.io", [">= 1.4.5", "< 2.0.0"])
|
24
|
+
gem.add_runtime_dependency("serverengine", [">= 2.0.4", "< 3.0.0"])
|
26
25
|
gem.add_runtime_dependency("http_parser.rb", [">= 0.5.1", "< 0.7.0"])
|
27
26
|
gem.add_runtime_dependency("sigdump", ["~> 0.2.2"])
|
28
|
-
gem.add_runtime_dependency("tzinfo", ["
|
29
|
-
gem.add_runtime_dependency("tzinfo-data", ["
|
30
|
-
gem.add_runtime_dependency("
|
27
|
+
gem.add_runtime_dependency("tzinfo", ["~> 1.0"])
|
28
|
+
gem.add_runtime_dependency("tzinfo-data", ["~> 1.0"])
|
29
|
+
gem.add_runtime_dependency("strptime", [">= 0.2.2", "< 1.0.0"])
|
30
|
+
gem.add_runtime_dependency("dig_rb", ["~> 1.0.0"])
|
31
31
|
|
32
|
-
gem.
|
32
|
+
# build gem for a certain platform. see also Rakefile
|
33
|
+
fake_platform = ENV['GEM_BUILD_FAKE_PLATFORM'].to_s
|
34
|
+
gem.platform = fake_platform unless fake_platform.empty?
|
35
|
+
if /mswin|mingw/ =~ fake_platform || (/mswin|mingw/ =~ RUBY_PLATFORM && fake_platform.empty?)
|
36
|
+
gem.add_runtime_dependency("win32-service", ["~> 0.8.3"])
|
37
|
+
gem.add_runtime_dependency("win32-ipc", ["~> 0.6.1"])
|
38
|
+
gem.add_runtime_dependency("win32-event", ["~> 0.6.1"])
|
39
|
+
gem.add_runtime_dependency("windows-pr", ["~> 1.2.5"])
|
40
|
+
end
|
41
|
+
|
42
|
+
gem.add_development_dependency("rake", ["~> 11.0"])
|
33
43
|
gem.add_development_dependency("flexmock", ["~> 2.0"])
|
34
44
|
gem.add_development_dependency("parallel_tests", ["~> 0.15.3"])
|
35
45
|
gem.add_development_dependency("simplecov", ["~> 0.7"])
|
@@ -37,5 +47,5 @@ Gem::Specification.new do |gem|
|
|
37
47
|
gem.add_development_dependency("timecop", ["~> 0.3"])
|
38
48
|
gem.add_development_dependency("test-unit", ["~> 3.2"])
|
39
49
|
gem.add_development_dependency("test-unit-rr", ["~> 1.0"])
|
40
|
-
gem.add_development_dependency("oj", ["
|
50
|
+
gem.add_development_dependency("oj", [">= 2.14", "< 4"])
|
41
51
|
end
|
data/lib/fluent/agent.rb
CHANGED
@@ -15,9 +15,9 @@
|
|
15
15
|
#
|
16
16
|
|
17
17
|
require 'fluent/configurable'
|
18
|
-
require 'fluent/engine'
|
19
18
|
require 'fluent/plugin'
|
20
19
|
require 'fluent/output'
|
20
|
+
require 'fluent/match'
|
21
21
|
|
22
22
|
module Fluent
|
23
23
|
#
|
@@ -29,16 +29,23 @@ module Fluent
|
|
29
29
|
class Agent
|
30
30
|
include Configurable
|
31
31
|
|
32
|
-
def initialize(
|
32
|
+
def initialize(log:)
|
33
33
|
super()
|
34
34
|
|
35
35
|
@context = nil
|
36
36
|
@outputs = []
|
37
37
|
@filters = []
|
38
|
-
@started_outputs = []
|
39
|
-
@started_filters = []
|
40
38
|
|
41
|
-
@
|
39
|
+
@lifecycle_control_list = nil
|
40
|
+
# lifecycle_control_list is the list of plugins in this agent, and ordered
|
41
|
+
# from plugins which DOES emit, then DOESN'T emit
|
42
|
+
# (input -> output w/ router -> filter -> output w/o router)
|
43
|
+
# for start: use this order DESC
|
44
|
+
# (because plugins which appears later in configurations will receive events from plugins which appears earlier)
|
45
|
+
# for stop/before_shutdown/shutdown/after_shutdown/close/terminate: use this order ASC
|
46
|
+
@lifecycle_cache = nil
|
47
|
+
|
48
|
+
@log = log
|
42
49
|
@event_router = EventRouter.new(NoMatchMatch.new(log), self)
|
43
50
|
@error_collector = nil
|
44
51
|
end
|
@@ -54,9 +61,10 @@ module Fluent
|
|
54
61
|
super
|
55
62
|
|
56
63
|
# initialize <match> and <filter> elements
|
57
|
-
conf.elements
|
64
|
+
conf.elements('filter', 'match').each { |e|
|
65
|
+
next if e.for_another_worker?
|
58
66
|
pattern = e.arg.empty? ? '**' : e.arg
|
59
|
-
type = e['@type']
|
67
|
+
type = e['@type']
|
60
68
|
raise ConfigError, "Missing '@type' parameter on <#{e.name}> directive" unless type
|
61
69
|
if e.name == 'filter'
|
62
70
|
add_filter(type, pattern, e)
|
@@ -66,82 +74,81 @@ module Fluent
|
|
66
74
|
}
|
67
75
|
end
|
68
76
|
|
69
|
-
def
|
70
|
-
@
|
71
|
-
o.start
|
72
|
-
@started_outputs << o
|
73
|
-
}
|
77
|
+
def lifecycle_control_list
|
78
|
+
return @lifecycle_control_list if @lifecycle_control_list
|
74
79
|
|
75
|
-
|
76
|
-
|
77
|
-
|
80
|
+
lifecycle_control_list = {
|
81
|
+
input: [],
|
82
|
+
output_with_router: [],
|
83
|
+
filter: [],
|
84
|
+
output: [],
|
78
85
|
}
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
@started_filters.map { |f|
|
83
|
-
Thread.new do
|
84
|
-
begin
|
85
|
-
log.info "shutting down filter#{@context.nil? ? '' : " in #{@context}"}", type: Plugin.lookup_name_from_class(f.class), plugin_id: f.plugin_id
|
86
|
-
f.shutdown
|
87
|
-
rescue => e
|
88
|
-
log.warn "unexpected error while shutting down filter plugins", plugin: f.class, plugin_id: f.plugin_id, error_class: e.class, error: e
|
89
|
-
log.warn_backtrace
|
90
|
-
end
|
86
|
+
if self.respond_to?(:inputs)
|
87
|
+
inputs.each do |i|
|
88
|
+
lifecycle_control_list[:input] << i
|
91
89
|
end
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
begin
|
99
|
-
log.info "shutting down output#{@context.nil? ? '' : " in #{@context}"}", type: Plugin.lookup_name_from_class(o.class), plugin_id: o.plugin_id
|
100
|
-
o.shutdown
|
101
|
-
rescue => e
|
102
|
-
log.warn "unexpected error while shutting down output plugins", plugin: o.class, plugin_id: o.plugin_id, error_class: e.class, error: e
|
103
|
-
log.warn_backtrace
|
104
|
-
end
|
90
|
+
end
|
91
|
+
outputs.each do |o|
|
92
|
+
if o.has_router?
|
93
|
+
lifecycle_control_list[:output_with_router] << o
|
94
|
+
else
|
95
|
+
lifecycle_control_list[:output] << o
|
105
96
|
end
|
106
|
-
|
107
|
-
|
97
|
+
end
|
98
|
+
filters.each do |f|
|
99
|
+
lifecycle_control_list[:filter] << f
|
100
|
+
end
|
108
101
|
|
109
|
-
|
110
|
-
flush_recursive(@outputs)
|
102
|
+
@lifecycle_control_list = lifecycle_control_list
|
111
103
|
end
|
112
104
|
|
113
|
-
def
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
105
|
+
def lifecycle(desc: false)
|
106
|
+
kind_list = if desc
|
107
|
+
[:output, :filter, :output_with_router]
|
108
|
+
else
|
109
|
+
[:output_with_router, :filter, :output]
|
110
|
+
end
|
111
|
+
kind_list.each do |kind|
|
112
|
+
list = if desc
|
113
|
+
lifecycle_control_list[kind].reverse
|
114
|
+
else
|
115
|
+
lifecycle_control_list[kind]
|
116
|
+
end
|
117
|
+
display_kind = (kind == :output_with_router ? :output : kind)
|
118
|
+
list.each do |instance|
|
119
|
+
yield instance, display_kind
|
124
120
|
end
|
125
|
-
|
121
|
+
end
|
126
122
|
end
|
127
123
|
|
128
124
|
def add_match(type, pattern, conf)
|
129
|
-
|
125
|
+
log_type = conf.for_this_worker? ? :default : :worker0
|
126
|
+
log.info log_type, "adding match#{@context.nil? ? '' : " in #{@context}"}", pattern: pattern, type: type
|
130
127
|
|
131
128
|
output = Plugin.new_output(type)
|
132
|
-
output.
|
129
|
+
output.context_router = @event_router
|
133
130
|
output.configure(conf)
|
134
131
|
@outputs << output
|
132
|
+
if output.respond_to?(:outputs) && output.respond_to?(:multi_output?) && output.multi_output?
|
133
|
+
# TODO: ruby 2.3 or later: replace `output.respond_to?(:multi_output?) && output.multi_output?` with output&.multi_output?
|
134
|
+
outputs = if output.respond_to?(:static_outputs)
|
135
|
+
output.static_outputs
|
136
|
+
else
|
137
|
+
output.outputs
|
138
|
+
end
|
139
|
+
@outputs.push(*outputs)
|
140
|
+
end
|
135
141
|
@event_router.add_rule(pattern, output)
|
136
142
|
|
137
143
|
output
|
138
144
|
end
|
139
145
|
|
140
146
|
def add_filter(type, pattern, conf)
|
141
|
-
|
147
|
+
log_type = conf.for_this_worker? ? :default : :worker0
|
148
|
+
log.info log_type, "adding filter#{@context.nil? ? '' : " in #{@context}"}", pattern: pattern, type: type
|
142
149
|
|
143
150
|
filter = Plugin.new_filter(type)
|
144
|
-
filter.
|
151
|
+
filter.context_router = @event_router
|
145
152
|
filter.configure(conf)
|
146
153
|
@filters << filter
|
147
154
|
@event_router.add_rule(pattern, filter)
|
@@ -155,35 +162,5 @@ module Fluent
|
|
155
162
|
|
156
163
|
def handle_emits_error(tag, es, error)
|
157
164
|
end
|
158
|
-
|
159
|
-
class NoMatchMatch
|
160
|
-
def initialize(log)
|
161
|
-
@log = log
|
162
|
-
@count = 0
|
163
|
-
end
|
164
|
-
|
165
|
-
def emit(tag, es, chain)
|
166
|
-
# TODO use time instead of num of records
|
167
|
-
c = (@count += 1)
|
168
|
-
if c < 512
|
169
|
-
if Math.log(c) / Math.log(2) % 1.0 == 0
|
170
|
-
@log.warn "no patterns matched", tag: tag
|
171
|
-
return
|
172
|
-
end
|
173
|
-
else
|
174
|
-
if c % 512 == 0
|
175
|
-
@log.warn "no patterns matched", tag: tag
|
176
|
-
return
|
177
|
-
end
|
178
|
-
end
|
179
|
-
@log.on_trace { @log.trace "no patterns matched", tag: tag }
|
180
|
-
end
|
181
|
-
|
182
|
-
def start
|
183
|
-
end
|
184
|
-
|
185
|
-
def shutdown
|
186
|
-
end
|
187
|
-
end
|
188
165
|
end
|
189
166
|
end
|
data/lib/fluent/clock.rb
ADDED
@@ -0,0 +1,62 @@
|
|
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 Clock
|
19
|
+
CLOCK_ID = Process::CLOCK_MONOTONIC_RAW rescue Process::CLOCK_MONOTONIC
|
20
|
+
|
21
|
+
@@block_level = 0
|
22
|
+
@@frozen_clock = nil
|
23
|
+
|
24
|
+
def self.now
|
25
|
+
@@frozen_clock || now_raw
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.freeze(dst = nil, &block)
|
29
|
+
return freeze_block(dst, &block) if block_given?
|
30
|
+
|
31
|
+
dst = dst_clock_from_time(dst) if dst.is_a?(Time)
|
32
|
+
@@frozen_clock = dst || now_raw
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.return
|
36
|
+
raise "invalid return while running code in blocks" if @@block_level > 0
|
37
|
+
@@frozen_clock = nil
|
38
|
+
end
|
39
|
+
|
40
|
+
# internal use
|
41
|
+
|
42
|
+
def self.now_raw
|
43
|
+
Process.clock_gettime(CLOCK_ID)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.dst_clock_from_time(time)
|
47
|
+
diff_sec = Time.now - time
|
48
|
+
now_raw - diff_sec
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.freeze_block(dst)
|
52
|
+
dst = dst_clock_from_time(dst) if dst.is_a?(Time)
|
53
|
+
pre_frozen_clock = @@frozen_clock
|
54
|
+
@@frozen_clock = dst || now_raw
|
55
|
+
@@block_level += 1
|
56
|
+
yield
|
57
|
+
ensure
|
58
|
+
@@block_level -= 1
|
59
|
+
@@frozen_clock = pre_frozen_clock
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|