fluentd 0.12.43 → 0.14.0
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 +4 -4
- data/.github/ISSUE_TEMPLATE.md +6 -0
- data/.gitignore +2 -0
- data/.travis.yml +33 -21
- data/CONTRIBUTING.md +1 -0
- data/ChangeLog +1239 -0
- data/README.md +0 -25
- data/Rakefile +2 -1
- data/Vagrantfile +17 -0
- data/appveyor.yml +35 -0
- data/example/filter_stdout.conf +5 -5
- data/example/in_forward.conf +2 -2
- data/example/in_http.conf +2 -2
- data/example/in_out_forward.conf +17 -0
- data/example/in_syslog.conf +2 -2
- data/example/in_tail.conf +2 -2
- data/example/in_tcp.conf +2 -2
- data/example/in_udp.conf +2 -2
- data/example/out_copy.conf +4 -4
- data/example/out_file.conf +2 -2
- data/example/out_forward.conf +2 -2
- data/example/out_forward_buf_file.conf +23 -0
- data/example/v0_12_filter.conf +8 -8
- data/fluent.conf +29 -0
- data/fluentd.gemspec +18 -11
- data/lib/fluent/agent.rb +60 -58
- data/lib/fluent/command/cat.rb +1 -1
- data/lib/fluent/command/debug.rb +7 -5
- data/lib/fluent/command/fluentd.rb +97 -2
- data/lib/fluent/compat/call_super_mixin.rb +67 -0
- data/lib/fluent/compat/filter.rb +50 -0
- data/lib/fluent/compat/formatter.rb +109 -0
- data/lib/fluent/compat/input.rb +50 -0
- data/lib/fluent/compat/output.rb +617 -0
- data/lib/fluent/compat/output_chain.rb +60 -0
- data/lib/fluent/compat/parser.rb +163 -0
- data/lib/fluent/compat/propagate_default.rb +62 -0
- data/lib/fluent/config.rb +23 -20
- data/lib/fluent/config/configure_proxy.rb +119 -70
- data/lib/fluent/config/dsl.rb +5 -18
- data/lib/fluent/config/element.rb +72 -8
- data/lib/fluent/config/error.rb +0 -3
- data/lib/fluent/config/literal_parser.rb +0 -2
- data/lib/fluent/config/parser.rb +4 -4
- data/lib/fluent/config/section.rb +39 -28
- data/lib/fluent/config/types.rb +2 -13
- data/lib/fluent/config/v1_parser.rb +1 -3
- data/lib/fluent/configurable.rb +48 -16
- data/lib/fluent/daemon.rb +15 -0
- data/lib/fluent/engine.rb +26 -52
- data/lib/fluent/env.rb +6 -4
- data/lib/fluent/event.rb +58 -11
- data/lib/fluent/event_router.rb +5 -5
- 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 +2 -2
- data/lib/fluent/load.rb +3 -2
- data/lib/fluent/log.rb +107 -38
- data/lib/fluent/match.rb +0 -36
- data/lib/fluent/mixin.rb +117 -7
- data/lib/fluent/msgpack_factory.rb +62 -0
- data/lib/fluent/output.rb +7 -612
- data/lib/fluent/output_chain.rb +23 -0
- data/lib/fluent/parser.rb +4 -800
- data/lib/fluent/plugin.rb +100 -121
- data/lib/fluent/plugin/bare_output.rb +63 -0
- data/lib/fluent/plugin/base.rb +121 -0
- data/lib/fluent/plugin/buf_file.rb +101 -182
- data/lib/fluent/plugin/buf_memory.rb +9 -92
- data/lib/fluent/plugin/buffer.rb +473 -0
- data/lib/fluent/plugin/buffer/chunk.rb +135 -0
- data/lib/fluent/plugin/buffer/file_chunk.rb +339 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +100 -0
- data/lib/fluent/plugin/exec_util.rb +80 -75
- data/lib/fluent/plugin/file_util.rb +33 -28
- data/lib/fluent/plugin/file_wrapper.rb +120 -0
- data/lib/fluent/plugin/filter.rb +51 -0
- data/lib/fluent/plugin/filter_grep.rb +13 -40
- data/lib/fluent/plugin/filter_record_transformer.rb +22 -18
- data/lib/fluent/plugin/formatter.rb +93 -0
- data/lib/fluent/plugin/formatter_csv.rb +48 -0
- data/lib/fluent/plugin/formatter_hash.rb +32 -0
- data/lib/fluent/plugin/formatter_json.rb +47 -0
- data/lib/fluent/plugin/formatter_ltsv.rb +42 -0
- data/lib/fluent/plugin/formatter_msgpack.rb +32 -0
- data/lib/fluent/plugin/formatter_out_file.rb +45 -0
- data/lib/fluent/plugin/formatter_single_value.rb +34 -0
- data/lib/fluent/plugin/formatter_stdout.rb +39 -0
- data/lib/fluent/plugin/in_debug_agent.rb +4 -0
- data/lib/fluent/plugin/in_dummy.rb +22 -18
- data/lib/fluent/plugin/in_exec.rb +18 -8
- data/lib/fluent/plugin/in_forward.rb +36 -79
- data/lib/fluent/plugin/in_gc_stat.rb +4 -0
- data/lib/fluent/plugin/in_http.rb +21 -18
- data/lib/fluent/plugin/in_monitor_agent.rb +15 -48
- data/lib/fluent/plugin/in_object_space.rb +6 -1
- data/lib/fluent/plugin/in_stream.rb +7 -3
- data/lib/fluent/plugin/in_syslog.rb +46 -95
- data/lib/fluent/plugin/in_tail.rb +58 -640
- data/lib/fluent/plugin/in_tcp.rb +8 -1
- data/lib/fluent/plugin/in_udp.rb +8 -18
- 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_copy.rb +11 -7
- data/lib/fluent/plugin/out_exec.rb +15 -11
- data/lib/fluent/plugin/out_exec_filter.rb +18 -10
- data/lib/fluent/plugin/out_file.rb +34 -5
- data/lib/fluent/plugin/out_forward.rb +25 -19
- data/lib/fluent/plugin/out_null.rb +0 -14
- data/lib/fluent/plugin/out_roundrobin.rb +11 -7
- data/lib/fluent/plugin/out_stdout.rb +5 -7
- data/lib/fluent/plugin/out_stream.rb +3 -1
- data/lib/fluent/plugin/output.rb +979 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
- data/lib/fluent/plugin/parser.rb +244 -0
- data/lib/fluent/plugin/parser_apache.rb +24 -0
- data/lib/fluent/plugin/parser_apache2.rb +84 -0
- data/lib/fluent/plugin/parser_apache_error.rb +21 -0
- data/lib/fluent/plugin/parser_csv.rb +31 -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 +102 -0
- data/lib/fluent/plugin/parser_nginx.rb +24 -0
- data/lib/fluent/plugin/parser_none.rb +36 -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 +119 -117
- data/lib/fluent/plugin/storage.rb +84 -0
- data/lib/fluent/plugin/storage_local.rb +116 -0
- data/lib/fluent/plugin/string_util.rb +16 -13
- data/lib/fluent/plugin_helper.rb +39 -0
- data/lib/fluent/plugin_helper/child_process.rb +298 -0
- data/lib/fluent/plugin_helper/compat_parameters.rb +99 -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/retry_state.rb +177 -0
- data/lib/fluent/plugin_helper/storage.rb +308 -0
- data/lib/fluent/plugin_helper/thread.rb +147 -0
- data/lib/fluent/plugin_helper/timer.rb +85 -0
- data/lib/fluent/plugin_id.rb +63 -0
- data/lib/fluent/process.rb +21 -30
- data/lib/fluent/registry.rb +21 -9
- data/lib/fluent/root_agent.rb +115 -40
- data/lib/fluent/supervisor.rb +330 -320
- data/lib/fluent/system_config.rb +42 -18
- data/lib/fluent/test.rb +6 -1
- data/lib/fluent/test/base.rb +23 -3
- data/lib/fluent/test/driver/base.rb +247 -0
- data/lib/fluent/test/driver/event_feeder.rb +98 -0
- data/lib/fluent/test/driver/filter.rb +35 -0
- data/lib/fluent/test/driver/input.rb +31 -0
- data/lib/fluent/test/driver/output.rb +78 -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 +2 -1
- data/lib/fluent/test/input_test.rb +23 -17
- data/lib/fluent/test/output_test.rb +28 -39
- data/lib/fluent/test/parser_test.rb +1 -1
- data/lib/fluent/time.rb +104 -1
- data/lib/fluent/{status.rb → unique_id.rb} +15 -24
- data/lib/fluent/version.rb +1 -1
- data/lib/fluent/winsvc.rb +72 -0
- data/test/compat/test_calls_super.rb +164 -0
- data/test/config/test_config_parser.rb +83 -0
- data/test/config/test_configurable.rb +547 -274
- data/test/config/test_configure_proxy.rb +146 -29
- data/test/config/test_dsl.rb +3 -181
- data/test/config/test_element.rb +274 -0
- data/test/config/test_literal_parser.rb +1 -1
- data/test/config/test_section.rb +79 -7
- data/test/config/test_system_config.rb +21 -0
- data/test/config/test_types.rb +3 -26
- data/test/helper.rb +78 -8
- data/test/plugin/test_bare_output.rb +118 -0
- data/test/plugin/test_base.rb +75 -0
- data/test/plugin/test_buf_file.rb +420 -521
- data/test/plugin/test_buf_memory.rb +32 -194
- data/test/plugin/test_buffer.rb +981 -0
- data/test/plugin/test_buffer_chunk.rb +110 -0
- data/test/plugin/test_buffer_file_chunk.rb +770 -0
- data/test/plugin/test_buffer_memory_chunk.rb +265 -0
- data/test/plugin/test_filter.rb +255 -0
- data/test/plugin/test_filter_grep.rb +2 -73
- data/test/plugin/test_filter_record_transformer.rb +24 -68
- data/test/plugin/test_filter_stdout.rb +6 -6
- data/test/plugin/test_in_debug_agent.rb +2 -0
- data/test/plugin/test_in_dummy.rb +11 -17
- data/test/plugin/test_in_exec.rb +6 -25
- data/test/plugin/test_in_forward.rb +112 -151
- data/test/plugin/test_in_gc_stat.rb +2 -0
- data/test/plugin/test_in_http.rb +106 -157
- data/test/plugin/test_in_object_space.rb +21 -5
- data/test/plugin/test_in_stream.rb +14 -13
- data/test/plugin/test_in_syslog.rb +30 -275
- data/test/plugin/test_in_tail.rb +95 -282
- data/test/plugin/test_in_tcp.rb +14 -0
- data/test/plugin/test_in_udp.rb +21 -67
- 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_copy.rb +15 -2
- data/test/plugin/test_out_exec.rb +75 -25
- data/test/plugin/test_out_exec_filter.rb +74 -8
- data/test/plugin/test_out_file.rb +61 -7
- data/test/plugin/test_out_forward.rb +92 -15
- data/test/plugin/test_out_roundrobin.rb +1 -0
- data/test/plugin/test_out_stdout.rb +22 -13
- data/test/plugin/test_out_stream.rb +18 -0
- data/test/plugin/test_output.rb +515 -0
- data/test/plugin/test_output_as_buffered.rb +1540 -0
- data/test/plugin/test_output_as_buffered_overflow.rb +247 -0
- data/test/plugin/test_output_as_buffered_retries.rb +808 -0
- data/test/plugin/test_output_as_buffered_secondary.rb +776 -0
- data/test/plugin/test_output_as_standard.rb +362 -0
- data/test/plugin/test_owned_by.rb +35 -0
- data/test/plugin/test_storage.rb +167 -0
- data/test/plugin/test_storage_local.rb +8 -0
- data/test/plugin_helper/test_child_process.rb +599 -0
- data/test/plugin_helper/test_compat_parameters.rb +175 -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_retry_state.rb +399 -0
- data/test/plugin_helper/test_storage.rb +411 -0
- data/test/plugin_helper/test_thread.rb +164 -0
- data/test/plugin_helper/test_timer.rb +100 -0
- data/test/scripts/exec_script.rb +0 -6
- data/test/scripts/fluent/plugin/out_test.rb +3 -0
- data/test/test_config.rb +13 -4
- data/test/test_event.rb +24 -13
- data/test/test_event_router.rb +8 -7
- data/test/test_event_time.rb +187 -0
- data/test/test_formatter.rb +13 -51
- data/test/test_input.rb +1 -1
- data/test/test_log.rb +239 -16
- data/test/test_mixin.rb +1 -1
- data/test/test_output.rb +53 -66
- data/test/test_parser.rb +105 -323
- data/test/test_plugin_helper.rb +81 -0
- data/test/test_root_agent.rb +4 -52
- data/test/test_supervisor.rb +272 -0
- data/test/test_unique_id.rb +47 -0
- metadata +181 -55
- data/CHANGELOG.md +0 -710
- data/lib/fluent/buffer.rb +0 -365
- data/lib/fluent/plugin/filter_parser.rb +0 -107
- data/lib/fluent/plugin/in_status.rb +0 -76
- data/lib/fluent/test/helpers.rb +0 -86
- data/test/plugin/data/log/foo/bar2 +0 -0
- data/test/plugin/test_filter_parser.rb +0 -744
- data/test/plugin/test_in_status.rb +0 -38
- data/test/test_buffer.rb +0 -624
data/lib/fluent/config/dsl.rb
CHANGED
@@ -35,19 +35,14 @@ module Fluent
|
|
35
35
|
end
|
36
36
|
|
37
37
|
class Proxy
|
38
|
-
def initialize(name, arg
|
38
|
+
def initialize(name, arg)
|
39
39
|
@element = Element.new(name, arg, self)
|
40
|
-
@include_basepath = include_basepath
|
41
40
|
end
|
42
41
|
|
43
42
|
def element
|
44
43
|
@element
|
45
44
|
end
|
46
45
|
|
47
|
-
def include_basepath
|
48
|
-
@include_basepath
|
49
|
-
end
|
50
|
-
|
51
46
|
def eval(source, source_path)
|
52
47
|
@element.instance_eval(source, source_path)
|
53
48
|
self
|
@@ -82,6 +77,10 @@ module Fluent
|
|
82
77
|
@proxy = proxy
|
83
78
|
end
|
84
79
|
|
80
|
+
def to_int
|
81
|
+
__id__
|
82
|
+
end
|
83
|
+
|
85
84
|
def method_missing(name, *args, &block)
|
86
85
|
::Kernel.raise ::ArgumentError, "Configuration DSL Syntax Error: only one argument allowed" if args.size > 1
|
87
86
|
value = args.first
|
@@ -101,18 +100,6 @@ module Fluent
|
|
101
100
|
self
|
102
101
|
end
|
103
102
|
|
104
|
-
def include(*args)
|
105
|
-
::Kernel.raise ::ArgumentError, "#{name} block requires arguments for include path" if args.nil? || args.size != 1
|
106
|
-
if args.first =~ /\.rb$/
|
107
|
-
path = File.expand_path(args.first)
|
108
|
-
data = File.read(path)
|
109
|
-
self.instance_eval(data, path)
|
110
|
-
else
|
111
|
-
ss = StringScanner.new('')
|
112
|
-
Config::V1Parser.new(ss, @proxy.include_basepath, '', nil).eval_include(@attrs, @elements, args.first)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
103
|
def source(&block)
|
117
104
|
@proxy.add_element('source', nil, block)
|
118
105
|
end
|
@@ -32,11 +32,36 @@ module Fluent
|
|
32
32
|
@v1_config = false
|
33
33
|
@corresponding_proxies = [] # some plugins use flat parameters, e.g. in_http doesn't provide <format> section for parser.
|
34
34
|
@unused_in = false # if this element is not used in plugins, correspoing plugin name and parent element name is set, e.g. [source, plugin class].
|
35
|
+
|
36
|
+
# it's global logger, not plugin logger: deprecated message should be global warning, not plugin level.
|
37
|
+
@logger = defined?($log) ? $log : nil
|
35
38
|
end
|
36
39
|
|
37
|
-
attr_accessor :name, :arg, :
|
40
|
+
attr_accessor :name, :arg, :unused, :v1_config, :corresponding_proxies, :unused_in
|
41
|
+
attr_writer :elements
|
42
|
+
|
43
|
+
RESERVED_PARAMETERS_COMPAT = {
|
44
|
+
'@type' => 'type',
|
45
|
+
'@id' => 'id',
|
46
|
+
'@log_level' => 'log_level',
|
47
|
+
'@label' => nil,
|
48
|
+
}
|
49
|
+
RESERVED_PARAMETERS = RESERVED_PARAMETERS_COMPAT.keys
|
50
|
+
|
51
|
+
def elements(*names, name: nil, arg: nil)
|
52
|
+
raise ArgumentError, "name and names are exclusive" if name && !names.empty?
|
53
|
+
raise ArgumentError, "arg is available only with name" if arg && !name
|
54
|
+
|
55
|
+
if name
|
56
|
+
@elements.select{|e| e.name == name && (!arg || e.arg == arg) }
|
57
|
+
elsif !names.empty?
|
58
|
+
@elements.select{|e| names.include?(e.name) }
|
59
|
+
else
|
60
|
+
@elements
|
61
|
+
end
|
62
|
+
end
|
38
63
|
|
39
|
-
def add_element(name, arg='')
|
64
|
+
def add_element(name, arg = '')
|
40
65
|
e = Element.new(name, arg, {}, [])
|
41
66
|
e.v1_config = @v1_config
|
42
67
|
@elements << e
|
@@ -63,6 +88,7 @@ module Fluent
|
|
63
88
|
e
|
64
89
|
end
|
65
90
|
|
91
|
+
# no code in fluentd uses this method
|
66
92
|
def each_element(*names, &block)
|
67
93
|
if names.empty?
|
68
94
|
@elements.each(&block)
|
@@ -84,6 +110,12 @@ module Fluent
|
|
84
110
|
def [](key)
|
85
111
|
@unused_in = false # ditto
|
86
112
|
@unused.delete(key)
|
113
|
+
|
114
|
+
if RESERVED_PARAMETERS.include?(key) && !has_key?(key) && has_key?(RESERVED_PARAMETERS_COMPAT[key])
|
115
|
+
@logger.warn "'#{RESERVED_PARAMETERS_COMPAT[key]}' is deprecated parameter name. use '#{key}' instead." if @logger
|
116
|
+
return self[RESERVED_PARAMETERS_COMPAT[key]]
|
117
|
+
end
|
118
|
+
|
87
119
|
super
|
88
120
|
end
|
89
121
|
|
@@ -108,11 +140,7 @@ module Fluent
|
|
108
140
|
out << "#{indent}<#{@name} #{@arg}>\n"
|
109
141
|
end
|
110
142
|
each_pair { |k, v|
|
111
|
-
|
112
|
-
out << "#{nindent}#{k} xxxxxx\n"
|
113
|
-
else
|
114
|
-
out << "#{nindent}#{k} #{v}\n"
|
115
|
-
end
|
143
|
+
out << dump_value(k, v, indent, nindent)
|
116
144
|
}
|
117
145
|
@elements.each { |e|
|
118
146
|
out << e.to_s(nest + 1)
|
@@ -124,6 +152,8 @@ module Fluent
|
|
124
152
|
def to_masked_element
|
125
153
|
new_elems = @elements.map { |e| e.to_masked_element }
|
126
154
|
new_elem = Element.new(@name, @arg, {}, new_elems, @unused)
|
155
|
+
new_elem.v1_config = @v1_config
|
156
|
+
new_elem.corresponding_proxies = @corresponding_proxies
|
127
157
|
each_pair { |k, v|
|
128
158
|
new_elem[k] = secret_param?(k) ? 'xxxxxx' : v
|
129
159
|
}
|
@@ -135,7 +165,7 @@ module Fluent
|
|
135
165
|
|
136
166
|
param_key = key.to_sym
|
137
167
|
@corresponding_proxies.each { |proxy|
|
138
|
-
|
168
|
+
_block, opts = proxy.params[param_key]
|
139
169
|
if opts && opts.has_key?(:secret)
|
140
170
|
return opts[:secret]
|
141
171
|
end
|
@@ -144,6 +174,40 @@ module Fluent
|
|
144
174
|
false
|
145
175
|
end
|
146
176
|
|
177
|
+
def param_type(key)
|
178
|
+
return nil if @corresponding_proxies.empty?
|
179
|
+
|
180
|
+
param_key = key.to_sym
|
181
|
+
proxy = @corresponding_proxies.detect do |_proxy|
|
182
|
+
_proxy.params.has_key?(param_key)
|
183
|
+
end
|
184
|
+
return nil unless proxy
|
185
|
+
_block, opts = proxy.params[param_key]
|
186
|
+
opts[:type]
|
187
|
+
end
|
188
|
+
|
189
|
+
def dump_value(k, v, indent, nindent)
|
190
|
+
if secret_param?(k)
|
191
|
+
"#{nindent}#{k} xxxxxx\n"
|
192
|
+
else
|
193
|
+
if @v1_config
|
194
|
+
case param_type(k)
|
195
|
+
when :string
|
196
|
+
"#{nindent}#{k} \"#{self.class.unescape_parameter(v)}\"\n"
|
197
|
+
when :enum, :integer, :float, :size, :bool, :time
|
198
|
+
"#{nindent}#{k} #{v}\n"
|
199
|
+
when :hash, :array
|
200
|
+
"#{nindent}#{k} #{v}\n"
|
201
|
+
else
|
202
|
+
# Unknown type
|
203
|
+
"#{nindent}#{k} #{v}\n"
|
204
|
+
end
|
205
|
+
else
|
206
|
+
"#{nindent}#{k} #{v}\n"
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
147
211
|
def self.unescape_parameter(v)
|
148
212
|
result = ''
|
149
213
|
v.each_char { |c| result << LiteralParser.unescape_char(c) }
|
data/lib/fluent/config/error.rb
CHANGED
data/lib/fluent/config/parser.rb
CHANGED
@@ -81,10 +81,10 @@ module Fluent
|
|
81
81
|
pattern = path
|
82
82
|
end
|
83
83
|
|
84
|
-
Dir.glob(pattern).sort.each { |
|
85
|
-
basepath = File.dirname(
|
86
|
-
fname = File.basename(
|
87
|
-
File.open(
|
84
|
+
Dir.glob(pattern).sort.each { |entry|
|
85
|
+
basepath = File.dirname(entry)
|
86
|
+
fname = File.basename(entry)
|
87
|
+
File.open(entry) { |f|
|
88
88
|
Parser.new(basepath, f.each_line, fname).parse!(allow_include, nil, attrs, elems)
|
89
89
|
}
|
90
90
|
}
|
@@ -26,13 +26,26 @@ module Fluent
|
|
26
26
|
'Fluent::Config::Section'
|
27
27
|
end
|
28
28
|
|
29
|
-
def initialize(params = {})
|
29
|
+
def initialize(params = {}, config_element = nil)
|
30
30
|
@klass = 'Fluent::Config::Section'
|
31
31
|
@params = params
|
32
|
+
@corresponding_config_element = config_element
|
32
33
|
end
|
33
34
|
|
34
35
|
alias :object_id :__id__
|
35
36
|
|
37
|
+
def corresponding_config_element
|
38
|
+
@corresponding_config_element
|
39
|
+
end
|
40
|
+
|
41
|
+
def class
|
42
|
+
Section
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_s
|
46
|
+
inspect
|
47
|
+
end
|
48
|
+
|
36
49
|
def inspect
|
37
50
|
"<Fluent::Config::Section #{@params.to_json}>"
|
38
51
|
end
|
@@ -62,6 +75,19 @@ module Fluent
|
|
62
75
|
@params[key.to_sym]
|
63
76
|
end
|
64
77
|
|
78
|
+
def respond_to?(symbol, include_all=false)
|
79
|
+
case symbol
|
80
|
+
when :inspect, :nil?, :to_h, :+, :instance_of?, :kind_of?, :[], :respond_to?, :respond_to_missing?
|
81
|
+
true
|
82
|
+
when :!, :!= , :==, :equal?, :instance_eval, :instance_exec
|
83
|
+
true
|
84
|
+
when :method_missing, :singleton_method_added, :singleton_method_removed, :singleton_method_undefined
|
85
|
+
include_all
|
86
|
+
else
|
87
|
+
false
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
65
91
|
def respond_to_missing?(symbol, include_private)
|
66
92
|
@params.has_key?(symbol)
|
67
93
|
end
|
@@ -70,7 +96,7 @@ module Fluent
|
|
70
96
|
if @params.has_key?(name)
|
71
97
|
@params[name]
|
72
98
|
else
|
73
|
-
|
99
|
+
::Kernel.raise ::NoMethodError, "undefined method `#{name}' for #{self.inspect}"
|
74
100
|
end
|
75
101
|
end
|
76
102
|
end
|
@@ -88,7 +114,7 @@ module Fluent
|
|
88
114
|
|
89
115
|
proxy.defaults.each_pair do |name, defval|
|
90
116
|
varname = name.to_sym
|
91
|
-
section_params[varname] = defval
|
117
|
+
section_params[varname] = (defval.dup rescue defval)
|
92
118
|
end
|
93
119
|
|
94
120
|
if proxy.argument
|
@@ -97,10 +123,9 @@ module Fluent
|
|
97
123
|
section_params[key] = self.instance_exec(conf.arg, opts, name, &block)
|
98
124
|
end
|
99
125
|
unless section_params.has_key?(proxy.argument.first)
|
100
|
-
logger.error "config error in:\n#{conf}"
|
126
|
+
logger.error "config error in:\n#{conf}" if logger # logger should exist, but somethimes it's nil (e.g, in tests)
|
101
127
|
raise ConfigError, "'<#{proxy.name} ARG>' section requires argument" + section_stack
|
102
128
|
end
|
103
|
-
# argument should NOT be deprecated... (argument always has a value: '')
|
104
129
|
end
|
105
130
|
|
106
131
|
proxy.params.each_pair do |name, defval|
|
@@ -113,23 +138,9 @@ module Fluent
|
|
113
138
|
conf[opts[:alias].to_s]
|
114
139
|
end
|
115
140
|
section_params[varname] = self.instance_exec(val, opts, name, &block)
|
116
|
-
|
117
|
-
# Source of definitions of deprecated/obsoleted:
|
118
|
-
# https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Deprecated_and_obsolete_features
|
119
|
-
#
|
120
|
-
# Deprecated: These deprecated features can still be used, but should be used with caution
|
121
|
-
# because they are expected to be removed entirely sometime in the future.
|
122
|
-
# Obsoleted: These obsolete features have been entirely removed from JavaScript and can no longer be used.
|
123
|
-
if opts[:deprecated]
|
124
|
-
logger.warn "'#{name}' parameter is deprecated: #{opts[:deprecated]}"
|
125
|
-
end
|
126
|
-
if opts[:obsoleted]
|
127
|
-
logger.error "config error in:\n#{conf}" if logger
|
128
|
-
raise ObsoletedParameterError, "'#{name}' parameter is already removed: #{opts[:obsoleted]}" + section_stack
|
129
|
-
end
|
130
141
|
end
|
131
142
|
unless section_params.has_key?(varname)
|
132
|
-
logger.error "config error in:\n#{conf}"
|
143
|
+
logger.error "config error in:\n#{conf}" if logger
|
133
144
|
raise ConfigError, "'#{name}' parameter is required" + section_stack
|
134
145
|
end
|
135
146
|
end
|
@@ -137,39 +148,39 @@ module Fluent
|
|
137
148
|
check_unused_section(proxy, conf, plugin_class)
|
138
149
|
|
139
150
|
proxy.sections.each do |name, subproxy|
|
140
|
-
varname = subproxy.
|
151
|
+
varname = subproxy.variable_name
|
141
152
|
elements = (conf.respond_to?(:elements) ? conf.elements : []).select{ |e| e.name == subproxy.name.to_s || e.name == subproxy.alias.to_s }
|
153
|
+
if elements.empty? && subproxy.init? && !subproxy.multi?
|
154
|
+
elements << Fluent::Config::Element.new(subproxy.name.to_s, '', {}, [])
|
155
|
+
end
|
156
|
+
|
142
157
|
# set subproxy for secret option
|
143
158
|
elements.each { |element|
|
144
159
|
element.corresponding_proxies << subproxy
|
145
160
|
}
|
146
161
|
|
147
162
|
if subproxy.required? && elements.size < 1
|
148
|
-
logger.error "config error in:\n#{conf}"
|
163
|
+
logger.error "config error in:\n#{conf}" if logger
|
149
164
|
raise ConfigError, "'<#{subproxy.name}>' sections are required" + section_stack
|
150
165
|
end
|
151
166
|
if subproxy.multi?
|
152
167
|
section_params[varname] = elements.map{ |e| generate(subproxy, e, logger, plugin_class, stack + [subproxy.name]) }
|
153
168
|
else
|
154
169
|
if elements.size > 1
|
155
|
-
logger.error "config error in:\n#{conf}"
|
170
|
+
logger.error "config error in:\n#{conf}" if logger
|
156
171
|
raise ConfigError, "'<#{subproxy.name}>' section cannot be written twice or more" + section_stack
|
157
172
|
end
|
158
173
|
section_params[varname] = generate(subproxy, elements.first, logger, plugin_class, stack + [subproxy.name])
|
159
174
|
end
|
160
175
|
end
|
161
176
|
|
162
|
-
Section.new(section_params)
|
177
|
+
Section.new(section_params, conf)
|
163
178
|
end
|
164
179
|
|
165
180
|
def self.check_unused_section(proxy, conf, plugin_class)
|
166
181
|
elems = conf.respond_to?(:elements) ? conf.elements : []
|
167
182
|
elems.each { |e|
|
168
183
|
next if plugin_class.nil? && Fluent::Config::V1Parser::ELEM_SYMBOLS.include?(e.name) # skip pre-defined non-plugin elements because it doens't have proxy section
|
169
|
-
# In v0.12, buffer and output parameters are defined in same place.
|
170
|
-
# It causes same configuration is used in different buffer / output
|
171
|
-
# and buffer plugin's sections are always empty. It should be skipped.
|
172
|
-
next if proxy.sections.empty?
|
173
184
|
|
174
185
|
unless proxy.sections.any? { |name, subproxy| e.name == subproxy.name.to_s || e.name == subproxy.alias.to_s }
|
175
186
|
parent_name = if conf.arg.empty?
|
data/lib/fluent/config/types.rb
CHANGED
@@ -17,7 +17,6 @@
|
|
17
17
|
require 'json'
|
18
18
|
|
19
19
|
require 'fluent/config/error'
|
20
|
-
require 'fluent/configurable'
|
21
20
|
|
22
21
|
module Fluent
|
23
22
|
module Config
|
@@ -65,7 +64,7 @@ module Fluent
|
|
65
64
|
end
|
66
65
|
end
|
67
66
|
|
68
|
-
STRING_TYPE = Proc.new { |val, opts| val
|
67
|
+
STRING_TYPE = Proc.new { |val, opts| val }
|
69
68
|
ENUM_TYPE = Proc.new { |val, opts|
|
70
69
|
s = val.to_sym
|
71
70
|
list = opts[:list]
|
@@ -86,7 +85,7 @@ module Fluent
|
|
86
85
|
value
|
87
86
|
else
|
88
87
|
case type
|
89
|
-
when :string then value.to_s
|
88
|
+
when :string then value.to_s
|
90
89
|
when :integer then value.to_i
|
91
90
|
when :float then value.to_f
|
92
91
|
when :size then Config.size_value(value)
|
@@ -134,14 +133,4 @@ module Fluent
|
|
134
133
|
end
|
135
134
|
}
|
136
135
|
end
|
137
|
-
|
138
|
-
Configurable.register_type(:string, Config::STRING_TYPE)
|
139
|
-
Configurable.register_type(:enum, Config::ENUM_TYPE)
|
140
|
-
Configurable.register_type(:integer, Config::INTEGER_TYPE)
|
141
|
-
Configurable.register_type(:float, Config::FLOAT_TYPE)
|
142
|
-
Configurable.register_type(:size, Config::SIZE_TYPE)
|
143
|
-
Configurable.register_type(:bool, Config::BOOL_TYPE)
|
144
|
-
Configurable.register_type(:time, Config::TIME_TYPE)
|
145
|
-
Configurable.register_type(:hash, Config::HASH_TYPE)
|
146
|
-
Configurable.register_type(:array, Config::ARRAY_TYPE)
|
147
136
|
end
|
@@ -148,9 +148,7 @@ module Fluent
|
|
148
148
|
|
149
149
|
def eval_include(attrs, elems, uri)
|
150
150
|
u = URI.parse(uri)
|
151
|
-
if u.scheme == 'file' ||
|
152
|
-
# When the Windows absolute path then u.scheme.length == 1
|
153
|
-
# e.g. C:
|
151
|
+
if u.scheme == 'file' || u.path == uri # file path
|
154
152
|
path = u.path
|
155
153
|
if path[0] != ?/
|
156
154
|
pattern = File.expand_path("#{@include_basepath}/#{path}")
|
data/lib/fluent/configurable.rb
CHANGED
@@ -19,7 +19,7 @@ require 'fluent/config/section'
|
|
19
19
|
require 'fluent/config/error'
|
20
20
|
require 'fluent/registry'
|
21
21
|
require 'fluent/plugin'
|
22
|
-
require 'fluent/
|
22
|
+
require 'fluent/config/types'
|
23
23
|
|
24
24
|
module Fluent
|
25
25
|
module Configurable
|
@@ -28,19 +28,22 @@ module Fluent
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def initialize
|
31
|
+
super
|
31
32
|
# to simulate implicit 'attr_accessor' by config_param / config_section and its value by config_set_default
|
32
33
|
proxy = self.class.merged_configure_proxy
|
33
34
|
proxy.params.keys.each do |name|
|
35
|
+
next if name.to_s.start_with?('@')
|
34
36
|
if proxy.defaults.has_key?(name)
|
35
37
|
instance_variable_set("@#{name}".to_sym, proxy.defaults[name])
|
36
38
|
end
|
37
39
|
end
|
38
40
|
proxy.sections.keys.each do |name|
|
41
|
+
next if name.to_s.start_with?('@')
|
39
42
|
subproxy = proxy.sections[name]
|
40
43
|
if subproxy.multi?
|
41
|
-
instance_variable_set("@#{subproxy.
|
44
|
+
instance_variable_set("@#{subproxy.variable_name}".to_sym, [])
|
42
45
|
else
|
43
|
-
instance_variable_set("@#{subproxy.
|
46
|
+
instance_variable_set("@#{subproxy.variable_name}".to_sym, nil)
|
44
47
|
end
|
45
48
|
end
|
46
49
|
end
|
@@ -48,18 +51,27 @@ module Fluent
|
|
48
51
|
def configure(conf)
|
49
52
|
@config = conf
|
50
53
|
|
51
|
-
logger = self.respond_to?(:log) ? log : $log
|
54
|
+
logger = self.respond_to?(:log) ? log : (defined?($log) ? $log : nil)
|
52
55
|
proxy = self.class.merged_configure_proxy
|
53
56
|
conf.corresponding_proxies << proxy
|
54
57
|
|
58
|
+
if self.respond_to?(:owner) && self.owner
|
59
|
+
owner_proxy = owner.class.merged_configure_proxy
|
60
|
+
if proxy.configured_in_section
|
61
|
+
owner_proxy = owner_proxy.sections[proxy.configured_in_section]
|
62
|
+
end
|
63
|
+
proxy.overwrite_defaults(owner_proxy) if owner_proxy
|
64
|
+
end
|
65
|
+
|
55
66
|
# In the nested section, can't get plugin class through proxies so get plugin class here
|
56
|
-
plugin_class = Fluent::Plugin.
|
67
|
+
plugin_class = Fluent::Plugin.lookup_type_from_class(proxy.name.to_s)
|
57
68
|
root = Fluent::Config::SectionGenerator.generate(proxy, conf, logger, plugin_class)
|
58
69
|
@config_root_section = root
|
59
70
|
|
60
71
|
root.instance_eval{ @params.keys }.each do |param_name|
|
72
|
+
next if param_name.to_s.start_with?('@')
|
61
73
|
varname = "@#{param_name}".to_sym
|
62
|
-
if (! root[param_name].nil?) || instance_variable_get(varname).nil?
|
74
|
+
if (! root[param_name].nil?) || (instance_variable_defined?(varname) && instance_variable_get(varname).nil?)
|
63
75
|
instance_variable_set(varname, root[param_name])
|
64
76
|
end
|
65
77
|
end
|
@@ -82,6 +94,20 @@ module Fluent
|
|
82
94
|
CONFIG_TYPE_REGISTRY.lookup(type)
|
83
95
|
end
|
84
96
|
|
97
|
+
{
|
98
|
+
string: Config::STRING_TYPE,
|
99
|
+
enum: Config::ENUM_TYPE,
|
100
|
+
integer: Config::INTEGER_TYPE,
|
101
|
+
float: Config::FLOAT_TYPE,
|
102
|
+
size: Config::SIZE_TYPE,
|
103
|
+
bool: Config::BOOL_TYPE,
|
104
|
+
time: Config::TIME_TYPE,
|
105
|
+
hash: Config::HASH_TYPE,
|
106
|
+
array: Config::ARRAY_TYPE,
|
107
|
+
}.each do |name, type|
|
108
|
+
register_type(name, type)
|
109
|
+
end
|
110
|
+
|
85
111
|
module ClassMethods
|
86
112
|
def configure_proxy_map
|
87
113
|
map = {}
|
@@ -92,15 +118,21 @@ module Fluent
|
|
92
118
|
def configure_proxy(mod_name)
|
93
119
|
map = configure_proxy_map
|
94
120
|
unless map[mod_name]
|
95
|
-
|
121
|
+
type_lookup = ->(type) { Fluent::Configurable.lookup_type(type) }
|
122
|
+
proxy = Fluent::Config::ConfigureProxy.new(mod_name, required: true, multi: false, type_lookup: type_lookup)
|
96
123
|
map[mod_name] = proxy
|
97
124
|
end
|
98
125
|
map[mod_name]
|
99
126
|
end
|
100
127
|
|
101
|
-
def
|
102
|
-
configure_proxy(self.name).
|
103
|
-
|
128
|
+
def configured_in(section_name)
|
129
|
+
configure_proxy(self.name).configured_in(section_name)
|
130
|
+
end
|
131
|
+
|
132
|
+
def config_param(name, type = nil, **kwargs, &block)
|
133
|
+
configure_proxy(self.name).config_param(name, type, **kwargs, &block)
|
134
|
+
# reserved names '@foo' are invalid as attr_accessor name
|
135
|
+
attr_accessor(name) unless kwargs[:skip_accessor] || Fluent::Config::Element::RESERVED_PARAMETERS.include?(name.to_s)
|
104
136
|
end
|
105
137
|
|
106
138
|
def config_set_default(name, defval)
|
@@ -111,9 +143,12 @@ module Fluent
|
|
111
143
|
configure_proxy(self.name).config_set_desc(name, desc)
|
112
144
|
end
|
113
145
|
|
114
|
-
def config_section(name,
|
115
|
-
configure_proxy(self.name).config_section(name,
|
116
|
-
|
146
|
+
def config_section(name, **kwargs, &block)
|
147
|
+
configure_proxy(self.name).config_section(name, **kwargs, &block)
|
148
|
+
variable_name = configure_proxy(self.name).sections[name].variable_name
|
149
|
+
unless self.respond_to?(variable_name)
|
150
|
+
attr_accessor variable_name
|
151
|
+
end
|
117
152
|
end
|
118
153
|
|
119
154
|
def desc(description)
|
@@ -137,7 +172,4 @@ module Fluent
|
|
137
172
|
end
|
138
173
|
end
|
139
174
|
end
|
140
|
-
|
141
|
-
# load default types
|
142
|
-
require 'fluent/config/types'
|
143
175
|
end
|