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,353 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin_helper/compat_parameters'
3
+ require 'fluent/plugin/input'
4
+ require 'fluent/plugin/output'
5
+ require 'fluent/time'
6
+
7
+ require 'time'
8
+
9
+ class CompatParameterTest < Test::Unit::TestCase
10
+ setup do
11
+ Fluent::Test.setup
12
+ @i = nil
13
+ end
14
+
15
+ teardown do
16
+ if @i
17
+ @i.stop unless @i.stopped?
18
+ @i.before_shutdown unless @i.before_shutdown?
19
+ @i.shutdown unless @i.shutdown?
20
+ @i.after_shutdown unless @i.after_shutdown?
21
+ @i.close unless @i.closed?
22
+ @i.terminate unless @i.terminated?
23
+ end
24
+ end
25
+
26
+ class DummyI0 < Fluent::Plugin::Input
27
+ helpers :compat_parameters, :parser, :extract
28
+ attr_reader :parser
29
+ def configure(conf)
30
+ compat_parameters_convert(conf, :extract, :parser)
31
+ super
32
+ end
33
+ def start
34
+ super
35
+ @parser = parser_create
36
+ end
37
+ def produce_events(input_data)
38
+ emit_events = [] # tag, time, record
39
+ @parser.parse(input_data) do |time, record|
40
+ tag = extract_tag_from_record(record) || 'dummy_tag'
41
+ emit_events << [tag, time, record]
42
+ end
43
+ emit_events
44
+ end
45
+ end
46
+ class DummyO0 < Fluent::Plugin::Output
47
+ helpers :compat_parameters
48
+ def configure(conf)
49
+ compat_parameters_buffer(conf, default_chunk_key: '')
50
+ super
51
+ end
52
+ def write(chunk); end # dummy
53
+ end
54
+ class DummyO1 < Fluent::Plugin::Output
55
+ helpers :compat_parameters
56
+ def configure(conf)
57
+ compat_parameters_buffer(conf, default_chunk_key: 'time')
58
+ super
59
+ end
60
+ def write(chunk); end # dummy
61
+ end
62
+ class DummyO2 < Fluent::Plugin::Output
63
+ helpers :compat_parameters
64
+ def configure(conf)
65
+ compat_parameters_buffer(conf, default_chunk_key: 'time')
66
+ super
67
+ end
68
+ def write(chunk); end # dummy
69
+ end
70
+ class DummyO3 < Fluent::Plugin::Output
71
+ helpers :compat_parameters
72
+ def configure(conf)
73
+ compat_parameters_buffer(conf, default_chunk_key: 'tag')
74
+ super
75
+ end
76
+ def write(chunk); end # dummy
77
+ end
78
+ class DummyO4 < Fluent::Plugin::Output
79
+ helpers :compat_parameters, :inject, :formatter
80
+ attr_reader :f
81
+ def configure(conf)
82
+ compat_parameters_convert(conf, :buffer, :inject, :formatter, default_chunk_key: 'tag')
83
+ super
84
+ end
85
+ def start
86
+ super
87
+ @f = formatter_create()
88
+ end
89
+ def write(chunk); end # dummy
90
+ end
91
+
92
+ sub_test_case 'output plugins which does not have default chunk key' do
93
+ test 'plugin helper converts parameters into plugin configuration parameters' do
94
+ hash = {
95
+ 'num_threads' => 8,
96
+ 'flush_interval' => '10s',
97
+ 'buffer_chunk_limit' => '8m',
98
+ 'buffer_queue_limit' => '1024',
99
+ 'flush_at_shutdown' => 'yes',
100
+ }
101
+ conf = config_element('ROOT', '', hash)
102
+ @i = DummyO0.new
103
+ @i.configure(conf)
104
+
105
+ assert_equal 'memory', @i.buffer_config[:@type]
106
+ assert_equal [], @i.buffer_config.chunk_keys
107
+ assert_equal 8, @i.buffer_config.flush_thread_count
108
+ assert_equal 10, @i.buffer_config.flush_interval
109
+ assert_equal :default, @i.buffer_config.flush_mode
110
+ assert @i.buffer_config.flush_at_shutdown
111
+
112
+ assert_equal 8*1024*1024, @i.buffer.chunk_limit_size
113
+ assert_equal 1024, @i.buffer.queue_limit_length
114
+ end
115
+ end
116
+
117
+ sub_test_case 'output plugins which has default chunk key: time' do
118
+ test 'plugin helper converts parameters into plugin configuration parameters' do
119
+ hash = {
120
+ 'buffer_type' => 'file',
121
+ 'buffer_path' => '/tmp/mybuffer',
122
+ 'disable_retry_limit' => 'yes',
123
+ 'max_retry_wait' => '1h',
124
+ 'buffer_queue_full_action' => 'block',
125
+ }
126
+ conf = config_element('ROOT', '', hash)
127
+ @i = DummyO1.new
128
+ @i.configure(conf)
129
+
130
+ assert_equal 'file', @i.buffer_config[:@type]
131
+ assert_equal 24*60*60, @i.buffer_config.timekey
132
+ assert @i.buffer_config.retry_forever
133
+ assert_equal 60*60, @i.buffer_config.retry_max_interval
134
+ assert_equal :block, @i.buffer_config.overflow_action
135
+ assert_equal :default, @i.buffer_config.flush_mode
136
+
137
+ assert !@i.chunk_key_tag
138
+ assert_equal [], @i.chunk_keys
139
+
140
+ assert_equal '/tmp/mybuffer/buffer.*.log', @i.buffer.path
141
+ end
142
+ end
143
+
144
+ sub_test_case 'output plugins which does not have default chunk key' do
145
+ test 'plugin helper converts parameters into plugin configuration parameters' do
146
+ hash = {
147
+ 'buffer_type' => 'file',
148
+ 'buffer_path' => '/tmp/mybuffer',
149
+ 'time_slice_format' => '%Y%m%d%H',
150
+ 'time_slice_wait' => '10',
151
+ 'retry_limit' => '1024',
152
+ 'buffer_queue_full_action' => 'drop_oldest_chunk',
153
+ }
154
+ conf = config_element('ROOT', '', hash)
155
+ @i = DummyO2.new
156
+ @i.configure(conf)
157
+
158
+ assert_equal 'file', @i.buffer_config[:@type]
159
+ assert_equal 60*60, @i.buffer_config.timekey
160
+ assert_equal 10, @i.buffer_config.timekey_wait
161
+ assert_equal 1024, @i.buffer_config.retry_max_times
162
+ assert_equal :drop_oldest_chunk, @i.buffer_config.overflow_action
163
+
164
+ assert @i.chunk_key_time
165
+ assert !@i.chunk_key_tag
166
+ assert_equal [], @i.chunk_keys
167
+
168
+ assert_equal '/tmp/mybuffer/buffer.*.log', @i.buffer.path
169
+ end
170
+ end
171
+
172
+ sub_test_case 'output plugins which has default chunk key: tag' do
173
+ test 'plugin helper converts parameters into plugin configuration parameters' do
174
+ hash = {
175
+ 'buffer_type' => 'memory',
176
+ 'num_threads' => '10',
177
+ 'flush_interval' => '10s',
178
+ 'try_flush_interval' => '0.1',
179
+ 'queued_chunk_flush_interval' => '0.5',
180
+ }
181
+ conf = config_element('ROOT', '', hash)
182
+ @i = DummyO3.new
183
+ @i.configure(conf)
184
+
185
+ assert_equal 'memory', @i.buffer_config[:@type]
186
+ assert_equal 10, @i.buffer_config.flush_thread_count
187
+ assert_equal 10, @i.buffer_config.flush_interval
188
+ assert_equal 0.1, @i.buffer_config.flush_thread_interval
189
+ assert_equal 0.5, @i.buffer_config.flush_thread_burst_interval
190
+
191
+ assert !@i.chunk_key_time
192
+ assert @i.chunk_key_tag
193
+ assert_equal [], @i.chunk_keys
194
+ end
195
+ end
196
+
197
+ sub_test_case 'output plugins which has default chunk key: tag, and enables inject and formatter' do
198
+ test 'plugin helper converts parameters into plugin configuration parameters for all of buffer, inject and formatter' do
199
+ hash = {
200
+ 'buffer_type' => 'file',
201
+ 'buffer_path' => File.expand_path('../../tmp/compat_parameters/mybuffer.*.log', __FILE__),
202
+ 'num_threads' => '10',
203
+ 'format' => 'ltsv',
204
+ 'delimiter' => ',',
205
+ 'label_delimiter' => '%',
206
+ 'include_time_key' => 'true', # default time_key 'time' and default time format (iso8601: 2016-06-24T15:57:38) at localtime
207
+ 'include_tag_key' => 'yes', # default tag_key 'tag'
208
+ }
209
+ conf = config_element('ROOT', '', hash)
210
+ @i = DummyO4.new
211
+ @i.configure(conf)
212
+ @i.start
213
+ @i.after_start
214
+
215
+ assert_equal 'file', @i.buffer_config[:@type]
216
+ assert_equal 10, @i.buffer_config.flush_thread_count
217
+ formatter = @i.f
218
+ assert{ formatter.is_a? Fluent::Plugin::LabeledTSVFormatter }
219
+ assert_equal ',', @i.f.delimiter
220
+ assert_equal '%', @i.f.label_delimiter
221
+
222
+ assert !@i.chunk_key_time
223
+ assert @i.chunk_key_tag
224
+ assert_equal [], @i.chunk_keys
225
+
226
+ t = event_time('2016-06-24 16:05:01') # localtime
227
+ iso8601str = Time.at(t.to_i).iso8601
228
+ formatted = @i.f.format('tag.test', t, @i.inject_values_to_record('tag.test', t, {"value" => 1}))
229
+ assert_equal "value%1,tag%tag.test,time%#{iso8601str}\n", formatted
230
+ end
231
+
232
+ test 'plugin helper setups time injecting as unix time (integer from epoch)' do
233
+ hash = {
234
+ 'buffer_type' => 'file',
235
+ 'buffer_path' => File.expand_path('../../tmp/compat_parameters/mybuffer.*.log', __FILE__),
236
+ 'num_threads' => '10',
237
+ 'format' => 'ltsv',
238
+ 'delimiter' => ',',
239
+ 'label_delimiter' => '%',
240
+ 'include_time_key' => 'true', # default time_key 'time' and default time format (iso8601: 2016-06-24T15:57:38) at localtime
241
+ 'include_tag_key' => 'yes', # default tag_key 'tag'
242
+ }
243
+ conf = config_element('ROOT', '', hash)
244
+ @i = DummyO4.new
245
+ @i.configure(conf)
246
+ @i.start
247
+ @i.after_start
248
+
249
+ assert_equal 'file', @i.buffer_config[:@type]
250
+ assert_equal 10, @i.buffer_config.flush_thread_count
251
+ formatter = @i.f
252
+ assert{ formatter.is_a? Fluent::Plugin::LabeledTSVFormatter }
253
+ assert_equal ',', @i.f.delimiter
254
+ assert_equal '%', @i.f.label_delimiter
255
+
256
+ assert !@i.chunk_key_time
257
+ assert @i.chunk_key_tag
258
+ assert_equal [], @i.chunk_keys
259
+
260
+ t = event_time('2016-06-24 16:05:01') # localtime
261
+ iso8601str = Time.at(t.to_i).iso8601
262
+ formatted = @i.f.format('tag.test', t, @i.inject_values_to_record('tag.test', t, {"value" => 1}))
263
+ assert_equal "value%1,tag%tag.test,time%#{iso8601str}\n", formatted
264
+ end
265
+ end
266
+
267
+ sub_test_case 'input plugins' do
268
+ test 'plugin helper converts parameters into plugin configuration parameters for extract and parser' do
269
+ hash = {
270
+ 'format' => 'ltsv',
271
+ 'delimiter' => ',',
272
+ 'label_delimiter' => '%',
273
+ 'tag_key' => 't2',
274
+ 'time_key' => 't',
275
+ 'time_format' => '%Y-%m-%d.%H:%M:%S.%N',
276
+ 'utc' => 'yes',
277
+ 'types' => 'A integer|B string|C bool',
278
+ 'types_delimiter' => '|',
279
+ 'types_label_delimiter' => ' ',
280
+ }
281
+ conf = config_element('ROOT', '', hash)
282
+ @i = DummyI0.new
283
+ @i.configure(conf)
284
+ @i.start
285
+ @i.after_start
286
+
287
+ parser = @i.parser
288
+ assert{ parser.is_a? Fluent::Plugin::LabeledTSVParser }
289
+ assert_equal ',', parser.delimiter
290
+ assert_equal '%', parser.label_delimiter
291
+
292
+ events = @i.produce_events("A%1,B%x,C%true,t2%mytag,t%2016-10-20.03:50:11.987654321")
293
+ assert_equal 1, events.size
294
+
295
+ tag, time, record = events.first
296
+ assert_equal 'mytag', tag
297
+ assert_equal_event_time event_time("2016-10-20 03:50:11.987654321 +0000"), time
298
+ assert_equal 3, record.keys.size
299
+ assert_equal ['A','B','C'], record.keys.sort
300
+ assert_equal 1, record['A']
301
+ assert_equal 'x', record['B']
302
+ assert_equal true, record['C']
303
+ end
304
+
305
+ test 'plugin helper converts parameters into plugin configuration parameters for extract and parser, using numeric time' do
306
+ hash = {
307
+ 'format' => 'ltsv',
308
+ 'delimiter' => ',',
309
+ 'label_delimiter' => '%',
310
+ 'tag_key' => 't2',
311
+ 'time_key' => 't',
312
+ 'time_type' => 'float',
313
+ 'localtime' => 'yes',
314
+ }
315
+ conf = config_element('ROOT', '', hash)
316
+ @i = DummyI0.new
317
+ @i.configure(conf)
318
+ @i.start
319
+ @i.after_start
320
+
321
+ parser = @i.parser
322
+ assert{ parser.is_a? Fluent::Plugin::LabeledTSVParser }
323
+ assert_equal ',', parser.delimiter
324
+ assert_equal '%', parser.label_delimiter
325
+ end
326
+
327
+ test 'plugin helper setups time extraction as unix time (integer from epoch)' do
328
+ # TODO:
329
+ end
330
+ end
331
+
332
+ sub_test_case 'parser plugins' do
333
+ test 'syslog parser parameters' do
334
+ hash = {
335
+ 'format' => 'syslog',
336
+ 'message_format' => 'rfc5424',
337
+ 'with_priority' => 'true',
338
+ 'rfc5424_time_format' => '%Y'
339
+ }
340
+ conf = config_element('ROOT', '', hash)
341
+ @i = DummyI0.new
342
+ @i.configure(conf)
343
+ @i.start
344
+ @i.after_start
345
+
346
+ parser = @i.parser
347
+ assert_kind_of(Fluent::Plugin::SyslogParser, parser)
348
+ assert_equal :rfc5424, parser.message_format
349
+ assert_equal true, parser.with_priority
350
+ assert_equal '%Y', parser.rfc5424_time_format
351
+ end
352
+ end
353
+ end
@@ -0,0 +1,51 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin_helper/event_emitter'
3
+ require 'fluent/plugin/base'
4
+
5
+ class EventEmitterTest < Test::Unit::TestCase
6
+ setup do
7
+ Fluent::Test.setup
8
+ end
9
+
10
+ class Dummy0 < Fluent::Plugin::TestBase
11
+ end
12
+
13
+ class Dummy < Fluent::Plugin::TestBase
14
+ helpers :event_emitter
15
+ end
16
+
17
+ test 'can be instantiated to be able to emit with router' do
18
+ d0 = Dummy0.new
19
+ assert d0.respond_to?(:has_router?)
20
+ assert !d0.has_router?
21
+ assert !d0.respond_to?(:router)
22
+
23
+ d1 = Dummy.new
24
+ assert d1.respond_to?(:has_router?)
25
+ assert d1.has_router?
26
+ assert d1.respond_to?(:router)
27
+ d1.stop; d1.shutdown; d1.close; d1.terminate
28
+ end
29
+
30
+ test 'can be configured with valid router' do
31
+ d1 = Dummy.new
32
+ assert d1.has_router?
33
+ assert_nil d1.router
34
+
35
+ assert_nothing_raised do
36
+ d1.configure(config_element())
37
+ end
38
+
39
+ assert d1.router
40
+
41
+ d1.shutdown
42
+
43
+ assert d1.router
44
+
45
+ d1.close
46
+
47
+ assert_nil d1.router
48
+
49
+ d1.terminate
50
+ end
51
+ end
@@ -0,0 +1,52 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin_helper/event_loop'
3
+ require 'fluent/plugin/base'
4
+
5
+ class EventLoopTest < Test::Unit::TestCase
6
+ class Dummy < Fluent::Plugin::TestBase
7
+ helpers :event_loop
8
+ def configure(conf)
9
+ super
10
+ @_event_loop_run_timeout = 0.1
11
+ end
12
+ end
13
+
14
+ test 'can be instantiated to be able to create event loop' do
15
+ d1 = Dummy.new
16
+ assert d1.respond_to?(:event_loop_attach)
17
+ assert d1.respond_to?(:event_loop_running?)
18
+ assert d1.respond_to?(:_event_loop)
19
+ assert d1._event_loop
20
+ assert !d1.event_loop_running?
21
+ end
22
+
23
+ test 'can be configured' do
24
+ d1 = Dummy.new
25
+ assert_nothing_raised do
26
+ d1.configure(config_element())
27
+ end
28
+ assert d1.plugin_id
29
+ assert d1.log
30
+ end
31
+
32
+ test 'can run event loop by start, stop by shutdown/close and clear by terminate' do
33
+ d1 = Dummy.new
34
+ d1.configure(config_element())
35
+ assert !d1.event_loop_running?
36
+
37
+ d1.start
38
+ d1.event_loop_wait_until_start
39
+
40
+ assert d1.event_loop_running?
41
+ assert_equal 1, d1._event_loop.watchers.size
42
+
43
+ d1.shutdown
44
+ d1.close
45
+
46
+ assert !d1.event_loop_running?
47
+
48
+ d1.terminate
49
+
50
+ assert_nil d1._event_loop
51
+ end
52
+ end
@@ -0,0 +1,194 @@
1
+ require_relative '../helper'
2
+ require 'fluent/plugin_helper/extract'
3
+ require 'fluent/time'
4
+
5
+ class ExtractHelperTest < Test::Unit::TestCase
6
+ class Dummy < Fluent::Plugin::TestBase
7
+ helpers :extract
8
+ end
9
+
10
+ class Dummy2 < Fluent::Plugin::TestBase
11
+ helpers :extract
12
+ config_section :extract do
13
+ config_set_default :tag_key, 'tag2'
14
+ end
15
+ end
16
+
17
+ def config_extract_section(hash = {})
18
+ config_element('ROOT', '', {}, [config_element('extract', '', hash)])
19
+ end
20
+
21
+ setup do
22
+ Fluent::Test.setup
23
+ @d = Dummy.new
24
+ end
25
+
26
+ teardown do
27
+ if @d
28
+ @d.stop unless @d.stopped?
29
+ @d.shutdown unless @d.shutdown?
30
+ @d.close unless @d.closed?
31
+ @d.terminate unless @d.terminated?
32
+ end
33
+ end
34
+
35
+ test 'can override default parameters, but not overwrite whole definition' do
36
+ d = Dummy.new
37
+ d.configure(config_element())
38
+ assert_nil d.extract_config
39
+
40
+ d = Dummy2.new
41
+ d.configure(config_element('ROOT', '', {}, [config_element('extract')]))
42
+ assert d.extract_config
43
+ assert_equal 'tag2', d.extract_config.tag_key
44
+ end
45
+
46
+ test 'returns nil in default' do
47
+ @d.configure(config_extract_section())
48
+ @d.start
49
+ assert_nil @d.instance_eval{ @_extract_tag_key }
50
+ assert_nil @d.instance_eval{ @_extract_time_key }
51
+ assert_nil @d.instance_eval{ @_extract_time_parser }
52
+
53
+ record = {"key1" => "value1", "key2" => 2, "tag" => "yay", "time" => Time.now.to_i}
54
+
55
+ assert_nil @d.extract_tag_from_record(record)
56
+ assert_nil @d.extract_time_from_record(record)
57
+ end
58
+
59
+ test 'can be configured as specified' do
60
+ @d.configure(config_extract_section(
61
+ "tag_key" => "tag",
62
+ "time_key" => "time",
63
+ "time_type" => "unixtime",
64
+ ))
65
+
66
+ assert_equal "tag", @d.instance_eval{ @_extract_tag_key }
67
+ assert_equal "time", @d.instance_eval{ @_extract_time_key }
68
+ assert_equal :unixtime, @d.instance_eval{ @extract_config.time_type }
69
+ assert_not_nil @d.instance_eval{ @_extract_time_parser }
70
+ end
71
+
72
+ sub_test_case 'extract_tag_from_record' do
73
+ test 'returns tag string from specified tag_key field' do
74
+ @d.configure(config_extract_section("tag_key" => "tag"))
75
+ @d.start
76
+ @d.after_start
77
+
78
+ tag = @d.extract_tag_from_record({"tag" => "tag.test.code", "message" => "yay!"})
79
+ assert_equal "tag.test.code", tag
80
+ end
81
+
82
+ test 'returns tag as string by stringifying values from specified key' do
83
+ @d.configure(config_extract_section("tag_key" => "tag"))
84
+ @d.start
85
+ @d.after_start
86
+
87
+ tag = @d.extract_tag_from_record({"tag" => 100, "message" => "yay!"})
88
+ assert_equal "100", tag
89
+ end
90
+ end
91
+
92
+ sub_test_case 'extract_time_from_record' do
93
+ test 'returns EventTime object from specified time_key field, parsed as float in default' do
94
+ @d.configure(config_extract_section("time_key" => "t"))
95
+ @d.start
96
+ @d.after_start
97
+
98
+ # 1473135272 => 2016-09-06 04:14:32 UTC
99
+ t = @d.extract_time_from_record({"t" => 1473135272.5, "message" => "yay!"})
100
+ assert_equal_event_time(Fluent::EventTime.new(1473135272, 500_000_000), t)
101
+
102
+ t = @d.extract_time_from_record({"t" => "1473135272.5", "message" => "yay!"})
103
+ assert_equal_event_time(Fluent::EventTime.new(1473135272, 500_000_000), t)
104
+ end
105
+
106
+ test 'returns EventTime object, parsed as unixtime when configured so' do
107
+ @d.configure(config_extract_section("time_key" => "t", "time_type" => "unixtime"))
108
+ @d.start
109
+ @d.after_start
110
+
111
+ t = @d.extract_time_from_record({"t" => 1473135272, "message" => "yay!"})
112
+ assert_equal_event_time(Fluent::EventTime.new(1473135272, 0), t)
113
+
114
+ t = @d.extract_time_from_record({"t" => "1473135272", "message" => "yay!"})
115
+ assert_equal_event_time(Fluent::EventTime.new(1473135272, 0), t)
116
+
117
+ t = @d.extract_time_from_record({"t" => 1473135272.5, "message" => "yay!"})
118
+ assert_equal_event_time(Fluent::EventTime.new(1473135272, 0), t)
119
+ end
120
+
121
+ test 'returns EventTime object, parsed by default time parser of ruby with timezone in data' do
122
+ t = with_timezone("UTC-02") do
123
+ @d.configure(config_extract_section("time_key" => "t", "time_type" => "string"))
124
+ @d.start
125
+ @d.after_start
126
+ @d.extract_time_from_record({"t" => "2016-09-06 13:27:01 +0900", "message" => "yay!"})
127
+ end
128
+ assert_equal_event_time(event_time("2016-09-06 13:27:01 +0900"), t)
129
+ end
130
+
131
+ test 'returns EventTime object, parsed by default time parser of ruby as localtime' do
132
+ t = with_timezone("UTC-02") do
133
+ @d.configure(config_extract_section("time_key" => "t", "time_type" => "string"))
134
+ @d.start
135
+ @d.after_start
136
+ @d.extract_time_from_record({"t" => "2016-09-06 13:27:01", "message" => "yay!"})
137
+ end
138
+ assert_equal_event_time(event_time("2016-09-06 13:27:01 +0200"), t)
139
+ end
140
+
141
+ test 'returns EventTime object, parsed as configured time_format with timezone' do
142
+ t = with_timezone("UTC-02") do
143
+ @d.configure(config_extract_section("time_key" => "t", "time_type" => "string", "time_format" => "%H:%M:%S, %m/%d/%Y, %z"))
144
+ @d.start
145
+ @d.after_start
146
+ @d.extract_time_from_record({"t" => "13:27:01, 09/06/2016, -0700", "message" => "yay!"})
147
+ end
148
+ assert_equal_event_time(event_time("2016-09-06 13:27:01 -0700"), t)
149
+ end
150
+
151
+ test 'returns EventTime object, parsed as configured time_format in localtime without timezone' do
152
+ t = with_timezone("UTC-02") do
153
+ @d.configure(config_extract_section("time_key" => "t", "time_type" => "string", "time_format" => "%H:%M:%S, %m/%d/%Y"))
154
+ @d.start
155
+ @d.after_start
156
+ @d.extract_time_from_record({"t" => "13:27:01, 09/06/2016", "message" => "yay!"})
157
+ end
158
+ assert_equal_event_time(event_time("2016-09-06 13:27:01 +0200"), t)
159
+ end
160
+
161
+ test 'returns EventTime object, parsed as configured time_format in utc without timezone, localtime: false' do
162
+ t = with_timezone("UTC-02") do
163
+ c = config_extract_section("time_key" => "t", "time_type" => "string", "time_format" => "%H:%M:%S, %m/%d/%Y", "localtime" => "false")
164
+ @d.configure(c)
165
+ @d.start
166
+ @d.after_start
167
+ @d.extract_time_from_record({"t" => "13:27:01, 09/06/2016", "message" => "yay!"})
168
+ end
169
+ assert_equal_event_time(event_time("2016-09-06 13:27:01 UTC"), t)
170
+ end
171
+
172
+ test 'returns EventTime object, parsed as configured time_format in utc without timezone, utc: true' do
173
+ t = with_timezone("UTC-02") do
174
+ c = config_extract_section("time_key" => "t", "time_type" => "string", "time_format" => "%H:%M:%S, %m/%d/%Y", "utc" => "true")
175
+ @d.configure(c)
176
+ @d.start
177
+ @d.after_start
178
+ @d.extract_time_from_record({"t" => "13:27:01, 09/06/2016", "message" => "yay!"})
179
+ end
180
+ assert_equal_event_time(event_time("2016-09-06 13:27:01 UTC"), t)
181
+ end
182
+
183
+ test 'returns EventTime object, parsed as configured time_format in configured timezone' do
184
+ t = with_timezone("UTC-02") do
185
+ c = config_extract_section("time_key" => "t", "time_type" => "string", "time_format" => "%H:%M:%S, %m/%d/%Y", "timezone" => "+09:00")
186
+ @d.configure(c)
187
+ @d.start
188
+ @d.after_start
189
+ @d.extract_time_from_record({"t" => "13:27:01, 09/06/2016", "message" => "yay!"})
190
+ end
191
+ assert_equal_event_time(event_time("2016-09-06 13:27:01 +0900"), t)
192
+ end
193
+ end
194
+ end