fluentd 0.14.4-x86-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,45 @@
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 'rbconfig'
18
+
19
+ if ENV['BUNDLE_BIN_PATH']
20
+ puts 'error: You seem to use `bundle exec` already.'
21
+ exit 1
22
+ else
23
+ begin
24
+ bundle_bin = Gem::Specification.find_by_name('bundler').bin_file('bundle')
25
+ rescue Gem::LoadError => e
26
+ puts "error: #{e}"
27
+ exit 1
28
+ end
29
+ ruby_bin = RbConfig.ruby
30
+ system("#{ruby_bin} #{bundle_bin} install")
31
+ unless $?.success?
32
+ exit $?.exitstatus
33
+ end
34
+
35
+ cmdline = [
36
+ ruby_bin,
37
+ bundle_bin,
38
+ 'exec',
39
+ ruby_bin,
40
+ File.expand_path(File.join(File.dirname(__FILE__), 'fluentd.rb')),
41
+ ] + ARGV
42
+
43
+ exec *cmdline
44
+ exit! 127
45
+ end
@@ -0,0 +1,319 @@
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 'optparse'
18
+ require 'fluent/env'
19
+
20
+ op = OptionParser.new
21
+
22
+ op.banner += " <tag>"
23
+
24
+ port = 24224
25
+ host = '127.0.0.1'
26
+ unix = false
27
+ socket_path = Fluent::DEFAULT_SOCKET_PATH
28
+
29
+ config_path = Fluent::DEFAULT_CONFIG_PATH
30
+ format = 'json'
31
+ message_key = 'message'
32
+
33
+ op.on('-p', '--port PORT', "fluent tcp port (default: #{port})", Integer) {|i|
34
+ port = i
35
+ }
36
+
37
+ op.on('-h', '--host HOST', "fluent host (default: #{host})") {|s|
38
+ host = s
39
+ }
40
+
41
+ op.on('-u', '--unix', "use unix socket instead of tcp", TrueClass) {|b|
42
+ unix = b
43
+ }
44
+
45
+ op.on('-s', '--socket PATH', "unix socket path (default: #{socket_path})") {|s|
46
+ socket_path = s
47
+ }
48
+
49
+ op.on('-f', '--format FORMAT', "input format (default: #{format})") {|s|
50
+ format = s
51
+ }
52
+
53
+ op.on('--json', "same as: -f json", TrueClass) {|b|
54
+ format = 'json'
55
+ }
56
+
57
+ op.on('--msgpack', "same as: -f msgpack", TrueClass) {|b|
58
+ format = 'msgpack'
59
+ }
60
+
61
+ op.on('--none', "same as: -f none", TrueClass) {|b|
62
+ format = 'none'
63
+ }
64
+
65
+ op.on('--message-key KEY', "key field for none format (default: #{message_key})") {|s|
66
+ message_key = s
67
+ }
68
+
69
+ (class << self; self; end).module_eval do
70
+ define_method(:usage) do |msg|
71
+ puts op.to_s
72
+ puts "error: #{msg}" if msg
73
+ exit 1
74
+ end
75
+ end
76
+
77
+ begin
78
+ op.parse!(ARGV)
79
+
80
+ if ARGV.length != 1
81
+ usage nil
82
+ end
83
+
84
+ tag = ARGV.shift
85
+
86
+ rescue
87
+ usage $!.to_s
88
+ end
89
+
90
+
91
+ require 'thread'
92
+ require 'monitor'
93
+ require 'socket'
94
+ require 'yajl'
95
+ require 'msgpack'
96
+
97
+
98
+ class Writer
99
+ include MonitorMixin
100
+
101
+ class TimerThread
102
+ def initialize(writer)
103
+ @writer = writer
104
+ end
105
+
106
+ def start
107
+ @finish = false
108
+ @thread = Thread.new(&method(:run))
109
+ end
110
+
111
+ def shutdown
112
+ @finish = true
113
+ @thread.join
114
+ end
115
+
116
+ def run
117
+ until @finish
118
+ sleep 1
119
+ @writer.on_timer
120
+ end
121
+ end
122
+ end
123
+
124
+ def initialize(tag, connector)
125
+ @tag = tag
126
+ @connector = connector
127
+ @socket = false
128
+
129
+ @socket_time = Time.now.to_i
130
+ @socket_ttl = 10 # TODO
131
+ @error_history = []
132
+
133
+ @pending = []
134
+ @pending_limit = 1024 # TODO
135
+ @retry_wait = 1
136
+ @retry_limit = 5 # TODO
137
+
138
+ super()
139
+ end
140
+
141
+ def write(record)
142
+ if record.class != Hash
143
+ raise ArgumentError, "Input must be a map (got #{record.class})"
144
+ end
145
+
146
+ entry = [Time.now.to_i, record]
147
+ synchronize {
148
+ unless write_impl([entry])
149
+ # write failed
150
+ @pending.push(entry)
151
+
152
+ while @pending.size > @pending_limit
153
+ # exceeds pending limit; trash oldest record
154
+ time, record = @pending.shift
155
+ abort_message(time, record)
156
+ end
157
+ end
158
+ }
159
+ end
160
+
161
+ def on_timer
162
+ now = Time.now.to_i
163
+
164
+ synchronize {
165
+ unless @pending.empty?
166
+ # flush pending records
167
+ if write_impl(@pending)
168
+ # write succeeded
169
+ @pending.clear
170
+ end
171
+ end
172
+
173
+ if @socket && @socket_time + @socket_ttl < now
174
+ # socket is not used @socket_ttl seconds
175
+ close
176
+ end
177
+ }
178
+ end
179
+
180
+ def close
181
+ @socket.close
182
+ @socket = nil
183
+ end
184
+
185
+ def start
186
+ @timer = TimerThread.new(self)
187
+ @timer.start
188
+ self
189
+ end
190
+
191
+ def shutdown
192
+ @timer.shutdown
193
+ end
194
+
195
+ private
196
+ def write_impl(array)
197
+ socket = get_socket
198
+ unless socket
199
+ return false
200
+ end
201
+
202
+ begin
203
+ socket.write [@tag, array].to_msgpack
204
+ socket.flush
205
+ rescue
206
+ $stderr.puts "write failed: #{$!}"
207
+ close
208
+ return false
209
+ end
210
+
211
+ return true
212
+ end
213
+
214
+ def get_socket
215
+ unless @socket
216
+ unless try_connect
217
+ return nil
218
+ end
219
+ end
220
+
221
+ @socket_time = Time.now.to_i
222
+ return @socket
223
+ end
224
+
225
+ def try_connect
226
+ now = Time.now.to_i
227
+
228
+ unless @error_history.empty?
229
+ # wait before re-connecting
230
+ wait = @retry_wait * (2 ** (@error_history.size-1))
231
+ if now <= @socket_time + wait
232
+ return false
233
+ end
234
+ end
235
+
236
+ begin
237
+ @socket = @connector.call
238
+ @error_history.clear
239
+ return true
240
+
241
+ rescue
242
+ $stderr.puts "connect failed: #{$!}"
243
+ @error_history << $!
244
+ @socket_time = now
245
+
246
+ if @retry_limit < @error_history.size
247
+ # abort all pending records
248
+ @pending.each {|(time, record)|
249
+ abort_message(time, record)
250
+ }
251
+ @pending.clear
252
+ @error_history.clear
253
+ end
254
+
255
+ return false
256
+ end
257
+ end
258
+
259
+ def abort_message(time, record)
260
+ $stdout.puts "!#{time}:#{Yajl.dump(record)}"
261
+ end
262
+ end
263
+
264
+
265
+ if unix
266
+ connector = Proc.new {
267
+ UNIXSocket.open(socket_path)
268
+ }
269
+ else
270
+ connector = Proc.new {
271
+ TCPSocket.new(host, port)
272
+ }
273
+ end
274
+
275
+ w = Writer.new(tag, connector)
276
+ w.start
277
+
278
+ case format
279
+ when 'json'
280
+ begin
281
+ while line = $stdin.gets
282
+ record = Yajl.load(line)
283
+ w.write(record)
284
+ end
285
+ rescue
286
+ $stderr.puts $!
287
+ exit 1
288
+ end
289
+
290
+ when 'msgpack'
291
+ require 'fluent/engine'
292
+
293
+ begin
294
+ u = Fluent::Engine.msgpack_factory.unpacker($stdin)
295
+ u.each {|record|
296
+ w.write(record)
297
+ }
298
+ rescue EOFError
299
+ rescue
300
+ $stderr.puts $!
301
+ exit 1
302
+ end
303
+
304
+ when 'none'
305
+ begin
306
+ while line = $stdin.gets
307
+ record = { message_key => line.chomp }
308
+ w.write(record)
309
+ end
310
+ rescue
311
+ $stderr.puts $!
312
+ exit 1
313
+ end
314
+
315
+ else
316
+ $stderr.puts "Unknown format '#{format}'"
317
+ exit 1
318
+ end
319
+
@@ -0,0 +1,102 @@
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 'optparse'
18
+
19
+ op = OptionParser.new
20
+
21
+ host = '127.0.0.1'
22
+ port = 24230
23
+ unix = nil
24
+
25
+ op.on('-h', '--host HOST', "fluent host (default: #{host})") {|s|
26
+ host = s
27
+ }
28
+
29
+ op.on('-p', '--port PORT', "debug_agent tcp port (default: #{port})", Integer) {|i|
30
+ port = i
31
+ }
32
+
33
+ op.on('-u', '--unix PATH', "use unix socket instead of tcp") {|b|
34
+ unix = b
35
+ }
36
+
37
+ (class << self; self; end).module_eval do
38
+ define_method(:usage) do |msg|
39
+ puts op.to_s
40
+ puts "error: #{msg}" if msg
41
+ exit 1
42
+ end
43
+ end
44
+
45
+ begin
46
+ op.parse!(ARGV)
47
+
48
+ if ARGV.length != 0
49
+ usage nil
50
+ end
51
+ rescue
52
+ usage $!.to_s
53
+ end
54
+
55
+ require 'drb/drb'
56
+
57
+ if unix
58
+ uri = "drbunix:#{unix}"
59
+ else
60
+ uri = "druby://#{host}:#{port}"
61
+ end
62
+
63
+ require 'fluent/log'
64
+ require 'fluent/engine'
65
+ require 'fluent/system_config'
66
+ require 'serverengine'
67
+
68
+ include Fluent::SystemConfig::Mixin
69
+
70
+ dl_opts = {}
71
+ dl_opts[:log_level] = ServerEngine::DaemonLogger::TRACE
72
+ logger = ServerEngine::DaemonLogger.new(STDERR, dl_opts)
73
+ $log = Fluent::Log.new(logger)
74
+ Fluent::Engine.init(system_config)
75
+
76
+ DRb::DRbObject.class_eval do
77
+ undef_method :methods
78
+ undef_method :instance_eval
79
+ undef_method :instance_variables
80
+ undef_method :instance_variable_get
81
+ end
82
+
83
+ remote_engine = DRb::DRbObject.new_with_uri(uri)
84
+
85
+ Fluent.module_eval do
86
+ remove_const(:Engine)
87
+ const_set(:Engine, remote_engine)
88
+ end
89
+
90
+ include Fluent
91
+
92
+ puts "Connected to #{uri}."
93
+ puts "Usage:"
94
+ puts " Fluent::Engine.match('some.tag').output : get an output plugin instance"
95
+ puts " Fluent::Engine.sources[i] : get input plugin instances"
96
+ puts " Fluent::Plugin.load_plugin(type,name) : load plugin class (use this if you get DRb::DRbUnknown)"
97
+ puts ""
98
+
99
+ Encoding.default_internal = nil if Encoding.respond_to?(:default_internal)
100
+
101
+ require 'irb'
102
+ IRB.start