fluentd 0.12.40 → 1.6.2

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 (428) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  4. data/.github/ISSUE_TEMPLATE.md +17 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  6. data/.gitignore +5 -0
  7. data/.gitlab/cicd-template.yaml +10 -0
  8. data/.gitlab-ci.yml +147 -0
  9. data/.travis.yml +56 -20
  10. data/ADOPTERS.md +5 -0
  11. data/CHANGELOG.md +1369 -0
  12. data/CONTRIBUTING.md +16 -5
  13. data/GOVERNANCE.md +55 -0
  14. data/Gemfile +5 -0
  15. data/GithubWorkflow.md +78 -0
  16. data/LICENSE +202 -0
  17. data/MAINTAINERS.md +7 -0
  18. data/README.md +23 -11
  19. data/Rakefile +48 -2
  20. data/Vagrantfile +17 -0
  21. data/appveyor.yml +37 -0
  22. data/bin/fluent-binlog-reader +7 -0
  23. data/bin/fluent-ca-generate +6 -0
  24. data/bin/fluent-plugin-config-format +5 -0
  25. data/bin/fluent-plugin-generate +5 -0
  26. data/bin/fluentd +3 -0
  27. data/code-of-conduct.md +3 -0
  28. data/example/copy_roundrobin.conf +39 -0
  29. data/example/counter.conf +18 -0
  30. data/example/in_dummy_blocks.conf +17 -0
  31. data/example/in_dummy_with_compression.conf +23 -0
  32. data/example/in_forward.conf +7 -0
  33. data/example/in_forward_client.conf +37 -0
  34. data/example/in_forward_shared_key.conf +15 -0
  35. data/example/in_forward_tls.conf +14 -0
  36. data/example/in_forward_users.conf +24 -0
  37. data/example/in_forward_workers.conf +21 -0
  38. data/example/in_http.conf +3 -1
  39. data/example/in_out_forward.conf +17 -0
  40. data/example/logevents.conf +25 -0
  41. data/example/multi_filters.conf +61 -0
  42. data/example/out_exec_filter.conf +42 -0
  43. data/example/out_forward.conf +13 -13
  44. data/example/out_forward_buf_file.conf +23 -0
  45. data/example/out_forward_client.conf +109 -0
  46. data/example/out_forward_heartbeat_none.conf +16 -0
  47. data/example/out_forward_shared_key.conf +36 -0
  48. data/example/out_forward_tls.conf +18 -0
  49. data/example/out_forward_users.conf +65 -0
  50. data/example/out_null.conf +36 -0
  51. data/example/secondary_file.conf +42 -0
  52. data/example/suppress_config_dump.conf +7 -0
  53. data/example/worker_section.conf +36 -0
  54. data/fluent.conf +29 -0
  55. data/fluentd.gemspec +21 -11
  56. data/lib/fluent/agent.rb +67 -90
  57. data/lib/fluent/clock.rb +62 -0
  58. data/lib/fluent/command/binlog_reader.rb +244 -0
  59. data/lib/fluent/command/ca_generate.rb +181 -0
  60. data/lib/fluent/command/cat.rb +42 -18
  61. data/lib/fluent/command/debug.rb +12 -10
  62. data/lib/fluent/command/fluentd.rb +153 -5
  63. data/lib/fluent/command/plugin_config_formatter.rb +292 -0
  64. data/lib/fluent/command/plugin_generator.rb +324 -0
  65. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  66. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  67. data/lib/fluent/compat/exec_util.rb +129 -0
  68. data/lib/fluent/compat/file_util.rb +54 -0
  69. data/lib/fluent/compat/filter.rb +68 -0
  70. data/lib/fluent/compat/formatter.rb +111 -0
  71. data/lib/fluent/compat/formatter_utils.rb +85 -0
  72. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  73. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  74. data/lib/fluent/compat/input.rb +49 -0
  75. data/lib/fluent/compat/output.rb +718 -0
  76. data/lib/fluent/compat/output_chain.rb +60 -0
  77. data/lib/fluent/compat/parser.rb +310 -0
  78. data/lib/fluent/compat/parser_utils.rb +40 -0
  79. data/lib/fluent/compat/propagate_default.rb +62 -0
  80. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  81. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  82. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  83. data/lib/fluent/compat/socket_util.rb +165 -0
  84. data/lib/fluent/compat/string_util.rb +34 -0
  85. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  86. data/lib/fluent/compat/type_converter.rb +90 -0
  87. data/lib/fluent/config/configure_proxy.rb +210 -62
  88. data/lib/fluent/config/dsl.rb +12 -5
  89. data/lib/fluent/config/element.rb +107 -9
  90. data/lib/fluent/config/literal_parser.rb +9 -3
  91. data/lib/fluent/config/parser.rb +4 -4
  92. data/lib/fluent/config/section.rb +51 -14
  93. data/lib/fluent/config/types.rb +28 -13
  94. data/lib/fluent/config/v1_parser.rb +3 -5
  95. data/lib/fluent/config.rb +23 -20
  96. data/lib/fluent/configurable.rb +79 -21
  97. data/lib/fluent/counter/base_socket.rb +46 -0
  98. data/lib/fluent/counter/client.rb +297 -0
  99. data/lib/fluent/counter/error.rb +86 -0
  100. data/lib/fluent/counter/mutex_hash.rb +163 -0
  101. data/lib/fluent/counter/server.rb +273 -0
  102. data/lib/fluent/counter/store.rb +205 -0
  103. data/lib/fluent/counter/validator.rb +145 -0
  104. data/lib/fluent/counter.rb +23 -0
  105. data/lib/fluent/daemon.rb +15 -0
  106. data/lib/fluent/engine.rb +102 -65
  107. data/lib/fluent/env.rb +7 -3
  108. data/lib/fluent/error.rb +30 -0
  109. data/lib/fluent/event.rb +197 -21
  110. data/lib/fluent/event_router.rb +93 -10
  111. data/lib/fluent/filter.rb +2 -50
  112. data/lib/fluent/formatter.rb +4 -293
  113. data/lib/fluent/input.rb +2 -32
  114. data/lib/fluent/label.rb +10 -2
  115. data/lib/fluent/load.rb +3 -3
  116. data/lib/fluent/log.rb +348 -81
  117. data/lib/fluent/match.rb +37 -36
  118. data/lib/fluent/mixin.rb +12 -176
  119. data/lib/fluent/msgpack_factory.rb +62 -0
  120. data/lib/fluent/output.rb +10 -612
  121. data/lib/fluent/output_chain.rb +23 -0
  122. data/lib/fluent/parser.rb +4 -800
  123. data/lib/fluent/plugin/bare_output.rb +63 -0
  124. data/lib/fluent/plugin/base.rb +192 -0
  125. data/lib/fluent/plugin/buf_file.rb +128 -174
  126. data/lib/fluent/plugin/buf_memory.rb +9 -92
  127. data/lib/fluent/plugin/buffer/chunk.rb +221 -0
  128. data/lib/fluent/plugin/buffer/file_chunk.rb +383 -0
  129. data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
  130. data/lib/fluent/plugin/buffer.rb +779 -0
  131. data/lib/fluent/plugin/compressable.rb +92 -0
  132. data/lib/fluent/plugin/exec_util.rb +3 -108
  133. data/lib/fluent/plugin/file_util.rb +4 -34
  134. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  135. data/lib/fluent/plugin/filter.rb +93 -0
  136. data/lib/fluent/plugin/filter_grep.rb +117 -34
  137. data/lib/fluent/plugin/filter_parser.rb +85 -62
  138. data/lib/fluent/plugin/filter_record_transformer.rb +27 -39
  139. data/lib/fluent/plugin/filter_stdout.rb +15 -12
  140. data/lib/fluent/plugin/formatter.rb +50 -0
  141. data/lib/fluent/plugin/formatter_csv.rb +52 -0
  142. data/lib/fluent/plugin/formatter_hash.rb +33 -0
  143. data/lib/fluent/plugin/formatter_json.rb +55 -0
  144. data/lib/fluent/plugin/formatter_ltsv.rb +42 -0
  145. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  146. data/lib/fluent/plugin/formatter_out_file.rb +51 -0
  147. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  148. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  149. data/lib/fluent/plugin/formatter_tsv.rb +38 -0
  150. data/lib/fluent/plugin/in_debug_agent.rb +17 -6
  151. data/lib/fluent/plugin/in_dummy.rb +47 -20
  152. data/lib/fluent/plugin/in_exec.rb +55 -123
  153. data/lib/fluent/plugin/in_forward.rb +299 -216
  154. data/lib/fluent/plugin/in_gc_stat.rb +14 -36
  155. data/lib/fluent/plugin/in_http.rb +204 -91
  156. data/lib/fluent/plugin/in_monitor_agent.rb +186 -258
  157. data/lib/fluent/plugin/in_object_space.rb +13 -41
  158. data/lib/fluent/plugin/in_syslog.rb +112 -134
  159. data/lib/fluent/plugin/in_tail.rb +408 -745
  160. data/lib/fluent/plugin/in_tcp.rb +66 -9
  161. data/lib/fluent/plugin/in_udp.rb +60 -11
  162. data/lib/fluent/plugin/{in_stream.rb → in_unix.rb} +8 -4
  163. data/lib/fluent/plugin/input.rb +37 -0
  164. data/lib/fluent/plugin/multi_output.rb +158 -0
  165. data/lib/fluent/plugin/out_copy.rb +23 -35
  166. data/lib/fluent/plugin/out_exec.rb +67 -70
  167. data/lib/fluent/plugin/out_exec_filter.rb +204 -271
  168. data/lib/fluent/plugin/out_file.rb +267 -73
  169. data/lib/fluent/plugin/out_forward.rb +854 -325
  170. data/lib/fluent/plugin/out_null.rb +42 -9
  171. data/lib/fluent/plugin/out_relabel.rb +9 -5
  172. data/lib/fluent/plugin/out_roundrobin.rb +18 -37
  173. data/lib/fluent/plugin/out_secondary_file.rb +133 -0
  174. data/lib/fluent/plugin/out_stdout.rb +43 -10
  175. data/lib/fluent/plugin/out_stream.rb +7 -2
  176. data/lib/fluent/plugin/output.rb +1498 -0
  177. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  178. data/lib/fluent/plugin/parser.rb +191 -0
  179. data/lib/fluent/plugin/parser_apache.rb +28 -0
  180. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  181. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  182. data/lib/fluent/plugin/parser_csv.rb +39 -0
  183. data/lib/fluent/plugin/parser_json.rb +94 -0
  184. data/lib/fluent/plugin/parser_ltsv.rb +49 -0
  185. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  186. data/lib/fluent/plugin/parser_multiline.rb +106 -0
  187. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  188. data/lib/fluent/plugin/parser_none.rb +36 -0
  189. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  190. data/lib/fluent/plugin/parser_syslog.rb +142 -0
  191. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  192. data/lib/fluent/plugin/socket_util.rb +3 -143
  193. data/lib/fluent/plugin/storage.rb +84 -0
  194. data/lib/fluent/plugin/storage_local.rb +164 -0
  195. data/lib/fluent/plugin/string_util.rb +3 -15
  196. data/lib/fluent/plugin.rb +122 -121
  197. data/lib/fluent/plugin_helper/cert_option.rb +178 -0
  198. data/lib/fluent/plugin_helper/child_process.rb +364 -0
  199. data/lib/fluent/plugin_helper/compat_parameters.rb +333 -0
  200. data/lib/fluent/plugin_helper/counter.rb +51 -0
  201. data/lib/fluent/plugin_helper/event_emitter.rb +93 -0
  202. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  203. data/lib/fluent/plugin_helper/extract.rb +104 -0
  204. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  205. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  206. data/lib/fluent/plugin_helper/http_server/compat/server.rb +81 -0
  207. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  208. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  209. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  210. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  211. data/lib/fluent/plugin_helper/http_server/server.rb +87 -0
  212. data/lib/fluent/plugin_helper/http_server.rb +76 -0
  213. data/lib/fluent/plugin_helper/inject.rb +151 -0
  214. data/lib/fluent/plugin_helper/parser.rb +147 -0
  215. data/lib/fluent/plugin_helper/record_accessor.rb +210 -0
  216. data/lib/fluent/plugin_helper/retry_state.rb +205 -0
  217. data/lib/fluent/plugin_helper/server.rb +807 -0
  218. data/lib/fluent/plugin_helper/socket.rb +250 -0
  219. data/lib/fluent/plugin_helper/socket_option.rb +80 -0
  220. data/lib/fluent/plugin_helper/storage.rb +349 -0
  221. data/lib/fluent/plugin_helper/thread.rb +179 -0
  222. data/lib/fluent/plugin_helper/timer.rb +92 -0
  223. data/lib/fluent/plugin_helper.rb +73 -0
  224. data/lib/fluent/plugin_id.rb +80 -0
  225. data/lib/fluent/process.rb +3 -489
  226. data/lib/fluent/registry.rb +52 -10
  227. data/lib/fluent/root_agent.rb +204 -42
  228. data/lib/fluent/supervisor.rb +597 -359
  229. data/lib/fluent/system_config.rb +131 -42
  230. data/lib/fluent/test/base.rb +6 -54
  231. data/lib/fluent/test/driver/base.rb +224 -0
  232. data/lib/fluent/test/driver/base_owned.rb +70 -0
  233. data/lib/fluent/test/driver/base_owner.rb +135 -0
  234. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  235. data/lib/fluent/test/driver/filter.rb +57 -0
  236. data/lib/fluent/test/driver/formatter.rb +30 -0
  237. data/lib/fluent/test/driver/input.rb +31 -0
  238. data/lib/fluent/test/driver/multi_output.rb +53 -0
  239. data/lib/fluent/test/driver/output.rb +102 -0
  240. data/lib/fluent/test/driver/parser.rb +30 -0
  241. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  242. data/lib/fluent/test/filter_test.rb +0 -1
  243. data/lib/fluent/test/formatter_test.rb +4 -1
  244. data/lib/fluent/test/helpers.rb +58 -10
  245. data/lib/fluent/test/input_test.rb +27 -19
  246. data/lib/fluent/test/log.rb +79 -0
  247. data/lib/fluent/test/output_test.rb +28 -39
  248. data/lib/fluent/test/parser_test.rb +3 -1
  249. data/lib/fluent/test/startup_shutdown.rb +46 -0
  250. data/lib/fluent/test.rb +33 -1
  251. data/lib/fluent/time.rb +450 -1
  252. data/lib/fluent/timezone.rb +27 -3
  253. data/lib/fluent/{status.rb → unique_id.rb} +15 -24
  254. data/lib/fluent/version.rb +1 -1
  255. data/lib/fluent/winsvc.rb +85 -0
  256. data/templates/new_gem/Gemfile +3 -0
  257. data/templates/new_gem/README.md.erb +43 -0
  258. data/templates/new_gem/Rakefile +13 -0
  259. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  260. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  261. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  262. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  263. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  264. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  265. data/templates/new_gem/test/helper.rb.erb +8 -0
  266. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  267. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  268. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  269. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  270. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  271. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  272. data/templates/plugin_config_formatter/param.md.erb +34 -0
  273. data/templates/plugin_config_formatter/section.md.erb +12 -0
  274. data/test/command/test_binlog_reader.rb +346 -0
  275. data/test/command/test_ca_generate.rb +70 -0
  276. data/test/command/test_fluentd.rb +901 -0
  277. data/test/command/test_plugin_config_formatter.rb +276 -0
  278. data/test/command/test_plugin_generator.rb +92 -0
  279. data/test/compat/test_calls_super.rb +166 -0
  280. data/test/compat/test_parser.rb +92 -0
  281. data/test/config/test_config_parser.rb +126 -2
  282. data/test/config/test_configurable.rb +946 -187
  283. data/test/config/test_configure_proxy.rb +424 -74
  284. data/test/config/test_dsl.rb +11 -11
  285. data/test/config/test_element.rb +500 -0
  286. data/test/config/test_literal_parser.rb +8 -0
  287. data/test/config/test_plugin_configuration.rb +56 -0
  288. data/test/config/test_section.rb +79 -7
  289. data/test/config/test_system_config.rb +122 -35
  290. data/test/config/test_types.rb +38 -0
  291. data/test/counter/test_client.rb +559 -0
  292. data/test/counter/test_error.rb +44 -0
  293. data/test/counter/test_mutex_hash.rb +179 -0
  294. data/test/counter/test_server.rb +589 -0
  295. data/test/counter/test_store.rb +258 -0
  296. data/test/counter/test_validator.rb +137 -0
  297. data/test/helper.rb +89 -6
  298. data/test/helpers/fuzzy_assert.rb +89 -0
  299. data/test/plugin/test_bare_output.rb +118 -0
  300. data/test/plugin/test_base.rb +115 -0
  301. data/test/plugin/test_buf_file.rb +823 -460
  302. data/test/plugin/test_buf_memory.rb +32 -194
  303. data/test/plugin/test_buffer.rb +1233 -0
  304. data/test/plugin/test_buffer_chunk.rb +198 -0
  305. data/test/plugin/test_buffer_file_chunk.rb +844 -0
  306. data/test/plugin/test_buffer_memory_chunk.rb +338 -0
  307. data/test/plugin/test_compressable.rb +84 -0
  308. data/test/plugin/test_filter.rb +357 -0
  309. data/test/plugin/test_filter_grep.rb +540 -29
  310. data/test/plugin/test_filter_parser.rb +439 -452
  311. data/test/plugin/test_filter_record_transformer.rb +123 -166
  312. data/test/plugin/test_filter_stdout.rb +160 -72
  313. data/test/plugin/test_formatter_csv.rb +111 -0
  314. data/test/plugin/test_formatter_hash.rb +35 -0
  315. data/test/plugin/test_formatter_json.rb +51 -0
  316. data/test/plugin/test_formatter_ltsv.rb +62 -0
  317. data/test/plugin/test_formatter_msgpack.rb +28 -0
  318. data/test/plugin/test_formatter_out_file.rb +95 -0
  319. data/test/plugin/test_formatter_single_value.rb +38 -0
  320. data/test/plugin/test_formatter_tsv.rb +68 -0
  321. data/test/plugin/test_in_debug_agent.rb +24 -1
  322. data/test/plugin/test_in_dummy.rb +111 -18
  323. data/test/plugin/test_in_exec.rb +200 -113
  324. data/test/plugin/test_in_forward.rb +990 -387
  325. data/test/plugin/test_in_gc_stat.rb +10 -8
  326. data/test/plugin/test_in_http.rb +600 -224
  327. data/test/plugin/test_in_monitor_agent.rb +690 -0
  328. data/test/plugin/test_in_object_space.rb +24 -8
  329. data/test/plugin/test_in_syslog.rb +154 -215
  330. data/test/plugin/test_in_tail.rb +1006 -707
  331. data/test/plugin/test_in_tcp.rb +125 -48
  332. data/test/plugin/test_in_udp.rb +204 -63
  333. data/test/plugin/{test_in_stream.rb → test_in_unix.rb} +14 -13
  334. data/test/plugin/test_input.rb +126 -0
  335. data/test/plugin/test_metadata.rb +89 -0
  336. data/test/plugin/test_multi_output.rb +180 -0
  337. data/test/plugin/test_out_copy.rb +117 -112
  338. data/test/plugin/test_out_exec.rb +258 -53
  339. data/test/plugin/test_out_exec_filter.rb +538 -115
  340. data/test/plugin/test_out_file.rb +865 -178
  341. data/test/plugin/test_out_forward.rb +998 -210
  342. data/test/plugin/test_out_null.rb +105 -0
  343. data/test/plugin/test_out_relabel.rb +28 -0
  344. data/test/plugin/test_out_roundrobin.rb +36 -29
  345. data/test/plugin/test_out_secondary_file.rb +458 -0
  346. data/test/plugin/test_out_stdout.rb +135 -37
  347. data/test/plugin/test_out_stream.rb +18 -0
  348. data/test/plugin/test_output.rb +984 -0
  349. data/test/plugin/test_output_as_buffered.rb +2021 -0
  350. data/test/plugin/test_output_as_buffered_backup.rb +312 -0
  351. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  352. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  353. data/test/plugin/test_output_as_buffered_retries.rb +911 -0
  354. data/test/plugin/test_output_as_buffered_secondary.rb +874 -0
  355. data/test/plugin/test_output_as_standard.rb +374 -0
  356. data/test/plugin/test_owned_by.rb +35 -0
  357. data/test/plugin/test_parser.rb +359 -0
  358. data/test/plugin/test_parser_apache.rb +42 -0
  359. data/test/plugin/test_parser_apache2.rb +47 -0
  360. data/test/plugin/test_parser_apache_error.rb +45 -0
  361. data/test/plugin/test_parser_csv.rb +103 -0
  362. data/test/plugin/test_parser_json.rb +138 -0
  363. data/test/plugin/test_parser_labeled_tsv.rb +145 -0
  364. data/test/plugin/test_parser_multiline.rb +100 -0
  365. data/test/plugin/test_parser_nginx.rb +88 -0
  366. data/test/plugin/test_parser_none.rb +52 -0
  367. data/test/plugin/test_parser_regexp.rb +289 -0
  368. data/test/plugin/test_parser_syslog.rb +441 -0
  369. data/test/plugin/test_parser_tsv.rb +122 -0
  370. data/test/plugin/test_storage.rb +167 -0
  371. data/test/plugin/test_storage_local.rb +335 -0
  372. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  373. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  374. data/test/plugin_helper/data/cert/cert.pem +19 -0
  375. data/test/plugin_helper/http_server/test_app.rb +65 -0
  376. data/test/plugin_helper/http_server/test_route.rb +32 -0
  377. data/test/plugin_helper/test_cert_option.rb +16 -0
  378. data/test/plugin_helper/test_child_process.rb +794 -0
  379. data/test/plugin_helper/test_compat_parameters.rb +353 -0
  380. data/test/plugin_helper/test_event_emitter.rb +51 -0
  381. data/test/plugin_helper/test_event_loop.rb +52 -0
  382. data/test/plugin_helper/test_extract.rb +194 -0
  383. data/test/plugin_helper/test_formatter.rb +255 -0
  384. data/test/plugin_helper/test_http_server_helper.rb +205 -0
  385. data/test/plugin_helper/test_inject.rb +519 -0
  386. data/test/plugin_helper/test_parser.rb +264 -0
  387. data/test/plugin_helper/test_record_accessor.rb +197 -0
  388. data/test/plugin_helper/test_retry_state.rb +442 -0
  389. data/test/plugin_helper/test_server.rb +1714 -0
  390. data/test/plugin_helper/test_storage.rb +542 -0
  391. data/test/plugin_helper/test_thread.rb +164 -0
  392. data/test/plugin_helper/test_timer.rb +132 -0
  393. data/test/scripts/exec_script.rb +0 -6
  394. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  395. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  396. data/test/scripts/fluent/plugin/out_test.rb +23 -15
  397. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  398. data/test/test_clock.rb +164 -0
  399. data/test/test_config.rb +16 -7
  400. data/test/test_configdsl.rb +2 -2
  401. data/test/test_event.rb +360 -13
  402. data/test/test_event_router.rb +108 -11
  403. data/test/test_event_time.rb +199 -0
  404. data/test/test_filter.rb +48 -6
  405. data/test/test_formatter.rb +11 -391
  406. data/test/test_input.rb +1 -1
  407. data/test/test_log.rb +591 -31
  408. data/test/test_mixin.rb +1 -1
  409. data/test/test_output.rb +121 -185
  410. data/test/test_plugin.rb +251 -0
  411. data/test/test_plugin_classes.rb +177 -10
  412. data/test/test_plugin_helper.rb +81 -0
  413. data/test/test_plugin_id.rb +101 -0
  414. data/test/test_process.rb +8 -42
  415. data/test/test_root_agent.rb +766 -21
  416. data/test/test_supervisor.rb +481 -0
  417. data/test/test_test_drivers.rb +135 -0
  418. data/test/test_time_formatter.rb +282 -0
  419. data/test/test_time_parser.rb +231 -0
  420. data/test/test_unique_id.rb +47 -0
  421. metadata +454 -60
  422. data/COPYING +0 -14
  423. data/ChangeLog +0 -666
  424. data/lib/fluent/buffer.rb +0 -365
  425. data/lib/fluent/plugin/in_status.rb +0 -76
  426. data/test/plugin/test_in_status.rb +0 -38
  427. data/test/test_buffer.rb +0 -624
  428. data/test/test_parser.rb +0 -1305
@@ -0,0 +1,519 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin_helper/inject'
3
+ require 'fluent/plugin/output'
4
+ require 'fluent/event'
5
+ require 'time'
6
+
7
+ class InjectHelperTest < Test::Unit::TestCase
8
+ class Dummy < Fluent::Plugin::TestBase
9
+ helpers :inject
10
+ end
11
+
12
+ class Dummy2 < Fluent::Plugin::TestBase
13
+ helpers :inject
14
+ config_section :inject do
15
+ config_set_default :hostname_key, 'host'
16
+ end
17
+ end
18
+
19
+ class Dummy3 < Fluent::Plugin::Output
20
+ helpers :inject
21
+ def write(chunk)
22
+ # dummy
23
+ end
24
+ end
25
+
26
+ def config_inject_section(hash = {})
27
+ config_element('ROOT', '', {}, [config_element('inject', '', hash)])
28
+ end
29
+
30
+ setup do
31
+ Fluent::Test.setup
32
+ @d = Dummy.new
33
+ end
34
+
35
+ teardown do
36
+ if @d
37
+ @d.stop unless @d.stopped?
38
+ @d.before_shutdown unless @d.before_shutdown?
39
+ @d.shutdown unless @d.shutdown?
40
+ @d.after_shutdown unless @d.after_shutdown?
41
+ @d.close unless @d.closed?
42
+ @d.terminate unless @d.terminated?
43
+ end
44
+ end
45
+
46
+ test 'can override default parameters, but not overwrite whole definition' do
47
+ d = Dummy.new
48
+ d.configure(config_element())
49
+ assert_nil d.inject_config
50
+
51
+ d = Dummy2.new
52
+ d.configure(config_element('ROOT', '', {}, [config_element('inject')]))
53
+ assert d.inject_config
54
+ assert_equal 'host', d.inject_config.hostname_key
55
+ end
56
+
57
+ test 'do nothing in default' do
58
+ @d.configure(config_inject_section())
59
+ @d.start
60
+ assert_nil @d.instance_eval{ @_inject_hostname_key }
61
+ assert_nil @d.instance_eval{ @_inject_hostname }
62
+ assert_nil @d.instance_eval{ @_inject_worker_id_key }
63
+ assert_nil @d.instance_eval{ @_inject_worker_id }
64
+ assert_nil @d.instance_eval{ @_inject_tag_key }
65
+ assert_nil @d.instance_eval{ @_inject_time_key }
66
+ assert_nil @d.instance_eval{ @_inject_time_formatter }
67
+
68
+ time = event_time()
69
+ record = {"key1" => "value1", "key2" => 2}
70
+ assert_equal record, @d.inject_values_to_record('tag', time, record)
71
+ assert_equal record.object_id, @d.inject_values_to_record('tag', time, record).object_id
72
+
73
+ es0 = Fluent::OneEventStream.new(time, {"key1" => "v", "key2" => 0})
74
+
75
+ es1 = Fluent::ArrayEventStream.new([ [time, {"key1" => "a", "key2" => 1}], [time, {"key1" => "b", "key2" => 2}] ])
76
+
77
+ es2 = Fluent::MultiEventStream.new
78
+ es2.add(event_time(), {"key1" => "a", "key2" => 1})
79
+ es2.add(event_time(), {"key1" => "b", "key2" => 2})
80
+
81
+ es3 = Fluent::MessagePackEventStream.new(es2.to_msgpack_stream)
82
+
83
+ [es0, es1, es2, es3].each do |es|
84
+ assert_equal es, @d.inject_values_to_event_stream('tag', es), "failed for #{es.class}"
85
+ assert_equal es.object_id, @d.inject_values_to_event_stream('tag', es).object_id, "failed for #{es.class}"
86
+ end
87
+ end
88
+
89
+ test 'can be configured as specified' do
90
+ with_worker_config(workers: 1, worker_id: 0) do
91
+ @d.configure(config_inject_section(
92
+ "hostname_key" => "hostname",
93
+ "hostname" => "myhost.local",
94
+ "worker_id_key" => "worker_id",
95
+ "tag_key" => "tag",
96
+ "time_key" => "time",
97
+ "time_type" => "string",
98
+ "time_format" => "%Y-%m-%d %H:%M:%S.%N",
99
+ "timezone" => "-0700",
100
+ ))
101
+ end
102
+
103
+ assert_equal "hostname", @d.instance_eval{ @_inject_hostname_key }
104
+ assert_equal "myhost.local", @d.instance_eval{ @_inject_hostname }
105
+ assert_equal "worker_id", @d.instance_eval{ @_inject_worker_id_key }
106
+ assert_equal 0, @d.instance_eval{ @_inject_worker_id }
107
+ assert_equal "tag", @d.instance_eval{ @_inject_tag_key }
108
+ assert_equal "time", @d.instance_eval{ @_inject_time_key }
109
+ assert_equal :string, @d.instance_eval{ @inject_config.time_type }
110
+ assert_not_nil @d.instance_eval{ @_inject_time_formatter }
111
+ end
112
+
113
+ test 'raise an error when injected hostname is used in buffer chunk key too' do
114
+ @d = Dummy3.new
115
+ conf = config_element('ROOT', '', {}, [
116
+ config_element('inject', '', {'hostname_key' => 'h'}),
117
+ config_element('buffer', 'tag,h'),
118
+ ])
119
+ assert_raise Fluent::ConfigError.new("the key specified by 'hostname_key' in <inject> cannot be used in buffering chunk key.") do
120
+ @d.configure(conf)
121
+ end
122
+ end
123
+
124
+ sub_test_case 'using inject_values_to_record' do
125
+ test 'injects hostname automatically detected' do
126
+ detected_hostname = `hostname`.chomp
127
+ @d.configure(config_inject_section("hostname_key" => "host"))
128
+ logs = @d.log.out.logs
129
+ assert{ logs.any?{|l| l.include?("[info]: using hostname for specified field host_key=\"host\" host_name=\"#{detected_hostname}\"") } }
130
+ @d.start
131
+
132
+ time = event_time()
133
+ record = {"key1" => "value1", "key2" => 2}
134
+ assert_equal record.merge({"host" => detected_hostname}), @d.inject_values_to_record('tag', time, record)
135
+ end
136
+
137
+ test 'injects hostname as specified value' do
138
+ @d.configure(config_inject_section("hostname_key" => "host", "hostname" => "myhost.yay.local"))
139
+ @d.start
140
+
141
+ time = event_time()
142
+ record = {"key1" => "value1", "key2" => 2}
143
+ assert_equal record.merge({"host" => "myhost.yay.local"}), @d.inject_values_to_record('tag', time, record)
144
+ end
145
+
146
+ test 'injects worker id' do
147
+ with_worker_config(workers: 3, worker_id: 2) do
148
+ @d.configure(config_inject_section("worker_id_key" => "workerid"))
149
+ end
150
+ @d.start
151
+
152
+ time = event_time()
153
+ record = {"key1" => "value1", "key2" => 2}
154
+ assert_equal record.merge({"workerid" => 2}), @d.inject_values_to_record('tag', time, record)
155
+ end
156
+
157
+ test 'injects tag into specified key' do
158
+ @d.configure(config_inject_section("tag_key" => "mytag"))
159
+ @d.start
160
+
161
+ time = event_time()
162
+ record = {"key1" => "value1", "key2" => 2}
163
+ assert_equal record.merge({"mytag" => "tag.test"}), @d.inject_values_to_record('tag.test', time, record)
164
+ end
165
+
166
+ test 'injects time as floating point value into specified key as default' do
167
+ time_in_unix = Time.parse("2016-06-21 08:10:11 +0900").to_i # 1466464211 in unix time
168
+ time_subsecond = 320_101_224
169
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
170
+ float_time = 1466464211.320101 # microsecond precision in float
171
+
172
+ @d.configure(config_inject_section("time_key" => "timedata"))
173
+ @d.start
174
+
175
+ record = {"key1" => "value1", "key2" => 2}
176
+ assert_equal record.merge({"timedata" => float_time}), @d.inject_values_to_record('tag', time, record)
177
+ end
178
+
179
+ test 'injects time as unix time into specified key' do
180
+ time_in_unix = Time.parse("2016-06-21 08:10:11 +0900").to_i
181
+ time_subsecond = 320_101_224
182
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
183
+ int_time = 1466464211
184
+
185
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "unixtime"))
186
+ @d.start
187
+
188
+ record = {"key1" => "value1", "key2" => 2}
189
+ assert_equal record.merge({"timedata" => int_time}), @d.inject_values_to_record('tag', time, record)
190
+ end
191
+
192
+ test 'injects time as formatted string in localtime if timezone not specified' do
193
+ local_timezone = Time.now.strftime('%z')
194
+ time_in_unix = Time.parse("2016-06-21 08:10:11 #{local_timezone}").to_i
195
+ time_subsecond = 320_101_224
196
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
197
+
198
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "string", "time_format" => "%Y_%m_%d %H:%M:%S %z"))
199
+ @d.start
200
+
201
+ record = {"key1" => "value1", "key2" => 2}
202
+ assert_equal record.merge({"timedata" => "2016_06_21 08:10:11 #{local_timezone}"}), @d.inject_values_to_record('tag', time, record)
203
+ end
204
+
205
+ test 'injects time as formatted string with nanosecond in localtime if timezone not specified' do
206
+ local_timezone = Time.now.strftime('%z')
207
+ time_in_unix = Time.parse("2016-06-21 08:10:11 #{local_timezone}").to_i
208
+ time_subsecond = 320_101_224
209
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
210
+
211
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "string", "time_format" => "%Y_%m_%d %H:%M:%S.%N %z"))
212
+ @d.start
213
+
214
+ record = {"key1" => "value1", "key2" => 2}
215
+ assert_equal record.merge({"timedata" => "2016_06_21 08:10:11.320101224 #{local_timezone}"}), @d.inject_values_to_record('tag', time, record)
216
+ end
217
+
218
+ test 'injects time as formatted string with millisecond in localtime if timezone not specified' do
219
+ local_timezone = Time.now.strftime('%z')
220
+ time_in_unix = Time.parse("2016-06-21 08:10:11 #{local_timezone}").to_i
221
+ time_subsecond = 320_101_224
222
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
223
+
224
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "string", "time_format" => "%Y_%m_%d %H:%M:%S.%3N %z"))
225
+ @d.start
226
+
227
+ record = {"key1" => "value1", "key2" => 2}
228
+ assert_equal record.merge({"timedata" => "2016_06_21 08:10:11.320 #{local_timezone}"}), @d.inject_values_to_record('tag', time, record)
229
+ end
230
+
231
+ test 'injects time as formatted string in specified timezone' do
232
+ time_in_unix = Time.parse("2016-06-21 08:10:11 +0000").to_i
233
+ time_subsecond = 320_101_224
234
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
235
+
236
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "string", "time_format" => "%Y_%m_%d %H:%M:%S %z", "timezone" => "-0800"))
237
+ @d.start
238
+
239
+ record = {"key1" => "value1", "key2" => 2}
240
+ assert_equal record.merge({"timedata" => "2016_06_21 00:10:11 -0800"}), @d.inject_values_to_record('tag', time, record)
241
+ end
242
+
243
+ test 'injects hostname, tag and time' do
244
+ time_in_unix = Time.parse("2016-06-21 08:10:11 +0900").to_i
245
+ time_subsecond = 320_101_224
246
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
247
+
248
+ @d.configure(config_inject_section(
249
+ "hostname_key" => "hostnamedata",
250
+ "hostname" => "myname.local",
251
+ "tag_key" => "tagdata",
252
+ "time_key" => "timedata",
253
+ "time_type" => "string",
254
+ "time_format" => "%Y_%m_%d %H:%M:%S.%N %z",
255
+ "timezone" => "+0000",
256
+ ))
257
+ @d.start
258
+
259
+ record = {"key1" => "value1", "key2" => 2}
260
+ injected = {"hostnamedata" => "myname.local", "tagdata" => "tag", "timedata" => "2016_06_20 23:10:11.320101224 +0000"}
261
+ assert_equal record.merge(injected), @d.inject_values_to_record('tag', time, record)
262
+ end
263
+ end
264
+
265
+ sub_test_case 'using inject_values_to_event_stream' do
266
+ local_timezone = Time.now.strftime('%z')
267
+ time_in_unix = Time.parse("2016-06-21 08:10:11 #{local_timezone}").to_i
268
+ time_subsecond = 320_101_224
269
+ time_in_rational = Rational(time_in_unix * 1_000_000_000 + time_subsecond, 1_000_000_000)
270
+ time_in_localtime = Time.at(time_in_rational).localtime
271
+ time_in_utc = Time.at(time_in_rational).utc
272
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
273
+ time_float = time.to_r.truncate(+6).to_f
274
+
275
+ data(
276
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
277
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
278
+ )
279
+ test 'injects hostname automatically detected' do |data|
280
+ detected_hostname = `hostname`.chomp
281
+ @d.configure(config_inject_section("hostname_key" => "host"))
282
+ logs = @d.log.out.logs
283
+ assert{ logs.any?{|l| l.include?("[info]: using hostname for specified field host_key=\"host\" host_name=\"#{detected_hostname}\"") } }
284
+ @d.start
285
+
286
+ injected = {"host" => detected_hostname}
287
+ expected_es = Fluent::MultiEventStream.new
288
+ data.each do |t, r|
289
+ expected_es.add(t, r.merge(injected))
290
+ end
291
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
292
+ end
293
+
294
+ data(
295
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
296
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
297
+ )
298
+ test 'injects hostname as specified value' do |data|
299
+ @d.configure(config_inject_section("hostname_key" => "host", "hostname" => "myhost.yay.local"))
300
+ @d.start
301
+
302
+ injected = {"host" => "myhost.yay.local"}
303
+ expected_es = Fluent::MultiEventStream.new
304
+ data.each do |t, r|
305
+ expected_es.add(t, r.merge(injected))
306
+ end
307
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
308
+ end
309
+
310
+ data(
311
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
312
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
313
+ )
314
+ test 'injects tag into specified key' do |data|
315
+ @d.configure(config_inject_section("tag_key" => "mytag"))
316
+ @d.start
317
+
318
+ injected = {"mytag" => "tag"}
319
+ expected_es = Fluent::MultiEventStream.new
320
+ data.each do |t, r|
321
+ expected_es.add(t, r.merge(injected))
322
+ end
323
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
324
+ end
325
+
326
+ data(
327
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
328
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
329
+ )
330
+ test 'injects time as floating point value into specified key as default' do |data|
331
+ @d.configure(config_inject_section("time_key" => "timedata"))
332
+ @d.start
333
+
334
+ injected = {"timedata" => time_float }
335
+ expected_es = Fluent::MultiEventStream.new
336
+ data.each do |t, r|
337
+ expected_es.add(t, r.merge(injected))
338
+ end
339
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
340
+ end
341
+
342
+ data(
343
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
344
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
345
+ )
346
+ test 'injects time as unix time into specified key' do |data|
347
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "unixtime"))
348
+ @d.start
349
+
350
+ injected = {"timedata" => time_in_localtime.to_i}
351
+ expected_es = Fluent::MultiEventStream.new
352
+ data.each do |t, r|
353
+ expected_es.add(t, r.merge(injected))
354
+ end
355
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
356
+ end
357
+
358
+ data(
359
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
360
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
361
+ )
362
+ test 'injects time as formatted string in localtime if timezone not specified' do |data|
363
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "string", "time_format" => "%Y_%m_%d %H:%M:%S %z"))
364
+ @d.start
365
+
366
+ injected = {"timedata" => time_in_localtime.strftime("%Y_%m_%d %H:%M:%S %z")}
367
+ expected_es = Fluent::MultiEventStream.new
368
+ data.each do |t, r|
369
+ expected_es.add(t, r.merge(injected))
370
+ end
371
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
372
+ end
373
+
374
+ data(
375
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
376
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
377
+ )
378
+ test 'injects time as formatted string with nanosecond in localtime if timezone not specified' do |data|
379
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "string", "time_format" => "%Y_%m_%d %H:%M:%S.%N %z"))
380
+ @d.start
381
+
382
+ injected = {"timedata" => time_in_localtime.strftime("%Y_%m_%d %H:%M:%S.%N %z")}
383
+ expected_es = Fluent::MultiEventStream.new
384
+ data.each do |t, r|
385
+ expected_es.add(t, r.merge(injected))
386
+ end
387
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
388
+ end
389
+
390
+ data(
391
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
392
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
393
+ )
394
+ test 'injects time as formatted string with millisecond in localtime if timezone not specified' do |data|
395
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "string", "time_format" => "%Y_%m_%d %H:%M:%S.%3N %z"))
396
+ @d.start
397
+
398
+ injected = {"timedata" => time_in_localtime.strftime("%Y_%m_%d %H:%M:%S.%3N %z")}
399
+ expected_es = Fluent::MultiEventStream.new
400
+ data.each do |t, r|
401
+ expected_es.add(t, r.merge(injected))
402
+ end
403
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
404
+ end
405
+
406
+ data(
407
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
408
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
409
+ )
410
+ test 'injects time as formatted string in specified timezone' do |data|
411
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "string", "time_format" => "%Y_%m_%d %H:%M:%S %z", "timezone" => "-0800"))
412
+ @d.start
413
+
414
+ injected = {"timedata" => Time.at(time_in_unix).localtime("-08:00").strftime("%Y_%m_%d %H:%M:%S -0800")}
415
+ expected_es = Fluent::MultiEventStream.new
416
+ data.each do |t, r|
417
+ expected_es.add(t, r.merge(injected))
418
+ end
419
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
420
+ end
421
+
422
+ data(
423
+ "OneEventStream" => Fluent::OneEventStream.new(time, {"key1" => "value1", "key2" => 0}),
424
+ "ArrayEventStream" => Fluent::ArrayEventStream.new([ [time, {"key1" => "value1", "key2" => 1}], [time, {"key1" => "value2", "key2" => 2}] ]),
425
+ )
426
+ test 'injects hostname, tag and time' do |data|
427
+ @d.configure(config_inject_section(
428
+ "hostname_key" => "hostnamedata",
429
+ "hostname" => "myname.local",
430
+ "tag_key" => "tagdata",
431
+ "time_key" => "timedata",
432
+ "time_type" => "string",
433
+ "time_format" => "%Y_%m_%d %H:%M:%S.%N %z",
434
+ "timezone" => "+0000",
435
+ ))
436
+ @d.start
437
+
438
+ injected = {"hostnamedata" => "myname.local", "tagdata" => "tag", "timedata" => time_in_utc.strftime("%Y_%m_%d %H:%M:%S.%N %z")}
439
+ expected_es = Fluent::MultiEventStream.new
440
+ data.each do |t, r|
441
+ expected_es.add(t, r.merge(injected))
442
+ end
443
+ assert_equal expected_es, @d.inject_values_to_event_stream('tag', data)
444
+ end
445
+ end
446
+
447
+ sub_test_case 'time formatting with modified timezone' do
448
+ setup do
449
+ @time = event_time("2014-09-27 00:00:00 +00:00").to_i
450
+ end
451
+
452
+ def format(conf)
453
+ @d.configure(config_inject_section(
454
+ "hostname_key" => "hostnamedata",
455
+ "hostname" => "myname.local",
456
+ "tag_key" => "tagdata",
457
+ "time_key" => "timedata",
458
+ "time_type" => "string",
459
+ "time_format" => "%Y_%m_%d %H:%M:%S.%N %z",
460
+ "timezone" => "+0000",
461
+ ))
462
+ @d.start
463
+
464
+ record = {"key1" => "value1", "key2" => 2}
465
+ injected = {"hostnamedata" => "myname.local", "tagdata" => "tag", "timedata" => "2016_06_20 23:10:11.320101224 +0000"}
466
+ assert_equal record.merge(injected), @d.inject_values_to_record('tag', time, record)
467
+
468
+
469
+ d = create_driver({'include_time_key' => true}.merge(conf))
470
+ formatted = d.instance.format("tag", @time, {})
471
+ # Drop the leading "time:" and the trailing "\n".
472
+ formatted[5..-2]
473
+ end
474
+
475
+ def test_nothing_specified_about_time_formatting
476
+ with_timezone("UTC-01") do
477
+ # 'localtime' is true by default.
478
+ @d.configure(config_inject_section("time_key" => "t", "time_type" => "string"))
479
+ @d.start
480
+ record = @d.inject_values_to_record('tag', @time, {"message" => "yay"})
481
+
482
+ assert_equal("2014-09-27T01:00:00+01:00", record['t'])
483
+ end
484
+ end
485
+
486
+ def test_utc
487
+ with_timezone("UTC-01") do
488
+ # 'utc' takes precedence over 'localtime'.
489
+ @d.configure(config_inject_section("time_key" => "t", "time_type" => "string", "utc" => "true"))
490
+ @d.start
491
+ record = @d.inject_values_to_record('tag', @time, {"message" => "yay"})
492
+
493
+ assert_equal("2014-09-27T00:00:00Z", record['t'])
494
+ end
495
+ end
496
+
497
+ def test_timezone
498
+ with_timezone("UTC-01") do
499
+ # 'timezone' takes precedence over 'localtime'.
500
+ @d.configure(config_inject_section("time_key" => "t", "time_type" => "string", "timezone" => "+02"))
501
+ @d.start
502
+ record = @d.inject_values_to_record('tag', @time, {"message" => "yay"})
503
+
504
+ assert_equal("2014-09-27T02:00:00+02:00", record['t'])
505
+ end
506
+ end
507
+
508
+ def test_utc_timezone
509
+ with_timezone("UTC-01") do
510
+ # 'timezone' takes precedence over 'utc'.
511
+ @d.configure(config_inject_section("time_key" => "t", "time_type" => "string", "timezone" => "Asia/Tokyo", "utc" => "true"))
512
+ @d.start
513
+ record = @d.inject_values_to_record('tag', @time, {"message" => "yay"})
514
+
515
+ assert_equal("2014-09-27T09:00:00+09:00", record['t'])
516
+ end
517
+ end
518
+ end
519
+ end