fluentd 0.12.40 → 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 +810 -237
- 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 +51 -595
- data/lib/fluent/plugin/in_tcp.rb +8 -1
- data/lib/fluent/plugin/in_udp.rb +8 -14
- 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 +19 -9
- 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 +120 -114
- 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 -234
- data/test/plugin/test_in_tcp.rb +14 -0
- data/test/plugin/test_in_udp.rb +21 -13
- 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 +180 -54
- 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/buffer.rb
DELETED
@@ -1,365 +0,0 @@
|
|
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 'monitor'
|
18
|
-
require 'fileutils'
|
19
|
-
|
20
|
-
require 'fluent/configurable'
|
21
|
-
|
22
|
-
module Fluent
|
23
|
-
class BufferError < StandardError
|
24
|
-
end
|
25
|
-
|
26
|
-
class BufferChunkLimitError < BufferError
|
27
|
-
end
|
28
|
-
|
29
|
-
class BufferQueueLimitError < BufferError
|
30
|
-
end
|
31
|
-
|
32
|
-
|
33
|
-
class Buffer
|
34
|
-
include Configurable
|
35
|
-
|
36
|
-
def initialize
|
37
|
-
super
|
38
|
-
end
|
39
|
-
|
40
|
-
def configure(conf)
|
41
|
-
super
|
42
|
-
end
|
43
|
-
|
44
|
-
def start
|
45
|
-
end
|
46
|
-
|
47
|
-
def shutdown
|
48
|
-
end
|
49
|
-
|
50
|
-
def before_shutdown(out)
|
51
|
-
end
|
52
|
-
|
53
|
-
def emit(key, data, chain)
|
54
|
-
raise NotImplementedError, "Implement this method in child class"
|
55
|
-
end
|
56
|
-
|
57
|
-
def keys
|
58
|
-
raise NotImplementedError, "Implement this method in child class"
|
59
|
-
end
|
60
|
-
|
61
|
-
def push(key)
|
62
|
-
raise NotImplementedError, "Implement this method in child class"
|
63
|
-
end
|
64
|
-
|
65
|
-
def pop(out)
|
66
|
-
raise NotImplementedError, "Implement this method in child class"
|
67
|
-
end
|
68
|
-
|
69
|
-
def clear!
|
70
|
-
raise NotImplementedError, "Implement this method in child class"
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
|
75
|
-
class BufferChunk
|
76
|
-
include MonitorMixin
|
77
|
-
|
78
|
-
def initialize(key)
|
79
|
-
super()
|
80
|
-
@key = key
|
81
|
-
end
|
82
|
-
|
83
|
-
attr_reader :key
|
84
|
-
|
85
|
-
def <<(data)
|
86
|
-
raise NotImplementedError, "Implement this method in child class"
|
87
|
-
end
|
88
|
-
|
89
|
-
def size
|
90
|
-
raise NotImplementedError, "Implement this method in child class"
|
91
|
-
end
|
92
|
-
|
93
|
-
def empty?
|
94
|
-
size == 0
|
95
|
-
end
|
96
|
-
|
97
|
-
def close
|
98
|
-
raise NotImplementedError, "Implement this method in child class"
|
99
|
-
end
|
100
|
-
|
101
|
-
def purge
|
102
|
-
raise NotImplementedError, "Implement this method in child class"
|
103
|
-
end
|
104
|
-
|
105
|
-
def read
|
106
|
-
raise NotImplementedError, "Implement this method in child class"
|
107
|
-
end
|
108
|
-
|
109
|
-
def open
|
110
|
-
raise NotImplementedError, "Implement this method in child class"
|
111
|
-
end
|
112
|
-
|
113
|
-
def write_to(io)
|
114
|
-
open {|i|
|
115
|
-
FileUtils.copy_stream(i, io)
|
116
|
-
}
|
117
|
-
end
|
118
|
-
|
119
|
-
def msgpack_each(&block)
|
120
|
-
open {|io|
|
121
|
-
u = Fluent::Engine.msgpack_factory.unpacker(io)
|
122
|
-
begin
|
123
|
-
u.each(&block)
|
124
|
-
rescue EOFError
|
125
|
-
end
|
126
|
-
}
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
|
131
|
-
class BasicBuffer < Buffer
|
132
|
-
include MonitorMixin
|
133
|
-
|
134
|
-
def initialize
|
135
|
-
super
|
136
|
-
@map = nil # chunks to store data
|
137
|
-
@queue = nil # chunks to be flushed
|
138
|
-
@parallel_pop = true
|
139
|
-
end
|
140
|
-
|
141
|
-
def enable_parallel(b=true)
|
142
|
-
@parallel_pop = b
|
143
|
-
end
|
144
|
-
|
145
|
-
# This configuration assumes plugins to send records to a remote server.
|
146
|
-
# Local file based plugins which should provide more reliability and efficiency
|
147
|
-
# should override buffer_chunk_limit with a larger size.
|
148
|
-
desc 'The size of each buffer chunk.'
|
149
|
-
config_param :buffer_chunk_limit, :size, default: 8*1024*1024
|
150
|
-
desc 'The length limit of the chunk queue.'
|
151
|
-
config_param :buffer_queue_limit, :integer, default: 256
|
152
|
-
desc 'The action when the size of buffer queue exceeds the buffer_queue_limit.'
|
153
|
-
config_param :buffer_queue_full_action, :enum, list: [:exception, :block, :drop_oldest_chunk], default: :exception
|
154
|
-
|
155
|
-
alias chunk_limit buffer_chunk_limit
|
156
|
-
alias chunk_limit= buffer_chunk_limit=
|
157
|
-
alias queue_limit buffer_queue_limit
|
158
|
-
alias queue_limit= buffer_queue_limit=
|
159
|
-
|
160
|
-
def configure(conf)
|
161
|
-
super
|
162
|
-
|
163
|
-
if @buffer_queue_full_action == :block
|
164
|
-
$log.warn "'block' action stops input process until the buffer full is resolved. Check your pipeline this action is fit or not"
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
def start
|
169
|
-
@queue, @map = resume
|
170
|
-
@queue.extend(MonitorMixin)
|
171
|
-
end
|
172
|
-
|
173
|
-
def shutdown
|
174
|
-
synchronize do
|
175
|
-
@queue.synchronize do
|
176
|
-
until @queue.empty?
|
177
|
-
@queue.shift.close
|
178
|
-
end
|
179
|
-
end
|
180
|
-
@map.each_pair {|key,chunk|
|
181
|
-
chunk.close
|
182
|
-
}
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
def storable?(chunk, data)
|
187
|
-
chunk.size + data.bytesize <= @buffer_chunk_limit
|
188
|
-
end
|
189
|
-
|
190
|
-
def emit(key, data, chain)
|
191
|
-
key = key.to_s
|
192
|
-
|
193
|
-
synchronize do
|
194
|
-
begin
|
195
|
-
# chunk unique id is generated in #new_chunk
|
196
|
-
chunk = (@map[key] ||= new_chunk(key))
|
197
|
-
|
198
|
-
if storable?(chunk, data)
|
199
|
-
chain.next
|
200
|
-
chunk << data
|
201
|
-
return false
|
202
|
-
|
203
|
-
elsif @queue.size >= @buffer_queue_limit
|
204
|
-
raise BufferQueueLimitError, "queue size exceeds limit"
|
205
|
-
end
|
206
|
-
rescue BufferQueueLimitError => e
|
207
|
-
case @buffer_queue_full_action
|
208
|
-
when :exception
|
209
|
-
raise e
|
210
|
-
when :block
|
211
|
-
# This is rough implementation. New Buffer API should improve this routine by using wait/signal
|
212
|
-
$log.debug "buffer queue is full. Wait 1 second to re-emit events"
|
213
|
-
sleep 1
|
214
|
-
retry
|
215
|
-
when :drop_oldest_chunk
|
216
|
-
$log.debug "buffer queue is full. Dropping oldest chunk"
|
217
|
-
pop(nil)
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
if data.bytesize > @buffer_chunk_limit
|
222
|
-
$log.warn "Size of the emitted data exceeds buffer_chunk_limit."
|
223
|
-
$log.warn "This may occur problems in the output plugins ``at this server.``"
|
224
|
-
$log.warn "To avoid problems, set a smaller number to the buffer_chunk_limit"
|
225
|
-
$log.warn "in the forward output ``at the log forwarding server.``"
|
226
|
-
### TODO
|
227
|
-
# raise BufferChunkLimitError, "received data too large"
|
228
|
-
end
|
229
|
-
|
230
|
-
# chunk unique id is generated in #new_chunk
|
231
|
-
nc = new_chunk(key)
|
232
|
-
ok = false
|
233
|
-
|
234
|
-
begin
|
235
|
-
nc << data
|
236
|
-
chain.next
|
237
|
-
|
238
|
-
flush_trigger = false
|
239
|
-
@queue.synchronize {
|
240
|
-
enqueue(chunk) # this is buffer enqueue *hook*
|
241
|
-
flush_trigger = @queue.empty?
|
242
|
-
@queue << chunk # actual enqueue
|
243
|
-
@map[key] = nc
|
244
|
-
}
|
245
|
-
|
246
|
-
ok = true
|
247
|
-
# false: queue have 1 or more chunks before this emit
|
248
|
-
# so this enqueue is not a trigger to flush
|
249
|
-
# true: queue have no chunks before this emit
|
250
|
-
# so this enqueue is a trigger to flush this buffer ASAP
|
251
|
-
return flush_trigger
|
252
|
-
ensure
|
253
|
-
nc.purge unless ok
|
254
|
-
end
|
255
|
-
|
256
|
-
end # synchronize
|
257
|
-
end
|
258
|
-
|
259
|
-
def keys
|
260
|
-
@map.keys
|
261
|
-
end
|
262
|
-
|
263
|
-
def queue_size
|
264
|
-
@queue.size
|
265
|
-
end
|
266
|
-
|
267
|
-
def total_queued_chunk_size
|
268
|
-
total = 0
|
269
|
-
synchronize {
|
270
|
-
@map.each_value {|c|
|
271
|
-
total += c.size
|
272
|
-
}
|
273
|
-
@queue.synchronize {
|
274
|
-
@queue.each {|c|
|
275
|
-
total += c.size
|
276
|
-
}
|
277
|
-
}
|
278
|
-
}
|
279
|
-
total
|
280
|
-
end
|
281
|
-
|
282
|
-
def new_chunk(key)
|
283
|
-
raise NotImplementedError, "Implement this method in child class"
|
284
|
-
end
|
285
|
-
|
286
|
-
def resume
|
287
|
-
raise NotImplementedError, "Implement this method in child class"
|
288
|
-
end
|
289
|
-
|
290
|
-
# enqueueing is done by #push
|
291
|
-
# this method is actually 'enqueue_hook'
|
292
|
-
def enqueue(chunk)
|
293
|
-
raise NotImplementedError, "Implement this method in child class"
|
294
|
-
end
|
295
|
-
|
296
|
-
# get the chunk specified by key, and push it into queue
|
297
|
-
def push(key)
|
298
|
-
synchronize do
|
299
|
-
chunk = @map[key]
|
300
|
-
if !chunk || chunk.empty?
|
301
|
-
return false
|
302
|
-
end
|
303
|
-
|
304
|
-
@queue.synchronize do
|
305
|
-
enqueue(chunk)
|
306
|
-
@queue << chunk
|
307
|
-
@map.delete(key)
|
308
|
-
end
|
309
|
-
|
310
|
-
return true
|
311
|
-
end # synchronize
|
312
|
-
end
|
313
|
-
|
314
|
-
# shift a chunk from queue, write and purge it
|
315
|
-
# returns boolean to indicate whether this buffer have more chunk to be flushed or not
|
316
|
-
def pop(out)
|
317
|
-
chunk = nil
|
318
|
-
@queue.synchronize do
|
319
|
-
if @parallel_pop
|
320
|
-
chunk = @queue.find {|c| c.try_mon_enter }
|
321
|
-
return false unless chunk
|
322
|
-
else
|
323
|
-
chunk = @queue.first
|
324
|
-
return false unless chunk
|
325
|
-
return false unless chunk.try_mon_enter
|
326
|
-
end
|
327
|
-
end
|
328
|
-
|
329
|
-
begin
|
330
|
-
# #push(key) does not push empty chunks into queue.
|
331
|
-
# so this check is nonsense...
|
332
|
-
if !chunk.empty? && !out.nil?
|
333
|
-
write_chunk(chunk, out)
|
334
|
-
end
|
335
|
-
|
336
|
-
queue_empty = false
|
337
|
-
@queue.synchronize do
|
338
|
-
@queue.delete_if {|c|
|
339
|
-
c.object_id == chunk.object_id
|
340
|
-
}
|
341
|
-
queue_empty = @queue.empty?
|
342
|
-
end
|
343
|
-
|
344
|
-
chunk.purge
|
345
|
-
|
346
|
-
# return to be flushed once more immediately, or not
|
347
|
-
return !queue_empty
|
348
|
-
ensure
|
349
|
-
chunk.mon_exit
|
350
|
-
end
|
351
|
-
end
|
352
|
-
|
353
|
-
def write_chunk(chunk, out)
|
354
|
-
out.write(chunk)
|
355
|
-
end
|
356
|
-
|
357
|
-
def clear!
|
358
|
-
@queue.delete_if {|chunk|
|
359
|
-
chunk.purge
|
360
|
-
true
|
361
|
-
}
|
362
|
-
end
|
363
|
-
end
|
364
|
-
end
|
365
|
-
|
@@ -1,107 +0,0 @@
|
|
1
|
-
require 'time'
|
2
|
-
require 'fluent/parser'
|
3
|
-
|
4
|
-
class Fluent::ParserFilter < Fluent::Filter
|
5
|
-
Fluent::Plugin.register_filter('parser', self)
|
6
|
-
|
7
|
-
config_param :key_name, :string
|
8
|
-
config_param :reserve_data, :bool, default: false
|
9
|
-
config_param :inject_key_prefix, :string, default: nil
|
10
|
-
config_param :replace_invalid_sequence, :bool, default: false
|
11
|
-
config_param :hash_value_field, :string, default: nil
|
12
|
-
config_param :suppress_parse_error_log, :bool, default: false
|
13
|
-
config_param :time_parse, :bool, default: true
|
14
|
-
config_param :ignore_key_not_exist, :bool, default: false
|
15
|
-
config_param :emit_invalid_record_to_error, :bool, default: false
|
16
|
-
|
17
|
-
attr_reader :parser
|
18
|
-
|
19
|
-
def configure(conf)
|
20
|
-
super
|
21
|
-
|
22
|
-
@parser = Fluent::TextParser.new
|
23
|
-
@parser.estimate_current_event = false
|
24
|
-
@parser.configure(conf)
|
25
|
-
if !@time_parse && @parser.parser.respond_to?("time_key=".to_sym)
|
26
|
-
# disable parse time
|
27
|
-
@parser.parser.time_key = nil
|
28
|
-
end
|
29
|
-
|
30
|
-
self
|
31
|
-
end
|
32
|
-
|
33
|
-
def filter_stream(tag, es)
|
34
|
-
new_es = Fluent::MultiEventStream.new
|
35
|
-
es.each do |time,record|
|
36
|
-
raw_value = record[@key_name]
|
37
|
-
if raw_value.nil?
|
38
|
-
if @emit_invalid_record_to_error
|
39
|
-
router.emit_error_event(tag, time, record, ArgumentError.new("#{@key_name} does not exist"))
|
40
|
-
else
|
41
|
-
log.warn "#{@key_name} does not exist" unless @ignore_key_not_exist
|
42
|
-
end
|
43
|
-
new_es.add(time, handle_parsed(tag, record, time, {})) if @reserve_data
|
44
|
-
next
|
45
|
-
end
|
46
|
-
begin
|
47
|
-
@parser.parse(raw_value) do |t,values|
|
48
|
-
if values
|
49
|
-
t ||= time
|
50
|
-
r = handle_parsed(tag, record, t, values)
|
51
|
-
new_es.add(t, r)
|
52
|
-
else
|
53
|
-
if @emit_invalid_record_to_error
|
54
|
-
router.emit_error_event(tag, time, record, ::Fluent::ParserError.new("pattern not match with data '#{raw_value}'"))
|
55
|
-
else
|
56
|
-
log.warn "pattern not match with data '#{raw_value}'" unless @suppress_parse_error_log
|
57
|
-
end
|
58
|
-
if @reserve_data
|
59
|
-
t = time
|
60
|
-
r = handle_parsed(tag, record, time, {})
|
61
|
-
new_es.add(t, r)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
rescue Fluent::ParserError => e
|
66
|
-
if @emit_invalid_record_to_error
|
67
|
-
router.emit_error_event(tag, time, record, e)
|
68
|
-
else
|
69
|
-
log.warn e.message unless @suppress_parse_error_log
|
70
|
-
end
|
71
|
-
rescue ArgumentError => e
|
72
|
-
raise unless @replace_invalid_sequence
|
73
|
-
raise unless e.message.index("invalid byte sequence in") == 0
|
74
|
-
|
75
|
-
raw_value = replace_invalid_byte(raw_value)
|
76
|
-
retry
|
77
|
-
rescue => e
|
78
|
-
if @emit_invalid_record_to_error
|
79
|
-
router.emit_error_event(tag, time, record, Fluent::ParserError.new("parse failed #{e.message}"))
|
80
|
-
else
|
81
|
-
log.warn "parse failed #{e.message}" unless @suppress_parse_error_log
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
new_es
|
86
|
-
end
|
87
|
-
|
88
|
-
private
|
89
|
-
|
90
|
-
def handle_parsed(tag, record, t, values)
|
91
|
-
if values && @inject_key_prefix
|
92
|
-
values = Hash[values.map{|k,v| [ @inject_key_prefix + k, v ]}]
|
93
|
-
end
|
94
|
-
r = @hash_value_field ? {@hash_value_field => values} : values
|
95
|
-
if @reserve_data
|
96
|
-
r = r ? record.merge(r) : record
|
97
|
-
end
|
98
|
-
r
|
99
|
-
end
|
100
|
-
|
101
|
-
def replace_invalid_byte(string)
|
102
|
-
replace_options = { invalid: :replace, undef: :replace, replace: '?' }
|
103
|
-
original_encoding = string.encoding
|
104
|
-
temporal_encoding = (original_encoding == Encoding::UTF_8 ? Encoding::UTF_16BE : Encoding::UTF_8)
|
105
|
-
string.encode(temporal_encoding, original_encoding, replace_options).encode(original_encoding)
|
106
|
-
end
|
107
|
-
end
|