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,487 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin_helper/inject'
3
+ require 'fluent/event'
4
+ require 'time'
5
+
6
+ class InjectHelperTest < Test::Unit::TestCase
7
+ class Dummy < Fluent::Plugin::TestBase
8
+ helpers :inject
9
+ end
10
+
11
+ class Dummy2 < Fluent::Plugin::TestBase
12
+ helpers :inject
13
+ config_section :inject do
14
+ config_set_default :hostname_key, 'host'
15
+ end
16
+ end
17
+
18
+ def config_inject_section(hash = {})
19
+ config_element('ROOT', '', {}, [config_element('inject', '', hash)])
20
+ end
21
+
22
+ setup do
23
+ Fluent::Test.setup
24
+ @d = Dummy.new
25
+ end
26
+
27
+ teardown do
28
+ if @d
29
+ @d.stop unless @d.stopped?
30
+ @d.shutdown unless @d.shutdown?
31
+ @d.close unless @d.closed?
32
+ @d.terminate unless @d.terminated?
33
+ end
34
+ end
35
+
36
+ test 'can override default parameters, but not overwrite whole definition' do
37
+ d = Dummy.new
38
+ d.configure(config_element())
39
+ assert_nil d.inject_config
40
+
41
+ d = Dummy2.new
42
+ d.configure(config_element('ROOT', '', {}, [config_element('inject')]))
43
+ assert d.inject_config
44
+ assert_equal 'host', d.inject_config.hostname_key
45
+ end
46
+
47
+ test 'do nothing in default' do
48
+ @d.configure(config_inject_section())
49
+ @d.start
50
+ assert_nil @d.instance_eval{ @_inject_hostname_key }
51
+ assert_nil @d.instance_eval{ @_inject_hostname }
52
+ assert_nil @d.instance_eval{ @_inject_tag_key }
53
+ assert_nil @d.instance_eval{ @_inject_time_key }
54
+ assert_nil @d.instance_eval{ @_inject_time_formatter }
55
+
56
+ time = event_time()
57
+ record = {"key1" => "value1", "key2" => 2}
58
+ assert_equal record, @d.inject_values_to_record('tag', time, record)
59
+ assert_equal record.object_id, @d.inject_values_to_record('tag', time, record).object_id
60
+
61
+ es0 = Fluent::OneEventStream.new(time, {"key1" => "v", "key2" => 0})
62
+
63
+ es1 = Fluent::ArrayEventStream.new([ [time, {"key1" => "a", "key2" => 1}], [time, {"key1" => "b", "key2" => 2}] ])
64
+
65
+ es2 = Fluent::MultiEventStream.new
66
+ es2.add(event_time(), {"key1" => "a", "key2" => 1})
67
+ es2.add(event_time(), {"key1" => "b", "key2" => 2})
68
+
69
+ es3 = Fluent::MessagePackEventStream.new(es2.to_msgpack_stream)
70
+
71
+ [es0, es1, es2, es3].each do |es|
72
+ assert_equal es, @d.inject_values_to_event_stream('tag', es), "failed for #{es.class}"
73
+ assert_equal es.object_id, @d.inject_values_to_event_stream('tag', es).object_id, "failed for #{es.class}"
74
+ end
75
+ end
76
+
77
+ test 'can be configured as specified' do
78
+ @d.configure(config_inject_section(
79
+ "hostname_key" => "hostname",
80
+ "hostname" => "myhost.local",
81
+ "tag_key" => "tag",
82
+ "time_key" => "time",
83
+ "time_type" => "string",
84
+ "time_format" => "%Y-%m-%d %H:%M:%S.%N",
85
+ "timezone" => "-0700",
86
+ ))
87
+
88
+ assert_equal "hostname", @d.instance_eval{ @_inject_hostname_key }
89
+ assert_equal "myhost.local", @d.instance_eval{ @_inject_hostname }
90
+ assert_equal "tag", @d.instance_eval{ @_inject_tag_key }
91
+ assert_equal "time", @d.instance_eval{ @_inject_time_key }
92
+ assert_equal :string, @d.instance_eval{ @inject_config.time_type }
93
+ assert_not_nil @d.instance_eval{ @_inject_time_formatter }
94
+ end
95
+
96
+ sub_test_case 'using inject_values_to_record' do
97
+ test 'injects hostname automatically detected' do
98
+ detected_hostname = `hostname`.chomp
99
+ @d.configure(config_inject_section("hostname_key" => "host"))
100
+ logs = @d.log.out.logs
101
+ assert{ logs.any?{|l| l.include?("[info]: using hostname for specified field host_key=\"host\" host_name=\"#{detected_hostname}\"") } }
102
+ @d.start
103
+
104
+ time = event_time()
105
+ record = {"key1" => "value1", "key2" => 2}
106
+ assert_equal record.merge({"host" => detected_hostname}), @d.inject_values_to_record('tag', time, record)
107
+ end
108
+
109
+ test 'injects hostname as specified value' do
110
+ @d.configure(config_inject_section("hostname_key" => "host", "hostname" => "myhost.yay.local"))
111
+ @d.start
112
+
113
+ time = event_time()
114
+ record = {"key1" => "value1", "key2" => 2}
115
+ assert_equal record.merge({"host" => "myhost.yay.local"}), @d.inject_values_to_record('tag', time, record)
116
+ end
117
+
118
+ test 'injects tag into specified key' do
119
+ @d.configure(config_inject_section("tag_key" => "mytag"))
120
+ @d.start
121
+
122
+ time = event_time()
123
+ record = {"key1" => "value1", "key2" => 2}
124
+ assert_equal record.merge({"mytag" => "tag.test"}), @d.inject_values_to_record('tag.test', time, record)
125
+ end
126
+
127
+ test 'injects time as floating point value into specified key as default' do
128
+ time_in_unix = Time.parse("2016-06-21 08:10:11 +0900").to_i # 1466464211 in unix time
129
+ time_subsecond = 320_101_224
130
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
131
+ float_time = 1466464211.320101 # microsecond precision in float
132
+
133
+ @d.configure(config_inject_section("time_key" => "timedata"))
134
+ @d.start
135
+
136
+ record = {"key1" => "value1", "key2" => 2}
137
+ assert_equal record.merge({"timedata" => float_time}), @d.inject_values_to_record('tag', time, record)
138
+ end
139
+
140
+ test 'injects time as unix time into specified key' do
141
+ time_in_unix = Time.parse("2016-06-21 08:10:11 +0900").to_i
142
+ time_subsecond = 320_101_224
143
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
144
+ int_time = 1466464211
145
+
146
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "unixtime"))
147
+ @d.start
148
+
149
+ record = {"key1" => "value1", "key2" => 2}
150
+ assert_equal record.merge({"timedata" => int_time}), @d.inject_values_to_record('tag', time, record)
151
+ end
152
+
153
+ test 'injects time as formatted string in localtime if timezone not specified' do
154
+ local_timezone = Time.now.strftime('%z')
155
+ time_in_unix = Time.parse("2016-06-21 08:10:11 #{local_timezone}").to_i
156
+ time_subsecond = 320_101_224
157
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
158
+
159
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "string", "time_format" => "%Y_%m_%d %H:%M:%S %z"))
160
+ @d.start
161
+
162
+ record = {"key1" => "value1", "key2" => 2}
163
+ assert_equal record.merge({"timedata" => "2016_06_21 08:10:11 #{local_timezone}"}), @d.inject_values_to_record('tag', time, record)
164
+ end
165
+
166
+ test 'injects time as formatted string with nanosecond in localtime if timezone not specified' do
167
+ local_timezone = Time.now.strftime('%z')
168
+ time_in_unix = Time.parse("2016-06-21 08:10:11 #{local_timezone}").to_i
169
+ time_subsecond = 320_101_224
170
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
171
+
172
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "string", "time_format" => "%Y_%m_%d %H:%M:%S.%N %z"))
173
+ @d.start
174
+
175
+ record = {"key1" => "value1", "key2" => 2}
176
+ assert_equal record.merge({"timedata" => "2016_06_21 08:10:11.320101224 #{local_timezone}"}), @d.inject_values_to_record('tag', time, record)
177
+ end
178
+
179
+ test 'injects time as formatted string with millisecond in localtime if timezone not specified' do
180
+ local_timezone = Time.now.strftime('%z')
181
+ time_in_unix = Time.parse("2016-06-21 08:10:11 #{local_timezone}").to_i
182
+ time_subsecond = 320_101_224
183
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
184
+
185
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "string", "time_format" => "%Y_%m_%d %H:%M:%S.%3N %z"))
186
+ @d.start
187
+
188
+ record = {"key1" => "value1", "key2" => 2}
189
+ assert_equal record.merge({"timedata" => "2016_06_21 08:10:11.320 #{local_timezone}"}), @d.inject_values_to_record('tag', time, record)
190
+ end
191
+
192
+ test 'injects time as formatted string in specified timezone' do
193
+ time_in_unix = Time.parse("2016-06-21 08:10:11 +0000").to_i
194
+ time_subsecond = 320_101_224
195
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
196
+
197
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "string", "time_format" => "%Y_%m_%d %H:%M:%S %z", "timezone" => "-0800"))
198
+ @d.start
199
+
200
+ record = {"key1" => "value1", "key2" => 2}
201
+ assert_equal record.merge({"timedata" => "2016_06_21 00:10:11 -0800"}), @d.inject_values_to_record('tag', time, record)
202
+ end
203
+
204
+ test 'injects hostname, tag and time' do
205
+ time_in_unix = Time.parse("2016-06-21 08:10:11 +0900").to_i
206
+ time_subsecond = 320_101_224
207
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
208
+
209
+ @d.configure(config_inject_section(
210
+ "hostname_key" => "hostnamedata",
211
+ "hostname" => "myname.local",
212
+ "tag_key" => "tagdata",
213
+ "time_key" => "timedata",
214
+ "time_type" => "string",
215
+ "time_format" => "%Y_%m_%d %H:%M:%S.%N %z",
216
+ "timezone" => "+0000",
217
+ ))
218
+ @d.start
219
+
220
+ record = {"key1" => "value1", "key2" => 2}
221
+ injected = {"hostnamedata" => "myname.local", "tagdata" => "tag", "timedata" => "2016_06_20 23:10:11.320101224 +0000"}
222
+ assert_equal record.merge(injected), @d.inject_values_to_record('tag', time, record)
223
+ end
224
+ end
225
+
226
+ sub_test_case 'using inject_values_to_event_stream' do
227
+ local_timezone = Time.now.strftime('%z')
228
+ time_in_unix = Time.parse("2016-06-21 08:10:11 #{local_timezone}").to_i
229
+ time_subsecond = 320_101_224
230
+ time_in_rational = Rational(time_in_unix * 1_000_000_000 + time_subsecond, 1_000_000_000)
231
+ time_in_localtime = Time.at(time_in_rational).localtime
232
+ time_in_utc = Time.at(time_in_rational).utc
233
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
234
+ time_float = time.to_r.truncate(+6).to_f
235
+
236
+ data(
237
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
238
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
239
+ )
240
+ test 'injects hostname automatically detected' do |data|
241
+ detected_hostname = `hostname`.chomp
242
+ @d.configure(config_inject_section("hostname_key" => "host"))
243
+ logs = @d.log.out.logs
244
+ assert{ logs.any?{|l| l.include?("[info]: using hostname for specified field host_key=\"host\" host_name=\"#{detected_hostname}\"") } }
245
+ @d.start
246
+
247
+ injected = {"host" => detected_hostname}
248
+ expected_es = Fluent::MultiEventStream.new
249
+ data.each do |t, r|
250
+ expected_es.add(t, r.merge(injected))
251
+ end
252
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
253
+ end
254
+
255
+ data(
256
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
257
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
258
+ )
259
+ test 'injects hostname as specified value' do |data|
260
+ @d.configure(config_inject_section("hostname_key" => "host", "hostname" => "myhost.yay.local"))
261
+ @d.start
262
+
263
+ injected = {"host" => "myhost.yay.local"}
264
+ expected_es = Fluent::MultiEventStream.new
265
+ data.each do |t, r|
266
+ expected_es.add(t, r.merge(injected))
267
+ end
268
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
269
+ end
270
+
271
+ data(
272
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
273
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
274
+ )
275
+ test 'injects tag into specified key' do |data|
276
+ @d.configure(config_inject_section("tag_key" => "mytag"))
277
+ @d.start
278
+
279
+ injected = {"mytag" => "tag"}
280
+ expected_es = Fluent::MultiEventStream.new
281
+ data.each do |t, r|
282
+ expected_es.add(t, r.merge(injected))
283
+ end
284
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
285
+ end
286
+
287
+ data(
288
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
289
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
290
+ )
291
+ test 'injects time as floating point value into specified key as default' do |data|
292
+ @d.configure(config_inject_section("time_key" => "timedata"))
293
+ @d.start
294
+
295
+ injected = {"timedata" => time_float }
296
+ expected_es = Fluent::MultiEventStream.new
297
+ data.each do |t, r|
298
+ expected_es.add(t, r.merge(injected))
299
+ end
300
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
301
+ end
302
+
303
+ data(
304
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
305
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
306
+ )
307
+ test 'injects time as unix time into specified key' do |data|
308
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "unixtime"))
309
+ @d.start
310
+
311
+ injected = {"timedata" => time_in_localtime.to_i}
312
+ expected_es = Fluent::MultiEventStream.new
313
+ data.each do |t, r|
314
+ expected_es.add(t, r.merge(injected))
315
+ end
316
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
317
+ end
318
+
319
+ data(
320
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
321
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
322
+ )
323
+ test 'injects time as formatted string in localtime if timezone not specified' do |data|
324
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "string", "time_format" => "%Y_%m_%d %H:%M:%S %z"))
325
+ @d.start
326
+
327
+ injected = {"timedata" => time_in_localtime.strftime("%Y_%m_%d %H:%M:%S %z")}
328
+ expected_es = Fluent::MultiEventStream.new
329
+ data.each do |t, r|
330
+ expected_es.add(t, r.merge(injected))
331
+ end
332
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
333
+ end
334
+
335
+ data(
336
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
337
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
338
+ )
339
+ test 'injects time as formatted string with nanosecond in localtime if timezone not specified' do |data|
340
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "string", "time_format" => "%Y_%m_%d %H:%M:%S.%N %z"))
341
+ @d.start
342
+
343
+ injected = {"timedata" => time_in_localtime.strftime("%Y_%m_%d %H:%M:%S.%N %z")}
344
+ expected_es = Fluent::MultiEventStream.new
345
+ data.each do |t, r|
346
+ expected_es.add(t, r.merge(injected))
347
+ end
348
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
349
+ end
350
+
351
+ data(
352
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
353
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
354
+ )
355
+ test 'injects time as formatted string with millisecond in localtime if timezone not specified' do |data|
356
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "string", "time_format" => "%Y_%m_%d %H:%M:%S.%3N %z"))
357
+ @d.start
358
+
359
+ injected = {"timedata" => time_in_localtime.strftime("%Y_%m_%d %H:%M:%S.%3N %z")}
360
+ expected_es = Fluent::MultiEventStream.new
361
+ data.each do |t, r|
362
+ expected_es.add(t, r.merge(injected))
363
+ end
364
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
365
+ end
366
+
367
+ data(
368
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
369
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
370
+ )
371
+ test 'injects time as formatted string in specified timezone' do |data|
372
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "string", "time_format" => "%Y_%m_%d %H:%M:%S %z", "timezone" => "-0800"))
373
+ @d.start
374
+
375
+ injected = {"timedata" => Time.at(time_in_unix).localtime("-08:00").strftime("%Y_%m_%d %H:%M:%S -0800")}
376
+ expected_es = Fluent::MultiEventStream.new
377
+ data.each do |t, r|
378
+ expected_es.add(t, r.merge(injected))
379
+ end
380
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
381
+ end
382
+
383
+ data(
384
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
385
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
386
+ )
387
+ test 'injects hostname, tag and time' do |data|
388
+ @d.configure(config_inject_section(
389
+ "hostname_key" => "hostnamedata",
390
+ "hostname" => "myname.local",
391
+ "tag_key" => "tagdata",
392
+ "time_key" => "timedata",
393
+ "time_type" => "string",
394
+ "time_format" => "%Y_%m_%d %H:%M:%S.%N %z",
395
+ "timezone" => "+0000",
396
+ ))
397
+ @d.start
398
+
399
+ injected = {"hostnamedata" => "myname.local", "tagdata" => "tag", "timedata" => time_in_utc.strftime("%Y_%m_%d %H:%M:%S.%N %z")}
400
+ expected_es = Fluent::MultiEventStream.new
401
+ data.each do |t, r|
402
+ expected_es.add(t, r.merge(injected))
403
+ end
404
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
405
+ end
406
+ end
407
+
408
+ sub_test_case 'time formatting with modified timezone' do
409
+ setup do
410
+ @time = event_time("2014-09-27 00:00:00 +00:00").to_i
411
+ end
412
+
413
+ def with_timezone(tz)
414
+ oldtz, ENV['TZ'] = ENV['TZ'], tz
415
+ yield
416
+ ensure
417
+ ENV['TZ'] = oldtz
418
+ end
419
+
420
+ def format(conf)
421
+ @d.configure(config_inject_section(
422
+ "hostname_key" => "hostnamedata",
423
+ "hostname" => "myname.local",
424
+ "tag_key" => "tagdata",
425
+ "time_key" => "timedata",
426
+ "time_type" => "string",
427
+ "time_format" => "%Y_%m_%d %H:%M:%S.%N %z",
428
+ "timezone" => "+0000",
429
+ ))
430
+ @d.start
431
+
432
+ record = {"key1" => "value1", "key2" => 2}
433
+ injected = {"hostnamedata" => "myname.local", "tagdata" => "tag", "timedata" => "2016_06_20 23:10:11.320101224 +0000"}
434
+ assert_equal record.merge(injected), @d.inject_values_to_record('tag', time, record)
435
+
436
+
437
+ d = create_driver({'include_time_key' => true}.merge(conf))
438
+ formatted = d.instance.format("tag", @time, {})
439
+ # Drop the leading "time:" and the trailing "\n".
440
+ formatted[5..-2]
441
+ end
442
+
443
+ def test_nothing_specified_about_time_formatting
444
+ with_timezone("UTC-01") do
445
+ # 'localtime' is true by default.
446
+ @d.configure(config_inject_section("time_key" => "t", "time_type" => "string"))
447
+ @d.start
448
+ record = @d.inject_values_to_record('tag', @time, {"message" => "yay"})
449
+
450
+ assert_equal("2014-09-27T01:00:00+01:00", record['t'])
451
+ end
452
+ end
453
+
454
+ def test_utc
455
+ with_timezone("UTC-01") do
456
+ # 'utc' takes precedence over 'localtime'.
457
+ @d.configure(config_inject_section("time_key" => "t", "time_type" => "string", "utc" => "true"))
458
+ @d.start
459
+ record = @d.inject_values_to_record('tag', @time, {"message" => "yay"})
460
+
461
+ assert_equal("2014-09-27T00:00:00Z", record['t'])
462
+ end
463
+ end
464
+
465
+ def test_timezone
466
+ with_timezone("UTC-01") do
467
+ # 'timezone' takes precedence over 'localtime'.
468
+ @d.configure(config_inject_section("time_key" => "t", "time_type" => "string", "timezone" => "+02"))
469
+ @d.start
470
+ record = @d.inject_values_to_record('tag', @time, {"message" => "yay"})
471
+
472
+ assert_equal("2014-09-27T02:00:00+02:00", record['t'])
473
+ end
474
+ end
475
+
476
+ def test_utc_timezone
477
+ with_timezone("UTC-01") do
478
+ # 'timezone' takes precedence over 'utc'.
479
+ @d.configure(config_inject_section("time_key" => "t", "time_type" => "string", "timezone" => "Asia/Tokyo", "utc" => "true"))
480
+ @d.start
481
+ record = @d.inject_values_to_record('tag', @time, {"message" => "yay"})
482
+
483
+ assert_equal("2014-09-27T09:00:00+09:00", record['t'])
484
+ end
485
+ end
486
+ end
487
+ end