fluentd 0.14.4-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fluentd might be problematic. Click here for more details.

Files changed (328) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE.md +6 -0
  3. data/.gitignore +26 -0
  4. data/.travis.yml +45 -0
  5. data/AUTHORS +2 -0
  6. data/CONTRIBUTING.md +35 -0
  7. data/COPYING +14 -0
  8. data/ChangeLog +276 -0
  9. data/Gemfile +9 -0
  10. data/README.md +51 -0
  11. data/Rakefile +53 -0
  12. data/Vagrantfile +17 -0
  13. data/appveyor.yml +41 -0
  14. data/bin/fluent-debug +5 -0
  15. data/example/copy_roundrobin.conf +39 -0
  16. data/example/filter_stdout.conf +22 -0
  17. data/example/in_forward.conf +11 -0
  18. data/example/in_http.conf +14 -0
  19. data/example/in_out_forward.conf +17 -0
  20. data/example/in_syslog.conf +15 -0
  21. data/example/in_tail.conf +14 -0
  22. data/example/in_tcp.conf +13 -0
  23. data/example/in_udp.conf +13 -0
  24. data/example/multi_filters.conf +61 -0
  25. data/example/out_buffered_null.conf +32 -0
  26. data/example/out_copy.conf +20 -0
  27. data/example/out_file.conf +13 -0
  28. data/example/out_forward.conf +35 -0
  29. data/example/out_forward_buf_file.conf +23 -0
  30. data/example/v0_12_filter.conf +78 -0
  31. data/example/v1_literal_example.conf +36 -0
  32. data/fluent.conf +139 -0
  33. data/fluentd.gemspec +51 -0
  34. data/lib/fluent/agent.rb +194 -0
  35. data/lib/fluent/command/bundler_injection.rb +45 -0
  36. data/lib/fluent/command/cat.rb +319 -0
  37. data/lib/fluent/command/debug.rb +102 -0
  38. data/lib/fluent/command/fluentd.rb +273 -0
  39. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  40. data/lib/fluent/compat/exec_util.rb +129 -0
  41. data/lib/fluent/compat/file_util.rb +54 -0
  42. data/lib/fluent/compat/filter.rb +68 -0
  43. data/lib/fluent/compat/formatter.rb +111 -0
  44. data/lib/fluent/compat/formatter_utils.rb +85 -0
  45. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  46. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  47. data/lib/fluent/compat/input.rb +49 -0
  48. data/lib/fluent/compat/output.rb +677 -0
  49. data/lib/fluent/compat/output_chain.rb +60 -0
  50. data/lib/fluent/compat/parser.rb +180 -0
  51. data/lib/fluent/compat/parser_utils.rb +40 -0
  52. data/lib/fluent/compat/propagate_default.rb +62 -0
  53. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  54. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  55. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  56. data/lib/fluent/compat/socket_util.rb +165 -0
  57. data/lib/fluent/compat/string_util.rb +34 -0
  58. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  59. data/lib/fluent/compat/type_converter.rb +90 -0
  60. data/lib/fluent/config.rb +56 -0
  61. data/lib/fluent/config/basic_parser.rb +123 -0
  62. data/lib/fluent/config/configure_proxy.rb +366 -0
  63. data/lib/fluent/config/dsl.rb +149 -0
  64. data/lib/fluent/config/element.rb +218 -0
  65. data/lib/fluent/config/error.rb +26 -0
  66. data/lib/fluent/config/literal_parser.rb +251 -0
  67. data/lib/fluent/config/parser.rb +107 -0
  68. data/lib/fluent/config/section.rb +212 -0
  69. data/lib/fluent/config/types.rb +136 -0
  70. data/lib/fluent/config/v1_parser.rb +190 -0
  71. data/lib/fluent/configurable.rb +176 -0
  72. data/lib/fluent/daemon.rb +15 -0
  73. data/lib/fluent/engine.rb +220 -0
  74. data/lib/fluent/env.rb +27 -0
  75. data/lib/fluent/event.rb +287 -0
  76. data/lib/fluent/event_router.rb +259 -0
  77. data/lib/fluent/filter.rb +21 -0
  78. data/lib/fluent/formatter.rb +23 -0
  79. data/lib/fluent/input.rb +21 -0
  80. data/lib/fluent/label.rb +38 -0
  81. data/lib/fluent/load.rb +36 -0
  82. data/lib/fluent/log.rb +445 -0
  83. data/lib/fluent/match.rb +141 -0
  84. data/lib/fluent/mixin.rb +31 -0
  85. data/lib/fluent/msgpack_factory.rb +62 -0
  86. data/lib/fluent/output.rb +26 -0
  87. data/lib/fluent/output_chain.rb +23 -0
  88. data/lib/fluent/parser.rb +23 -0
  89. data/lib/fluent/plugin.rb +161 -0
  90. data/lib/fluent/plugin/bare_output.rb +63 -0
  91. data/lib/fluent/plugin/base.rb +130 -0
  92. data/lib/fluent/plugin/buf_file.rb +154 -0
  93. data/lib/fluent/plugin/buf_memory.rb +34 -0
  94. data/lib/fluent/plugin/buffer.rb +603 -0
  95. data/lib/fluent/plugin/buffer/chunk.rb +160 -0
  96. data/lib/fluent/plugin/buffer/file_chunk.rb +323 -0
  97. data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
  98. data/lib/fluent/plugin/exec_util.rb +22 -0
  99. data/lib/fluent/plugin/file_util.rb +22 -0
  100. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  101. data/lib/fluent/plugin/filter.rb +93 -0
  102. data/lib/fluent/plugin/filter_grep.rb +75 -0
  103. data/lib/fluent/plugin/filter_record_transformer.rb +342 -0
  104. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  105. data/lib/fluent/plugin/formatter.rb +45 -0
  106. data/lib/fluent/plugin/formatter_csv.rb +47 -0
  107. data/lib/fluent/plugin/formatter_hash.rb +29 -0
  108. data/lib/fluent/plugin/formatter_json.rb +44 -0
  109. data/lib/fluent/plugin/formatter_ltsv.rb +41 -0
  110. data/lib/fluent/plugin/formatter_msgpack.rb +29 -0
  111. data/lib/fluent/plugin/formatter_out_file.rb +78 -0
  112. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  113. data/lib/fluent/plugin/formatter_stdout.rb +74 -0
  114. data/lib/fluent/plugin/in_debug_agent.rb +64 -0
  115. data/lib/fluent/plugin/in_dummy.rb +135 -0
  116. data/lib/fluent/plugin/in_exec.rb +149 -0
  117. data/lib/fluent/plugin/in_forward.rb +366 -0
  118. data/lib/fluent/plugin/in_gc_stat.rb +52 -0
  119. data/lib/fluent/plugin/in_http.rb +422 -0
  120. data/lib/fluent/plugin/in_monitor_agent.rb +401 -0
  121. data/lib/fluent/plugin/in_object_space.rb +90 -0
  122. data/lib/fluent/plugin/in_syslog.rb +204 -0
  123. data/lib/fluent/plugin/in_tail.rb +838 -0
  124. data/lib/fluent/plugin/in_tcp.rb +41 -0
  125. data/lib/fluent/plugin/in_udp.rb +37 -0
  126. data/lib/fluent/plugin/in_unix.rb +201 -0
  127. data/lib/fluent/plugin/input.rb +33 -0
  128. data/lib/fluent/plugin/multi_output.rb +95 -0
  129. data/lib/fluent/plugin/out_buffered_null.rb +59 -0
  130. data/lib/fluent/plugin/out_buffered_stdout.rb +70 -0
  131. data/lib/fluent/plugin/out_copy.rb +42 -0
  132. data/lib/fluent/plugin/out_exec.rb +114 -0
  133. data/lib/fluent/plugin/out_exec_filter.rb +393 -0
  134. data/lib/fluent/plugin/out_file.rb +167 -0
  135. data/lib/fluent/plugin/out_forward.rb +646 -0
  136. data/lib/fluent/plugin/out_null.rb +27 -0
  137. data/lib/fluent/plugin/out_relabel.rb +28 -0
  138. data/lib/fluent/plugin/out_roundrobin.rb +80 -0
  139. data/lib/fluent/plugin/out_stdout.rb +48 -0
  140. data/lib/fluent/plugin/out_stream.rb +130 -0
  141. data/lib/fluent/plugin/output.rb +1020 -0
  142. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  143. data/lib/fluent/plugin/parser.rb +175 -0
  144. data/lib/fluent/plugin/parser_apache.rb +28 -0
  145. data/lib/fluent/plugin/parser_apache2.rb +84 -0
  146. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  147. data/lib/fluent/plugin/parser_csv.rb +33 -0
  148. data/lib/fluent/plugin/parser_json.rb +79 -0
  149. data/lib/fluent/plugin/parser_ltsv.rb +50 -0
  150. data/lib/fluent/plugin/parser_multiline.rb +104 -0
  151. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  152. data/lib/fluent/plugin/parser_none.rb +36 -0
  153. data/lib/fluent/plugin/parser_regexp.rb +73 -0
  154. data/lib/fluent/plugin/parser_syslog.rb +82 -0
  155. data/lib/fluent/plugin/parser_tsv.rb +37 -0
  156. data/lib/fluent/plugin/socket_util.rb +22 -0
  157. data/lib/fluent/plugin/storage.rb +84 -0
  158. data/lib/fluent/plugin/storage_local.rb +132 -0
  159. data/lib/fluent/plugin/string_util.rb +22 -0
  160. data/lib/fluent/plugin_helper.rb +42 -0
  161. data/lib/fluent/plugin_helper/child_process.rb +298 -0
  162. data/lib/fluent/plugin_helper/compat_parameters.rb +224 -0
  163. data/lib/fluent/plugin_helper/event_emitter.rb +80 -0
  164. data/lib/fluent/plugin_helper/event_loop.rb +118 -0
  165. data/lib/fluent/plugin_helper/formatter.rb +149 -0
  166. data/lib/fluent/plugin_helper/inject.rb +125 -0
  167. data/lib/fluent/plugin_helper/parser.rb +147 -0
  168. data/lib/fluent/plugin_helper/retry_state.rb +177 -0
  169. data/lib/fluent/plugin_helper/storage.rb +331 -0
  170. data/lib/fluent/plugin_helper/thread.rb +147 -0
  171. data/lib/fluent/plugin_helper/timer.rb +90 -0
  172. data/lib/fluent/plugin_id.rb +63 -0
  173. data/lib/fluent/process.rb +504 -0
  174. data/lib/fluent/registry.rb +99 -0
  175. data/lib/fluent/root_agent.rb +314 -0
  176. data/lib/fluent/rpc.rb +94 -0
  177. data/lib/fluent/supervisor.rb +680 -0
  178. data/lib/fluent/system_config.rb +122 -0
  179. data/lib/fluent/test.rb +56 -0
  180. data/lib/fluent/test/base.rb +85 -0
  181. data/lib/fluent/test/driver/base.rb +179 -0
  182. data/lib/fluent/test/driver/base_owned.rb +70 -0
  183. data/lib/fluent/test/driver/base_owner.rb +125 -0
  184. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  185. data/lib/fluent/test/driver/filter.rb +57 -0
  186. data/lib/fluent/test/driver/formatter.rb +30 -0
  187. data/lib/fluent/test/driver/input.rb +31 -0
  188. data/lib/fluent/test/driver/multi_output.rb +52 -0
  189. data/lib/fluent/test/driver/output.rb +76 -0
  190. data/lib/fluent/test/driver/parser.rb +30 -0
  191. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  192. data/lib/fluent/test/filter_test.rb +77 -0
  193. data/lib/fluent/test/formatter_test.rb +65 -0
  194. data/lib/fluent/test/helpers.rb +79 -0
  195. data/lib/fluent/test/input_test.rb +172 -0
  196. data/lib/fluent/test/log.rb +73 -0
  197. data/lib/fluent/test/output_test.rb +156 -0
  198. data/lib/fluent/test/parser_test.rb +70 -0
  199. data/lib/fluent/time.rb +175 -0
  200. data/lib/fluent/timezone.rb +133 -0
  201. data/lib/fluent/unique_id.rb +39 -0
  202. data/lib/fluent/version.rb +21 -0
  203. data/lib/fluent/winsvc.rb +71 -0
  204. data/test/compat/test_calls_super.rb +166 -0
  205. data/test/compat/test_parser.rb +82 -0
  206. data/test/config/assertions.rb +42 -0
  207. data/test/config/test_config_parser.rb +507 -0
  208. data/test/config/test_configurable.rb +1194 -0
  209. data/test/config/test_configure_proxy.rb +386 -0
  210. data/test/config/test_dsl.rb +415 -0
  211. data/test/config/test_element.rb +403 -0
  212. data/test/config/test_literal_parser.rb +297 -0
  213. data/test/config/test_section.rb +184 -0
  214. data/test/config/test_system_config.rb +120 -0
  215. data/test/config/test_types.rb +171 -0
  216. data/test/helper.rb +119 -0
  217. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  218. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  219. data/test/plugin/data/2010/01/20100102.log +0 -0
  220. data/test/plugin/data/log/bar +0 -0
  221. data/test/plugin/data/log/foo/bar.log +0 -0
  222. data/test/plugin/data/log/test.log +0 -0
  223. data/test/plugin/test_bare_output.rb +118 -0
  224. data/test/plugin/test_base.rb +75 -0
  225. data/test/plugin/test_buf_file.rb +571 -0
  226. data/test/plugin/test_buf_memory.rb +42 -0
  227. data/test/plugin/test_buffer.rb +1200 -0
  228. data/test/plugin/test_buffer_chunk.rb +168 -0
  229. data/test/plugin/test_buffer_file_chunk.rb +771 -0
  230. data/test/plugin/test_buffer_memory_chunk.rb +265 -0
  231. data/test/plugin/test_file_util.rb +96 -0
  232. data/test/plugin/test_filter.rb +353 -0
  233. data/test/plugin/test_filter_grep.rb +119 -0
  234. data/test/plugin/test_filter_record_transformer.rb +600 -0
  235. data/test/plugin/test_filter_stdout.rb +211 -0
  236. data/test/plugin/test_formatter_csv.rb +94 -0
  237. data/test/plugin/test_formatter_json.rb +30 -0
  238. data/test/plugin/test_formatter_ltsv.rb +52 -0
  239. data/test/plugin/test_formatter_msgpack.rb +28 -0
  240. data/test/plugin/test_formatter_out_file.rb +95 -0
  241. data/test/plugin/test_formatter_single_value.rb +38 -0
  242. data/test/plugin/test_in_debug_agent.rb +28 -0
  243. data/test/plugin/test_in_dummy.rb +188 -0
  244. data/test/plugin/test_in_exec.rb +133 -0
  245. data/test/plugin/test_in_forward.rb +635 -0
  246. data/test/plugin/test_in_gc_stat.rb +39 -0
  247. data/test/plugin/test_in_http.rb +442 -0
  248. data/test/plugin/test_in_monitor_agent.rb +329 -0
  249. data/test/plugin/test_in_object_space.rb +64 -0
  250. data/test/plugin/test_in_syslog.rb +205 -0
  251. data/test/plugin/test_in_tail.rb +1001 -0
  252. data/test/plugin/test_in_tcp.rb +102 -0
  253. data/test/plugin/test_in_udp.rb +121 -0
  254. data/test/plugin/test_in_unix.rb +126 -0
  255. data/test/plugin/test_input.rb +122 -0
  256. data/test/plugin/test_multi_output.rb +180 -0
  257. data/test/plugin/test_out_buffered_null.rb +79 -0
  258. data/test/plugin/test_out_buffered_stdout.rb +122 -0
  259. data/test/plugin/test_out_copy.rb +160 -0
  260. data/test/plugin/test_out_exec.rb +155 -0
  261. data/test/plugin/test_out_exec_filter.rb +262 -0
  262. data/test/plugin/test_out_file.rb +383 -0
  263. data/test/plugin/test_out_forward.rb +590 -0
  264. data/test/plugin/test_out_null.rb +29 -0
  265. data/test/plugin/test_out_relabel.rb +28 -0
  266. data/test/plugin/test_out_roundrobin.rb +146 -0
  267. data/test/plugin/test_out_stdout.rb +92 -0
  268. data/test/plugin/test_out_stream.rb +93 -0
  269. data/test/plugin/test_output.rb +568 -0
  270. data/test/plugin/test_output_as_buffered.rb +1604 -0
  271. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  272. data/test/plugin/test_output_as_buffered_retries.rb +839 -0
  273. data/test/plugin/test_output_as_buffered_secondary.rb +817 -0
  274. data/test/plugin/test_output_as_standard.rb +374 -0
  275. data/test/plugin/test_owned_by.rb +35 -0
  276. data/test/plugin/test_parser_apache.rb +42 -0
  277. data/test/plugin/test_parser_apache2.rb +38 -0
  278. data/test/plugin/test_parser_apache_error.rb +45 -0
  279. data/test/plugin/test_parser_base.rb +32 -0
  280. data/test/plugin/test_parser_csv.rb +104 -0
  281. data/test/plugin/test_parser_json.rb +107 -0
  282. data/test/plugin/test_parser_labeled_tsv.rb +129 -0
  283. data/test/plugin/test_parser_multiline.rb +100 -0
  284. data/test/plugin/test_parser_nginx.rb +48 -0
  285. data/test/plugin/test_parser_none.rb +53 -0
  286. data/test/plugin/test_parser_regexp.rb +277 -0
  287. data/test/plugin/test_parser_syslog.rb +66 -0
  288. data/test/plugin/test_parser_time.rb +46 -0
  289. data/test/plugin/test_parser_tsv.rb +121 -0
  290. data/test/plugin/test_storage.rb +167 -0
  291. data/test/plugin/test_storage_local.rb +8 -0
  292. data/test/plugin/test_string_util.rb +26 -0
  293. data/test/plugin_helper/test_child_process.rb +608 -0
  294. data/test/plugin_helper/test_compat_parameters.rb +242 -0
  295. data/test/plugin_helper/test_event_emitter.rb +51 -0
  296. data/test/plugin_helper/test_event_loop.rb +52 -0
  297. data/test/plugin_helper/test_formatter.rb +252 -0
  298. data/test/plugin_helper/test_inject.rb +487 -0
  299. data/test/plugin_helper/test_parser.rb +263 -0
  300. data/test/plugin_helper/test_retry_state.rb +399 -0
  301. data/test/plugin_helper/test_storage.rb +521 -0
  302. data/test/plugin_helper/test_thread.rb +164 -0
  303. data/test/plugin_helper/test_timer.rb +131 -0
  304. data/test/scripts/exec_script.rb +32 -0
  305. data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
  306. data/test/scripts/fluent/plugin/out_test.rb +81 -0
  307. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  308. data/test/scripts/fluent/plugin/parser_known.rb +4 -0
  309. data/test/test_config.rb +179 -0
  310. data/test/test_configdsl.rb +148 -0
  311. data/test/test_event.rb +329 -0
  312. data/test/test_event_router.rb +331 -0
  313. data/test/test_event_time.rb +184 -0
  314. data/test/test_filter.rb +121 -0
  315. data/test/test_formatter.rb +319 -0
  316. data/test/test_input.rb +31 -0
  317. data/test/test_log.rb +572 -0
  318. data/test/test_match.rb +137 -0
  319. data/test/test_mixin.rb +351 -0
  320. data/test/test_output.rb +214 -0
  321. data/test/test_plugin_classes.rb +136 -0
  322. data/test/test_plugin_helper.rb +81 -0
  323. data/test/test_process.rb +48 -0
  324. data/test/test_root_agent.rb +278 -0
  325. data/test/test_supervisor.rb +339 -0
  326. data/test/test_time_formatter.rb +186 -0
  327. data/test/test_unique_id.rb +47 -0
  328. metadata +823 -0
@@ -0,0 +1,180 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin/multi_output'
3
+ require 'fluent/event'
4
+
5
+ require 'json'
6
+ require 'time'
7
+ require 'timeout'
8
+
9
+ module FluentPluginMultiOutputTest
10
+ class DummyMultiOutput < Fluent::Plugin::MultiOutput
11
+ attr_reader :events
12
+ def initialize
13
+ super
14
+ @events = []
15
+ end
16
+ def configure(conf)
17
+ super
18
+ end
19
+ def process(tag, es)
20
+ es.each do |time, record|
21
+ @events << [tag, time, record]
22
+ end
23
+ end
24
+ end
25
+ class DummyCompatMultiOutput < Fluent::Plugin::MultiOutput
26
+ def initialize
27
+ super
28
+ @compat = true
29
+ end
30
+ def configure(conf)
31
+ super
32
+ end
33
+ def process(tag, es)
34
+ # ...
35
+ end
36
+ end
37
+
38
+ class Dummy1Output < Fluent::Plugin::Output
39
+ Fluent::Plugin.register_output('dummy_test_multi_output_1', self)
40
+ attr_reader :configured
41
+ def configure(conf)
42
+ super
43
+ @configured = true
44
+ end
45
+ def process(tag, es)
46
+ end
47
+ end
48
+ class Dummy2Output < Fluent::Plugin::Output
49
+ Fluent::Plugin.register_output('dummy_test_multi_output_2', self)
50
+ attr_reader :configured
51
+ def configure(conf)
52
+ super
53
+ @configured = true
54
+ end
55
+ def process(tag, es)
56
+ end
57
+ end
58
+ class Dummy3Output < Fluent::Plugin::Output
59
+ Fluent::Plugin.register_output('dummy_test_multi_output_3', self)
60
+ attr_reader :configured
61
+ def configure(conf)
62
+ super
63
+ @configured = true
64
+ end
65
+ def process(tag, es)
66
+ end
67
+ end
68
+ class Dummy4Output < Fluent::Plugin::Output
69
+ Fluent::Plugin.register_output('dummy_test_multi_output_4', self)
70
+ attr_reader :configured
71
+ def configure(conf)
72
+ super
73
+ @configured = true
74
+ end
75
+ def process(tag, es)
76
+ end
77
+ end
78
+ end
79
+
80
+ class MultiOutputTest < Test::Unit::TestCase
81
+ def create_output(type=:multi)
82
+ case type
83
+ when :compat_multi
84
+ FluentPluginMultiOutputTest::DummyCompatMultiOutput.new
85
+ else
86
+ FluentPluginMultiOutputTest::DummyMultiOutput.new
87
+ end
88
+ end
89
+
90
+ sub_test_case 'basic multi output plugin' do
91
+ setup do
92
+ Fluent::Test.setup
93
+ @i = create_output()
94
+ end
95
+
96
+ teardown do
97
+ @i.log.out.reset
98
+ end
99
+
100
+ test '#configure raises error if <store> sections are missing' do
101
+ conf = config_element('ROOT', '', { '@type' => 'dummy_test_multi_output' }, [])
102
+ assert_raise Fluent::ConfigError do
103
+ @i.configure(conf)
104
+ end
105
+ end
106
+
107
+ test '#configure initialize child plugins and call these #configure' do
108
+ assert_equal [], @i.outputs
109
+
110
+ conf = config_element('ROOT', '', { '@type' => 'dummy_test_multi_output' },
111
+ [
112
+ config_element('store', '', { '@type' => 'dummy_test_multi_output_1' }),
113
+ config_element('store', '', { '@type' => 'dummy_test_multi_output_2' }),
114
+ config_element('store', '', { '@type' => 'dummy_test_multi_output_3' }),
115
+ config_element('store', '', { '@type' => 'dummy_test_multi_output_4' }),
116
+ ]
117
+ )
118
+ @i.configure(conf)
119
+
120
+ assert_equal 4, @i.outputs.size
121
+
122
+ assert @i.outputs[0].is_a? FluentPluginMultiOutputTest::Dummy1Output
123
+ assert @i.outputs[0].configured
124
+
125
+ assert @i.outputs[1].is_a? FluentPluginMultiOutputTest::Dummy2Output
126
+ assert @i.outputs[1].configured
127
+
128
+ assert @i.outputs[2].is_a? FluentPluginMultiOutputTest::Dummy3Output
129
+ assert @i.outputs[2].configured
130
+
131
+ assert @i.outputs[3].is_a? FluentPluginMultiOutputTest::Dummy4Output
132
+ assert @i.outputs[3].configured
133
+ end
134
+
135
+ test '#configure warns if "type" is used in <store> sections instead of "@type"' do
136
+ assert_equal [], @i.log.out.logs
137
+
138
+ conf = config_element('ROOT', '', { '@type' => 'dummy_test_multi_output' },
139
+ [
140
+ config_element('store', '', { 'type' => 'dummy_test_multi_output_1' }),
141
+ config_element('store', '', { 'type' => 'dummy_test_multi_output_2' }),
142
+ config_element('store', '', { 'type' => 'dummy_test_multi_output_3' }),
143
+ config_element('store', '', { 'type' => 'dummy_test_multi_output_4' }),
144
+ ]
145
+ )
146
+ @i.configure(conf)
147
+ assert_equal 4, @i.outputs.size
148
+
149
+ logs = @i.log.out.logs
150
+ assert{ logs.select{|log| log.include?('[warn]') && log.include?("'type' is deprecated parameter name. use '@type' instead.") }.size == 4 }
151
+ end
152
+
153
+ test '#emit_events calls #process always' do
154
+ conf = config_element('ROOT', '', { '@type' => 'dummy_test_multi_output' },
155
+ [
156
+ config_element('store', '', { '@type' => 'dummy_test_multi_output_1' }),
157
+ config_element('store', '', { '@type' => 'dummy_test_multi_output_2' }),
158
+ config_element('store', '', { '@type' => 'dummy_test_multi_output_3' }),
159
+ config_element('store', '', { '@type' => 'dummy_test_multi_output_4' }),
160
+ ]
161
+ )
162
+ @i.configure(conf)
163
+ @i.start
164
+
165
+ assert @i.events.empty?
166
+
167
+ @i.emit_events(
168
+ 'test.tag',
169
+ Fluent::ArrayEventStream.new(
170
+ [
171
+ [event_time(), {"message" => "multi test 1"}],
172
+ [event_time(), {"message" => "multi test 1"}],
173
+ ]
174
+ )
175
+ )
176
+
177
+ assert_equal 2, @i.events.size
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,79 @@
1
+ require_relative '../helper'
2
+ require 'fluent/test/driver/output'
3
+ require 'fluent/plugin/out_buffered_null'
4
+
5
+ class BufferedNullOutputTestCase < Test::Unit::TestCase
6
+ sub_test_case 'BufferedNullOutput' do
7
+ test 'default chunk limit size is 100' do
8
+ d = Fluent::Test::Driver::Output.new(Fluent::Plugin::BufferedNullOutput).configure('')
9
+ assert_equal 10 * 1024, d.instance.buffer_config.chunk_limit_size
10
+ assert d.instance.buffer_config.flush_at_shutdown
11
+ assert_equal ['tag'], d.instance.buffer_config.chunk_keys
12
+ assert d.instance.chunk_key_tag
13
+ assert !d.instance.chunk_key_time
14
+ assert_equal [], d.instance.chunk_keys
15
+ end
16
+
17
+ test 'writes standard formattted chunks' do
18
+ d = Fluent::Test::Driver::Output.new(Fluent::Plugin::BufferedNullOutput).configure('')
19
+ t = event_time("2016-05-23 00:22:13 -0800")
20
+ d.run(default_tag: 'test', flush: true) do
21
+ d.feed(t, {"message" => "null null null"})
22
+ d.feed(t, {"message" => "null null"})
23
+ d.feed(t, {"message" => "null"})
24
+ end
25
+
26
+ assert_equal 3, d.instance.emit_count
27
+ assert_equal 3, d.instance.emit_records
28
+ end
29
+
30
+ test 'check for chunk passed to #write' do
31
+ d = Fluent::Test::Driver::Output.new(Fluent::Plugin::BufferedNullOutput).configure('')
32
+ data = []
33
+ d.instance.feed_proc = ->(chunk){ data << [chunk.unique_id, chunk.metadata.tag, chunk.read] }
34
+
35
+ t = event_time("2016-05-23 00:22:13 -0800")
36
+ d.run(default_tag: 'test', flush: true) do
37
+ d.feed(t, {"message" => "null null null"})
38
+ d.feed(t, {"message" => "null null"})
39
+ d.feed(t, {"message" => "null"})
40
+ end
41
+
42
+ assert_equal 1, data.size
43
+ _, tag, binary = data.first
44
+ events = []
45
+ Fluent::MessagePackFactory.unpacker.feed_each(binary){|obj| events << obj }
46
+ assert_equal 'test', tag
47
+ assert_equal [ [t, {"message" => "null null null"}], [t, {"message" => "null null"}], [t, {"message" => "null"}] ], events
48
+ end
49
+
50
+ test 'check for chunk passed to #try_write' do
51
+ d = Fluent::Test::Driver::Output.new(Fluent::Plugin::BufferedNullOutput).configure('')
52
+ data = []
53
+ d.instance.feed_proc = ->(chunk){ data << [chunk.unique_id, chunk.metadata.tag, chunk.read] }
54
+ d.instance.delayed = true
55
+
56
+ t = event_time("2016-05-23 00:22:13 -0800")
57
+ d.run(default_tag: 'test', flush: true, shutdown: false) do
58
+ d.feed(t, {"message" => "null null null"})
59
+ d.feed(t, {"message" => "null null"})
60
+ d.feed(t, {"message" => "null"})
61
+ end
62
+
63
+ assert_equal 1, data.size
64
+ chunk_id, tag, binary = data.first
65
+ events = []
66
+ Fluent::MessagePackFactory.unpacker.feed_each(binary){|obj| events << obj }
67
+ assert_equal 'test', tag
68
+ assert_equal [ [t, {"message" => "null null null"}], [t, {"message" => "null null"}], [t, {"message" => "null"}] ], events
69
+
70
+ assert_equal [chunk_id], d.instance.buffer.dequeued.keys
71
+
72
+ d.instance.commit_write(chunk_id)
73
+
74
+ assert_equal [], d.instance.buffer.dequeued.keys
75
+
76
+ d.instance_shutdown
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,122 @@
1
+ require_relative '../helper'
2
+ require 'fluent/test/driver/output'
3
+ require 'fluent/plugin/out_buffered_stdout'
4
+
5
+ class BufferedStdoutOutputTest < Test::Unit::TestCase
6
+ def setup
7
+ Fluent::Test.setup
8
+ end
9
+
10
+ CONFIG = %[
11
+ ]
12
+
13
+ def create_driver(conf = CONFIG)
14
+ Fluent::Test::Driver::Output.new(Fluent::Plugin::BufferedStdoutOutput).configure(conf)
15
+ end
16
+
17
+ test 'default configure' do
18
+ d = create_driver
19
+ assert_equal [], d.instance.formatter_configs
20
+ assert_equal 10 * 1024, d.instance.buffer_config.chunk_limit_size
21
+ assert d.instance.buffer_config.flush_at_shutdown
22
+ assert_equal ['tag'], d.instance.buffer_config.chunk_keys
23
+ assert d.instance.chunk_key_tag
24
+ assert !d.instance.chunk_key_time
25
+ assert_equal [], d.instance.chunk_keys
26
+ end
27
+
28
+ test 'configure with output_type' do
29
+ d = create_driver(CONFIG + "\noutput_type json")
30
+ assert_equal 'json', d.instance.formatter_configs.first[:@type]
31
+
32
+ d = create_driver(CONFIG + "\noutput_type hash")
33
+ assert_equal 'hash', d.instance.formatter_configs.first[:@type]
34
+
35
+ assert_raise(Fluent::ConfigError) do
36
+ d = create_driver(CONFIG + "\noutput_type foo")
37
+ end
38
+ end
39
+
40
+ sub_test_case "emit with default config" do
41
+ test '#write(synchronous)' do
42
+ d = create_driver
43
+ time = event_time()
44
+
45
+ out = capture_log do
46
+ d.run(default_tag: 'test', flush: true) do
47
+ d.feed(time, {'test' => 'test'})
48
+ end
49
+ end
50
+ assert_equal "#{Time.at(time).localtime} test: {\"test\":\"test\"}\n", out
51
+ end
52
+ end
53
+
54
+ sub_test_case "emit json" do
55
+ data('oj' => 'oj', 'yajl' => 'yajl')
56
+ test '#write(synchronous)' do |data|
57
+ d = create_driver(CONFIG + "\noutput_type json\njson_parser #{data}")
58
+ time = event_time()
59
+
60
+ out = capture_log do
61
+ d.run(default_tag: 'test', flush: true) do
62
+ d.feed(time, {'test' => 'test'})
63
+ end
64
+ end
65
+ assert_equal "#{Time.at(time).localtime} test: {\"test\":\"test\"}\n", out
66
+ end
67
+
68
+ data('oj' => 'oj', 'yajl' => 'yajl')
69
+ test '#try_write(asynchronous)' do |data|
70
+ d = create_driver(CONFIG + "\noutput_type json\njson_parser #{data}")
71
+ time = event_time()
72
+ d.instance.delayed = true
73
+
74
+ out = capture_log do
75
+ d.run(default_tag: 'test', flush: true, shutdown: false) do
76
+ d.feed(time, {'test' => 'test'})
77
+ end
78
+ end
79
+
80
+ assert_equal "#{Time.at(time).localtime} test: {\"test\":\"test\"}\n", out
81
+ end
82
+ end
83
+
84
+ sub_test_case 'emit hash' do
85
+ test '#write(synchronous)' do
86
+ d = create_driver(CONFIG + "\noutput_type hash")
87
+ time = event_time()
88
+
89
+ out = capture_log do
90
+ d.run(default_tag: 'test', flush: true) do
91
+ d.feed(time, {'test' => 'test'})
92
+ end
93
+ end
94
+
95
+ assert_equal "#{Time.at(time).localtime} test: {\"test\"=>\"test\"}\n", out
96
+ end
97
+
98
+ test '#try_write(asynchronous)' do
99
+ d = create_driver(CONFIG + "\noutput_type hash")
100
+ time = event_time()
101
+ d.instance.delayed = true
102
+
103
+ out = capture_log do
104
+ d.run(default_tag: 'test', flush: true, shutdown: false) do
105
+ d.feed(time, {'test' => 'test'})
106
+ end
107
+ end
108
+
109
+ assert_equal "#{Time.at(time).localtime} test: {\"test\"=>\"test\"}\n", out
110
+ end
111
+ end
112
+
113
+ # Capture the log output of the block given
114
+ def capture_log(&block)
115
+ tmp = $log
116
+ $log = StringIO.new
117
+ yield
118
+ return $log.string
119
+ ensure
120
+ $log = tmp
121
+ end
122
+ end
@@ -0,0 +1,160 @@
1
+ require_relative '../helper'
2
+ require 'fluent/test/driver/multi_output'
3
+ require 'fluent/plugin/out_copy'
4
+ require 'fluent/event'
5
+
6
+ class CopyOutputTest < Test::Unit::TestCase
7
+ class << self
8
+ def startup
9
+ $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'scripts'))
10
+ require 'fluent/plugin/out_test'
11
+ require 'fluent/plugin/out_test2'
12
+ end
13
+
14
+ def shutdown
15
+ $LOAD_PATH.shift
16
+ end
17
+ end
18
+
19
+ def setup
20
+ Fluent::Test.setup
21
+ end
22
+
23
+ CONFIG = %[
24
+ <store>
25
+ @type test
26
+ name c0
27
+ </store>
28
+ <store>
29
+ @type test2
30
+ name c1
31
+ </store>
32
+ <store>
33
+ @type test
34
+ name c2
35
+ </store>
36
+ ]
37
+
38
+ def create_driver(conf = CONFIG)
39
+ Fluent::Test::Driver::MultiOutput.new(Fluent::Plugin::CopyOutput).configure(conf)
40
+ end
41
+
42
+ def test_configure
43
+ d = create_driver
44
+
45
+ outputs = d.instance.outputs
46
+ assert_equal 3, outputs.size
47
+ assert_equal Fluent::Plugin::TestOutput, outputs[0].class
48
+ assert_equal Fluent::Plugin::Test2Output, outputs[1].class
49
+ assert_equal Fluent::Plugin::TestOutput, outputs[2].class
50
+ assert_equal "c0", outputs[0].name
51
+ assert_equal "c1", outputs[1].name
52
+ assert_equal "c2", outputs[2].name
53
+ end
54
+
55
+ def test_feed_events
56
+ d = create_driver
57
+
58
+ assert !d.instance.outputs[0].has_router?
59
+ assert_not_nil d.instance.outputs[1].router
60
+ assert !d.instance.outputs[2].has_router?
61
+
62
+ time = event_time("2011-01-02 13:14:15 UTC")
63
+ d.run(default_tag: 'test') do
64
+ d.feed(time, {"a" => 1})
65
+ d.feed(time, {"a" => 2})
66
+ end
67
+
68
+ d.instance.outputs.each {|o|
69
+ assert_equal [ [time, {"a"=>1}], [time, {"a"=>2}] ], o.events
70
+ }
71
+ end
72
+
73
+ def test_msgpack_unpacker_cache_bug_for_msgpack_event_stream
74
+ d = create_driver
75
+
76
+ time = event_time("2011-01-02 13:14:15 UTC")
77
+ source = Fluent::ArrayEventStream.new([ [time, {"a" => 1}], [time, {"a" => 2}] ])
78
+ es = Fluent::MessagePackEventStream.new(source.to_msgpack_stream)
79
+
80
+ d.run(default_tag: 'test') do
81
+ d.feed(es)
82
+ end
83
+
84
+ d.instance.outputs.each { |o|
85
+ assert_equal [ [time, {"a"=>1}], [time, {"a"=>2}] ], o.events
86
+ }
87
+ end
88
+
89
+ def create_event_test_driver(does_deep_copy = false)
90
+ config = %[
91
+ deep_copy #{does_deep_copy}
92
+ <store>
93
+ @type test
94
+ name output1
95
+ </store>
96
+ <store>
97
+ @type test
98
+ name output2
99
+ </store>
100
+ ]
101
+
102
+ d = Fluent::Test::Driver::MultiOutput.new(Fluent::Plugin::CopyOutput).configure(config)
103
+ d.instance.outputs[0].define_singleton_method(:process) do |tag, es|
104
+ es.each do |time, record|
105
+ record['foo'] = 'bar'
106
+ end
107
+ super(tag, es)
108
+ end
109
+ d
110
+ end
111
+
112
+ time = event_time("2013-05-26 06:37:22 UTC")
113
+ mes0 = Fluent::MultiEventStream.new
114
+ mes0.add(time, {"a" => 1})
115
+ mes0.add(time, {"b" => 1})
116
+ mes1 = Fluent::MultiEventStream.new
117
+ mes1.add(time, {"a" => 1})
118
+ mes1.add(time, {"b" => 1})
119
+
120
+ data(
121
+ "OneEventStream without deep_copy" => [false, Fluent::OneEventStream.new(time, {"a" => 1})],
122
+ "OneEventStream with deep_copy" => [true, Fluent::OneEventStream.new(time, {"a" => 1})],
123
+ "ArrayEventStream without deep_copy" => [false, Fluent::ArrayEventStream.new([ [time, {"a" => 1}], [time, {"b" => 2}] ])],
124
+ "ArrayEventStream with deep_copy" => [true, Fluent::ArrayEventStream.new([ [time, {"a" => 1}], [time, {"b" => 2}] ])],
125
+ "MultiEventStream without deep_copy" => [false, mes0],
126
+ "MultiEventStream with deep_copy" => [true, mes1],
127
+ )
128
+ def test_deep_copy_controls_shallow_or_deep_copied(data)
129
+ does_deep_copy, es = data
130
+
131
+ d = create_event_test_driver(does_deep_copy)
132
+
133
+ d.run(default_tag: 'test') do
134
+ d.feed(es)
135
+ end
136
+
137
+ events = d.instance.outputs.map(&:events)
138
+
139
+ if does_deep_copy
140
+ events[0].each_with_index do |entry0, i|
141
+ record0 = entry0.last
142
+ record1 = events[1][i].last
143
+
144
+ assert{ record0.object_id != record1.object_id }
145
+ assert_equal "bar", record0["foo"]
146
+ assert !record1.has_key?("foo")
147
+ end
148
+ else
149
+ events[0].each_with_index do |entry0, i|
150
+ record0 = entry0.last
151
+ record1 = events[1][i].last
152
+
153
+ assert{ record0.object_id == record1.object_id }
154
+ assert_equal "bar", record0["foo"]
155
+ assert_equal "bar", record1["foo"]
156
+ end
157
+ end
158
+ end
159
+ end
160
+