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
@@ -1,38 +0,0 @@
1
- require_relative '../helper'
2
- require 'fluent/test'
3
-
4
- class StatusInputTest < Test::Unit::TestCase
5
- def setup
6
- Fluent::Test.setup
7
- end
8
-
9
- CONFIG = %[
10
- emit_interval 1
11
- tag t1
12
- ]
13
-
14
- def create_driver(conf=CONFIG)
15
- Fluent::Test::InputTestDriver.new(Fluent::StatusInput).configure(conf)
16
- end
17
-
18
- def test_configure
19
- d = create_driver
20
- assert_equal(1, d.instance.emit_interval)
21
- assert_equal("t1", d.instance.tag)
22
- end
23
-
24
- def test_emit
25
- stub(Fluent::Status).each { |b|
26
- b.call("answer" => "42")
27
- }
28
-
29
- d = create_driver
30
- d.run do
31
- sleep 2
32
- end
33
-
34
- emits = d.emits
35
- assert(emits.length > 0)
36
- assert_equal({"answer" => "42"}, emits[0][2])
37
- end
38
- end
data/test/test_buffer.rb DELETED
@@ -1,624 +0,0 @@
1
- require_relative 'helper'
2
- require 'fluent/test'
3
- require 'fluent/buffer'
4
-
5
- require 'stringio'
6
- require 'msgpack'
7
- require 'timeout'
8
-
9
- module FluentBufferTest
10
- class BufferTest < Test::Unit::TestCase
11
- def test_buffer_interface
12
- buf = Fluent::Buffer.new
13
-
14
- assert buf.respond_to?(:configure)
15
- assert buf.respond_to?(:start)
16
- assert buf.respond_to?(:shutdown)
17
- assert buf.respond_to?(:before_shutdown)
18
-
19
- # virtual methods
20
- assert buf.respond_to?(:emit)
21
- assert_raise(NotImplementedError){ buf.emit('key', 'data', 'chain') }
22
- assert buf.respond_to?(:keys)
23
- assert_raise(NotImplementedError){ buf.keys }
24
- assert buf.respond_to?(:push)
25
- assert_raise(NotImplementedError){ buf.push('key') }
26
- assert buf.respond_to?(:pop)
27
- assert_raise(NotImplementedError){ buf.pop('out') }
28
- assert buf.respond_to?(:clear!)
29
- assert_raise(NotImplementedError){ buf.clear! }
30
- end
31
-
32
- def test_buffer_does_nothing
33
- buf = Fluent::Buffer.new
34
-
35
- buf.start
36
- buf.before_shutdown(nil) # out == nil
37
- buf.shutdown
38
- end
39
- end
40
-
41
- class DummyChunk < Fluent::BufferChunk
42
- attr_accessor :size, :data, :purged, :closed
43
- def initialize(key, size=0)
44
- super(key)
45
- @size = size
46
- end
47
-
48
- def <<(data)
49
- @size += data.bytesize
50
- end
51
-
52
- def open(&block)
53
- StringIO.open(@data, &block)
54
- end
55
-
56
- def purge
57
- @purged = true
58
- end
59
-
60
- def close
61
- @closed = true
62
- end
63
- end
64
-
65
- class BufferChunkTest < Test::Unit::TestCase
66
- def test_has_key
67
- chunk = Fluent::BufferChunk.new('key')
68
- assert_equal 'key', chunk.key
69
- end
70
-
71
- def test_buffer_chunk_interface
72
- chunk = Fluent::BufferChunk.new('key')
73
-
74
- assert chunk.respond_to?(:empty?)
75
- assert chunk.respond_to?(:write_to)
76
- assert chunk.respond_to?(:msgpack_each)
77
-
78
- # virtual methods
79
- assert chunk.respond_to?(:<<)
80
- assert_raise(NotImplementedError){ chunk << 'data' }
81
- assert chunk.respond_to?(:size)
82
- assert_raise(NotImplementedError){ chunk.size }
83
- assert chunk.respond_to?(:close)
84
- assert_raise(NotImplementedError){ chunk.close }
85
- assert chunk.respond_to?(:purge)
86
- assert_raise(NotImplementedError){ chunk.purge }
87
- assert chunk.respond_to?(:read)
88
- assert_raise(NotImplementedError){ chunk.read }
89
- assert chunk.respond_to?(:open)
90
- assert_raise(NotImplementedError){ chunk.open }
91
- end
92
-
93
- def test_empty?
94
- dchunk = DummyChunk.new('key', 1)
95
-
96
- assert !(dchunk.empty?)
97
-
98
- dchunk.size = 0
99
- assert dchunk.empty?
100
- end
101
-
102
- def test_write_to
103
- dummy_chunk = DummyChunk.new('key')
104
- dummy_chunk.data = 'foo bar baz'
105
-
106
- dummy_dst = StringIO.new
107
- dummy_chunk.write_to(dummy_dst)
108
- assert_equal 'foo bar baz', dummy_dst.string
109
- end
110
-
111
- def test_msgpack_each
112
- dummy_chunk = DummyChunk.new('key')
113
- d0 = MessagePack.pack([[1, "foo"], [2, "bar"], [3, "baz"]])
114
- d1 = MessagePack.pack({"key1" => "value1", "key2" => "value2"})
115
- d2 = MessagePack.pack("string1")
116
- d3 = MessagePack.pack(1)
117
- d4 = MessagePack.pack(nil)
118
-
119
- dummy_chunk.data = d0 + d1 + d2 + d3 + d4
120
-
121
- store = []
122
- dummy_chunk.msgpack_each do |data|
123
- store << data
124
- end
125
-
126
- assert_equal 5, store.size
127
- assert_equal [[1, "foo"], [2, "bar"], [3, "baz"]], store[0]
128
- assert_equal({"key1" => "value1", "key2" => "value2"}, store[1])
129
- assert_equal "string1", store[2]
130
- assert_equal 1, store[3]
131
- assert_equal nil, store[4]
132
- end
133
- end
134
-
135
- class DummyBuffer < Fluent::BasicBuffer
136
- attr_accessor :queue, :map, :enqueue_hook_times
137
-
138
- def initialize
139
- super
140
- @queue = nil
141
- @map = nil
142
- @enqueue_hook_times = 0
143
- end
144
-
145
- def resume
146
- return [], {}
147
- end
148
-
149
- def new_chunk(key)
150
- DummyChunk.new(key)
151
- end
152
-
153
- def enqueue(chunk)
154
- @enqueue_hook_times += 1
155
- end
156
- end
157
-
158
- class DummyChain
159
- def next
160
- true
161
- end
162
- end
163
-
164
- class BasicBufferTest < Test::Unit::TestCase
165
- def test_parallel_pop_default
166
- bb = Fluent::BasicBuffer.new
167
-
168
- assert bb.instance_eval{ @parallel_pop }
169
- bb.enable_parallel(false)
170
- assert !(bb.instance_eval{ @parallel_pop })
171
- bb.enable_parallel()
172
- assert bb.instance_eval{ @parallel_pop }
173
- end
174
-
175
- def test_configure
176
- bb1 = Fluent::BasicBuffer.new
177
- bb1.configure({})
178
- assert_equal 8 * 1024 * 1024, bb1.buffer_chunk_limit
179
- assert_equal 256, bb1.buffer_queue_limit
180
-
181
- bb2 = Fluent::BasicBuffer.new
182
- bb2.configure({
183
- "buffer_chunk_limit" => 256 * 1024 * 1024,
184
- "buffer_queue_limit" => 16
185
- })
186
- assert_equal 256 * 1024 * 1024, bb2.buffer_chunk_limit
187
- assert_equal 16, bb2.buffer_queue_limit
188
- end
189
-
190
- def test_virtual_methods
191
- bb = Fluent::BasicBuffer.new
192
-
193
- assert_raise(NotImplementedError){ bb.new_chunk('key') }
194
- assert_raise(NotImplementedError){ bb.resume }
195
- assert_raise(NotImplementedError){ bb.enqueue('chunk') }
196
- end
197
-
198
- def test_start
199
- db = DummyBuffer.new
200
- db.start
201
- assert_equal([], db.queue)
202
- assert_equal({}, db.map)
203
- end
204
-
205
- def test_shutdown
206
- db1 = DummyBuffer.new
207
- db1.start
208
- db1.shutdown
209
-
210
- db2 = DummyBuffer.new
211
- db2.start
212
-
213
- chunks = [ DummyChunk.new('k1'), DummyChunk.new('k2'), DummyChunk.new('k3'), DummyChunk.new('k4') ]
214
-
215
- db2.queue << chunks[0]
216
- db2.queue << chunks[1]
217
- db2.map = { 'k3' => chunks[2], 'k4' => chunks[3] }
218
-
219
- db2.shutdown
220
-
221
- assert chunks[0].closed
222
- assert chunks[1].closed
223
- assert chunks[2].closed
224
- assert chunks[3].closed
225
-
226
- assert_equal 0, db2.queue.size
227
- end
228
-
229
- def test_storable?
230
- db = DummyBuffer.new
231
- db.configure({})
232
- assert_equal 8 * 1024 * 1024, db.buffer_chunk_limit
233
- assert_equal 256, db.buffer_queue_limit
234
-
235
- # db.storable?(chunk, data)
236
- chunk0 = DummyChunk.new('k', 0)
237
- chunk1 = DummyChunk.new('k', 7 * 1024 * 1024)
238
-
239
- assert db.storable?(chunk0, 'b' * 1024 * 1024)
240
- assert db.storable?(chunk0, 'b' * 8 * 1024 * 1024)
241
- assert !(db.storable?(chunk0, 'b' * 9 * 1024 * 1024))
242
-
243
- assert db.storable?(chunk1, 'b' * 1024 * 1024)
244
- assert !(db.storable?(chunk1, 'b' * ( 1024 * 1024 + 1 ) ))
245
- end
246
-
247
- def test_emit
248
- db = DummyBuffer.new
249
- db.configure({})
250
- db.start
251
-
252
- chain = DummyChain.new
253
-
254
- assert_equal 8 * 1024 * 1024, db.buffer_chunk_limit
255
- assert_equal 256, db.buffer_queue_limit
256
-
257
- assert_equal 0, db.enqueue_hook_times
258
-
259
- s1m = "a" * 1024 * 1024
260
-
261
- d1 = s1m * 4
262
- d2 = s1m * 4 #=> 8
263
- d3 = s1m * 1 #=> 9, 1
264
- d4 = s1m * 6 #=> 7
265
- d5 = s1m * 2 #=> 9, 2
266
- d6 = s1m * 9 #=> 11, 9
267
- d7 = s1m * 9 #=> 18, 9
268
- d8 = s1m * 1 #=> 10, 1
269
- d9 = s1m * 2 #=> 3
270
-
271
- assert !(db.emit('key', d1, chain)) # stored in new chunk, and queue is empty
272
- assert !(db.map['key'].empty?)
273
- assert_equal 0, db.queue.size
274
- assert_equal 0, db.enqueue_hook_times
275
-
276
- assert !(db.emit('key', d2, chain)) # just storable, not queued yet.
277
- assert_equal 0, db.queue.size
278
- assert_equal 0, db.enqueue_hook_times
279
-
280
- assert db.emit('key', d3, chain) # not storable, so old chunk is enqueued & new chunk size is 1m and to be flushed
281
- assert_equal 1, db.queue.size
282
- assert_equal 1, db.enqueue_hook_times
283
-
284
- assert !(db.emit('key', d4, chain)) # stored in chunk
285
- assert_equal 1, db.queue.size
286
- assert_equal 1, db.enqueue_hook_times
287
-
288
- assert !(db.emit('key', d5, chain)) # not storable, old chunk is enqueued & new chunk size is 2m
289
- # not to be flushed (queue is not empty)
290
- assert_equal 2, db.queue.size
291
- assert_equal 2, db.enqueue_hook_times
292
-
293
- db.queue.reject!{|v| true } # flush
294
-
295
- assert db.emit('key', d6, chain) # not storable, old chunk is enqueued
296
- # new chunk is larger than buffer_chunk_limit
297
- # to be flushed
298
- assert_equal 1, db.queue.size
299
- assert_equal 3, db.enqueue_hook_times
300
-
301
- assert !(db.emit('key', d7, chain)) # chunk before emit is already larger than buffer_chunk_limit, so enqueued
302
- # not to be flushed
303
- assert_equal 2, db.queue.size
304
- assert_equal 4, db.enqueue_hook_times
305
-
306
- db.queue.reject!{|v| true } # flush
307
-
308
- assert db.emit('key', d8, chain) # chunk before emit is already larger than buffer_chunk_limit, so enqueued
309
- # to be flushed because just after flushing
310
- assert_equal 1, db.queue_size
311
- assert_equal 5, db.enqueue_hook_times
312
-
313
- db.queue.reject!{|v| true } # flush
314
-
315
- assert !(db.emit('key', d9, chain)) # stored in chunk
316
- assert_equal 0, db.queue_size
317
- assert_equal 5, db.enqueue_hook_times
318
- end
319
-
320
- def test_keys
321
- db = DummyBuffer.new
322
- db.start
323
-
324
- chunks = [ DummyChunk.new('k1'), DummyChunk.new('k2'), DummyChunk.new('k3'), DummyChunk.new('k4') ]
325
-
326
- db.queue << chunks[0]
327
- db.queue << chunks[1]
328
- db.map = { 'k3' => chunks[2], 'k4' => chunks[3] }
329
-
330
- assert_equal ['k3', 'k4'], db.keys
331
- end
332
-
333
- def test_queue_size
334
- db = DummyBuffer.new
335
- db.start
336
-
337
- chunks = [ DummyChunk.new('k1'), DummyChunk.new('k2'), DummyChunk.new('k3'), DummyChunk.new('k4') ]
338
-
339
- db.queue << chunks[0]
340
- db.queue << chunks[1]
341
- db.map = { 'k3' => chunks[2], 'k4' => chunks[3] }
342
-
343
- assert_equal 2, db.queue_size
344
- end
345
-
346
- def test_total_queued_chunk_size
347
- db = DummyBuffer.new
348
- db.start
349
-
350
- chunks = [ DummyChunk.new('k1', 1000), DummyChunk.new('k2', 2000), DummyChunk.new('k3', 3000), DummyChunk.new('k4', 4000) ]
351
-
352
- db.queue << chunks[0]
353
- db.queue << chunks[1]
354
- db.map = { 'k3' => chunks[2], 'k4' => chunks[3] }
355
-
356
- assert_equal (1000 + 2000 + 3000 + 4000), db.total_queued_chunk_size
357
- end
358
-
359
- def test_push
360
- db = DummyBuffer.new
361
- db.start
362
-
363
- chunks = [ DummyChunk.new('k1', 1000), DummyChunk.new('k2', 2000), DummyChunk.new('k3', 3000), DummyChunk.new('k4', 4000) ]
364
-
365
- db.map = { 'k1' => chunks[0], 'k2' => chunks[1], 'k3' => chunks[2], 'k4' => chunks[3] }
366
-
367
- assert_equal 0, db.queue.size
368
- assert_equal 4, db.map.size
369
-
370
- # if key does not exits, this method doesn't anything, and returns false
371
- assert_nil db.map['k5']
372
- assert !(db.push('k5'))
373
- assert_equal 0, db.queue.size
374
-
375
- # if empty chunk exists for specified key, this method doesn't anything and returns false
376
- empty_chunk = DummyChunk.new('key')
377
- db.map['k5'] = empty_chunk
378
- assert !(db.push('k5'))
379
- assert_equal empty_chunk, db.map['k5']
380
-
381
- # if non-empty chunk exists for specified key, that chunk is enqueued, and true returned
382
- assert db.push('k3')
383
- assert_equal 1, db.queue.size
384
- assert_equal 3000, db.queue.first.size
385
- assert_nil db.map['k3']
386
- assert_equal 1, db.instance_eval{ @enqueue_hook_times }
387
- end
388
-
389
- class DummyOutput
390
- attr_accessor :written
391
-
392
- def write(chunk)
393
- @written = chunk
394
- "return value"
395
- end
396
- end
397
-
398
- def test_pop
399
- ### pop(out)
400
- # 1. find a chunk that not owned (by checking monitor)
401
- # 2. return false if @queue is empty or all chunks are already owned
402
- # 3. call `write_chunk(chunk, out)` if it isn't empty
403
- # 4. remove that chunk from @queue
404
- # 5. call `chunk.purge`
405
- # 6. return @queue is not empty, or not
406
-
407
- db = DummyBuffer.new
408
- db.start
409
- out = DummyOutput.new
410
-
411
- assert !(db.pop(out)) # queue is empty
412
- assert_nil out.written
413
-
414
- c1 = DummyChunk.new('k1', 1)
415
- db.map = { 'k1' => c1 }
416
- db.push('k1')
417
- assert_equal 1, db.queue.size
418
-
419
- pop_return_value = nil
420
- c1.synchronize do
421
- pop_return_value = Thread.new {
422
- db.pop(out)
423
- }.value
424
- end
425
- assert !(pop_return_value) # a chunk is in queue, and it's owned by another thread
426
- assert_equal 1, db.queue.size
427
- assert_nil out.written
428
- assert_nil c1.purged
429
-
430
- c2 = DummyChunk.new('k2', 1)
431
- db.map['k2'] = c2
432
- db.push('k2')
433
- assert_equal 2, db.queue.size
434
-
435
- pop_return_value = nil
436
- c1.synchronize do
437
- pop_return_value = Thread.new {
438
- c2.synchronize do
439
- Thread.new {
440
- db.pop(out)
441
- }.value
442
- end
443
- }.value
444
- end
445
- assert !(pop_return_value) # two chunks are in queue, and these are owned by another thread
446
- assert_equal 2, db.queue.size
447
- assert_nil out.written
448
- assert_nil c1.purged
449
- assert_nil c2.purged
450
-
451
- c3 = DummyChunk.new('k3', 1)
452
- db.map['k3'] = c3
453
- db.push('k3')
454
- c4 = DummyChunk.new('k4', 1)
455
- db.map['k4'] = c4
456
- db.push('k4')
457
- assert_equal 4, db.queue.size
458
-
459
- # all of c[1234] are not empty
460
- queue_to_be_flushed_more = db.pop(out)
461
- assert queue_to_be_flushed_more # queue has more chunks
462
- assert c1.purged # the first chunk is shifted, and purged
463
- assert_equal c1, out.written # empty chunk is not passed to output plugin
464
- assert_equal 3, db.queue.size
465
-
466
- c3.synchronize do
467
- queue_to_be_flushed_more = Thread.new {
468
- db.pop(out)
469
- }.value
470
- end
471
- assert queue_to_be_flushed_more # c3, c4 exists in queue
472
- assert c2.purged
473
- assert_equal c2, out.written
474
- assert_equal 2, db.queue.size
475
-
476
- c3.synchronize do
477
- queue_to_be_flushed_more = Thread.new {
478
- db.pop(out)
479
- }.value
480
- end
481
- assert queue_to_be_flushed_more # c3 exists in queue
482
- assert c4.purged
483
- assert_equal c4, out.written
484
- assert_equal 1, db.queue.size
485
-
486
- queue_to_be_flushed_more = db.pop(out)
487
- assert c3.purged
488
- assert_equal c3, out.written
489
- assert_equal 0, db.queue.size
490
- end
491
-
492
- def test_write_chunk
493
- db = DummyBuffer.new
494
- db.start
495
-
496
- chunk = DummyChunk.new('k1', 1)
497
- out = DummyOutput.new
498
-
499
- assert_equal "return value", db.write_chunk(chunk, out)
500
- assert_equal chunk, out.written
501
- end
502
-
503
- def test_clear!
504
- db = DummyBuffer.new
505
- db.start
506
-
507
- keys = (1..5).map{ |i| "c_#{i}" }
508
- chunks = keys.map{ |k| DummyChunk.new(k, 1) }
509
- db.map = Hash[ [keys,chunks].transpose ]
510
-
511
- assert_equal 5, db.map.size
512
- assert_equal 0, db.queue.size
513
-
514
- db.clear!
515
- assert_equal 5, db.map.size
516
- assert_equal 0, db.queue.size
517
-
518
- keys.each do |k|
519
- db.push(k)
520
- end
521
- assert_equal 0, db.map.size
522
- assert_equal 5, db.queue.size
523
-
524
- db.clear!
525
- assert_equal 0, db.map.size
526
- assert_equal 0, db.queue.size
527
-
528
- assert chunks.reduce(true){|a,b| a && b.purged }
529
- end
530
-
531
- sub_test_case 'buffer_queue_full_action' do
532
- def dummy_buffer(action)
533
- db = DummyBuffer.new
534
- db.configure(
535
- "buffer_chunk_limit" => 1024,
536
- "buffer_queue_limit" => 1,
537
- "buffer_queue_full_action" => action
538
- )
539
- db.start
540
- db
541
- end
542
-
543
- def data
544
- @data ||= "a" * 1024
545
- end
546
-
547
- def chain
548
- @chain ||= DummyChain.new
549
- end
550
-
551
- def test_emit_with_exception
552
- db = dummy_buffer(:exception)
553
-
554
- assert !db.emit('key', data, chain)
555
- assert db.emit('key', data, chain)
556
-
557
- assert_raise(Fluent::BufferQueueLimitError) {
558
- assert db.emit('key', data, chain)
559
- }
560
- assert db.queue.size == 1
561
-
562
- assert !pop_chunk(db)
563
- assert db.queue.size == 0
564
-
565
- # queue is now empty so can emit data again
566
- assert db.emit('key', data, chain)
567
- end
568
-
569
- def test_emit_with_block
570
- db = dummy_buffer(:block)
571
-
572
- assert !db.emit('key', data, chain)
573
- assert db.emit('key', data, chain)
574
-
575
- begin
576
- # with block, emit events to full queue causes sleep loop
577
- Timeout.timeout(1) {
578
- assert db.emit('key', data, chain)
579
- }
580
- flunk("timeout must happen")
581
- rescue Timeout::Error => e
582
- end
583
- assert db.queue.size == 1
584
-
585
- assert !pop_chunk(db)
586
- assert db.queue.size == 0
587
-
588
- # queue is now empty so can emit data again
589
- assert db.emit('key', data, chain)
590
- end
591
-
592
- def test_emit_with_drop_oldest_chunk
593
- db = dummy_buffer(:drop_oldest_chunk)
594
-
595
- assert !db.emit('key', data, chain)
596
- assert db.emit('key', data, chain)
597
-
598
- # oldest (and only) chunk in queue is dropped before newer data is enqueued
599
- assert db.emit('key', data, chain)
600
-
601
- assert db.queue.size == 1
602
-
603
- assert !pop_chunk(db)
604
- assert db.queue.size == 0
605
-
606
- # queue is now empty so can emit data again
607
- assert db.emit('key', data, chain)
608
- end
609
-
610
- def pop_chunk(db)
611
- out = DummyOutput.new
612
- c1 = DummyChunk.new('k1', 1)
613
-
614
- pop_return_value = nil
615
- c1.synchronize do
616
- pop_return_value = Thread.new {
617
- db.pop(out)
618
- }.value
619
- end
620
- pop_return_value
621
- end
622
- end
623
- end
624
- end