fluentd 1.20.0-aarch64-mingw-ucrt
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rubocop.yml +116 -0
- data/ADOPTERS.md +5 -0
- data/AGENTS.md +46 -0
- data/AUTHORS +2 -0
- data/CHANGELOG.md +3324 -0
- data/CONTRIBUTING.md +45 -0
- data/GOVERNANCE.md +55 -0
- data/GithubWorkflow.md +78 -0
- data/LICENSE +202 -0
- data/MAINTAINERS.md +19 -0
- data/README.md +73 -0
- data/Rakefile +89 -0
- data/SECURITY.md +47 -0
- data/bin/fluent-binlog-reader +7 -0
- data/bin/fluent-ca-generate +6 -0
- data/bin/fluent-cap-ctl +7 -0
- data/bin/fluent-cat +5 -0
- data/bin/fluent-ctl +7 -0
- data/bin/fluent-debug +5 -0
- data/bin/fluent-gem +9 -0
- data/bin/fluent-plugin-config-format +5 -0
- data/bin/fluent-plugin-generate +5 -0
- data/bin/fluentd +15 -0
- data/code-of-conduct.md +3 -0
- data/docs/SECURITY_AUDIT.pdf +0 -0
- data/example/copy_roundrobin.conf +39 -0
- data/example/counter.conf +18 -0
- data/example/filter_stdout.conf +22 -0
- data/example/in_forward.conf +14 -0
- data/example/in_forward_client.conf +37 -0
- data/example/in_forward_shared_key.conf +15 -0
- data/example/in_forward_tls.conf +14 -0
- data/example/in_forward_users.conf +24 -0
- data/example/in_forward_workers.conf +21 -0
- data/example/in_http.conf +16 -0
- data/example/in_out_forward.conf +17 -0
- data/example/in_sample_blocks.conf +17 -0
- data/example/in_sample_with_compression.conf +23 -0
- data/example/in_syslog.conf +15 -0
- data/example/in_tail.conf +14 -0
- data/example/in_tcp.conf +13 -0
- data/example/in_udp.conf +13 -0
- data/example/logevents.conf +25 -0
- data/example/multi_filters.conf +61 -0
- data/example/out_copy.conf +20 -0
- data/example/out_exec_filter.conf +42 -0
- data/example/out_file.conf +13 -0
- data/example/out_forward.conf +35 -0
- data/example/out_forward_buf_file.conf +23 -0
- data/example/out_forward_client.conf +109 -0
- data/example/out_forward_heartbeat_none.conf +16 -0
- data/example/out_forward_sd.conf +17 -0
- data/example/out_forward_shared_key.conf +36 -0
- data/example/out_forward_tls.conf +18 -0
- data/example/out_forward_users.conf +65 -0
- data/example/out_null.conf +36 -0
- data/example/sd.yaml +8 -0
- data/example/secondary_file.conf +42 -0
- data/example/suppress_config_dump.conf +7 -0
- data/example/v0_12_filter.conf +78 -0
- data/example/v1_literal_example.conf +36 -0
- data/example/worker_section.conf +36 -0
- data/fluent.conf +139 -0
- data/lib/fluent/agent.rb +168 -0
- data/lib/fluent/capability.rb +87 -0
- data/lib/fluent/clock.rb +66 -0
- data/lib/fluent/command/binlog_reader.rb +244 -0
- data/lib/fluent/command/bundler_injection.rb +45 -0
- data/lib/fluent/command/ca_generate.rb +184 -0
- data/lib/fluent/command/cap_ctl.rb +174 -0
- data/lib/fluent/command/cat.rb +365 -0
- data/lib/fluent/command/ctl.rb +180 -0
- data/lib/fluent/command/debug.rb +103 -0
- data/lib/fluent/command/fluentd.rb +385 -0
- data/lib/fluent/command/plugin_config_formatter.rb +308 -0
- data/lib/fluent/command/plugin_generator.rb +365 -0
- data/lib/fluent/compat/call_super_mixin.rb +76 -0
- data/lib/fluent/compat/detach_process_mixin.rb +33 -0
- data/lib/fluent/compat/exec_util.rb +144 -0
- data/lib/fluent/compat/file_util.rb +54 -0
- data/lib/fluent/compat/filter.rb +68 -0
- data/lib/fluent/compat/formatter.rb +117 -0
- data/lib/fluent/compat/formatter_utils.rb +85 -0
- data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
- data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
- data/lib/fluent/compat/input.rb +49 -0
- data/lib/fluent/compat/output.rb +721 -0
- data/lib/fluent/compat/output_chain.rb +60 -0
- data/lib/fluent/compat/parser.rb +310 -0
- data/lib/fluent/compat/parser_utils.rb +40 -0
- data/lib/fluent/compat/propagate_default.rb +62 -0
- data/lib/fluent/compat/record_filter_mixin.rb +34 -0
- data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
- data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
- data/lib/fluent/compat/socket_util.rb +165 -0
- data/lib/fluent/compat/string_util.rb +34 -0
- data/lib/fluent/compat/structured_format_mixin.rb +26 -0
- data/lib/fluent/compat/type_converter.rb +90 -0
- data/lib/fluent/config/basic_parser.rb +122 -0
- data/lib/fluent/config/configure_proxy.rb +424 -0
- data/lib/fluent/config/dsl.rb +152 -0
- data/lib/fluent/config/element.rb +265 -0
- data/lib/fluent/config/error.rb +44 -0
- data/lib/fluent/config/literal_parser.rb +305 -0
- data/lib/fluent/config/parser.rb +119 -0
- data/lib/fluent/config/section.rb +272 -0
- data/lib/fluent/config/types.rb +257 -0
- data/lib/fluent/config/v1_parser.rb +200 -0
- data/lib/fluent/config/yaml_parser/fluent_value.rb +47 -0
- data/lib/fluent/config/yaml_parser/loader.rb +124 -0
- data/lib/fluent/config/yaml_parser/parser.rb +179 -0
- data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
- data/lib/fluent/config/yaml_parser.rb +56 -0
- data/lib/fluent/config.rb +89 -0
- data/lib/fluent/configurable.rb +202 -0
- data/lib/fluent/counter/base_socket.rb +44 -0
- data/lib/fluent/counter/client.rb +297 -0
- data/lib/fluent/counter/error.rb +86 -0
- data/lib/fluent/counter/mutex_hash.rb +163 -0
- data/lib/fluent/counter/server.rb +273 -0
- data/lib/fluent/counter/store.rb +205 -0
- data/lib/fluent/counter/validator.rb +145 -0
- data/lib/fluent/counter.rb +23 -0
- data/lib/fluent/daemon.rb +14 -0
- data/lib/fluent/daemonizer.rb +88 -0
- data/lib/fluent/engine.rb +269 -0
- data/lib/fluent/env.rb +45 -0
- data/lib/fluent/error.rb +37 -0
- data/lib/fluent/event.rb +369 -0
- data/lib/fluent/event_router.rb +315 -0
- data/lib/fluent/ext_monitor_require.rb +28 -0
- data/lib/fluent/file_wrapper.rb +137 -0
- data/lib/fluent/filter.rb +21 -0
- data/lib/fluent/fluent_log_event_router.rb +139 -0
- data/lib/fluent/formatter.rb +23 -0
- data/lib/fluent/input.rb +21 -0
- data/lib/fluent/label.rb +46 -0
- data/lib/fluent/load.rb +33 -0
- data/lib/fluent/log/console_adapter.rb +66 -0
- data/lib/fluent/log.rb +775 -0
- data/lib/fluent/match.rb +187 -0
- data/lib/fluent/mixin.rb +31 -0
- data/lib/fluent/msgpack_factory.rb +111 -0
- data/lib/fluent/oj_options.rb +61 -0
- data/lib/fluent/output.rb +29 -0
- data/lib/fluent/output_chain.rb +23 -0
- data/lib/fluent/parser.rb +23 -0
- data/lib/fluent/plugin/bare_output.rb +88 -0
- data/lib/fluent/plugin/base.rb +219 -0
- data/lib/fluent/plugin/buf_file.rb +256 -0
- data/lib/fluent/plugin/buf_file_single.rb +272 -0
- data/lib/fluent/plugin/buf_memory.rb +34 -0
- data/lib/fluent/plugin/buffer/chunk.rb +313 -0
- data/lib/fluent/plugin/buffer/file_chunk.rb +432 -0
- data/lib/fluent/plugin/buffer/file_single_chunk.rb +325 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
- data/lib/fluent/plugin/buffer.rb +1063 -0
- data/lib/fluent/plugin/compressable.rb +87 -0
- data/lib/fluent/plugin/exec_util.rb +22 -0
- data/lib/fluent/plugin/extractor.rb +132 -0
- data/lib/fluent/plugin/file_util.rb +22 -0
- data/lib/fluent/plugin/filter.rb +119 -0
- data/lib/fluent/plugin/filter_grep.rb +189 -0
- data/lib/fluent/plugin/filter_parser.rb +124 -0
- data/lib/fluent/plugin/filter_record_transformer.rb +325 -0
- data/lib/fluent/plugin/filter_stdout.rb +53 -0
- data/lib/fluent/plugin/formatter.rb +75 -0
- data/lib/fluent/plugin/formatter_csv.rb +92 -0
- data/lib/fluent/plugin/formatter_hash.rb +35 -0
- data/lib/fluent/plugin/formatter_json.rb +62 -0
- data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
- data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
- data/lib/fluent/plugin/formatter_out_file.rb +55 -0
- data/lib/fluent/plugin/formatter_single_value.rb +36 -0
- data/lib/fluent/plugin/formatter_stdout.rb +76 -0
- data/lib/fluent/plugin/formatter_tsv.rb +40 -0
- data/lib/fluent/plugin/in_debug_agent.rb +71 -0
- data/lib/fluent/plugin/in_dummy.rb +18 -0
- data/lib/fluent/plugin/in_exec.rb +124 -0
- data/lib/fluent/plugin/in_forward.rb +489 -0
- data/lib/fluent/plugin/in_gc_stat.rb +72 -0
- data/lib/fluent/plugin/in_http.rb +737 -0
- data/lib/fluent/plugin/in_monitor_agent.rb +406 -0
- data/lib/fluent/plugin/in_object_space.rb +93 -0
- data/lib/fluent/plugin/in_sample.rb +148 -0
- data/lib/fluent/plugin/in_syslog.rb +346 -0
- data/lib/fluent/plugin/in_tail/compatibility.rb +111 -0
- data/lib/fluent/plugin/in_tail/dir_watcher.rb +713 -0
- data/lib/fluent/plugin/in_tail/group_watch.rb +204 -0
- data/lib/fluent/plugin/in_tail/io_handler.rb +391 -0
- data/lib/fluent/plugin/in_tail/line_feeder.rb +230 -0
- data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
- data/lib/fluent/plugin/in_tail/stat_watcher.rb +52 -0
- data/lib/fluent/plugin/in_tail/tail_watcher.rb +276 -0
- data/lib/fluent/plugin/in_tail/worker_pool.rb +298 -0
- data/lib/fluent/plugin/in_tail.rb +917 -0
- data/lib/fluent/plugin/in_tcp.rb +230 -0
- data/lib/fluent/plugin/in_udp.rb +101 -0
- data/lib/fluent/plugin/in_unix.rb +197 -0
- data/lib/fluent/plugin/input.rb +71 -0
- data/lib/fluent/plugin/metrics.rb +119 -0
- data/lib/fluent/plugin/metrics_local.rb +96 -0
- data/lib/fluent/plugin/multi_output.rb +179 -0
- data/lib/fluent/plugin/out_buffer.rb +40 -0
- data/lib/fluent/plugin/out_copy.rb +120 -0
- data/lib/fluent/plugin/out_exec.rb +105 -0
- data/lib/fluent/plugin/out_exec_filter.rb +319 -0
- data/lib/fluent/plugin/out_file.rb +371 -0
- data/lib/fluent/plugin/out_forward/ack_handler.rb +176 -0
- data/lib/fluent/plugin/out_forward/connection_manager.rb +131 -0
- data/lib/fluent/plugin/out_forward/error.rb +28 -0
- data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
- data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
- data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
- data/lib/fluent/plugin/out_forward/socket_cache.rb +177 -0
- data/lib/fluent/plugin/out_forward.rb +865 -0
- data/lib/fluent/plugin/out_http.rb +419 -0
- data/lib/fluent/plugin/out_null.rb +74 -0
- data/lib/fluent/plugin/out_relabel.rb +32 -0
- data/lib/fluent/plugin/out_roundrobin.rb +84 -0
- data/lib/fluent/plugin/out_secondary_file.rb +148 -0
- data/lib/fluent/plugin/out_stdout.rb +81 -0
- data/lib/fluent/plugin/out_stream.rb +130 -0
- data/lib/fluent/plugin/output.rb +1688 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +41 -0
- data/lib/fluent/plugin/parser.rb +274 -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 +124 -0
- data/lib/fluent/plugin/parser_json.rb +118 -0
- data/lib/fluent/plugin/parser_ltsv.rb +49 -0
- data/lib/fluent/plugin/parser_msgpack.rb +72 -0
- data/lib/fluent/plugin/parser_multiline.rb +152 -0
- data/lib/fluent/plugin/parser_nginx.rb +28 -0
- data/lib/fluent/plugin/parser_none.rb +36 -0
- data/lib/fluent/plugin/parser_regexp.rb +68 -0
- data/lib/fluent/plugin/parser_syslog.rb +543 -0
- data/lib/fluent/plugin/parser_tsv.rb +47 -0
- data/lib/fluent/plugin/sd_file.rb +157 -0
- data/lib/fluent/plugin/sd_srv.rb +135 -0
- data/lib/fluent/plugin/sd_static.rb +58 -0
- data/lib/fluent/plugin/service_discovery.rb +65 -0
- data/lib/fluent/plugin/socket_util.rb +22 -0
- data/lib/fluent/plugin/storage.rb +84 -0
- data/lib/fluent/plugin/storage_local.rb +166 -0
- data/lib/fluent/plugin/string_util.rb +22 -0
- data/lib/fluent/plugin.rb +206 -0
- data/lib/fluent/plugin_helper/cert_option.rb +199 -0
- data/lib/fluent/plugin_helper/child_process.rb +369 -0
- data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
- data/lib/fluent/plugin_helper/counter.rb +51 -0
- data/lib/fluent/plugin_helper/event_emitter.rb +112 -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 +81 -0
- data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
- data/lib/fluent/plugin_helper/http_server/request.rb +53 -0
- data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
- data/lib/fluent/plugin_helper/http_server/server.rb +116 -0
- data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
- data/lib/fluent/plugin_helper/http_server.rb +129 -0
- data/lib/fluent/plugin_helper/inject.rb +154 -0
- data/lib/fluent/plugin_helper/metrics.rb +136 -0
- data/lib/fluent/plugin_helper/parser.rb +147 -0
- data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
- data/lib/fluent/plugin_helper/retry_state.rb +219 -0
- data/lib/fluent/plugin_helper/server.rb +840 -0
- data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
- data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
- data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
- data/lib/fluent/plugin_helper/socket.rb +288 -0
- data/lib/fluent/plugin_helper/socket_option.rb +98 -0
- data/lib/fluent/plugin_helper/storage.rb +349 -0
- data/lib/fluent/plugin_helper/thread.rb +180 -0
- data/lib/fluent/plugin_helper/timer.rb +92 -0
- data/lib/fluent/plugin_helper.rb +75 -0
- data/lib/fluent/plugin_id.rb +93 -0
- data/lib/fluent/process.rb +22 -0
- data/lib/fluent/registry.rb +117 -0
- data/lib/fluent/root_agent.rb +468 -0
- data/lib/fluent/rpc.rb +95 -0
- data/lib/fluent/source_only_buffer_agent.rb +102 -0
- data/lib/fluent/static_config_analysis.rb +195 -0
- data/lib/fluent/supervisor.rb +1347 -0
- data/lib/fluent/system_config.rb +213 -0
- data/lib/fluent/test/base.rb +83 -0
- data/lib/fluent/test/driver/base.rb +231 -0
- data/lib/fluent/test/driver/base_owned.rb +83 -0
- data/lib/fluent/test/driver/base_owner.rb +135 -0
- data/lib/fluent/test/driver/event_feeder.rb +98 -0
- data/lib/fluent/test/driver/filter.rb +61 -0
- data/lib/fluent/test/driver/formatter.rb +30 -0
- data/lib/fluent/test/driver/input.rb +31 -0
- data/lib/fluent/test/driver/multi_output.rb +53 -0
- data/lib/fluent/test/driver/output.rb +102 -0
- data/lib/fluent/test/driver/parser.rb +30 -0
- data/lib/fluent/test/driver/storage.rb +30 -0
- data/lib/fluent/test/driver/test_event_router.rb +45 -0
- data/lib/fluent/test/filter_test.rb +77 -0
- data/lib/fluent/test/formatter_test.rb +65 -0
- data/lib/fluent/test/helpers.rb +138 -0
- data/lib/fluent/test/input_test.rb +174 -0
- data/lib/fluent/test/log.rb +79 -0
- data/lib/fluent/test/output_test.rb +156 -0
- data/lib/fluent/test/parser_test.rb +70 -0
- data/lib/fluent/test/startup_shutdown.rb +44 -0
- data/lib/fluent/test.rb +61 -0
- data/lib/fluent/time.rb +513 -0
- data/lib/fluent/timezone.rb +171 -0
- data/lib/fluent/tls.rb +105 -0
- data/lib/fluent/unique_id.rb +39 -0
- data/lib/fluent/variable_store.rb +40 -0
- data/lib/fluent/version.rb +21 -0
- data/lib/fluent/win32api.rb +38 -0
- data/lib/fluent/winsvc.rb +130 -0
- data/templates/new_gem/.gitignore +8 -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 +28 -0
- data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
- data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
- data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
- data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
- data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
- data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
- data/templates/new_gem/test/helper.rb.erb +7 -0
- data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
- data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
- data/templates/plugin_config_formatter/param.md-table.erb +10 -0
- data/templates/plugin_config_formatter/param.md.erb +34 -0
- data/templates/plugin_config_formatter/section.md.erb +12 -0
- metadata +996 -0
|
@@ -0,0 +1,269 @@
|
|
|
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'
|
|
18
|
+
require 'fluent/event'
|
|
19
|
+
require 'fluent/event_router'
|
|
20
|
+
require 'fluent/msgpack_factory'
|
|
21
|
+
require 'fluent/root_agent'
|
|
22
|
+
require 'fluent/time'
|
|
23
|
+
require 'fluent/system_config'
|
|
24
|
+
require 'fluent/plugin'
|
|
25
|
+
require 'fluent/fluent_log_event_router'
|
|
26
|
+
require 'fluent/static_config_analysis'
|
|
27
|
+
|
|
28
|
+
module Fluent
|
|
29
|
+
class EngineClass
|
|
30
|
+
# For compat. remove it in fluentd v2
|
|
31
|
+
include Fluent::MessagePackFactory::Mixin
|
|
32
|
+
|
|
33
|
+
def initialize
|
|
34
|
+
@root_agent = nil
|
|
35
|
+
@engine_stopped = false
|
|
36
|
+
@_worker_id = nil
|
|
37
|
+
|
|
38
|
+
@log_event_verbose = false
|
|
39
|
+
@suppress_config_dump = false
|
|
40
|
+
@without_source = false
|
|
41
|
+
|
|
42
|
+
@fluent_log_event_router = nil
|
|
43
|
+
@system_config = SystemConfig.new
|
|
44
|
+
|
|
45
|
+
@supervisor_mode = false
|
|
46
|
+
|
|
47
|
+
@root_agent_mutex = Mutex.new
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
MAINLOOP_SLEEP_INTERVAL = 0.3
|
|
51
|
+
|
|
52
|
+
attr_reader :root_agent, :system_config, :supervisor_mode
|
|
53
|
+
|
|
54
|
+
def init(system_config, supervisor_mode: false, start_in_parallel: false)
|
|
55
|
+
@system_config = system_config
|
|
56
|
+
@supervisor_mode = supervisor_mode
|
|
57
|
+
|
|
58
|
+
@suppress_config_dump = system_config.suppress_config_dump unless system_config.suppress_config_dump.nil?
|
|
59
|
+
@without_source = system_config.without_source unless system_config.without_source.nil?
|
|
60
|
+
|
|
61
|
+
@log_event_verbose = system_config.log_event_verbose unless system_config.log_event_verbose.nil?
|
|
62
|
+
|
|
63
|
+
@root_agent = RootAgent.new(log: log, system_config: @system_config, start_in_parallel: start_in_parallel)
|
|
64
|
+
|
|
65
|
+
self
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def log
|
|
69
|
+
$log
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def parse_config(io, fname, basepath = Dir.pwd, v1_config = false)
|
|
73
|
+
if /\.rb$/.match?(fname)
|
|
74
|
+
require 'fluent/config/dsl'
|
|
75
|
+
Config::DSL::Parser.parse(io, File.join(basepath, fname))
|
|
76
|
+
else
|
|
77
|
+
Config.parse(io, fname, basepath, v1_config)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def run_configure(conf, dry_run: false)
|
|
82
|
+
configure(conf)
|
|
83
|
+
conf.check_not_fetched do |key, e|
|
|
84
|
+
parent_name, plugin_name = e.unused_in
|
|
85
|
+
message = if parent_name && plugin_name
|
|
86
|
+
"section <#{e.name}> is not used in <#{parent_name}> of #{plugin_name} plugin"
|
|
87
|
+
elsif parent_name
|
|
88
|
+
"section <#{e.name}> is not used in <#{parent_name}>"
|
|
89
|
+
elsif e.name != 'system' && !(@without_source && e.name == 'source')
|
|
90
|
+
"parameter '#{key}' in #{e.to_s.strip} is not used."
|
|
91
|
+
else
|
|
92
|
+
nil
|
|
93
|
+
end
|
|
94
|
+
next if message.nil?
|
|
95
|
+
|
|
96
|
+
if dry_run && @supervisor_mode
|
|
97
|
+
$log.warn :supervisor, message
|
|
98
|
+
elsif e.for_every_workers?
|
|
99
|
+
$log.warn :worker0, message
|
|
100
|
+
elsif e.for_this_worker?
|
|
101
|
+
$log.warn message
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def configure(conf)
|
|
107
|
+
@root_agent.configure(conf)
|
|
108
|
+
|
|
109
|
+
@fluent_log_event_router = FluentLogEventRouter.build(@root_agent)
|
|
110
|
+
|
|
111
|
+
if @fluent_log_event_router.emittable?
|
|
112
|
+
$log.enable_event(true)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
unless @suppress_config_dump
|
|
116
|
+
$log.info :supervisor, "using configuration file: #{conf.to_s.rstrip}"
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def add_plugin_dir(dir)
|
|
121
|
+
$log.warn('Deprecated method: this method is going to be deleted. Use Fluent::Plugin.add_plugin_dir')
|
|
122
|
+
Plugin.add_plugin_dir(dir)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def emit(tag, time, record)
|
|
126
|
+
raise "BUG: use router.emit instead of Engine.emit"
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def emit_array(tag, array)
|
|
130
|
+
raise "BUG: use router.emit_array instead of Engine.emit_array"
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def emit_stream(tag, es)
|
|
134
|
+
raise "BUG: use router.emit_stream instead of Engine.emit_stream"
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def flush!
|
|
138
|
+
@root_agent_mutex.synchronize do
|
|
139
|
+
@root_agent.flush!
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def cancel_source_only!
|
|
144
|
+
@root_agent_mutex.synchronize do
|
|
145
|
+
@root_agent.cancel_source_only!
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def now
|
|
150
|
+
# TODO thread update
|
|
151
|
+
Fluent::EventTime.now
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def run
|
|
155
|
+
begin
|
|
156
|
+
$log.info "starting fluentd worker", pid: Process.pid, ppid: Process.ppid, worker: worker_id
|
|
157
|
+
@root_agent_mutex.synchronize do
|
|
158
|
+
start
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
@fluent_log_event_router.start
|
|
162
|
+
|
|
163
|
+
$log.info "fluentd worker is now running", worker: worker_id
|
|
164
|
+
sleep MAINLOOP_SLEEP_INTERVAL until @engine_stopped
|
|
165
|
+
$log.info "fluentd worker is now stopping", worker: worker_id
|
|
166
|
+
|
|
167
|
+
rescue Exception => e
|
|
168
|
+
$log.error "unexpected error", error: e
|
|
169
|
+
$log.error_backtrace
|
|
170
|
+
raise
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
@root_agent_mutex.synchronize do
|
|
174
|
+
stop_phase(@root_agent)
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# @param conf [Fluent::Config]
|
|
179
|
+
# @param supervisor [Bool]
|
|
180
|
+
# @return nil
|
|
181
|
+
def reload_config(conf, supervisor: false)
|
|
182
|
+
@root_agent_mutex.synchronize do
|
|
183
|
+
# configure first to reduce down time while restarting
|
|
184
|
+
new_agent = RootAgent.new(log: log, system_config: @system_config)
|
|
185
|
+
ret = Fluent::StaticConfigAnalysis.call(conf, workers: system_config.workers)
|
|
186
|
+
|
|
187
|
+
ret.all_plugins.each do |plugin|
|
|
188
|
+
if plugin.respond_to?(:reloadable_plugin?) && !plugin.reloadable_plugin?
|
|
189
|
+
raise Fluent::ConfigError, "Unreloadable plugin: #{Fluent::Plugin.lookup_type_from_class(plugin.class)}, plugin_id: #{plugin.plugin_id}, class_name: #{plugin.class})"
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# Assign @root_agent to new root_agent
|
|
194
|
+
# for https://github.com/fluent/fluentd/blob/fcef949ce40472547fde295ddd2cfe297e1eddd6/lib/fluent/plugin_helper/event_emitter.rb#L50
|
|
195
|
+
old_agent, @root_agent = @root_agent, new_agent
|
|
196
|
+
begin
|
|
197
|
+
@root_agent.configure(conf)
|
|
198
|
+
rescue
|
|
199
|
+
@root_agent = old_agent
|
|
200
|
+
raise
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
unless @suppress_config_dump
|
|
204
|
+
$log.info :supervisor, "using configuration file: #{conf.to_s.rstrip}"
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# supervisor doesn't handle actual data. so the following code is unnecessary.
|
|
208
|
+
if supervisor
|
|
209
|
+
old_agent.shutdown # to close thread created in #configure
|
|
210
|
+
return
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
stop_phase(old_agent)
|
|
214
|
+
|
|
215
|
+
$log.info 'restart fluentd worker', worker: worker_id
|
|
216
|
+
start_phase(new_agent)
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def stop
|
|
221
|
+
@engine_stopped = true
|
|
222
|
+
nil
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def push_log_event(tag, time, record)
|
|
226
|
+
@fluent_log_event_router.emit_event([tag, time, record])
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def worker_id
|
|
230
|
+
if @supervisor_mode
|
|
231
|
+
return -1
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
return @_worker_id if @_worker_id
|
|
235
|
+
# if ENV doesn't have SERVERENGINE_WORKER_ID, it is a worker under --no-supervisor or in tests
|
|
236
|
+
# so it's (almost) a single worker, worker_id=0
|
|
237
|
+
@_worker_id = (ENV['SERVERENGINE_WORKER_ID'] || 0).to_i
|
|
238
|
+
@_worker_id
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
private
|
|
242
|
+
|
|
243
|
+
def stop_phase(root_agent)
|
|
244
|
+
unless @log_event_verbose
|
|
245
|
+
$log.enable_event(false)
|
|
246
|
+
@fluent_log_event_router.graceful_stop
|
|
247
|
+
end
|
|
248
|
+
$log.info 'shutting down fluentd worker', worker: worker_id
|
|
249
|
+
root_agent.shutdown
|
|
250
|
+
|
|
251
|
+
@fluent_log_event_router.stop
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
def start_phase(root_agent)
|
|
255
|
+
@fluent_log_event_router = FluentLogEventRouter.build(root_agent)
|
|
256
|
+
if @fluent_log_event_router.emittable?
|
|
257
|
+
$log.enable_event(true)
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
@root_agent.start
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def start
|
|
264
|
+
@root_agent.start
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
Engine = EngineClass.new
|
|
269
|
+
end
|
data/lib/fluent/env.rb
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
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 'securerandom'
|
|
18
|
+
|
|
19
|
+
require 'serverengine/utils'
|
|
20
|
+
require 'fluent/oj_options'
|
|
21
|
+
|
|
22
|
+
module Fluent
|
|
23
|
+
DEFAULT_CONFIG_PATH = ENV['FLUENT_CONF'] || '/etc/fluent/fluent.conf'
|
|
24
|
+
DEFAULT_CONFIG_INCLUDE_DIR = ENV["FLUENT_CONF_INCLUDE_DIR"] || '/etc/fluent/conf.d'
|
|
25
|
+
DEFAULT_PLUGIN_DIR = ENV['FLUENT_PLUGIN'] || '/etc/fluent/plugin'
|
|
26
|
+
DEFAULT_SOCKET_PATH = ENV['FLUENT_SOCKET'] || '/var/run/fluent/fluent.sock'
|
|
27
|
+
DEFAULT_BACKUP_DIR = ENV['FLUENT_BACKUP_DIR'] || '/tmp/fluent'
|
|
28
|
+
DEFAULT_OJ_OPTIONS = Fluent::OjOptions.load_env
|
|
29
|
+
DEFAULT_JSON_PARSE_OPTIONS = { allow_duplicate_key: true, allow_comments: true }.freeze
|
|
30
|
+
DEFAULT_DIR_PERMISSION = 0755
|
|
31
|
+
DEFAULT_FILE_PERMISSION = 0644
|
|
32
|
+
INSTANCE_ID = ENV['FLUENT_INSTANCE_ID'] || SecureRandom.uuid
|
|
33
|
+
|
|
34
|
+
def self.windows?
|
|
35
|
+
ServerEngine.windows?
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.linux?
|
|
39
|
+
RUBY_PLATFORM.include?("linux")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def self.macos?
|
|
43
|
+
RUBY_PLATFORM.include?("darwin")
|
|
44
|
+
end
|
|
45
|
+
end
|
data/lib/fluent/error.rb
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
|
|
31
|
+
class InvalidLockDirectory < UnrecoverableError
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# For internal use
|
|
35
|
+
class UncatchableError < Exception
|
|
36
|
+
end
|
|
37
|
+
end
|
data/lib/fluent/event.rb
ADDED
|
@@ -0,0 +1,369 @@
|
|
|
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/msgpack_factory'
|
|
18
|
+
require 'fluent/plugin/compressable'
|
|
19
|
+
|
|
20
|
+
module Fluent
|
|
21
|
+
class EventStream
|
|
22
|
+
include Enumerable
|
|
23
|
+
include Fluent::Plugin::Compressable
|
|
24
|
+
|
|
25
|
+
# dup does deep copy for event stream
|
|
26
|
+
def dup
|
|
27
|
+
raise NotImplementedError, "DO NOT USE THIS CLASS directly."
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def size
|
|
31
|
+
raise NotImplementedError, "DO NOT USE THIS CLASS directly."
|
|
32
|
+
end
|
|
33
|
+
alias :length :size
|
|
34
|
+
|
|
35
|
+
def empty?
|
|
36
|
+
size == 0
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# for tests
|
|
40
|
+
def ==(other)
|
|
41
|
+
other.is_a?(EventStream) && self.to_msgpack_stream == other.to_msgpack_stream
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def repeatable?
|
|
45
|
+
false
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def slice(index, num)
|
|
49
|
+
raise NotImplementedError, "DO NOT USE THIS CLASS directly."
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def each(unpacker: nil, &block)
|
|
53
|
+
raise NotImplementedError, "DO NOT USE THIS CLASS directly."
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def to_msgpack_stream(time_int: false, packer: nil)
|
|
57
|
+
return to_msgpack_stream_forced_integer(packer: packer) if time_int
|
|
58
|
+
out = packer || Fluent::MessagePackFactory.msgpack_packer
|
|
59
|
+
each {|time,record|
|
|
60
|
+
out.write([time,record])
|
|
61
|
+
}
|
|
62
|
+
out.full_pack
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def to_compressed_msgpack_stream(time_int: false, packer: nil, type: :gzip)
|
|
66
|
+
packed = to_msgpack_stream(time_int: time_int, packer: packer)
|
|
67
|
+
compress(packed, type: type)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def to_msgpack_stream_forced_integer(packer: nil)
|
|
71
|
+
out = packer || Fluent::MessagePackFactory.msgpack_packer
|
|
72
|
+
each {|time,record|
|
|
73
|
+
out.write([time.to_i,record])
|
|
74
|
+
}
|
|
75
|
+
out.full_pack
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
class OneEventStream < EventStream
|
|
80
|
+
def initialize(time, record)
|
|
81
|
+
@time = time
|
|
82
|
+
@record = record
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def dup
|
|
86
|
+
OneEventStream.new(@time, @record.dup)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def empty?
|
|
90
|
+
false
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def size
|
|
94
|
+
1
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def repeatable?
|
|
98
|
+
true
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def slice(index, num)
|
|
102
|
+
if index > 0 || num == 0
|
|
103
|
+
ArrayEventStream.new([])
|
|
104
|
+
else
|
|
105
|
+
self.dup
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def each(unpacker: nil, &block)
|
|
110
|
+
block.call(@time, @record)
|
|
111
|
+
nil
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# EventStream from entries: Array of [time, record]
|
|
116
|
+
#
|
|
117
|
+
# Use this class for many events data with a tag
|
|
118
|
+
# and its representation is [ [time, record], [time, record], .. ]
|
|
119
|
+
class ArrayEventStream < EventStream
|
|
120
|
+
def initialize(entries)
|
|
121
|
+
@entries = entries
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def dup
|
|
125
|
+
entries = @entries.map{ |time, record| [time, record.dup] }
|
|
126
|
+
ArrayEventStream.new(entries)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def size
|
|
130
|
+
@entries.size
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def repeatable?
|
|
134
|
+
true
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def empty?
|
|
138
|
+
@entries.empty?
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def slice(index, num)
|
|
142
|
+
ArrayEventStream.new(@entries.slice(index, num))
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def each(unpacker: nil, &block)
|
|
146
|
+
@entries.each(&block)
|
|
147
|
+
nil
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# EventStream from entries: numbers of pairs of time and record.
|
|
152
|
+
#
|
|
153
|
+
# This class can handle many events more efficiently than ArrayEventStream
|
|
154
|
+
# because this class generate less objects than ArrayEventStream.
|
|
155
|
+
#
|
|
156
|
+
# Use this class as below, in loop of data-enumeration:
|
|
157
|
+
# 1. initialize blank stream:
|
|
158
|
+
# streams[tag] ||= MultiEventStream.new
|
|
159
|
+
# 2. add events
|
|
160
|
+
# stream[tag].add(time, record)
|
|
161
|
+
class MultiEventStream < EventStream
|
|
162
|
+
def initialize(time_array = [], record_array = [])
|
|
163
|
+
@time_array = time_array
|
|
164
|
+
@record_array = record_array
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def dup
|
|
168
|
+
MultiEventStream.new(@time_array.dup, @record_array.map(&:dup))
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def size
|
|
172
|
+
@time_array.size
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def add(time, record)
|
|
176
|
+
@time_array << time
|
|
177
|
+
@record_array << record
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def repeatable?
|
|
181
|
+
true
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def empty?
|
|
185
|
+
@time_array.empty?
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def slice(index, num)
|
|
189
|
+
MultiEventStream.new(@time_array.slice(index, num), @record_array.slice(index, num))
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def each(unpacker: nil, &block)
|
|
193
|
+
time_array = @time_array
|
|
194
|
+
record_array = @record_array
|
|
195
|
+
for i in 0..time_array.length-1
|
|
196
|
+
block.call(time_array[i], record_array[i])
|
|
197
|
+
end
|
|
198
|
+
nil
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
class MessagePackEventStream < EventStream
|
|
203
|
+
# https://github.com/msgpack/msgpack-ruby/issues/119
|
|
204
|
+
|
|
205
|
+
# Keep cached_unpacker argument for existing plugins
|
|
206
|
+
def initialize(data, cached_unpacker = nil, size = 0, unpacked_times: nil, unpacked_records: nil)
|
|
207
|
+
@data = data
|
|
208
|
+
@size = size
|
|
209
|
+
@unpacked_times = unpacked_times
|
|
210
|
+
@unpacked_records = unpacked_records
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def empty?
|
|
214
|
+
@data.empty?
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def dup
|
|
218
|
+
if @unpacked_times
|
|
219
|
+
self.class.new(@data.dup, nil, @size, unpacked_times: @unpacked_times, unpacked_records: @unpacked_records.map(&:dup))
|
|
220
|
+
else
|
|
221
|
+
self.class.new(@data.dup, nil, @size)
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def size
|
|
226
|
+
# @size is unbelievable always when @size == 0
|
|
227
|
+
# If the number of events is really zero, unpacking events takes very short time.
|
|
228
|
+
ensure_unpacked! if @size == 0
|
|
229
|
+
@size
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def repeatable?
|
|
233
|
+
true
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def ensure_unpacked!(unpacker: nil)
|
|
237
|
+
return if @unpacked_times && @unpacked_records
|
|
238
|
+
@unpacked_times = []
|
|
239
|
+
@unpacked_records = []
|
|
240
|
+
(unpacker || Fluent::MessagePackFactory.msgpack_unpacker).feed_each(@data) do |time, record|
|
|
241
|
+
@unpacked_times << time
|
|
242
|
+
@unpacked_records << record
|
|
243
|
+
end
|
|
244
|
+
# @size should be updated always right after unpack.
|
|
245
|
+
# The real size of unpacked objects are correct, rather than given size.
|
|
246
|
+
@size = @unpacked_times.size
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
# This method returns MultiEventStream, because there are no reason
|
|
250
|
+
# to survey binary serialized by msgpack.
|
|
251
|
+
def slice(index, num)
|
|
252
|
+
ensure_unpacked!
|
|
253
|
+
MultiEventStream.new(@unpacked_times.slice(index, num), @unpacked_records.slice(index, num))
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def each(unpacker: nil, &block)
|
|
257
|
+
ensure_unpacked!(unpacker: unpacker)
|
|
258
|
+
@unpacked_times.each_with_index do |time, i|
|
|
259
|
+
block.call(time, @unpacked_records[i])
|
|
260
|
+
end
|
|
261
|
+
nil
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def to_msgpack_stream(time_int: false, packer: nil)
|
|
265
|
+
# time_int is always ignored because @data is always packed binary in this class
|
|
266
|
+
@data
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
class CompressedMessagePackEventStream < MessagePackEventStream
|
|
271
|
+
def initialize(data, cached_unpacker = nil, size = 0, unpacked_times: nil, unpacked_records: nil, compress: :gzip, decompression_size_limit: Fluent::Plugin::Compressable::DEFAULT_DECOMPRESSION_SIZE_LIMIT)
|
|
272
|
+
super(data, cached_unpacker, size, unpacked_times: unpacked_times, unpacked_records: unpacked_records)
|
|
273
|
+
@decompressed_data = nil
|
|
274
|
+
@compressed_data = data
|
|
275
|
+
@type = compress
|
|
276
|
+
@decompression_size_limit = decompression_size_limit
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def empty?
|
|
280
|
+
ensure_decompressed!
|
|
281
|
+
super
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
def ensure_unpacked!(unpacker: nil)
|
|
285
|
+
ensure_decompressed!
|
|
286
|
+
super
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
def each(unpacker: nil, &block)
|
|
290
|
+
ensure_decompressed!
|
|
291
|
+
super
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
def to_msgpack_stream(time_int: false, packer: nil)
|
|
295
|
+
ensure_decompressed!
|
|
296
|
+
super
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def to_compressed_msgpack_stream(time_int: false, packer: nil)
|
|
300
|
+
# time_int is always ignored because @data is always packed binary in this class
|
|
301
|
+
@compressed_data
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
private
|
|
305
|
+
|
|
306
|
+
def ensure_decompressed!
|
|
307
|
+
return if @decompressed_data
|
|
308
|
+
@data = @decompressed_data = decompress(@data, type: @type)
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
class MetadataTimeEventStream < EventStream
|
|
313
|
+
def initialize(es)
|
|
314
|
+
@es = es
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
def empty?
|
|
318
|
+
@es.empty?
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
def dup
|
|
322
|
+
self.class.new(@es.dup)
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
def size
|
|
326
|
+
@es.size
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
def repeatable?
|
|
330
|
+
@es.repeatable?
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
def slice(index, num)
|
|
334
|
+
self.class.new(@es.slice(index, num))
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
def each(unpacker: nil, &block)
|
|
338
|
+
@es.each(unpacker: unpacker) do |time, record|
|
|
339
|
+
next if record.nil?
|
|
340
|
+
|
|
341
|
+
time = time[0] if time.is_a?(Array)
|
|
342
|
+
time = Fluent::EventTime.now if time.nil? || time.to_i == 0
|
|
343
|
+
block.call(time, record)
|
|
344
|
+
end
|
|
345
|
+
nil
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
module ChunkMessagePackEventStreamer
|
|
350
|
+
# chunk.extend(ChunkMessagePackEventStreamer)
|
|
351
|
+
# => chunk.each{|time, record| ... }
|
|
352
|
+
def each(unpacker: nil, &block)
|
|
353
|
+
# Note: If need to use `unpacker`, then implement it,
|
|
354
|
+
# e.g., `unpacker.feed_each(io.read, &block)` (Not tested)
|
|
355
|
+
raise NotImplementedError, "'unpacker' argument is not implemented." if unpacker
|
|
356
|
+
|
|
357
|
+
open do |io|
|
|
358
|
+
Fluent::MessagePackFactory.msgpack_unpacker(io).each(&block)
|
|
359
|
+
end
|
|
360
|
+
nil
|
|
361
|
+
end
|
|
362
|
+
alias :msgpack_each :each
|
|
363
|
+
|
|
364
|
+
def to_msgpack_stream(time_int: false, packer: nil)
|
|
365
|
+
# time_int is always ignored because data is already packed and written in chunk
|
|
366
|
+
read
|
|
367
|
+
end
|
|
368
|
+
end
|
|
369
|
+
end
|