fluentd 0.14.4-x64-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of fluentd might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/.github/ISSUE_TEMPLATE.md +6 -0
- data/.gitignore +26 -0
- data/.travis.yml +45 -0
- data/AUTHORS +2 -0
- data/CONTRIBUTING.md +35 -0
- data/COPYING +14 -0
- data/ChangeLog +276 -0
- data/Gemfile +9 -0
- data/README.md +51 -0
- data/Rakefile +53 -0
- data/Vagrantfile +17 -0
- data/appveyor.yml +41 -0
- data/bin/fluent-debug +5 -0
- data/example/copy_roundrobin.conf +39 -0
- data/example/filter_stdout.conf +22 -0
- data/example/in_forward.conf +11 -0
- data/example/in_http.conf +14 -0
- data/example/in_out_forward.conf +17 -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/multi_filters.conf +61 -0
- data/example/out_buffered_null.conf +32 -0
- data/example/out_copy.conf +20 -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/v0_12_filter.conf +78 -0
- data/example/v1_literal_example.conf +36 -0
- data/fluent.conf +139 -0
- data/fluentd.gemspec +51 -0
- data/lib/fluent/agent.rb +194 -0
- data/lib/fluent/command/bundler_injection.rb +45 -0
- data/lib/fluent/command/cat.rb +319 -0
- data/lib/fluent/command/debug.rb +102 -0
- data/lib/fluent/command/fluentd.rb +273 -0
- data/lib/fluent/compat/call_super_mixin.rb +67 -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 +677 -0
- data/lib/fluent/compat/output_chain.rb +60 -0
- data/lib/fluent/compat/parser.rb +180 -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.rb +56 -0
- data/lib/fluent/config/basic_parser.rb +123 -0
- data/lib/fluent/config/configure_proxy.rb +366 -0
- data/lib/fluent/config/dsl.rb +149 -0
- data/lib/fluent/config/element.rb +218 -0
- data/lib/fluent/config/error.rb +26 -0
- data/lib/fluent/config/literal_parser.rb +251 -0
- data/lib/fluent/config/parser.rb +107 -0
- data/lib/fluent/config/section.rb +212 -0
- data/lib/fluent/config/types.rb +136 -0
- data/lib/fluent/config/v1_parser.rb +190 -0
- data/lib/fluent/configurable.rb +176 -0
- data/lib/fluent/daemon.rb +15 -0
- data/lib/fluent/engine.rb +220 -0
- data/lib/fluent/env.rb +27 -0
- data/lib/fluent/event.rb +287 -0
- data/lib/fluent/event_router.rb +259 -0
- data/lib/fluent/filter.rb +21 -0
- data/lib/fluent/formatter.rb +23 -0
- data/lib/fluent/input.rb +21 -0
- data/lib/fluent/label.rb +38 -0
- data/lib/fluent/load.rb +36 -0
- data/lib/fluent/log.rb +445 -0
- data/lib/fluent/match.rb +141 -0
- data/lib/fluent/mixin.rb +31 -0
- data/lib/fluent/msgpack_factory.rb +62 -0
- data/lib/fluent/output.rb +26 -0
- data/lib/fluent/output_chain.rb +23 -0
- data/lib/fluent/parser.rb +23 -0
- data/lib/fluent/plugin.rb +161 -0
- data/lib/fluent/plugin/bare_output.rb +63 -0
- data/lib/fluent/plugin/base.rb +130 -0
- data/lib/fluent/plugin/buf_file.rb +154 -0
- data/lib/fluent/plugin/buf_memory.rb +34 -0
- data/lib/fluent/plugin/buffer.rb +603 -0
- data/lib/fluent/plugin/buffer/chunk.rb +160 -0
- data/lib/fluent/plugin/buffer/file_chunk.rb +323 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
- data/lib/fluent/plugin/exec_util.rb +22 -0
- data/lib/fluent/plugin/file_util.rb +22 -0
- data/lib/fluent/plugin/file_wrapper.rb +120 -0
- data/lib/fluent/plugin/filter.rb +93 -0
- data/lib/fluent/plugin/filter_grep.rb +75 -0
- data/lib/fluent/plugin/filter_record_transformer.rb +342 -0
- data/lib/fluent/plugin/filter_stdout.rb +53 -0
- data/lib/fluent/plugin/formatter.rb +45 -0
- data/lib/fluent/plugin/formatter_csv.rb +47 -0
- data/lib/fluent/plugin/formatter_hash.rb +29 -0
- data/lib/fluent/plugin/formatter_json.rb +44 -0
- data/lib/fluent/plugin/formatter_ltsv.rb +41 -0
- data/lib/fluent/plugin/formatter_msgpack.rb +29 -0
- data/lib/fluent/plugin/formatter_out_file.rb +78 -0
- data/lib/fluent/plugin/formatter_single_value.rb +34 -0
- data/lib/fluent/plugin/formatter_stdout.rb +74 -0
- data/lib/fluent/plugin/in_debug_agent.rb +64 -0
- data/lib/fluent/plugin/in_dummy.rb +135 -0
- data/lib/fluent/plugin/in_exec.rb +149 -0
- data/lib/fluent/plugin/in_forward.rb +366 -0
- data/lib/fluent/plugin/in_gc_stat.rb +52 -0
- data/lib/fluent/plugin/in_http.rb +422 -0
- data/lib/fluent/plugin/in_monitor_agent.rb +401 -0
- data/lib/fluent/plugin/in_object_space.rb +90 -0
- data/lib/fluent/plugin/in_syslog.rb +204 -0
- data/lib/fluent/plugin/in_tail.rb +838 -0
- data/lib/fluent/plugin/in_tcp.rb +41 -0
- data/lib/fluent/plugin/in_udp.rb +37 -0
- data/lib/fluent/plugin/in_unix.rb +201 -0
- data/lib/fluent/plugin/input.rb +33 -0
- data/lib/fluent/plugin/multi_output.rb +95 -0
- data/lib/fluent/plugin/out_buffered_null.rb +59 -0
- data/lib/fluent/plugin/out_buffered_stdout.rb +70 -0
- data/lib/fluent/plugin/out_copy.rb +42 -0
- data/lib/fluent/plugin/out_exec.rb +114 -0
- data/lib/fluent/plugin/out_exec_filter.rb +393 -0
- data/lib/fluent/plugin/out_file.rb +167 -0
- data/lib/fluent/plugin/out_forward.rb +646 -0
- data/lib/fluent/plugin/out_null.rb +27 -0
- data/lib/fluent/plugin/out_relabel.rb +28 -0
- data/lib/fluent/plugin/out_roundrobin.rb +80 -0
- data/lib/fluent/plugin/out_stdout.rb +48 -0
- data/lib/fluent/plugin/out_stream.rb +130 -0
- data/lib/fluent/plugin/output.rb +1020 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
- data/lib/fluent/plugin/parser.rb +175 -0
- data/lib/fluent/plugin/parser_apache.rb +28 -0
- data/lib/fluent/plugin/parser_apache2.rb +84 -0
- data/lib/fluent/plugin/parser_apache_error.rb +26 -0
- data/lib/fluent/plugin/parser_csv.rb +33 -0
- data/lib/fluent/plugin/parser_json.rb +79 -0
- data/lib/fluent/plugin/parser_ltsv.rb +50 -0
- data/lib/fluent/plugin/parser_multiline.rb +104 -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 +73 -0
- data/lib/fluent/plugin/parser_syslog.rb +82 -0
- data/lib/fluent/plugin/parser_tsv.rb +37 -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 +132 -0
- data/lib/fluent/plugin/string_util.rb +22 -0
- data/lib/fluent/plugin_helper.rb +42 -0
- data/lib/fluent/plugin_helper/child_process.rb +298 -0
- data/lib/fluent/plugin_helper/compat_parameters.rb +224 -0
- data/lib/fluent/plugin_helper/event_emitter.rb +80 -0
- data/lib/fluent/plugin_helper/event_loop.rb +118 -0
- data/lib/fluent/plugin_helper/formatter.rb +149 -0
- data/lib/fluent/plugin_helper/inject.rb +125 -0
- data/lib/fluent/plugin_helper/parser.rb +147 -0
- data/lib/fluent/plugin_helper/retry_state.rb +177 -0
- data/lib/fluent/plugin_helper/storage.rb +331 -0
- data/lib/fluent/plugin_helper/thread.rb +147 -0
- data/lib/fluent/plugin_helper/timer.rb +90 -0
- data/lib/fluent/plugin_id.rb +63 -0
- data/lib/fluent/process.rb +504 -0
- data/lib/fluent/registry.rb +99 -0
- data/lib/fluent/root_agent.rb +314 -0
- data/lib/fluent/rpc.rb +94 -0
- data/lib/fluent/supervisor.rb +680 -0
- data/lib/fluent/system_config.rb +122 -0
- data/lib/fluent/test.rb +56 -0
- data/lib/fluent/test/base.rb +85 -0
- data/lib/fluent/test/driver/base.rb +179 -0
- data/lib/fluent/test/driver/base_owned.rb +70 -0
- data/lib/fluent/test/driver/base_owner.rb +125 -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 +52 -0
- data/lib/fluent/test/driver/output.rb +76 -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 +77 -0
- data/lib/fluent/test/formatter_test.rb +65 -0
- data/lib/fluent/test/helpers.rb +79 -0
- data/lib/fluent/test/input_test.rb +172 -0
- data/lib/fluent/test/log.rb +73 -0
- data/lib/fluent/test/output_test.rb +156 -0
- data/lib/fluent/test/parser_test.rb +70 -0
- data/lib/fluent/time.rb +175 -0
- data/lib/fluent/timezone.rb +133 -0
- data/lib/fluent/unique_id.rb +39 -0
- data/lib/fluent/version.rb +21 -0
- data/lib/fluent/winsvc.rb +71 -0
- data/test/compat/test_calls_super.rb +166 -0
- data/test/compat/test_parser.rb +82 -0
- data/test/config/assertions.rb +42 -0
- data/test/config/test_config_parser.rb +507 -0
- data/test/config/test_configurable.rb +1194 -0
- data/test/config/test_configure_proxy.rb +386 -0
- data/test/config/test_dsl.rb +415 -0
- data/test/config/test_element.rb +403 -0
- data/test/config/test_literal_parser.rb +297 -0
- data/test/config/test_section.rb +184 -0
- data/test/config/test_system_config.rb +120 -0
- data/test/config/test_types.rb +171 -0
- data/test/helper.rb +119 -0
- data/test/plugin/data/2010/01/20100102-030405.log +0 -0
- data/test/plugin/data/2010/01/20100102-030406.log +0 -0
- data/test/plugin/data/2010/01/20100102.log +0 -0
- data/test/plugin/data/log/bar +0 -0
- data/test/plugin/data/log/foo/bar.log +0 -0
- data/test/plugin/data/log/test.log +0 -0
- data/test/plugin/test_bare_output.rb +118 -0
- data/test/plugin/test_base.rb +75 -0
- data/test/plugin/test_buf_file.rb +571 -0
- data/test/plugin/test_buf_memory.rb +42 -0
- data/test/plugin/test_buffer.rb +1200 -0
- data/test/plugin/test_buffer_chunk.rb +168 -0
- data/test/plugin/test_buffer_file_chunk.rb +771 -0
- data/test/plugin/test_buffer_memory_chunk.rb +265 -0
- data/test/plugin/test_file_util.rb +96 -0
- data/test/plugin/test_filter.rb +353 -0
- data/test/plugin/test_filter_grep.rb +119 -0
- data/test/plugin/test_filter_record_transformer.rb +600 -0
- data/test/plugin/test_filter_stdout.rb +211 -0
- data/test/plugin/test_formatter_csv.rb +94 -0
- data/test/plugin/test_formatter_json.rb +30 -0
- data/test/plugin/test_formatter_ltsv.rb +52 -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_in_debug_agent.rb +28 -0
- data/test/plugin/test_in_dummy.rb +188 -0
- data/test/plugin/test_in_exec.rb +133 -0
- data/test/plugin/test_in_forward.rb +635 -0
- data/test/plugin/test_in_gc_stat.rb +39 -0
- data/test/plugin/test_in_http.rb +442 -0
- data/test/plugin/test_in_monitor_agent.rb +329 -0
- data/test/plugin/test_in_object_space.rb +64 -0
- data/test/plugin/test_in_syslog.rb +205 -0
- data/test/plugin/test_in_tail.rb +1001 -0
- data/test/plugin/test_in_tcp.rb +102 -0
- data/test/plugin/test_in_udp.rb +121 -0
- data/test/plugin/test_in_unix.rb +126 -0
- data/test/plugin/test_input.rb +122 -0
- data/test/plugin/test_multi_output.rb +180 -0
- data/test/plugin/test_out_buffered_null.rb +79 -0
- data/test/plugin/test_out_buffered_stdout.rb +122 -0
- data/test/plugin/test_out_copy.rb +160 -0
- data/test/plugin/test_out_exec.rb +155 -0
- data/test/plugin/test_out_exec_filter.rb +262 -0
- data/test/plugin/test_out_file.rb +383 -0
- data/test/plugin/test_out_forward.rb +590 -0
- data/test/plugin/test_out_null.rb +29 -0
- data/test/plugin/test_out_relabel.rb +28 -0
- data/test/plugin/test_out_roundrobin.rb +146 -0
- data/test/plugin/test_out_stdout.rb +92 -0
- data/test/plugin/test_out_stream.rb +93 -0
- data/test/plugin/test_output.rb +568 -0
- data/test/plugin/test_output_as_buffered.rb +1604 -0
- data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
- data/test/plugin/test_output_as_buffered_retries.rb +839 -0
- data/test/plugin/test_output_as_buffered_secondary.rb +817 -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_apache.rb +42 -0
- data/test/plugin/test_parser_apache2.rb +38 -0
- data/test/plugin/test_parser_apache_error.rb +45 -0
- data/test/plugin/test_parser_base.rb +32 -0
- data/test/plugin/test_parser_csv.rb +104 -0
- data/test/plugin/test_parser_json.rb +107 -0
- data/test/plugin/test_parser_labeled_tsv.rb +129 -0
- data/test/plugin/test_parser_multiline.rb +100 -0
- data/test/plugin/test_parser_nginx.rb +48 -0
- data/test/plugin/test_parser_none.rb +53 -0
- data/test/plugin/test_parser_regexp.rb +277 -0
- data/test/plugin/test_parser_syslog.rb +66 -0
- data/test/plugin/test_parser_time.rb +46 -0
- data/test/plugin/test_parser_tsv.rb +121 -0
- data/test/plugin/test_storage.rb +167 -0
- data/test/plugin/test_storage_local.rb +8 -0
- data/test/plugin/test_string_util.rb +26 -0
- data/test/plugin_helper/test_child_process.rb +608 -0
- data/test/plugin_helper/test_compat_parameters.rb +242 -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_formatter.rb +252 -0
- data/test/plugin_helper/test_inject.rb +487 -0
- data/test/plugin_helper/test_parser.rb +263 -0
- data/test/plugin_helper/test_retry_state.rb +399 -0
- data/test/plugin_helper/test_storage.rb +521 -0
- data/test/plugin_helper/test_thread.rb +164 -0
- data/test/plugin_helper/test_timer.rb +131 -0
- data/test/scripts/exec_script.rb +32 -0
- data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
- data/test/scripts/fluent/plugin/out_test.rb +81 -0
- data/test/scripts/fluent/plugin/out_test2.rb +80 -0
- data/test/scripts/fluent/plugin/parser_known.rb +4 -0
- data/test/test_config.rb +179 -0
- data/test/test_configdsl.rb +148 -0
- data/test/test_event.rb +329 -0
- data/test/test_event_router.rb +331 -0
- data/test/test_event_time.rb +184 -0
- data/test/test_filter.rb +121 -0
- data/test/test_formatter.rb +319 -0
- data/test/test_input.rb +31 -0
- data/test/test_log.rb +572 -0
- data/test/test_match.rb +137 -0
- data/test/test_mixin.rb +351 -0
- data/test/test_output.rb +214 -0
- data/test/test_plugin_classes.rb +136 -0
- data/test/test_plugin_helper.rb +81 -0
- data/test/test_process.rb +48 -0
- data/test/test_root_agent.rb +278 -0
- data/test/test_supervisor.rb +339 -0
- data/test/test_time_formatter.rb +186 -0
- data/test/test_unique_id.rb +47 -0
- metadata +823 -0
@@ -0,0 +1,99 @@
|
|
1
|
+
#
|
2
|
+
# Fluentd
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
require 'fluent/config/error'
|
18
|
+
|
19
|
+
module Fluent
|
20
|
+
class Registry
|
21
|
+
DEFAULT_PLUGIN_PATH = File.expand_path('../plugin', __FILE__)
|
22
|
+
|
23
|
+
def initialize(kind, search_prefix, dir_search_prefix: nil)
|
24
|
+
@kind = kind
|
25
|
+
@search_prefix = search_prefix
|
26
|
+
@dir_search_prefix = dir_search_prefix
|
27
|
+
@map = {}
|
28
|
+
@paths = [DEFAULT_PLUGIN_PATH]
|
29
|
+
end
|
30
|
+
|
31
|
+
attr_reader :kind, :paths
|
32
|
+
|
33
|
+
def register(type, value)
|
34
|
+
type = type.to_sym
|
35
|
+
@map[type] = value
|
36
|
+
end
|
37
|
+
|
38
|
+
def lookup(type)
|
39
|
+
type = type.to_sym
|
40
|
+
if value = @map[type]
|
41
|
+
return value
|
42
|
+
end
|
43
|
+
search(type)
|
44
|
+
if value = @map[type]
|
45
|
+
return value
|
46
|
+
end
|
47
|
+
raise ConfigError, "Unknown #{@kind} plugin '#{type}'. Run 'gem search -rd fluent-plugin' to find plugins" # TODO error class
|
48
|
+
end
|
49
|
+
|
50
|
+
def reverse_lookup(value)
|
51
|
+
@map.each do |k, v|
|
52
|
+
return k if v == value
|
53
|
+
end
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
|
57
|
+
def search(type)
|
58
|
+
# search from additional plugin directories
|
59
|
+
if @dir_search_prefix
|
60
|
+
path = "#{@dir_search_prefix}#{type}"
|
61
|
+
files = @paths.map { |lp|
|
62
|
+
lpath = File.expand_path(File.join(lp, "#{path}.rb"))
|
63
|
+
File.exist?(lpath) ? lpath : nil
|
64
|
+
}.compact
|
65
|
+
unless files.empty?
|
66
|
+
# prefer newer version
|
67
|
+
require files.sort.last
|
68
|
+
return
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
path = "#{@search_prefix}#{type}"
|
73
|
+
|
74
|
+
# prefer LOAD_PATH than gems
|
75
|
+
files = $LOAD_PATH.map { |lp|
|
76
|
+
lpath = File.expand_path(File.join(lp, "#{path}.rb"))
|
77
|
+
File.exist?(lpath) ? lpath : nil
|
78
|
+
}.compact
|
79
|
+
unless files.empty?
|
80
|
+
# prefer newer version
|
81
|
+
require files.sort.last
|
82
|
+
return
|
83
|
+
end
|
84
|
+
|
85
|
+
specs = Gem::Specification.find_all { |spec|
|
86
|
+
spec.contains_requirable_file? path
|
87
|
+
}
|
88
|
+
|
89
|
+
# prefer newer version
|
90
|
+
specs = specs.sort_by { |spec| spec.version }
|
91
|
+
if spec = specs.last
|
92
|
+
spec.require_paths.each { |lib|
|
93
|
+
file = "#{spec.full_gem_path}/#{lib}/#{path}"
|
94
|
+
require file
|
95
|
+
}
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,314 @@
|
|
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 'delegate'
|
18
|
+
|
19
|
+
require 'fluent/config/error'
|
20
|
+
require 'fluent/agent'
|
21
|
+
require 'fluent/label'
|
22
|
+
require 'fluent/plugin'
|
23
|
+
require 'fluent/system_config'
|
24
|
+
require 'fluent/time'
|
25
|
+
|
26
|
+
module Fluent
|
27
|
+
#
|
28
|
+
# Fluentd forms a tree structure to manage plugins:
|
29
|
+
#
|
30
|
+
# RootAgent
|
31
|
+
# |
|
32
|
+
# +------------+-------------+-------------+
|
33
|
+
# | | | |
|
34
|
+
# <label> <source> <filter> <match>
|
35
|
+
# |
|
36
|
+
# +----+----+
|
37
|
+
# | |
|
38
|
+
# <filter> <match>
|
39
|
+
#
|
40
|
+
# Relation:
|
41
|
+
# * RootAgent has many <label>, <source>, <filter> and <match>
|
42
|
+
# * <label> has many <match> and <filter>
|
43
|
+
#
|
44
|
+
# Next step: `fluentd/agent.rb`
|
45
|
+
# Next step: 'fluentd/label.rb'
|
46
|
+
#
|
47
|
+
class RootAgent < Agent
|
48
|
+
ERROR_LABEL = "@ERROR".freeze # @ERROR is built-in error label
|
49
|
+
|
50
|
+
def initialize(log:, system_config: SystemConfig.new)
|
51
|
+
super(log: log)
|
52
|
+
|
53
|
+
@labels = {}
|
54
|
+
@inputs = []
|
55
|
+
@suppress_emit_error_log_interval = 0
|
56
|
+
@next_emit_error_log_time = nil
|
57
|
+
@without_source = false
|
58
|
+
|
59
|
+
suppress_interval(system_config.emit_error_log_interval) unless system_config.emit_error_log_interval.nil?
|
60
|
+
@without_source = system_config.without_source unless system_config.without_source.nil?
|
61
|
+
end
|
62
|
+
|
63
|
+
attr_reader :inputs
|
64
|
+
attr_reader :labels
|
65
|
+
|
66
|
+
def configure(conf)
|
67
|
+
error_label_config = nil
|
68
|
+
|
69
|
+
# initialize <label> elements before configuring all plugins to avoid 'label not found' in input, filter and output.
|
70
|
+
label_configs = {}
|
71
|
+
conf.elements(name: 'label').each { |e|
|
72
|
+
name = e.arg
|
73
|
+
raise ConfigError, "Missing symbol argument on <label> directive" if name.empty?
|
74
|
+
|
75
|
+
if name == ERROR_LABEL
|
76
|
+
error_label_config = e
|
77
|
+
else
|
78
|
+
add_label(name)
|
79
|
+
label_configs[name] = e
|
80
|
+
end
|
81
|
+
}
|
82
|
+
# Call 'configure' here to avoid 'label not found'
|
83
|
+
label_configs.each { |name, e| @labels[name].configure(e) }
|
84
|
+
setup_error_label(error_label_config) if error_label_config
|
85
|
+
|
86
|
+
super
|
87
|
+
|
88
|
+
# initialize <source> elements
|
89
|
+
if @without_source
|
90
|
+
log.info "'--without-source' is applied. Ignore <source> sections"
|
91
|
+
else
|
92
|
+
conf.elements(name: 'source').each { |e|
|
93
|
+
type = e['@type']
|
94
|
+
raise ConfigError, "Missing 'type' parameter on <source> directive" unless type
|
95
|
+
add_source(type, e)
|
96
|
+
}
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def setup_error_label(e)
|
101
|
+
error_label = add_label(ERROR_LABEL)
|
102
|
+
error_label.configure(e)
|
103
|
+
error_label.root_agent = RootAgentProxyWithoutErrorCollector.new(self)
|
104
|
+
@error_collector = error_label.event_router
|
105
|
+
end
|
106
|
+
|
107
|
+
def lifecycle(desc: false, kind_callback: nil)
|
108
|
+
kind_or_label_list = if desc
|
109
|
+
[:output, :filter, @labels.values.reverse, :output_with_router, :input].flatten
|
110
|
+
else
|
111
|
+
[:input, :output_with_router, @labels.values, :filter, :output].flatten
|
112
|
+
end
|
113
|
+
kind_or_label_list.each do |kind|
|
114
|
+
if kind.respond_to?(:lifecycle)
|
115
|
+
label = kind
|
116
|
+
label.lifecycle(desc: desc) do |plugin, display_kind|
|
117
|
+
yield plugin, display_kind
|
118
|
+
end
|
119
|
+
else
|
120
|
+
list = if desc
|
121
|
+
lifecycle_control_list[kind].reverse
|
122
|
+
else
|
123
|
+
lifecycle_control_list[kind]
|
124
|
+
end
|
125
|
+
display_kind = (kind == :output_with_router ? :output : kind)
|
126
|
+
list.each do |instance|
|
127
|
+
yield instance, display_kind
|
128
|
+
end
|
129
|
+
end
|
130
|
+
if kind_callback
|
131
|
+
kind_callback.call
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def start
|
137
|
+
lifecycle(desc: true) do |i| # instance
|
138
|
+
i.start unless i.started?
|
139
|
+
end
|
140
|
+
lifecycle(desc: true) do |i|
|
141
|
+
i.after_start unless i.after_started?
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def flush!
|
146
|
+
log.info "flushing all buffer forcedly"
|
147
|
+
flushing_threads = []
|
148
|
+
lifecycle(desc: true) do |instance|
|
149
|
+
if instance.respond_to?(:force_flush)
|
150
|
+
t = Thread.new do
|
151
|
+
Thread.current.abort_on_exception = true
|
152
|
+
begin
|
153
|
+
instance.force_flush
|
154
|
+
rescue => e
|
155
|
+
log.warn "unexpected error while flushing buffer", plugin: instance.class, plugin_id: instance.plugin_id, error: e
|
156
|
+
log.warn_backtrace
|
157
|
+
end
|
158
|
+
end
|
159
|
+
flushing_threads << t
|
160
|
+
end
|
161
|
+
end
|
162
|
+
flushing_threads.each{|t| t.join }
|
163
|
+
end
|
164
|
+
|
165
|
+
def shutdown # Fluentd's shutdown sequence is stop, before_shutdown, shutdown, after_shutdown, close, terminate for plugins
|
166
|
+
# Thesee method callers does `rescue Exception` to call methods of shutdown sequence as far as possible
|
167
|
+
# if plugin methods does something like infinite recursive call, `exit`, unregistering signal handlers or others.
|
168
|
+
# Plugins should be separated and be in sandbox to protect data in each plugins/buffers.
|
169
|
+
|
170
|
+
lifecycle_safe_sequence = ->(method, checker) {
|
171
|
+
lifecycle do |instance, kind|
|
172
|
+
begin
|
173
|
+
log.debug "calling #{method} on #{kind} plugin", type: Plugin.lookup_type_from_class(instance.class), plugin_id: instance.plugin_id
|
174
|
+
instance.send(method) unless instance.send(checker)
|
175
|
+
rescue Exception => e
|
176
|
+
log.warn "unexpected error while calling #{method} on #{kind} plugin", pluguin: instance.class, plugin_id: instance.plugin_id, error: e
|
177
|
+
log.warn_backtrace
|
178
|
+
end
|
179
|
+
end
|
180
|
+
}
|
181
|
+
|
182
|
+
lifecycle_unsafe_sequence = ->(method, checker) {
|
183
|
+
operation = case method
|
184
|
+
when :before_shutdown then "preparing shutdown"
|
185
|
+
when :shutdown then "shutting down"
|
186
|
+
when :close then "closing"
|
187
|
+
else
|
188
|
+
raise "BUG: unknown method name '#{method}'"
|
189
|
+
end
|
190
|
+
operation_threads = []
|
191
|
+
callback = ->(){
|
192
|
+
operation_threads.each{|t| t.join }
|
193
|
+
operation_threads.clear
|
194
|
+
}
|
195
|
+
lifecycle(kind_callback: callback) do |instance, kind|
|
196
|
+
t = Thread.new do
|
197
|
+
Thread.current.abort_on_exception = true
|
198
|
+
begin
|
199
|
+
log.info "#{operation} #{kind} plugin", type: Plugin.lookup_type_from_class(instance.class), plugin_id: instance.plugin_id
|
200
|
+
instance.send(method) unless instance.send(checker)
|
201
|
+
rescue Exception => e
|
202
|
+
log.warn "unexpected error while #{operation} on #{kind} plugin", plugin: instance.class, plugin_id: instance.plugin_id, error: e
|
203
|
+
log.warn_backtrace
|
204
|
+
end
|
205
|
+
end
|
206
|
+
operation_threads << t
|
207
|
+
end
|
208
|
+
}
|
209
|
+
|
210
|
+
lifecycle_safe_sequence.call(:stop, :stopped?)
|
211
|
+
|
212
|
+
# before_shutdown does force_flush for output plugins: it should block, so it's unsafe operation
|
213
|
+
lifecycle_unsafe_sequence.call(:before_shutdown, :before_shutdown?)
|
214
|
+
|
215
|
+
lifecycle_unsafe_sequence.call(:shutdown, :shutdown?)
|
216
|
+
|
217
|
+
lifecycle_safe_sequence.call(:after_shutdown, :after_shutdown?)
|
218
|
+
|
219
|
+
lifecycle_unsafe_sequence.call(:close, :closed?)
|
220
|
+
|
221
|
+
lifecycle_safe_sequence.call(:terminate, :terminated?)
|
222
|
+
end
|
223
|
+
|
224
|
+
def suppress_interval(interval_time)
|
225
|
+
@suppress_emit_error_log_interval = interval_time
|
226
|
+
@next_emit_error_log_time = Time.now.to_i
|
227
|
+
end
|
228
|
+
|
229
|
+
def add_source(type, conf)
|
230
|
+
log.info "adding source", type: type
|
231
|
+
|
232
|
+
input = Plugin.new_input(type)
|
233
|
+
# <source> emits events to the top-level event router (RootAgent#event_router).
|
234
|
+
# Input#configure overwrites event_router to a label's event_router if it has `@label` parameter.
|
235
|
+
# See also 'fluentd/plugin/input.rb'
|
236
|
+
input.router = @event_router
|
237
|
+
input.configure(conf)
|
238
|
+
@inputs << input
|
239
|
+
|
240
|
+
input
|
241
|
+
end
|
242
|
+
|
243
|
+
def add_label(name)
|
244
|
+
label = Label.new(name, log: log)
|
245
|
+
label.root_agent = self
|
246
|
+
@labels[name] = label
|
247
|
+
end
|
248
|
+
|
249
|
+
def find_label(label_name)
|
250
|
+
if label = @labels[label_name]
|
251
|
+
label
|
252
|
+
else
|
253
|
+
raise ArgumentError, "#{label_name} label not found"
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
def emit_error_event(tag, time, record, error)
|
258
|
+
error_info = {error: error, tag: tag, time: time}
|
259
|
+
if @error_collector
|
260
|
+
# A record is not included in the logs because <@ERROR> handles it. This warn is for the notification
|
261
|
+
log.warn "send an error event to @ERROR:", error_info
|
262
|
+
@error_collector.emit(tag, time, record)
|
263
|
+
else
|
264
|
+
error_info[:record] = record
|
265
|
+
log.warn "dump an error event:", error_info
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
def handle_emits_error(tag, es, error)
|
270
|
+
error_info = {error: error, tag: tag}
|
271
|
+
if @error_collector
|
272
|
+
log.warn "send an error event stream to @ERROR:", error_info
|
273
|
+
@error_collector.emit_stream(tag, es)
|
274
|
+
else
|
275
|
+
now = Time.now
|
276
|
+
if @suppress_emit_error_log_interval.zero? || now > @next_emit_error_log_time
|
277
|
+
log.warn "emit transaction failed:", error_info
|
278
|
+
log.warn_backtrace
|
279
|
+
@next_emit_error_log_time = now + @suppress_emit_error_log_interval
|
280
|
+
end
|
281
|
+
raise error
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
# <label @ERROR> element use RootAgent wrapped by # this RootAgentProxyWithoutErrorCollector.
|
286
|
+
# So that those elements don't send cause infinite loop.
|
287
|
+
class RootAgentProxyWithoutErrorCollector < SimpleDelegator
|
288
|
+
def initialize(root_agent)
|
289
|
+
super
|
290
|
+
|
291
|
+
@suppress_emit_error_log_interval = 0
|
292
|
+
@next_emit_error_log_time = nil
|
293
|
+
|
294
|
+
interval_time = root_agent.instance_variable_get(:@suppress_emit_error_log_interval)
|
295
|
+
suppress_interval(interval_time) unless interval_time.zero?
|
296
|
+
end
|
297
|
+
|
298
|
+
def emit_error_event(tag, time, record, error)
|
299
|
+
error_info = {error: error, tag: tag, time: time, record: record}
|
300
|
+
log.warn "dump an error event in @ERROR:", error_info
|
301
|
+
end
|
302
|
+
|
303
|
+
def handle_emits_error(tag, es, e)
|
304
|
+
now = EventTime.now
|
305
|
+
if @suppress_emit_error_log_interval.zero? || now > @next_emit_error_log_time
|
306
|
+
log.warn "emit transaction failed in @ERROR:", error: e, tag: tag
|
307
|
+
log.warn_backtrace
|
308
|
+
@next_emit_error_log_time = now + @suppress_emit_error_log_interval
|
309
|
+
end
|
310
|
+
raise e
|
311
|
+
end
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|
data/lib/fluent/rpc.rb
ADDED
@@ -0,0 +1,94 @@
|
|
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 'webrick'
|
18
|
+
|
19
|
+
module Fluent
|
20
|
+
module RPC
|
21
|
+
class Server
|
22
|
+
def initialize(endpoint, log)
|
23
|
+
bind, port = endpoint.split(':')
|
24
|
+
@bind = bind
|
25
|
+
@port = port
|
26
|
+
@log = log
|
27
|
+
|
28
|
+
@server = WEBrick::HTTPServer.new(
|
29
|
+
BindAddress: @bind,
|
30
|
+
Port: @port,
|
31
|
+
Logger: WEBrick::Log.new(STDERR, WEBrick::Log::FATAL),
|
32
|
+
AccessLog: [],
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
def mount(path, servlet, *args)
|
37
|
+
@server.mount(path, servlet, *args)
|
38
|
+
@log.debug "register #{path} RPC servlet"
|
39
|
+
end
|
40
|
+
|
41
|
+
def mount_proc(path, &block)
|
42
|
+
@server.mount_proc(path) { |req, res|
|
43
|
+
begin
|
44
|
+
code, header, response = block.call(req, res)
|
45
|
+
rescue => e
|
46
|
+
@log.warn "failed to handle RPC request", path: path, error: e.to_s
|
47
|
+
@log.warn_backtrace e.backtrace
|
48
|
+
|
49
|
+
code = 500
|
50
|
+
body = {
|
51
|
+
'message '=> 'Internal Server Error',
|
52
|
+
'error' => "#{e}",
|
53
|
+
'backtrace'=> e.backtrace,
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
code = 200 if code.nil?
|
58
|
+
header = {'Content-Type' => 'application/json'} if header.nil?
|
59
|
+
body = if response.nil?
|
60
|
+
'{"ok":true}'
|
61
|
+
else
|
62
|
+
response.body['ok'] = code == 200
|
63
|
+
response.body.to_json
|
64
|
+
end
|
65
|
+
|
66
|
+
res.status = code
|
67
|
+
header.each_pair { |k, v|
|
68
|
+
res[k] = v
|
69
|
+
}
|
70
|
+
res.body = body
|
71
|
+
}
|
72
|
+
@log.debug "register #{path} RPC handler"
|
73
|
+
end
|
74
|
+
|
75
|
+
def start
|
76
|
+
@log.debug "listening RPC http server on http://#{@bind}:#{@port}/"
|
77
|
+
@thread = Thread.new {
|
78
|
+
@server.start
|
79
|
+
}
|
80
|
+
end
|
81
|
+
|
82
|
+
def shutdown
|
83
|
+
if @server
|
84
|
+
@server.shutdown
|
85
|
+
@server = nil
|
86
|
+
end
|
87
|
+
if @thread
|
88
|
+
@thread.join
|
89
|
+
@thread = nil
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|