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,125 @@
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/event'
18
+ require 'time'
19
+ require 'fluent/configurable'
20
+
21
+ module Fluent
22
+ module PluginHelper
23
+ module Inject
24
+ def inject_values_to_record(tag, time, record)
25
+ return record unless @_inject_enabled
26
+
27
+ r = record.dup
28
+ if @_inject_hostname_key
29
+ r[@_inject_hostname_key] = @_inject_hostname
30
+ end
31
+ if @_inject_tag_key
32
+ r[@_inject_tag_key] = tag
33
+ end
34
+ if @_inject_time_key
35
+ r[@_inject_time_key] = @_inject_time_formatter.call(time)
36
+ end
37
+
38
+ r
39
+ end
40
+
41
+ def inject_values_to_event_stream(tag, es)
42
+ return es unless @_inject_enabled
43
+
44
+ new_es = Fluent::MultiEventStream.new
45
+ es.each do |time, record|
46
+ r = record.dup
47
+ if @_inject_hostname_key
48
+ r[@_inject_hostname_key] = @_inject_hostname
49
+ end
50
+ if @_inject_tag_key
51
+ r[@_inject_tag_key] = tag
52
+ end
53
+ if @_inject_time_key
54
+ r[@_inject_time_key] = @_inject_time_formatter.call(time)
55
+ end
56
+ new_es.add(time, r)
57
+ end
58
+
59
+ new_es
60
+ end
61
+
62
+ module InjectParams
63
+ include Fluent::Configurable
64
+ config_section :inject, required: false, multi: false, param_name: :inject_config do
65
+ config_param :hostname_key, :string, default: nil
66
+ config_param :hostname, :string, default: nil
67
+ config_param :tag_key, :string, default: nil
68
+ config_param :time_key, :string, default: nil
69
+ config_param :time_type, :enum, list: [:float, :unixtime, :string], default: :float
70
+ config_param :time_format, :string, default: nil
71
+ config_param :localtime, :bool, default: true # if localtime is false and timezone is nil, then utc
72
+ config_param :utc, :bool, default: false # placeholder to turn localtime to false
73
+ config_param :timezone, :string, default: nil
74
+ end
75
+ end
76
+
77
+ def self.included(mod)
78
+ mod.include InjectParams
79
+ end
80
+
81
+ def initialize
82
+ super
83
+ @_inject_enabled = false
84
+ @_inject_hostname_key = nil
85
+ @_inject_hostname = nil
86
+ @_inject_tag_key = nil
87
+ @_inject_time_key = nil
88
+ @_inject_time_formatter = nil
89
+ end
90
+
91
+ def configure(conf)
92
+ conf.elements('inject').each do |e|
93
+ if e.has_key?('utc') && Fluent::Config.bool_value(e['utc'])
94
+ e['localtime'] = 'false'
95
+ end
96
+ end
97
+
98
+ super
99
+
100
+ if @inject_config
101
+ @_inject_hostname_key = @inject_config.hostname_key
102
+ if @_inject_hostname_key
103
+ @_inject_hostname = @inject_config.hostname
104
+ unless @_inject_hostname
105
+ @_inject_hostname = Socket.gethostname
106
+ log.info "using hostname for specified field", host_key: @_inject_hostname_key, host_name: @_inject_hostname
107
+ end
108
+ end
109
+ @_inject_tag_key = @inject_config.tag_key
110
+ @_inject_time_key = @inject_config.time_key
111
+ if @_inject_time_key
112
+ @_inject_time_formatter = case @inject_config.time_type
113
+ when :float then ->(time){ time.to_r.truncate(+6).to_f } # microsecond floating point value
114
+ when :unixtime then ->(time){ time.to_i }
115
+ else
116
+ Fluent::TimeFormatter.new(@inject_config.time_format, @inject_config.localtime, @inject_config.timezone)
117
+ end
118
+ end
119
+
120
+ @_inject_enabled = @_inject_hostname_key || @_inject_tag_key || @_inject_time_key
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,147 @@
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/plugin'
18
+ require 'fluent/plugin/parser'
19
+ require 'fluent/config/element'
20
+ require 'fluent/configurable'
21
+
22
+ module Fluent
23
+ module PluginHelper
24
+ module Parser
25
+ def parser_create(usage: '', type: nil, conf: nil, default_type: nil)
26
+ parser = @_parsers[usage]
27
+ return parser if parser
28
+
29
+ type = if type
30
+ type
31
+ elsif conf && conf.respond_to?(:[])
32
+ raise Fluent::ConfigError, "@type is required in <parse>" unless conf['@type']
33
+ conf['@type']
34
+ elsif default_type
35
+ default_type
36
+ else
37
+ raise ArgumentError, "BUG: both type and conf are not specified"
38
+ end
39
+ parser = Fluent::Plugin.new_parser(type, parent: self)
40
+ config = case conf
41
+ when Fluent::Config::Element
42
+ conf
43
+ when Hash
44
+ # in code, programmer may use symbols as keys, but Element needs strings
45
+ conf = Hash[conf.map{|k,v| [k.to_s, v]}]
46
+ Fluent::Config::Element.new('parse', usage, conf, [])
47
+ when nil
48
+ Fluent::Config::Element.new('parse', usage, {}, [])
49
+ else
50
+ raise ArgumentError, "BUG: conf must be a Element, Hash (or unspecified), but '#{conf.class}'"
51
+ end
52
+ parser.configure(config)
53
+ if @_parsers_started
54
+ parser.start
55
+ end
56
+
57
+ @_parsers[usage] = parser
58
+ parser
59
+ end
60
+
61
+ module ParserParams
62
+ include Fluent::Configurable
63
+ # minimum section definition to instantiate parser plugin instances
64
+ config_section :parse, required: false, multi: true, param_name: :parser_configs do
65
+ config_argument :usage, :string, default: ''
66
+ config_param :@type, :string
67
+ end
68
+ end
69
+
70
+ def self.included(mod)
71
+ mod.include ParserParams
72
+ end
73
+
74
+ attr_reader :_parsers # for tests
75
+
76
+ def initialize
77
+ super
78
+ @_parsers_started = false
79
+ @_parsers = {} # usage => parser
80
+ end
81
+
82
+ def configure(conf)
83
+ super
84
+
85
+ @parser_configs.each do |section|
86
+ if @_parsers[section.usage]
87
+ raise Fluent::ConfigError, "duplicated parsers configured: #{section.usage}"
88
+ end
89
+ parser = Plugin.new_parser(section[:@type], parent: self)
90
+ parser.configure(section.corresponding_config_element)
91
+ @_parsers[section.usage] = parser
92
+ end
93
+ end
94
+
95
+ def start
96
+ super
97
+ @_parsers_started = true
98
+ @_parsers.each_pair do |usage, parser|
99
+ parser.start
100
+ end
101
+ end
102
+
103
+ def parser_operate(method_name, &block)
104
+ @_parsers.each_pair do |usage, parser|
105
+ begin
106
+ parser.send(method_name)
107
+ block.call(parser) if block_given?
108
+ rescue => e
109
+ log.error "unexpected error while #{method_name}", usage: usage, parser: parser, error: e
110
+ end
111
+ end
112
+ end
113
+
114
+ def stop
115
+ super
116
+ parser_operate(:stop)
117
+ end
118
+
119
+ def before_shutdown
120
+ parser_operate(:before_shutdown)
121
+ super
122
+ end
123
+
124
+ def shutdown
125
+ parser_operate(:shutdown)
126
+ super
127
+ end
128
+
129
+ def after_shutdown
130
+ parser_operate(:after_shutdown)
131
+ super
132
+ end
133
+
134
+ def close
135
+ parser_operate(:close)
136
+ super
137
+ end
138
+
139
+ def terminate
140
+ parser_operate(:terminate)
141
+ @_parsers_started = false
142
+ @_parsers = {}
143
+ super
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,177 @@
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
+ module Fluent
18
+ module PluginHelper
19
+ module RetryState
20
+ def retry_state_create(
21
+ title, retry_type, wait, timeout,
22
+ forever: false, max_steps: nil, backoff_base: 2, max_interval: nil, randomize: true, randomize_width: 0.125,
23
+ secondary: false, secondary_threshold: 0.8
24
+ )
25
+ case retry_type
26
+ when :exponential_backoff
27
+ ExponentialBackOffRetry.new(title, wait, timeout, forever, max_steps, randomize, randomize_width, backoff_base, max_interval, secondary, secondary_threshold)
28
+ when :periodic
29
+ PeriodicRetry.new(title, wait, timeout, forever, max_steps, randomize, randomize_width, secondary, secondary_threshold)
30
+ else
31
+ raise "BUG: unknown retry_type specified: '#{retry_type}'"
32
+ end
33
+ end
34
+
35
+ class RetryStateMachine
36
+ attr_reader :title, :start, :steps, :next_time, :timeout_at, :current, :secondary_transition_at, :secondary_transition_steps
37
+
38
+ def initialize(title, wait, timeout, forever, max_steps, randomize, randomize_width, secondary, secondary_threshold)
39
+ @title = title
40
+
41
+ @start = current_time
42
+ @steps = 0
43
+ @next_time = nil # should be initialized for first retry by child class
44
+
45
+ @timeout = timeout
46
+ @timeout_at = @start + timeout
47
+ @current = :primary
48
+
49
+ if randomize_width < 0 || randomize_width > 0.5
50
+ raise "BUG: randomize_width MUST be between 0 and 0.5"
51
+ end
52
+
53
+ @randomize = randomize
54
+ @randomize_width = randomize_width
55
+
56
+ if forever && secondary
57
+ raise "BUG: forever and secondary are exclusive to each other"
58
+ end
59
+
60
+ @forever = forever
61
+ @max_steps = max_steps
62
+
63
+ @secondary = secondary
64
+ @secondary_threshold = secondary_threshold
65
+ if @secondary
66
+ raise "BUG: secondary_transition_threshold MUST be between 0 and 1" if @secondary_threshold <= 0 || @secondary_threshold >= 1
67
+ @secondary_transition_at = @start + timeout * @secondary_threshold
68
+ @secondary_transition_steps = nil
69
+ end
70
+ end
71
+
72
+ def current_time
73
+ Time.now
74
+ end
75
+
76
+ def randomize(interval)
77
+ return interval unless @randomize
78
+
79
+ interval + (interval * @randomize_width * (2 * rand - 1.0))
80
+ end
81
+
82
+ def calc_next_time
83
+ if @forever || !@secondary # primary
84
+ naive = naive_next_time(@steps)
85
+ if @forever
86
+ naive
87
+ elsif naive >= @timeout_at
88
+ @timeout_at
89
+ else
90
+ naive
91
+ end
92
+ elsif @current == :primary && @secondary
93
+ naive = naive_next_time(@steps)
94
+ if naive >= @secondary_transition_at
95
+ @secondary_transition_at
96
+ else
97
+ naive
98
+ end
99
+ elsif @current == :secondary
100
+ naive = naive_next_time(@steps - @secondary_transition_steps + 1)
101
+ if naive >= @timeout_at
102
+ @timeout_at
103
+ else
104
+ naive
105
+ end
106
+ else
107
+ raise "BUG: it's out of design"
108
+ end
109
+ end
110
+
111
+ def naive_next_time(retry_times)
112
+ raise NotImplementedError
113
+ end
114
+
115
+ def secondary?
116
+ @secondary && (@current == :secondary || current_time >= @secondary_transition_at)
117
+ end
118
+
119
+ def step
120
+ @steps += 1
121
+ if @secondary && @current != :secondary && current_time >= @secondary_transition_at
122
+ @current = :secondary
123
+ @secondary_transition_steps = @steps
124
+ end
125
+ @next_time = calc_next_time
126
+ nil
127
+ end
128
+
129
+ def limit?
130
+ if @forever
131
+ false
132
+ else
133
+ @next_time >= @timeout_at || !!(@max_steps && @steps >= @max_steps)
134
+ end
135
+ end
136
+ end
137
+
138
+ class ExponentialBackOffRetry < RetryStateMachine
139
+ def initialize(title, wait, timeout, forever, max_steps, randomize, randomize_width, backoff_base, max_interval, secondary, secondary_threathold)
140
+ super(title, wait, timeout, forever, max_steps, randomize, randomize_width, secondary, secondary_threathold)
141
+ @constant_factor = wait
142
+ @backoff_base = backoff_base
143
+ @max_interval = max_interval
144
+
145
+ @next_time = @start + @constant_factor
146
+ end
147
+
148
+ def naive_next_time(retry_next_times)
149
+ # make it infinite if calculated "interval" is too big
150
+ interval = @constant_factor.to_f * ( @backoff_base ** ( retry_next_times - 1 ) )
151
+ intr = if interval.finite?
152
+ if @max_interval && interval > @max_interval
153
+ @max_interval
154
+ else
155
+ interval
156
+ end
157
+ else
158
+ interval
159
+ end
160
+ current_time + randomize(intr)
161
+ end
162
+ end
163
+
164
+ class PeriodicRetry < RetryStateMachine
165
+ def initialize(title, wait, timeout, forever, max_steps, randomize, randomize_width, secondary, secondary_threathold)
166
+ super(title, wait, timeout, forever, max_steps, randomize, randomize_width, secondary, secondary_threathold)
167
+ @retry_wait = wait
168
+ @next_time = @start + @retry_wait
169
+ end
170
+
171
+ def naive_next_time(retry_next_times)
172
+ current_time + randomize(@retry_wait)
173
+ end
174
+ end
175
+ end
176
+ end
177
+ end