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
data/lib/fluent/engine.rb
CHANGED
@@ -14,14 +14,10 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
|
17
|
-
require 'socket'
|
18
|
-
|
19
|
-
require 'msgpack'
|
20
|
-
require 'cool.io'
|
21
|
-
|
22
17
|
require 'fluent/config'
|
23
18
|
require 'fluent/event'
|
24
19
|
require 'fluent/event_router'
|
20
|
+
require 'fluent/msgpack_factory'
|
25
21
|
require 'fluent/root_agent'
|
26
22
|
require 'fluent/time'
|
27
23
|
require 'fluent/system_config'
|
@@ -29,54 +25,51 @@ require 'fluent/plugin'
|
|
29
25
|
|
30
26
|
module Fluent
|
31
27
|
class EngineClass
|
32
|
-
|
33
|
-
def packer(*args)
|
34
|
-
MessagePack::Packer.new(*args)
|
35
|
-
end
|
36
|
-
|
37
|
-
def unpacker(*args)
|
38
|
-
MessagePack::Unpacker.new(*args)
|
39
|
-
end
|
40
|
-
end
|
28
|
+
include Fluent::MessagePackFactory::Mixin
|
41
29
|
|
42
30
|
def initialize
|
43
31
|
@root_agent = nil
|
44
|
-
@event_router = nil
|
45
32
|
@default_loop = nil
|
46
33
|
@engine_stopped = false
|
34
|
+
@_worker_id = nil
|
47
35
|
|
36
|
+
@log_event_router = nil
|
48
37
|
@log_emit_thread = nil
|
49
38
|
@log_event_loop_stop = false
|
39
|
+
@log_event_loop_graceful_stop = false
|
50
40
|
@log_event_queue = []
|
41
|
+
@log_event_verbose = false
|
51
42
|
|
52
43
|
@suppress_config_dump = false
|
53
44
|
|
54
|
-
@
|
45
|
+
@system_config = SystemConfig.new
|
46
|
+
|
47
|
+
@dry_run_mode = false
|
55
48
|
end
|
56
49
|
|
50
|
+
MAINLOOP_SLEEP_INTERVAL = 0.3
|
51
|
+
|
57
52
|
MATCH_CACHE_SIZE = 1024
|
58
53
|
LOG_EMIT_INTERVAL = 0.1
|
59
54
|
|
60
55
|
attr_reader :root_agent
|
61
56
|
attr_reader :matches, :sources
|
62
|
-
attr_reader :msgpack_factory
|
63
57
|
attr_reader :system_config
|
64
58
|
|
59
|
+
attr_accessor :dry_run_mode
|
60
|
+
|
65
61
|
def init(system_config)
|
66
62
|
@system_config = system_config
|
67
63
|
|
68
|
-
BasicSocket.do_not_reverse_lookup = true
|
69
|
-
Plugin.load_plugins
|
70
|
-
if defined?(Encoding)
|
71
|
-
Encoding.default_internal = 'ASCII-8BIT' if Encoding.respond_to?(:default_internal)
|
72
|
-
Encoding.default_external = 'ASCII-8BIT' if Encoding.respond_to?(:default_external)
|
73
|
-
end
|
74
|
-
|
75
64
|
suppress_interval(system_config.emit_error_log_interval) unless system_config.emit_error_log_interval.nil?
|
76
65
|
@suppress_config_dump = system_config.suppress_config_dump unless system_config.suppress_config_dump.nil?
|
77
66
|
@without_source = system_config.without_source unless system_config.without_source.nil?
|
78
67
|
|
79
|
-
@
|
68
|
+
@log_event_verbose = system_config.log_event_verbose unless system_config.log_event_verbose.nil?
|
69
|
+
|
70
|
+
@root_agent = RootAgent.new(log: log, system_config: @system_config)
|
71
|
+
|
72
|
+
MessagePackFactory.init
|
80
73
|
|
81
74
|
self
|
82
75
|
end
|
@@ -109,12 +102,21 @@ module Fluent
|
|
109
102
|
else
|
110
103
|
"section <#{e.name}> is not used in <#{parent_name}>"
|
111
104
|
end
|
112
|
-
|
105
|
+
if e.for_every_workers?
|
106
|
+
$log.warn :worker0, message
|
107
|
+
elsif e.for_this_worker?
|
108
|
+
$log.warn message
|
109
|
+
end
|
113
110
|
next
|
114
111
|
end
|
115
112
|
unless e.name == 'system'
|
116
113
|
unless @without_source && e.name == 'source'
|
117
|
-
|
114
|
+
message = "parameter '#{key}' in #{e.to_s.strip} is not used."
|
115
|
+
if e.for_every_workers?
|
116
|
+
$log.warn :worker0, message
|
117
|
+
elsif e.for_this_worker?
|
118
|
+
$log.warn message
|
119
|
+
end
|
118
120
|
end
|
119
121
|
end
|
120
122
|
}
|
@@ -123,33 +125,60 @@ module Fluent
|
|
123
125
|
def configure(conf)
|
124
126
|
# plugins / configuration dumps
|
125
127
|
Gem::Specification.find_all.select{|x| x.name =~ /^fluent(d|-(plugin|mixin)-.*)$/}.each do |spec|
|
126
|
-
$log.info "gem '#{spec.name}' version '#{spec.version}'"
|
128
|
+
$log.info :worker0, "gem '#{spec.name}' version '#{spec.version}'"
|
127
129
|
end
|
128
130
|
|
129
131
|
@root_agent.configure(conf)
|
130
|
-
|
132
|
+
|
133
|
+
begin
|
134
|
+
log_event_agent = @root_agent.find_label(Fluent::Log::LOG_EVENT_LABEL)
|
135
|
+
log_event_router = log_event_agent.event_router
|
136
|
+
|
137
|
+
# suppress mismatched tags only for <label @FLUENT_LOG> label.
|
138
|
+
# it's not suppressed in default event router for non-log-event events
|
139
|
+
log_event_router.suppress_missing_match!
|
140
|
+
|
141
|
+
@log_event_router = log_event_router
|
142
|
+
|
143
|
+
unmatched_tags = Fluent::Log.event_tags.select{|t| !@log_event_router.match?(t) }
|
144
|
+
unless unmatched_tags.empty?
|
145
|
+
$log.warn "match for some tags of log events are not defined (to be ignored)", tags: unmatched_tags
|
146
|
+
end
|
147
|
+
rescue ArgumentError # ArgumentError "#{label_name} label not found"
|
148
|
+
# use default event router if <label @FLUENT_LOG> is missing in configuration
|
149
|
+
log_event_router = @root_agent.event_router
|
150
|
+
|
151
|
+
if Fluent::Log.event_tags.any?{|t| log_event_router.match?(t) }
|
152
|
+
@log_event_router = log_event_router
|
153
|
+
|
154
|
+
unmatched_tags = Fluent::Log.event_tags.select{|t| !@log_event_router.match?(t) }
|
155
|
+
unless unmatched_tags.empty?
|
156
|
+
$log.warn "match for some tags of log events are not defined (to be ignored)", tags: unmatched_tags
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
$log.enable_event(true) if @log_event_router
|
131
162
|
|
132
163
|
unless @suppress_config_dump
|
133
|
-
$log.info "using configuration file: #{conf.to_s.rstrip}"
|
164
|
+
$log.info :supervisor, "using configuration file: #{conf.to_s.rstrip}"
|
134
165
|
end
|
135
166
|
end
|
136
167
|
|
137
|
-
def
|
138
|
-
Plugin.
|
168
|
+
def add_plugin_dir(dir)
|
169
|
+
Plugin.add_plugin_dir(dir)
|
139
170
|
end
|
140
171
|
|
141
172
|
def emit(tag, time, record)
|
142
|
-
|
143
|
-
emit_stream tag, OneEventStream.new(time, record)
|
144
|
-
end
|
173
|
+
raise "BUG: use router.emit instead of Engine.emit"
|
145
174
|
end
|
146
175
|
|
147
176
|
def emit_array(tag, array)
|
148
|
-
|
177
|
+
raise "BUG: use router.emit_array instead of Engine.emit_array"
|
149
178
|
end
|
150
179
|
|
151
180
|
def emit_stream(tag, es)
|
152
|
-
|
181
|
+
raise "BUG: use router.emit_stream instead of Engine.emit_stream"
|
153
182
|
end
|
154
183
|
|
155
184
|
def flush!
|
@@ -158,7 +187,7 @@ module Fluent
|
|
158
187
|
|
159
188
|
def now
|
160
189
|
# TODO thread update
|
161
|
-
|
190
|
+
Fluent::EventTime.now
|
162
191
|
end
|
163
192
|
|
164
193
|
def log_event_loop
|
@@ -166,6 +195,7 @@ module Fluent
|
|
166
195
|
|
167
196
|
while sleep(LOG_EMIT_INTERVAL)
|
168
197
|
break if @log_event_loop_stop
|
198
|
+
break if @log_event_loop_graceful_stop && @log_event_queue.empty?
|
169
199
|
next if @log_event_queue.empty?
|
170
200
|
|
171
201
|
# NOTE: thead-safe of slice! depends on GVL
|
@@ -174,9 +204,10 @@ module Fluent
|
|
174
204
|
|
175
205
|
events.each {|tag,time,record|
|
176
206
|
begin
|
177
|
-
@
|
207
|
+
@log_event_router.emit(tag, time, record)
|
178
208
|
rescue => e
|
179
|
-
$log.error
|
209
|
+
# This $log.error doesn't emit log events, because of `$log.disable_events(Thread.current)` above
|
210
|
+
$log.error "failed to emit fluentd's log event", tag: tag, event: record, error: e
|
180
211
|
end
|
181
212
|
}
|
182
213
|
end
|
@@ -184,45 +215,44 @@ module Fluent
|
|
184
215
|
|
185
216
|
def run
|
186
217
|
begin
|
218
|
+
$log.info "starting fluentd worker", pid: Process.pid, ppid: Process.ppid, worker: worker_id
|
187
219
|
start
|
188
220
|
|
189
|
-
if @
|
190
|
-
$log.enable_event
|
221
|
+
if @log_event_router
|
222
|
+
$log.enable_event(true)
|
191
223
|
@log_emit_thread = Thread.new(&method(:log_event_loop))
|
224
|
+
@log_emit_thread.abort_on_exception = true
|
192
225
|
end
|
193
226
|
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
@default_loop.attach Coolio::TimerWatcher.new(1, true)
|
198
|
-
# TODO attach async watch for thread pool
|
199
|
-
@default_loop.run
|
200
|
-
end
|
201
|
-
|
202
|
-
if @engine_stopped and @default_loop
|
203
|
-
@default_loop.stop
|
204
|
-
@default_loop = nil
|
205
|
-
end
|
227
|
+
$log.info "fluentd worker is now running", worker: worker_id
|
228
|
+
sleep MAINLOOP_SLEEP_INTERVAL until @engine_stopped
|
229
|
+
$log.info "fluentd worker is now stopping", worker: worker_id
|
206
230
|
|
207
|
-
rescue => e
|
208
|
-
$log.error "unexpected error",
|
231
|
+
rescue Exception => e
|
232
|
+
$log.error "unexpected error", error: e
|
209
233
|
$log.error_backtrace
|
210
|
-
|
211
|
-
|
212
|
-
|
234
|
+
raise
|
235
|
+
end
|
236
|
+
|
237
|
+
unless @log_event_verbose
|
238
|
+
$log.enable_event(false)
|
213
239
|
if @log_emit_thread
|
214
|
-
|
240
|
+
# to make sure to emit all log events into router, before shutting down
|
241
|
+
@log_event_loop_graceful_stop = true
|
215
242
|
@log_emit_thread.join
|
243
|
+
@log_emit_thread = nil
|
216
244
|
end
|
217
245
|
end
|
246
|
+
$log.info "shutting down fluentd worker", worker: worker_id
|
247
|
+
shutdown
|
248
|
+
if @log_emit_thread
|
249
|
+
@log_event_loop_stop = true
|
250
|
+
@log_emit_thread.join
|
251
|
+
end
|
218
252
|
end
|
219
253
|
|
220
254
|
def stop
|
221
255
|
@engine_stopped = true
|
222
|
-
if @default_loop
|
223
|
-
@default_loop.stop
|
224
|
-
@default_loop = nil
|
225
|
-
end
|
226
256
|
nil
|
227
257
|
end
|
228
258
|
|
@@ -231,8 +261,15 @@ module Fluent
|
|
231
261
|
@log_event_queue.push([tag, time, record])
|
232
262
|
end
|
233
263
|
|
234
|
-
|
264
|
+
def worker_id
|
265
|
+
return @_worker_id if @_worker_id
|
266
|
+
# if ENV doesn't have SERVERENGINE_WORKER_ID, it is a worker under --no-supervisor or in tests
|
267
|
+
# so it's (almost) a single worker, worker_id=0
|
268
|
+
@_worker_id = (ENV['SERVERENGINE_WORKER_ID'] || 0).to_i
|
269
|
+
@_worker_id
|
270
|
+
end
|
235
271
|
|
272
|
+
private
|
236
273
|
def start
|
237
274
|
@root_agent.start
|
238
275
|
end
|
data/lib/fluent/env.rb
CHANGED
@@ -14,12 +14,16 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
|
17
|
+
require 'serverengine/utils'
|
18
|
+
|
17
19
|
module Fluent
|
18
20
|
DEFAULT_CONFIG_PATH = ENV['FLUENT_CONF'] || '/etc/fluent/fluent.conf'
|
19
21
|
DEFAULT_PLUGIN_DIR = ENV['FLUENT_PLUGIN'] || '/etc/fluent/plugin'
|
20
22
|
DEFAULT_SOCKET_PATH = ENV['FLUENT_SOCKET'] || '/var/run/fluent/fluent.sock'
|
23
|
+
DEFAULT_BACKUP_DIR = ENV['FLUENT_BACKUP_DIR'] || '/tmp/fluent'
|
21
24
|
DEFAULT_OJ_OPTIONS = {bigdecimal_load: :float, mode: :compat, use_to_json: true}
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
+
|
26
|
+
def self.windows?
|
27
|
+
ServerEngine.windows?
|
28
|
+
end
|
25
29
|
end
|
data/lib/fluent/error.rb
ADDED
@@ -0,0 +1,30 @@
|
|
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
|
+
class UnrecoverableError < StandardError
|
19
|
+
def initialize(error_message = nil)
|
20
|
+
@message = error_message || "an unrecoverable error occurs in Fluentd process"
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_s
|
24
|
+
@message
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class InvalidRootDirectory < UnrecoverableError
|
29
|
+
end
|
30
|
+
end
|
data/lib/fluent/event.rb
CHANGED
@@ -14,29 +14,68 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
|
17
|
-
require 'fluent/
|
17
|
+
require 'fluent/msgpack_factory'
|
18
|
+
require 'fluent/plugin/compressable'
|
18
19
|
|
19
20
|
module Fluent
|
20
21
|
class EventStream
|
21
22
|
include Enumerable
|
23
|
+
include MessagePackFactory::Mixin
|
24
|
+
include Fluent::Plugin::Compressable
|
25
|
+
|
26
|
+
# dup does deep copy for event stream
|
27
|
+
def dup
|
28
|
+
raise NotImplementedError, "DO NOT USE THIS CLASS directly."
|
29
|
+
end
|
30
|
+
|
31
|
+
def size
|
32
|
+
raise NotImplementedError, "DO NOT USE THIS CLASS directly."
|
33
|
+
end
|
34
|
+
alias :length :size
|
35
|
+
|
36
|
+
def empty?
|
37
|
+
size == 0
|
38
|
+
end
|
39
|
+
|
40
|
+
# for tests
|
41
|
+
def ==(other)
|
42
|
+
other.is_a?(EventStream) && self.to_msgpack_stream == other.to_msgpack_stream
|
43
|
+
end
|
22
44
|
|
23
45
|
def repeatable?
|
24
46
|
false
|
25
47
|
end
|
26
48
|
|
49
|
+
def slice(index, num)
|
50
|
+
raise NotImplementedError, "DO NOT USE THIS CLASS directly."
|
51
|
+
end
|
52
|
+
|
27
53
|
def each(&block)
|
28
54
|
raise NotImplementedError, "DO NOT USE THIS CLASS directly."
|
29
55
|
end
|
30
56
|
|
31
|
-
def to_msgpack_stream
|
32
|
-
|
57
|
+
def to_msgpack_stream(time_int: false)
|
58
|
+
return to_msgpack_stream_forced_integer if time_int
|
59
|
+
out = msgpack_packer
|
33
60
|
each {|time,record|
|
34
61
|
out.write([time,record])
|
35
62
|
}
|
36
63
|
out.to_s
|
37
64
|
end
|
38
|
-
end
|
39
65
|
|
66
|
+
def to_compressed_msgpack_stream(time_int: false)
|
67
|
+
packed = to_msgpack_stream(time_int: time_int)
|
68
|
+
compress(packed)
|
69
|
+
end
|
70
|
+
|
71
|
+
def to_msgpack_stream_forced_integer
|
72
|
+
out = msgpack_packer
|
73
|
+
each {|time,record|
|
74
|
+
out.write([time.to_i,record])
|
75
|
+
}
|
76
|
+
out.to_s
|
77
|
+
end
|
78
|
+
end
|
40
79
|
|
41
80
|
class OneEventStream < EventStream
|
42
81
|
def initialize(time, record)
|
@@ -48,10 +87,22 @@ module Fluent
|
|
48
87
|
OneEventStream.new(@time, @record.dup)
|
49
88
|
end
|
50
89
|
|
90
|
+
def size
|
91
|
+
1
|
92
|
+
end
|
93
|
+
|
51
94
|
def repeatable?
|
52
95
|
true
|
53
96
|
end
|
54
97
|
|
98
|
+
def slice(index, num)
|
99
|
+
if index > 0 || num == 0
|
100
|
+
ArrayEventStream.new([])
|
101
|
+
else
|
102
|
+
self.dup
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
55
106
|
def each(&block)
|
56
107
|
block.call(@time, @record)
|
57
108
|
nil
|
@@ -68,10 +119,14 @@ module Fluent
|
|
68
119
|
end
|
69
120
|
|
70
121
|
def dup
|
71
|
-
entries = @entries.map
|
122
|
+
entries = @entries.map{ |time, record| [time, record.dup] }
|
72
123
|
ArrayEventStream.new(entries)
|
73
124
|
end
|
74
125
|
|
126
|
+
def size
|
127
|
+
@entries.size
|
128
|
+
end
|
129
|
+
|
75
130
|
def repeatable?
|
76
131
|
true
|
77
132
|
end
|
@@ -80,6 +135,10 @@ module Fluent
|
|
80
135
|
@entries.empty?
|
81
136
|
end
|
82
137
|
|
138
|
+
def slice(index, num)
|
139
|
+
ArrayEventStream.new(@entries.slice(index, num))
|
140
|
+
end
|
141
|
+
|
83
142
|
def each(&block)
|
84
143
|
@entries.each(&block)
|
85
144
|
nil
|
@@ -93,21 +152,21 @@ module Fluent
|
|
93
152
|
#
|
94
153
|
# Use this class as below, in loop of data-enumeration:
|
95
154
|
# 1. initialize blank stream:
|
96
|
-
# streams[tag] ||= MultiEventStream
|
155
|
+
# streams[tag] ||= MultiEventStream.new
|
97
156
|
# 2. add events
|
98
157
|
# stream[tag].add(time, record)
|
99
158
|
class MultiEventStream < EventStream
|
100
|
-
def initialize
|
101
|
-
@time_array =
|
102
|
-
@record_array =
|
159
|
+
def initialize(time_array = [], record_array = [])
|
160
|
+
@time_array = time_array
|
161
|
+
@record_array = record_array
|
103
162
|
end
|
104
163
|
|
105
164
|
def dup
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
165
|
+
MultiEventStream.new(@time_array.dup, @record_array.map(&:dup))
|
166
|
+
end
|
167
|
+
|
168
|
+
def size
|
169
|
+
@time_array.size
|
111
170
|
end
|
112
171
|
|
113
172
|
def add(time, record)
|
@@ -123,6 +182,10 @@ module Fluent
|
|
123
182
|
@time_array.empty?
|
124
183
|
end
|
125
184
|
|
185
|
+
def slice(index, num)
|
186
|
+
MultiEventStream.new(@time_array.slice(index, num), @record_array.slice(index, num))
|
187
|
+
end
|
188
|
+
|
126
189
|
def each(&block)
|
127
190
|
time_array = @time_array
|
128
191
|
record_array = @record_array
|
@@ -134,25 +197,138 @@ module Fluent
|
|
134
197
|
end
|
135
198
|
|
136
199
|
class MessagePackEventStream < EventStream
|
137
|
-
#
|
138
|
-
|
200
|
+
# https://github.com/msgpack/msgpack-ruby/issues/119
|
201
|
+
|
202
|
+
# Keep cached_unpacker argument for existing plugins
|
203
|
+
def initialize(data, cached_unpacker = nil, size = 0, unpacked_times: nil, unpacked_records: nil)
|
139
204
|
@data = data
|
205
|
+
@size = size
|
206
|
+
@unpacked_times = unpacked_times
|
207
|
+
@unpacked_records = unpacked_records
|
208
|
+
end
|
209
|
+
|
210
|
+
def empty?
|
211
|
+
@data.empty?
|
212
|
+
end
|
213
|
+
|
214
|
+
def dup
|
215
|
+
if @unpacked_times
|
216
|
+
self.class.new(@data.dup, nil, @size, unpacked_times: @unpacked_times, unpacked_records: @unpacked_records.map(&:dup))
|
217
|
+
else
|
218
|
+
self.class.new(@data.dup, nil, @size)
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
def size
|
223
|
+
# @size is unbelievable always when @size == 0
|
224
|
+
# If the number of events is really zero, unpacking events takes very short time.
|
225
|
+
ensure_unpacked! if @size == 0
|
226
|
+
@size
|
140
227
|
end
|
141
228
|
|
142
229
|
def repeatable?
|
143
230
|
true
|
144
231
|
end
|
145
232
|
|
233
|
+
def ensure_unpacked!
|
234
|
+
return if @unpacked_times && @unpacked_records
|
235
|
+
@unpacked_times = []
|
236
|
+
@unpacked_records = []
|
237
|
+
msgpack_unpacker.feed_each(@data) do |time, record|
|
238
|
+
@unpacked_times << time
|
239
|
+
@unpacked_records << record
|
240
|
+
end
|
241
|
+
# @size should be updated always right after unpack.
|
242
|
+
# The real size of unpacked objects are correct, rather than given size.
|
243
|
+
@size = @unpacked_times.size
|
244
|
+
end
|
245
|
+
|
246
|
+
# This method returns MultiEventStream, because there are no reason
|
247
|
+
# to surve binary serialized by msgpack.
|
248
|
+
def slice(index, num)
|
249
|
+
ensure_unpacked!
|
250
|
+
MultiEventStream.new(@unpacked_times.slice(index, num), @unpacked_records.slice(index, num))
|
251
|
+
end
|
252
|
+
|
146
253
|
def each(&block)
|
147
|
-
|
148
|
-
|
149
|
-
|
254
|
+
if @unpacked_times
|
255
|
+
@unpacked_times.each_with_index do |time, i|
|
256
|
+
block.call(time, @unpacked_records[i])
|
257
|
+
end
|
258
|
+
else
|
259
|
+
@unpacked_times = []
|
260
|
+
@unpacked_records = []
|
261
|
+
msgpack_unpacker.feed_each(@data) do |time, record|
|
262
|
+
@unpacked_times << time
|
263
|
+
@unpacked_records << record
|
264
|
+
block.call(time, record)
|
265
|
+
end
|
266
|
+
@size = @unpacked_times.size
|
267
|
+
end
|
150
268
|
nil
|
151
269
|
end
|
152
270
|
|
153
|
-
def to_msgpack_stream
|
271
|
+
def to_msgpack_stream(time_int: false)
|
272
|
+
# time_int is always ignored because @data is always packed binary in this class
|
154
273
|
@data
|
155
274
|
end
|
156
275
|
end
|
157
|
-
end
|
158
276
|
|
277
|
+
class CompressedMessagePackEventStream < MessagePackEventStream
|
278
|
+
def initialize(data, cached_unpacker = nil, size = 0, unpacked_times: nil, unpacked_records: nil)
|
279
|
+
super
|
280
|
+
@decompressed_data = nil
|
281
|
+
@compressed_data = data
|
282
|
+
end
|
283
|
+
|
284
|
+
def empty?
|
285
|
+
ensure_decompressed!
|
286
|
+
super
|
287
|
+
end
|
288
|
+
|
289
|
+
def ensure_unpacked!
|
290
|
+
ensure_decompressed!
|
291
|
+
super
|
292
|
+
end
|
293
|
+
|
294
|
+
def each(&block)
|
295
|
+
ensure_decompressed!
|
296
|
+
super
|
297
|
+
end
|
298
|
+
|
299
|
+
def to_msgpack_stream(time_int: false)
|
300
|
+
ensure_decompressed!
|
301
|
+
super
|
302
|
+
end
|
303
|
+
|
304
|
+
def to_compressed_msgpack_stream(time_int: false)
|
305
|
+
# time_int is always ignored because @data is always packed binary in this class
|
306
|
+
@compressed_data
|
307
|
+
end
|
308
|
+
|
309
|
+
private
|
310
|
+
|
311
|
+
def ensure_decompressed!
|
312
|
+
return if @decompressed_data
|
313
|
+
@data = @decompressed_data = decompress(@data)
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
module ChunkMessagePackEventStreamer
|
318
|
+
include MessagePackFactory::Mixin
|
319
|
+
# chunk.extend(ChunkEventStreamer)
|
320
|
+
# => chunk.each{|time, record| ... }
|
321
|
+
def each(&block)
|
322
|
+
open do |io|
|
323
|
+
msgpack_unpacker(io).each(&block)
|
324
|
+
end
|
325
|
+
nil
|
326
|
+
end
|
327
|
+
alias :msgpack_each :each
|
328
|
+
|
329
|
+
def to_msgpack_stream(time_int: false)
|
330
|
+
# time_int is always ignored because data is already packed and written in chunk
|
331
|
+
read
|
332
|
+
end
|
333
|
+
end
|
334
|
+
end
|