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,99 @@
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 'fluent/config/error'
18
+
19
+ module Fluent
20
+ class Registry
21
+ DEFAULT_PLUGIN_PATH = File.expand_path('../plugin', __FILE__)
22
+
23
+ def initialize(kind, search_prefix, dir_search_prefix: nil)
24
+ @kind = kind
25
+ @search_prefix = search_prefix
26
+ @dir_search_prefix = dir_search_prefix
27
+ @map = {}
28
+ @paths = [DEFAULT_PLUGIN_PATH]
29
+ end
30
+
31
+ attr_reader :kind, :paths
32
+
33
+ def register(type, value)
34
+ type = type.to_sym
35
+ @map[type] = value
36
+ end
37
+
38
+ def lookup(type)
39
+ type = type.to_sym
40
+ if value = @map[type]
41
+ return value
42
+ end
43
+ search(type)
44
+ if value = @map[type]
45
+ return value
46
+ end
47
+ raise ConfigError, "Unknown #{@kind} plugin '#{type}'. Run 'gem search -rd fluent-plugin' to find plugins" # TODO error class
48
+ end
49
+
50
+ def reverse_lookup(value)
51
+ @map.each do |k, v|
52
+ return k if v == value
53
+ end
54
+ nil
55
+ end
56
+
57
+ def search(type)
58
+ # search from additional plugin directories
59
+ if @dir_search_prefix
60
+ path = "#{@dir_search_prefix}#{type}"
61
+ files = @paths.map { |lp|
62
+ lpath = File.expand_path(File.join(lp, "#{path}.rb"))
63
+ File.exist?(lpath) ? lpath : nil
64
+ }.compact
65
+ unless files.empty?
66
+ # prefer newer version
67
+ require files.sort.last
68
+ return
69
+ end
70
+ end
71
+
72
+ path = "#{@search_prefix}#{type}"
73
+
74
+ # prefer LOAD_PATH than gems
75
+ files = $LOAD_PATH.map { |lp|
76
+ lpath = File.expand_path(File.join(lp, "#{path}.rb"))
77
+ File.exist?(lpath) ? lpath : nil
78
+ }.compact
79
+ unless files.empty?
80
+ # prefer newer version
81
+ require files.sort.last
82
+ return
83
+ end
84
+
85
+ specs = Gem::Specification.find_all { |spec|
86
+ spec.contains_requirable_file? path
87
+ }
88
+
89
+ # prefer newer version
90
+ specs = specs.sort_by { |spec| spec.version }
91
+ if spec = specs.last
92
+ spec.require_paths.each { |lib|
93
+ file = "#{spec.full_gem_path}/#{lib}/#{path}"
94
+ require file
95
+ }
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,314 @@
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 'delegate'
18
+
19
+ require 'fluent/config/error'
20
+ require 'fluent/agent'
21
+ require 'fluent/label'
22
+ require 'fluent/plugin'
23
+ require 'fluent/system_config'
24
+ require 'fluent/time'
25
+
26
+ module Fluent
27
+ #
28
+ # Fluentd forms a tree structure to manage plugins:
29
+ #
30
+ # RootAgent
31
+ # |
32
+ # +------------+-------------+-------------+
33
+ # | | | |
34
+ # <label> <source> <filter> <match>
35
+ # |
36
+ # +----+----+
37
+ # | |
38
+ # <filter> <match>
39
+ #
40
+ # Relation:
41
+ # * RootAgent has many <label>, <source>, <filter> and <match>
42
+ # * <label> has many <match> and <filter>
43
+ #
44
+ # Next step: `fluentd/agent.rb`
45
+ # Next step: 'fluentd/label.rb'
46
+ #
47
+ class RootAgent < Agent
48
+ ERROR_LABEL = "@ERROR".freeze # @ERROR is built-in error label
49
+
50
+ def initialize(log:, system_config: SystemConfig.new)
51
+ super(log: log)
52
+
53
+ @labels = {}
54
+ @inputs = []
55
+ @suppress_emit_error_log_interval = 0
56
+ @next_emit_error_log_time = nil
57
+ @without_source = false
58
+
59
+ suppress_interval(system_config.emit_error_log_interval) unless system_config.emit_error_log_interval.nil?
60
+ @without_source = system_config.without_source unless system_config.without_source.nil?
61
+ end
62
+
63
+ attr_reader :inputs
64
+ attr_reader :labels
65
+
66
+ def configure(conf)
67
+ error_label_config = nil
68
+
69
+ # initialize <label> elements before configuring all plugins to avoid 'label not found' in input, filter and output.
70
+ label_configs = {}
71
+ conf.elements(name: 'label').each { |e|
72
+ name = e.arg
73
+ raise ConfigError, "Missing symbol argument on <label> directive" if name.empty?
74
+
75
+ if name == ERROR_LABEL
76
+ error_label_config = e
77
+ else
78
+ add_label(name)
79
+ label_configs[name] = e
80
+ end
81
+ }
82
+ # Call 'configure' here to avoid 'label not found'
83
+ label_configs.each { |name, e| @labels[name].configure(e) }
84
+ setup_error_label(error_label_config) if error_label_config
85
+
86
+ super
87
+
88
+ # initialize <source> elements
89
+ if @without_source
90
+ log.info "'--without-source' is applied. Ignore <source> sections"
91
+ else
92
+ conf.elements(name: 'source').each { |e|
93
+ type = e['@type']
94
+ raise ConfigError, "Missing 'type' parameter on <source> directive" unless type
95
+ add_source(type, e)
96
+ }
97
+ end
98
+ end
99
+
100
+ def setup_error_label(e)
101
+ error_label = add_label(ERROR_LABEL)
102
+ error_label.configure(e)
103
+ error_label.root_agent = RootAgentProxyWithoutErrorCollector.new(self)
104
+ @error_collector = error_label.event_router
105
+ end
106
+
107
+ def lifecycle(desc: false, kind_callback: nil)
108
+ kind_or_label_list = if desc
109
+ [:output, :filter, @labels.values.reverse, :output_with_router, :input].flatten
110
+ else
111
+ [:input, :output_with_router, @labels.values, :filter, :output].flatten
112
+ end
113
+ kind_or_label_list.each do |kind|
114
+ if kind.respond_to?(:lifecycle)
115
+ label = kind
116
+ label.lifecycle(desc: desc) do |plugin, display_kind|
117
+ yield plugin, display_kind
118
+ end
119
+ else
120
+ list = if desc
121
+ lifecycle_control_list[kind].reverse
122
+ else
123
+ lifecycle_control_list[kind]
124
+ end
125
+ display_kind = (kind == :output_with_router ? :output : kind)
126
+ list.each do |instance|
127
+ yield instance, display_kind
128
+ end
129
+ end
130
+ if kind_callback
131
+ kind_callback.call
132
+ end
133
+ end
134
+ end
135
+
136
+ def start
137
+ lifecycle(desc: true) do |i| # instance
138
+ i.start unless i.started?
139
+ end
140
+ lifecycle(desc: true) do |i|
141
+ i.after_start unless i.after_started?
142
+ end
143
+ end
144
+
145
+ def flush!
146
+ log.info "flushing all buffer forcedly"
147
+ flushing_threads = []
148
+ lifecycle(desc: true) do |instance|
149
+ if instance.respond_to?(:force_flush)
150
+ t = Thread.new do
151
+ Thread.current.abort_on_exception = true
152
+ begin
153
+ instance.force_flush
154
+ rescue => e
155
+ log.warn "unexpected error while flushing buffer", plugin: instance.class, plugin_id: instance.plugin_id, error: e
156
+ log.warn_backtrace
157
+ end
158
+ end
159
+ flushing_threads << t
160
+ end
161
+ end
162
+ flushing_threads.each{|t| t.join }
163
+ end
164
+
165
+ def shutdown # Fluentd's shutdown sequence is stop, before_shutdown, shutdown, after_shutdown, close, terminate for plugins
166
+ # Thesee method callers does `rescue Exception` to call methods of shutdown sequence as far as possible
167
+ # if plugin methods does something like infinite recursive call, `exit`, unregistering signal handlers or others.
168
+ # Plugins should be separated and be in sandbox to protect data in each plugins/buffers.
169
+
170
+ lifecycle_safe_sequence = ->(method, checker) {
171
+ lifecycle do |instance, kind|
172
+ begin
173
+ log.debug "calling #{method} on #{kind} plugin", type: Plugin.lookup_type_from_class(instance.class), plugin_id: instance.plugin_id
174
+ instance.send(method) unless instance.send(checker)
175
+ rescue Exception => e
176
+ log.warn "unexpected error while calling #{method} on #{kind} plugin", pluguin: instance.class, plugin_id: instance.plugin_id, error: e
177
+ log.warn_backtrace
178
+ end
179
+ end
180
+ }
181
+
182
+ lifecycle_unsafe_sequence = ->(method, checker) {
183
+ operation = case method
184
+ when :before_shutdown then "preparing shutdown"
185
+ when :shutdown then "shutting down"
186
+ when :close then "closing"
187
+ else
188
+ raise "BUG: unknown method name '#{method}'"
189
+ end
190
+ operation_threads = []
191
+ callback = ->(){
192
+ operation_threads.each{|t| t.join }
193
+ operation_threads.clear
194
+ }
195
+ lifecycle(kind_callback: callback) do |instance, kind|
196
+ t = Thread.new do
197
+ Thread.current.abort_on_exception = true
198
+ begin
199
+ log.info "#{operation} #{kind} plugin", type: Plugin.lookup_type_from_class(instance.class), plugin_id: instance.plugin_id
200
+ instance.send(method) unless instance.send(checker)
201
+ rescue Exception => e
202
+ log.warn "unexpected error while #{operation} on #{kind} plugin", plugin: instance.class, plugin_id: instance.plugin_id, error: e
203
+ log.warn_backtrace
204
+ end
205
+ end
206
+ operation_threads << t
207
+ end
208
+ }
209
+
210
+ lifecycle_safe_sequence.call(:stop, :stopped?)
211
+
212
+ # before_shutdown does force_flush for output plugins: it should block, so it's unsafe operation
213
+ lifecycle_unsafe_sequence.call(:before_shutdown, :before_shutdown?)
214
+
215
+ lifecycle_unsafe_sequence.call(:shutdown, :shutdown?)
216
+
217
+ lifecycle_safe_sequence.call(:after_shutdown, :after_shutdown?)
218
+
219
+ lifecycle_unsafe_sequence.call(:close, :closed?)
220
+
221
+ lifecycle_safe_sequence.call(:terminate, :terminated?)
222
+ end
223
+
224
+ def suppress_interval(interval_time)
225
+ @suppress_emit_error_log_interval = interval_time
226
+ @next_emit_error_log_time = Time.now.to_i
227
+ end
228
+
229
+ def add_source(type, conf)
230
+ log.info "adding source", type: type
231
+
232
+ input = Plugin.new_input(type)
233
+ # <source> emits events to the top-level event router (RootAgent#event_router).
234
+ # Input#configure overwrites event_router to a label's event_router if it has `@label` parameter.
235
+ # See also 'fluentd/plugin/input.rb'
236
+ input.router = @event_router
237
+ input.configure(conf)
238
+ @inputs << input
239
+
240
+ input
241
+ end
242
+
243
+ def add_label(name)
244
+ label = Label.new(name, log: log)
245
+ label.root_agent = self
246
+ @labels[name] = label
247
+ end
248
+
249
+ def find_label(label_name)
250
+ if label = @labels[label_name]
251
+ label
252
+ else
253
+ raise ArgumentError, "#{label_name} label not found"
254
+ end
255
+ end
256
+
257
+ def emit_error_event(tag, time, record, error)
258
+ error_info = {error: error, tag: tag, time: time}
259
+ if @error_collector
260
+ # A record is not included in the logs because <@ERROR> handles it. This warn is for the notification
261
+ log.warn "send an error event to @ERROR:", error_info
262
+ @error_collector.emit(tag, time, record)
263
+ else
264
+ error_info[:record] = record
265
+ log.warn "dump an error event:", error_info
266
+ end
267
+ end
268
+
269
+ def handle_emits_error(tag, es, error)
270
+ error_info = {error: error, tag: tag}
271
+ if @error_collector
272
+ log.warn "send an error event stream to @ERROR:", error_info
273
+ @error_collector.emit_stream(tag, es)
274
+ else
275
+ now = Time.now
276
+ if @suppress_emit_error_log_interval.zero? || now > @next_emit_error_log_time
277
+ log.warn "emit transaction failed:", error_info
278
+ log.warn_backtrace
279
+ @next_emit_error_log_time = now + @suppress_emit_error_log_interval
280
+ end
281
+ raise error
282
+ end
283
+ end
284
+
285
+ # <label @ERROR> element use RootAgent wrapped by # this RootAgentProxyWithoutErrorCollector.
286
+ # So that those elements don't send cause infinite loop.
287
+ class RootAgentProxyWithoutErrorCollector < SimpleDelegator
288
+ def initialize(root_agent)
289
+ super
290
+
291
+ @suppress_emit_error_log_interval = 0
292
+ @next_emit_error_log_time = nil
293
+
294
+ interval_time = root_agent.instance_variable_get(:@suppress_emit_error_log_interval)
295
+ suppress_interval(interval_time) unless interval_time.zero?
296
+ end
297
+
298
+ def emit_error_event(tag, time, record, error)
299
+ error_info = {error: error, tag: tag, time: time, record: record}
300
+ log.warn "dump an error event in @ERROR:", error_info
301
+ end
302
+
303
+ def handle_emits_error(tag, es, e)
304
+ now = EventTime.now
305
+ if @suppress_emit_error_log_interval.zero? || now > @next_emit_error_log_time
306
+ log.warn "emit transaction failed in @ERROR:", error: e, tag: tag
307
+ log.warn_backtrace
308
+ @next_emit_error_log_time = now + @suppress_emit_error_log_interval
309
+ end
310
+ raise e
311
+ end
312
+ end
313
+ end
314
+ end
@@ -0,0 +1,94 @@
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 'webrick'
18
+
19
+ module Fluent
20
+ module RPC
21
+ class Server
22
+ def initialize(endpoint, log)
23
+ bind, port = endpoint.split(':')
24
+ @bind = bind
25
+ @port = port
26
+ @log = log
27
+
28
+ @server = WEBrick::HTTPServer.new(
29
+ BindAddress: @bind,
30
+ Port: @port,
31
+ Logger: WEBrick::Log.new(STDERR, WEBrick::Log::FATAL),
32
+ AccessLog: [],
33
+ )
34
+ end
35
+
36
+ def mount(path, servlet, *args)
37
+ @server.mount(path, servlet, *args)
38
+ @log.debug "register #{path} RPC servlet"
39
+ end
40
+
41
+ def mount_proc(path, &block)
42
+ @server.mount_proc(path) { |req, res|
43
+ begin
44
+ code, header, response = block.call(req, res)
45
+ rescue => e
46
+ @log.warn "failed to handle RPC request", path: path, error: e.to_s
47
+ @log.warn_backtrace e.backtrace
48
+
49
+ code = 500
50
+ body = {
51
+ 'message '=> 'Internal Server Error',
52
+ 'error' => "#{e}",
53
+ 'backtrace'=> e.backtrace,
54
+ }
55
+ end
56
+
57
+ code = 200 if code.nil?
58
+ header = {'Content-Type' => 'application/json'} if header.nil?
59
+ body = if response.nil?
60
+ '{"ok":true}'
61
+ else
62
+ response.body['ok'] = code == 200
63
+ response.body.to_json
64
+ end
65
+
66
+ res.status = code
67
+ header.each_pair { |k, v|
68
+ res[k] = v
69
+ }
70
+ res.body = body
71
+ }
72
+ @log.debug "register #{path} RPC handler"
73
+ end
74
+
75
+ def start
76
+ @log.debug "listening RPC http server on http://#{@bind}:#{@port}/"
77
+ @thread = Thread.new {
78
+ @server.start
79
+ }
80
+ end
81
+
82
+ def shutdown
83
+ if @server
84
+ @server.shutdown
85
+ @server = nil
86
+ end
87
+ if @thread
88
+ @thread.join
89
+ @thread = nil
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end