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.

Files changed (253) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE.md +6 -0
  3. data/.gitignore +2 -0
  4. data/.travis.yml +33 -21
  5. data/CONTRIBUTING.md +1 -0
  6. data/ChangeLog +1239 -0
  7. data/README.md +0 -25
  8. data/Rakefile +2 -1
  9. data/Vagrantfile +17 -0
  10. data/appveyor.yml +35 -0
  11. data/example/filter_stdout.conf +5 -5
  12. data/example/in_forward.conf +2 -2
  13. data/example/in_http.conf +2 -2
  14. data/example/in_out_forward.conf +17 -0
  15. data/example/in_syslog.conf +2 -2
  16. data/example/in_tail.conf +2 -2
  17. data/example/in_tcp.conf +2 -2
  18. data/example/in_udp.conf +2 -2
  19. data/example/out_copy.conf +4 -4
  20. data/example/out_file.conf +2 -2
  21. data/example/out_forward.conf +2 -2
  22. data/example/out_forward_buf_file.conf +23 -0
  23. data/example/v0_12_filter.conf +8 -8
  24. data/fluent.conf +29 -0
  25. data/fluentd.gemspec +18 -11
  26. data/lib/fluent/agent.rb +60 -58
  27. data/lib/fluent/command/cat.rb +1 -1
  28. data/lib/fluent/command/debug.rb +7 -5
  29. data/lib/fluent/command/fluentd.rb +97 -2
  30. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  31. data/lib/fluent/compat/filter.rb +50 -0
  32. data/lib/fluent/compat/formatter.rb +109 -0
  33. data/lib/fluent/compat/input.rb +50 -0
  34. data/lib/fluent/compat/output.rb +617 -0
  35. data/lib/fluent/compat/output_chain.rb +60 -0
  36. data/lib/fluent/compat/parser.rb +163 -0
  37. data/lib/fluent/compat/propagate_default.rb +62 -0
  38. data/lib/fluent/config.rb +23 -20
  39. data/lib/fluent/config/configure_proxy.rb +119 -70
  40. data/lib/fluent/config/dsl.rb +5 -18
  41. data/lib/fluent/config/element.rb +72 -8
  42. data/lib/fluent/config/error.rb +0 -3
  43. data/lib/fluent/config/literal_parser.rb +0 -2
  44. data/lib/fluent/config/parser.rb +4 -4
  45. data/lib/fluent/config/section.rb +39 -28
  46. data/lib/fluent/config/types.rb +2 -13
  47. data/lib/fluent/config/v1_parser.rb +1 -3
  48. data/lib/fluent/configurable.rb +48 -16
  49. data/lib/fluent/daemon.rb +15 -0
  50. data/lib/fluent/engine.rb +26 -52
  51. data/lib/fluent/env.rb +6 -4
  52. data/lib/fluent/event.rb +58 -11
  53. data/lib/fluent/event_router.rb +5 -5
  54. data/lib/fluent/filter.rb +2 -50
  55. data/lib/fluent/formatter.rb +4 -293
  56. data/lib/fluent/input.rb +2 -32
  57. data/lib/fluent/label.rb +2 -2
  58. data/lib/fluent/load.rb +3 -2
  59. data/lib/fluent/log.rb +107 -38
  60. data/lib/fluent/match.rb +0 -36
  61. data/lib/fluent/mixin.rb +117 -7
  62. data/lib/fluent/msgpack_factory.rb +62 -0
  63. data/lib/fluent/output.rb +7 -612
  64. data/lib/fluent/output_chain.rb +23 -0
  65. data/lib/fluent/parser.rb +4 -800
  66. data/lib/fluent/plugin.rb +100 -121
  67. data/lib/fluent/plugin/bare_output.rb +63 -0
  68. data/lib/fluent/plugin/base.rb +121 -0
  69. data/lib/fluent/plugin/buf_file.rb +101 -182
  70. data/lib/fluent/plugin/buf_memory.rb +9 -92
  71. data/lib/fluent/plugin/buffer.rb +473 -0
  72. data/lib/fluent/plugin/buffer/chunk.rb +135 -0
  73. data/lib/fluent/plugin/buffer/file_chunk.rb +339 -0
  74. data/lib/fluent/plugin/buffer/memory_chunk.rb +100 -0
  75. data/lib/fluent/plugin/exec_util.rb +80 -75
  76. data/lib/fluent/plugin/file_util.rb +33 -28
  77. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  78. data/lib/fluent/plugin/filter.rb +51 -0
  79. data/lib/fluent/plugin/filter_grep.rb +13 -40
  80. data/lib/fluent/plugin/filter_record_transformer.rb +22 -18
  81. data/lib/fluent/plugin/formatter.rb +93 -0
  82. data/lib/fluent/plugin/formatter_csv.rb +48 -0
  83. data/lib/fluent/plugin/formatter_hash.rb +32 -0
  84. data/lib/fluent/plugin/formatter_json.rb +47 -0
  85. data/lib/fluent/plugin/formatter_ltsv.rb +42 -0
  86. data/lib/fluent/plugin/formatter_msgpack.rb +32 -0
  87. data/lib/fluent/plugin/formatter_out_file.rb +45 -0
  88. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  89. data/lib/fluent/plugin/formatter_stdout.rb +39 -0
  90. data/lib/fluent/plugin/in_debug_agent.rb +4 -0
  91. data/lib/fluent/plugin/in_dummy.rb +22 -18
  92. data/lib/fluent/plugin/in_exec.rb +18 -8
  93. data/lib/fluent/plugin/in_forward.rb +36 -79
  94. data/lib/fluent/plugin/in_gc_stat.rb +4 -0
  95. data/lib/fluent/plugin/in_http.rb +21 -18
  96. data/lib/fluent/plugin/in_monitor_agent.rb +15 -48
  97. data/lib/fluent/plugin/in_object_space.rb +6 -1
  98. data/lib/fluent/plugin/in_stream.rb +7 -3
  99. data/lib/fluent/plugin/in_syslog.rb +46 -95
  100. data/lib/fluent/plugin/in_tail.rb +58 -640
  101. data/lib/fluent/plugin/in_tcp.rb +8 -1
  102. data/lib/fluent/plugin/in_udp.rb +8 -18
  103. data/lib/fluent/plugin/input.rb +33 -0
  104. data/lib/fluent/plugin/multi_output.rb +95 -0
  105. data/lib/fluent/plugin/out_buffered_null.rb +59 -0
  106. data/lib/fluent/plugin/out_copy.rb +11 -7
  107. data/lib/fluent/plugin/out_exec.rb +15 -11
  108. data/lib/fluent/plugin/out_exec_filter.rb +18 -10
  109. data/lib/fluent/plugin/out_file.rb +34 -5
  110. data/lib/fluent/plugin/out_forward.rb +25 -19
  111. data/lib/fluent/plugin/out_null.rb +0 -14
  112. data/lib/fluent/plugin/out_roundrobin.rb +11 -7
  113. data/lib/fluent/plugin/out_stdout.rb +5 -7
  114. data/lib/fluent/plugin/out_stream.rb +3 -1
  115. data/lib/fluent/plugin/output.rb +979 -0
  116. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  117. data/lib/fluent/plugin/parser.rb +244 -0
  118. data/lib/fluent/plugin/parser_apache.rb +24 -0
  119. data/lib/fluent/plugin/parser_apache2.rb +84 -0
  120. data/lib/fluent/plugin/parser_apache_error.rb +21 -0
  121. data/lib/fluent/plugin/parser_csv.rb +31 -0
  122. data/lib/fluent/plugin/parser_json.rb +79 -0
  123. data/lib/fluent/plugin/parser_ltsv.rb +50 -0
  124. data/lib/fluent/plugin/parser_multiline.rb +102 -0
  125. data/lib/fluent/plugin/parser_nginx.rb +24 -0
  126. data/lib/fluent/plugin/parser_none.rb +36 -0
  127. data/lib/fluent/plugin/parser_syslog.rb +82 -0
  128. data/lib/fluent/plugin/parser_tsv.rb +37 -0
  129. data/lib/fluent/plugin/socket_util.rb +119 -117
  130. data/lib/fluent/plugin/storage.rb +84 -0
  131. data/lib/fluent/plugin/storage_local.rb +116 -0
  132. data/lib/fluent/plugin/string_util.rb +16 -13
  133. data/lib/fluent/plugin_helper.rb +39 -0
  134. data/lib/fluent/plugin_helper/child_process.rb +298 -0
  135. data/lib/fluent/plugin_helper/compat_parameters.rb +99 -0
  136. data/lib/fluent/plugin_helper/event_emitter.rb +80 -0
  137. data/lib/fluent/plugin_helper/event_loop.rb +118 -0
  138. data/lib/fluent/plugin_helper/retry_state.rb +177 -0
  139. data/lib/fluent/plugin_helper/storage.rb +308 -0
  140. data/lib/fluent/plugin_helper/thread.rb +147 -0
  141. data/lib/fluent/plugin_helper/timer.rb +85 -0
  142. data/lib/fluent/plugin_id.rb +63 -0
  143. data/lib/fluent/process.rb +21 -30
  144. data/lib/fluent/registry.rb +21 -9
  145. data/lib/fluent/root_agent.rb +115 -40
  146. data/lib/fluent/supervisor.rb +330 -320
  147. data/lib/fluent/system_config.rb +42 -18
  148. data/lib/fluent/test.rb +6 -1
  149. data/lib/fluent/test/base.rb +23 -3
  150. data/lib/fluent/test/driver/base.rb +247 -0
  151. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  152. data/lib/fluent/test/driver/filter.rb +35 -0
  153. data/lib/fluent/test/driver/input.rb +31 -0
  154. data/lib/fluent/test/driver/output.rb +78 -0
  155. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  156. data/lib/fluent/test/filter_test.rb +0 -1
  157. data/lib/fluent/test/formatter_test.rb +2 -1
  158. data/lib/fluent/test/input_test.rb +23 -17
  159. data/lib/fluent/test/output_test.rb +28 -39
  160. data/lib/fluent/test/parser_test.rb +1 -1
  161. data/lib/fluent/time.rb +104 -1
  162. data/lib/fluent/{status.rb → unique_id.rb} +15 -24
  163. data/lib/fluent/version.rb +1 -1
  164. data/lib/fluent/winsvc.rb +72 -0
  165. data/test/compat/test_calls_super.rb +164 -0
  166. data/test/config/test_config_parser.rb +83 -0
  167. data/test/config/test_configurable.rb +547 -274
  168. data/test/config/test_configure_proxy.rb +146 -29
  169. data/test/config/test_dsl.rb +3 -181
  170. data/test/config/test_element.rb +274 -0
  171. data/test/config/test_literal_parser.rb +1 -1
  172. data/test/config/test_section.rb +79 -7
  173. data/test/config/test_system_config.rb +21 -0
  174. data/test/config/test_types.rb +3 -26
  175. data/test/helper.rb +78 -8
  176. data/test/plugin/test_bare_output.rb +118 -0
  177. data/test/plugin/test_base.rb +75 -0
  178. data/test/plugin/test_buf_file.rb +420 -521
  179. data/test/plugin/test_buf_memory.rb +32 -194
  180. data/test/plugin/test_buffer.rb +981 -0
  181. data/test/plugin/test_buffer_chunk.rb +110 -0
  182. data/test/plugin/test_buffer_file_chunk.rb +770 -0
  183. data/test/plugin/test_buffer_memory_chunk.rb +265 -0
  184. data/test/plugin/test_filter.rb +255 -0
  185. data/test/plugin/test_filter_grep.rb +2 -73
  186. data/test/plugin/test_filter_record_transformer.rb +24 -68
  187. data/test/plugin/test_filter_stdout.rb +6 -6
  188. data/test/plugin/test_in_debug_agent.rb +2 -0
  189. data/test/plugin/test_in_dummy.rb +11 -17
  190. data/test/plugin/test_in_exec.rb +6 -25
  191. data/test/plugin/test_in_forward.rb +112 -151
  192. data/test/plugin/test_in_gc_stat.rb +2 -0
  193. data/test/plugin/test_in_http.rb +106 -157
  194. data/test/plugin/test_in_object_space.rb +21 -5
  195. data/test/plugin/test_in_stream.rb +14 -13
  196. data/test/plugin/test_in_syslog.rb +30 -275
  197. data/test/plugin/test_in_tail.rb +95 -282
  198. data/test/plugin/test_in_tcp.rb +14 -0
  199. data/test/plugin/test_in_udp.rb +21 -67
  200. data/test/plugin/test_input.rb +122 -0
  201. data/test/plugin/test_multi_output.rb +180 -0
  202. data/test/plugin/test_out_buffered_null.rb +79 -0
  203. data/test/plugin/test_out_copy.rb +15 -2
  204. data/test/plugin/test_out_exec.rb +75 -25
  205. data/test/plugin/test_out_exec_filter.rb +74 -8
  206. data/test/plugin/test_out_file.rb +61 -7
  207. data/test/plugin/test_out_forward.rb +92 -15
  208. data/test/plugin/test_out_roundrobin.rb +1 -0
  209. data/test/plugin/test_out_stdout.rb +22 -13
  210. data/test/plugin/test_out_stream.rb +18 -0
  211. data/test/plugin/test_output.rb +515 -0
  212. data/test/plugin/test_output_as_buffered.rb +1540 -0
  213. data/test/plugin/test_output_as_buffered_overflow.rb +247 -0
  214. data/test/plugin/test_output_as_buffered_retries.rb +808 -0
  215. data/test/plugin/test_output_as_buffered_secondary.rb +776 -0
  216. data/test/plugin/test_output_as_standard.rb +362 -0
  217. data/test/plugin/test_owned_by.rb +35 -0
  218. data/test/plugin/test_storage.rb +167 -0
  219. data/test/plugin/test_storage_local.rb +8 -0
  220. data/test/plugin_helper/test_child_process.rb +599 -0
  221. data/test/plugin_helper/test_compat_parameters.rb +175 -0
  222. data/test/plugin_helper/test_event_emitter.rb +51 -0
  223. data/test/plugin_helper/test_event_loop.rb +52 -0
  224. data/test/plugin_helper/test_retry_state.rb +399 -0
  225. data/test/plugin_helper/test_storage.rb +411 -0
  226. data/test/plugin_helper/test_thread.rb +164 -0
  227. data/test/plugin_helper/test_timer.rb +100 -0
  228. data/test/scripts/exec_script.rb +0 -6
  229. data/test/scripts/fluent/plugin/out_test.rb +3 -0
  230. data/test/test_config.rb +13 -4
  231. data/test/test_event.rb +24 -13
  232. data/test/test_event_router.rb +8 -7
  233. data/test/test_event_time.rb +187 -0
  234. data/test/test_formatter.rb +13 -51
  235. data/test/test_input.rb +1 -1
  236. data/test/test_log.rb +239 -16
  237. data/test/test_mixin.rb +1 -1
  238. data/test/test_output.rb +53 -66
  239. data/test/test_parser.rb +105 -323
  240. data/test/test_plugin_helper.rb +81 -0
  241. data/test/test_root_agent.rb +4 -52
  242. data/test/test_supervisor.rb +272 -0
  243. data/test/test_unique_id.rb +47 -0
  244. metadata +181 -55
  245. data/CHANGELOG.md +0 -710
  246. data/lib/fluent/buffer.rb +0 -365
  247. data/lib/fluent/plugin/filter_parser.rb +0 -107
  248. data/lib/fluent/plugin/in_status.rb +0 -76
  249. data/lib/fluent/test/helpers.rb +0 -86
  250. data/test/plugin/data/log/foo/bar2 +0 -0
  251. data/test/plugin/test_filter_parser.rb +0 -744
  252. data/test/plugin/test_in_status.rb +0 -38
  253. 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.dump}'" 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