fluentd 0.12.40 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,690 @@
1
+ require_relative '../helper'
2
+ require 'fluent/test/driver/input'
3
+ require 'fluent/plugin/in_monitor_agent'
4
+ require 'fluent/engine'
5
+ require 'fluent/config'
6
+ require 'fluent/event_router'
7
+ require 'fluent/supervisor'
8
+ require 'net/http'
9
+ require 'json'
10
+ require_relative '../test_plugin_classes'
11
+
12
+ class MonitorAgentInputTest < Test::Unit::TestCase
13
+ include FuzzyAssert
14
+
15
+ def setup
16
+ Fluent::Test.setup
17
+ end
18
+
19
+ def create_driver(conf = '')
20
+ Fluent::Test::Driver::Input.new(Fluent::Plugin::MonitorAgentInput).configure(conf)
21
+ end
22
+
23
+ def configure_ra(ra, conf_str)
24
+ conf = Fluent::Config.parse(conf_str, "(test)", "(test_dir)", true)
25
+ ra.configure(conf)
26
+ ra
27
+ end
28
+
29
+ def test_configure
30
+ d = create_driver
31
+ assert_equal("0.0.0.0", d.instance.bind)
32
+ assert_equal(24220, d.instance.port)
33
+ assert_equal(nil, d.instance.tag)
34
+ assert_equal(60, d.instance.emit_interval)
35
+ assert_true d.instance.include_config
36
+ end
37
+
38
+ sub_test_case "collect plugin information" do
39
+ setup do
40
+ # check @type and type in one configuration
41
+ conf = <<-EOC
42
+ <source>
43
+ @type test_in
44
+ @id test_in
45
+ </source>
46
+ <filter>
47
+ @type test_filter
48
+ @id test_filter
49
+ </filter>
50
+ <match **>
51
+ @type relabel
52
+ @id test_relabel
53
+ @label @test
54
+ </match>
55
+ <label @test>
56
+ <match **>
57
+ @type test_out
58
+ @id test_out
59
+ </match>
60
+ </label>
61
+ <label @copy>
62
+ <match **>
63
+ @type copy
64
+ <store>
65
+ @type test_out
66
+ @id copy_out_1
67
+ </store>
68
+ <store>
69
+ @type test_out
70
+ @id copy_out_2
71
+ </store>
72
+ </match>
73
+ </label>
74
+ <label @ERROR>
75
+ <match>
76
+ @type null
77
+ @id null
78
+ </match>
79
+ </label>
80
+ EOC
81
+ @ra = Fluent::RootAgent.new(log: $log)
82
+ stub(Fluent::Engine).root_agent { @ra }
83
+ @ra = configure_ra(@ra, conf)
84
+ end
85
+
86
+ test "plugin_category" do
87
+ d = create_driver
88
+ test_label = @ra.labels['@test']
89
+ error_label = @ra.labels['@ERROR']
90
+ assert_equal("input", d.instance.plugin_category(@ra.inputs.first))
91
+ assert_equal("filter", d.instance.plugin_category(@ra.filters.first))
92
+ assert_equal("output", d.instance.plugin_category(test_label.outputs.first))
93
+ assert_equal("output", d.instance.plugin_category(error_label.outputs.first))
94
+ end
95
+
96
+ data(:with_config_yes => true,
97
+ :with_config_no => false)
98
+ test "get_monitor_info" do |with_config|
99
+ d = create_driver
100
+ test_label = @ra.labels['@test']
101
+ error_label = @ra.labels['@ERROR']
102
+ input_info = {
103
+ "output_plugin" => false,
104
+ "plugin_category"=> "input",
105
+ "plugin_id" => "test_in",
106
+ "retry_count" => nil,
107
+ "type" => "test_in"
108
+ }
109
+ input_info.merge!("config" => {"@id" => "test_in", "@type" => "test_in"}) if with_config
110
+ filter_info = {
111
+ "output_plugin" => false,
112
+ "plugin_category" => "filter",
113
+ "plugin_id" => "test_filter",
114
+ "retry_count" => nil,
115
+ "type" => "test_filter"
116
+ }
117
+ filter_info.merge!("config" => {"@id" => "test_filter", "@type" => "test_filter"}) if with_config
118
+ output_info = {
119
+ "output_plugin" => true,
120
+ "plugin_category" => "output",
121
+ "plugin_id" => "test_out",
122
+ "retry_count" => 0,
123
+ "type" => "test_out",
124
+ "emit_count" => Integer,
125
+ "emit_records" => Integer,
126
+ "write_count" => Integer,
127
+ "rollback_count" => Integer,
128
+ "slow_flush_count" => Integer,
129
+ "flush_time_count" => Integer,
130
+ }
131
+ output_info.merge!("config" => {"@id" => "test_out", "@type" => "test_out"}) if with_config
132
+ error_label_info = {
133
+ "buffer_queue_length" => 0,
134
+ "buffer_timekeys" => [],
135
+ "buffer_total_queued_size" => 0,
136
+ "output_plugin" => true,
137
+ "plugin_category" => "output",
138
+ "plugin_id" => "null",
139
+ "retry_count" => 0,
140
+ "type" => "null",
141
+ "buffer_available_buffer_space_ratios" => Float,
142
+ "buffer_queue_byte_size" => Integer,
143
+ "buffer_stage_byte_size" => Integer,
144
+ "buffer_stage_length" => Integer,
145
+ "emit_count" => Integer,
146
+ "emit_records" => Integer,
147
+ "write_count" => Integer,
148
+ "rollback_count" => Integer,
149
+ "slow_flush_count" => Integer,
150
+ "flush_time_count" => Integer,
151
+ }
152
+ error_label_info.merge!("config" => {"@id"=>"null", "@type" => "null"}) if with_config
153
+ opts = {with_config: with_config}
154
+ assert_equal(input_info, d.instance.get_monitor_info(@ra.inputs.first, opts))
155
+ assert_fuzzy_equal(filter_info, d.instance.get_monitor_info(@ra.filters.first, opts))
156
+ assert_fuzzy_equal(output_info, d.instance.get_monitor_info(test_label.outputs.first, opts))
157
+ assert_fuzzy_equal(error_label_info, d.instance.get_monitor_info(error_label.outputs.first, opts))
158
+ end
159
+
160
+ test "fluentd opts" do
161
+ d = create_driver
162
+ opts = Fluent::Supervisor.default_options
163
+ Fluent::Supervisor.new(opts)
164
+ expected_opts = {
165
+ "config_path" => "/etc/fluent/fluent.conf",
166
+ "pid_file" => nil,
167
+ "plugin_dirs" => ["/etc/fluent/plugin"],
168
+ "log_path" => nil,
169
+ "root_dir" => nil,
170
+ }
171
+ assert_equal(expected_opts, d.instance.fluentd_opts)
172
+ end
173
+
174
+ test "all_plugins" do
175
+ d = create_driver
176
+ plugins = []
177
+ d.instance.all_plugins.each {|plugin| plugins << plugin.class }
178
+ assert_equal([FluentTest::FluentTestInput,
179
+ Fluent::Plugin::RelabelOutput,
180
+ FluentTest::FluentTestFilter,
181
+ FluentTest::FluentTestOutput, # in label @test
182
+ Fluent::Plugin::CopyOutput,
183
+ FluentTest::FluentTestOutput, # in label @copy 1
184
+ FluentTest::FluentTestOutput, # in label @copy 2
185
+ Fluent::Plugin::NullOutput], plugins)
186
+ end
187
+
188
+ test "emit" do
189
+ port = unused_port
190
+ d = create_driver("
191
+ @type monitor_agent
192
+ bind '127.0.0.1'
193
+ port #{port}
194
+ tag monitor
195
+ emit_interval 1
196
+ ")
197
+ d.instance.start
198
+ d.end_if do
199
+ d.events.size >= 5
200
+ end
201
+ d.run
202
+ expect_relabel_record = {
203
+ "plugin_id" => "test_relabel",
204
+ "plugin_category" => "output",
205
+ "type" => "relabel",
206
+ "output_plugin" => true,
207
+ "retry_count" => 0,
208
+ "emit_count" => Integer,
209
+ "emit_records" => Integer,
210
+ "write_count" => Integer,
211
+ "rollback_count" => Integer,
212
+ "slow_flush_count" => Integer,
213
+ "flush_time_count" => Integer,
214
+ }
215
+ expect_test_out_record = {
216
+ "plugin_id" => "test_out",
217
+ "plugin_category" => "output",
218
+ "type" => "test_out",
219
+ "output_plugin" => true,
220
+ "retry_count" => 0,
221
+ "emit_count" => Integer,
222
+ "emit_records" => Integer,
223
+ "write_count" => Integer,
224
+ "rollback_count" => Integer,
225
+ "slow_flush_count" => Integer,
226
+ "flush_time_count" => Integer,
227
+ }
228
+ assert_fuzzy_equal(expect_relabel_record, d.events[1][2])
229
+ assert_fuzzy_equal(expect_test_out_record, d.events[3][2])
230
+ end
231
+ end
232
+
233
+ def get(uri, header = {})
234
+ url = URI.parse(uri)
235
+ req = Net::HTTP::Get.new(url, header)
236
+ unless header.has_key?('Content-Type')
237
+ header['Content-Type'] = 'application/octet-stream'
238
+ end
239
+ Net::HTTP.start(url.host, url.port) {|http|
240
+ http.request(req)
241
+ }
242
+ end
243
+
244
+ sub_test_case "servlets" do
245
+ setup do
246
+ @port = unused_port
247
+ # check @type and type in one configuration
248
+ conf = <<-EOC
249
+ <source>
250
+ @type test_in
251
+ @id test_in
252
+ </source>
253
+ <source>
254
+ @type monitor_agent
255
+ bind "127.0.0.1"
256
+ port #{@port}
257
+ tag monitor
258
+ @id monitor_agent
259
+ </source>
260
+ <filter>
261
+ @type test_filter
262
+ @id test_filter
263
+ </filter>
264
+ <match **>
265
+ @type relabel
266
+ @id test_relabel
267
+ @label @test
268
+ </match>
269
+ <label @test>
270
+ <match **>
271
+ @type test_out
272
+ @id test_out
273
+ </match>
274
+ </label>
275
+ <label @ERROR>
276
+ <match>
277
+ @type null
278
+ @id null
279
+ </match>
280
+ </label>
281
+ EOC
282
+ @ra = Fluent::RootAgent.new(log: $log)
283
+ stub(Fluent::Engine).root_agent { @ra }
284
+ @ra = configure_ra(@ra, conf)
285
+ # store Supervisor instance to avoid collected by GC
286
+ @supervisor = Fluent::Supervisor.new(Fluent::Supervisor.default_options)
287
+ end
288
+
289
+ test "/api/plugins" do
290
+ d = create_driver("
291
+ @type monitor_agent
292
+ bind '127.0.0.1'
293
+ port #{@port}
294
+ tag monitor
295
+ ")
296
+ d.instance.start
297
+ expected_test_in_response = "\
298
+ plugin_id:test_in\tplugin_category:input\ttype:test_in\toutput_plugin:false\tretry_count:"
299
+ expected_test_filter_response = "\
300
+ plugin_id:test_filter\tplugin_category:filter\ttype:test_filter\toutput_plugin:false\tretry_count:"
301
+
302
+ response = get("http://127.0.0.1:#{@port}/api/plugins").body
303
+ test_in = response.split("\n")[0]
304
+ test_filter = response.split("\n")[3]
305
+ assert_equal(expected_test_in_response, test_in)
306
+ assert_equal(expected_test_filter_response, test_filter)
307
+ end
308
+
309
+ data(:include_config_and_retry_yes => [true, true, "include_config yes", "include_retry yes"],
310
+ :include_config_and_retry_no => [false, false, "include_config no", "include_retry no"],)
311
+ test "/api/plugins.json" do |(with_config, with_retry, include_conf, retry_conf)|
312
+ d = create_driver("
313
+ @type monitor_agent
314
+ bind '127.0.0.1'
315
+ port #{@port}
316
+ tag monitor
317
+ #{include_conf}
318
+ #{retry_conf}
319
+ ")
320
+ d.instance.start
321
+ expected_test_in_response = {
322
+ "output_plugin" => false,
323
+ "plugin_category" => "input",
324
+ "plugin_id" => "test_in",
325
+ "retry_count" => nil,
326
+ "type" => "test_in"
327
+ }
328
+ expected_test_in_response.merge!("config" => {"@id" => "test_in", "@type" => "test_in"}) if with_config
329
+ expected_null_response = {
330
+ "buffer_queue_length" => 0,
331
+ "buffer_timekeys" => [],
332
+ "buffer_total_queued_size" => 0,
333
+ "output_plugin" => true,
334
+ "plugin_category" => "output",
335
+ "plugin_id" => "null",
336
+ "retry_count" => 0,
337
+ "type" => "null",
338
+ "buffer_available_buffer_space_ratios" => Float,
339
+ "buffer_queue_byte_size" => Integer,
340
+ "buffer_stage_byte_size" => Integer,
341
+ "buffer_stage_length" => Integer,
342
+ "emit_count" => Integer,
343
+ "emit_records" => Integer,
344
+ "write_count" => Integer,
345
+ "rollback_count" => Integer,
346
+ "slow_flush_count" => Integer,
347
+ "flush_time_count" => Integer,
348
+ }
349
+ expected_null_response.merge!("config" => {"@id" => "null", "@type" => "null"}) if with_config
350
+ expected_null_response.merge!("retry" => {}) if with_retry
351
+ response = JSON.parse(get("http://127.0.0.1:#{@port}/api/plugins.json").body)
352
+ test_in_response = response["plugins"][0]
353
+ null_response = response["plugins"][5]
354
+ assert_equal(expected_test_in_response, test_in_response)
355
+ assert_fuzzy_equal(expected_null_response, null_response)
356
+ end
357
+
358
+ test "/api/plugins.json/not_found" do
359
+ d = create_driver("
360
+ @type monitor_agent
361
+ bind '127.0.0.1'
362
+ port #{@port}
363
+ tag monitor
364
+ ")
365
+ d.instance.start
366
+ resp = get("http://127.0.0.1:#{@port}/api/plugins.json/not_found")
367
+ assert_equal('404', resp.code)
368
+ body = JSON.parse(resp.body)
369
+ assert_equal(body['message'], 'Not found')
370
+ end
371
+
372
+ data(:with_config_and_retry_yes => [true, true, "?with_config=yes&with_retry"],
373
+ :with_config_and_retry_no => [false, false, "?with_config=no&with_retry=no"])
374
+ test "/api/plugins.json with query parameter. query parameter is preferred than include_config" do |(with_config, with_retry, query_param)|
375
+
376
+ d = create_driver("
377
+ @type monitor_agent
378
+ bind '127.0.0.1'
379
+ port #{@port}
380
+ tag monitor
381
+ ")
382
+ d.instance.start
383
+ expected_test_in_response = {
384
+ "output_plugin" => false,
385
+ "plugin_category" => "input",
386
+ "plugin_id" => "test_in",
387
+ "retry_count" => nil,
388
+ "type" => "test_in"
389
+ }
390
+ expected_test_in_response.merge!("config" => {"@id" => "test_in", "@type" => "test_in"}) if with_config
391
+ expected_null_response = {
392
+ "buffer_queue_length" => 0,
393
+ "buffer_timekeys" => [],
394
+ "buffer_total_queued_size" => 0,
395
+ "output_plugin" => true,
396
+ "plugin_category" => "output",
397
+ "plugin_id" => "null",
398
+ "retry_count" => 0,
399
+ "type" => "null",
400
+ "buffer_available_buffer_space_ratios" => Float,
401
+ "buffer_queue_byte_size" => Integer,
402
+ "buffer_stage_byte_size" => Integer,
403
+ "buffer_stage_length" => Integer,
404
+ "emit_count" => Integer,
405
+ "emit_records" => Integer,
406
+ "write_count" => Integer,
407
+ "rollback_count" => Integer,
408
+ "slow_flush_count" => Integer,
409
+ "flush_time_count" => Integer,
410
+ }
411
+ expected_null_response.merge!("config" => {"@id" => "null", "@type" => "null"}) if with_config
412
+ expected_null_response.merge!("retry" => {}) if with_retry
413
+ response = JSON.parse(get("http://127.0.0.1:#{@port}/api/plugins.json#{query_param}").body)
414
+ test_in_response = response["plugins"][0]
415
+ null_response = response["plugins"][5]
416
+ assert_equal(expected_test_in_response, test_in_response)
417
+ assert_fuzzy_include(expected_null_response, null_response)
418
+ end
419
+
420
+ test "/api/plugins.json with 'with_ivars'. response contains specified instance variables of each plugin" do
421
+ d = create_driver("
422
+ @type monitor_agent
423
+ bind '127.0.0.1'
424
+ port #{@port}
425
+ tag monitor
426
+ ")
427
+ d.instance.start
428
+ expected_test_in_response = {
429
+ "output_plugin" => false,
430
+ "plugin_category" => "input",
431
+ "plugin_id" => "test_in",
432
+ "retry_count" => nil,
433
+ "type" => "test_in",
434
+ "instance_variables" => {"id" => "test_in"}
435
+ }
436
+ expected_null_response = {
437
+ "buffer_queue_length" => 0,
438
+ "buffer_timekeys" => [],
439
+ "buffer_total_queued_size" => 0,
440
+ "output_plugin" => true,
441
+ "plugin_category" => "output",
442
+ "plugin_id" => "null",
443
+ "retry_count" => 0,
444
+ "type" => "null",
445
+ "instance_variables" => {"id" => "null", "num_errors" => 0},
446
+ "buffer_available_buffer_space_ratios" => Float,
447
+ "buffer_queue_byte_size" => Integer,
448
+ "buffer_stage_byte_size" => Integer,
449
+ "buffer_stage_length" => Integer,
450
+ "emit_count" => Integer,
451
+ "emit_records" => Integer,
452
+ "write_count" => Integer,
453
+ "rollback_count" => Integer,
454
+ "slow_flush_count" => Integer,
455
+ "flush_time_count" => Integer,
456
+ }
457
+ response = JSON.parse(get("http://127.0.0.1:#{@port}/api/plugins.json?with_config=no&with_retry=no&with_ivars=id,num_errors").body)
458
+ test_in_response = response["plugins"][0]
459
+ null_response = response["plugins"][5]
460
+ assert_equal(expected_test_in_response, test_in_response)
461
+ assert_fuzzy_equal(expected_null_response, null_response)
462
+ end
463
+
464
+ test "/api/config" do
465
+ d = create_driver("
466
+ @type monitor_agent
467
+ bind '127.0.0.1'
468
+ port #{@port}
469
+ tag monitor
470
+ ")
471
+ d.instance.start
472
+ expected_response_regex = /pid:\d+\tppid:\d+\tconfig_path:\/etc\/fluent\/fluent.conf\tpid_file:\tplugin_dirs:\/etc\/fluent\/plugin\tlog_path:/
473
+
474
+ assert_match(expected_response_regex,
475
+ get("http://127.0.0.1:#{@port}/api/config").body)
476
+ end
477
+
478
+ test "/api/config.json" do
479
+ d = create_driver("
480
+ @type monitor_agent
481
+ bind '127.0.0.1'
482
+ port #{@port}
483
+ tag monitor
484
+ ")
485
+ d.instance.start
486
+ res = JSON.parse(get("http://127.0.0.1:#{@port}/api/config.json").body)
487
+ assert_equal("/etc/fluent/fluent.conf", res["config_path"])
488
+ assert_nil(res["pid_file"])
489
+ assert_equal(["/etc/fluent/plugin"], res["plugin_dirs"])
490
+ assert_nil(res["log_path"])
491
+ end
492
+
493
+ test "/api/config.json?debug=1" do
494
+ d = create_driver("
495
+ @type monitor_agent
496
+ bind '127.0.0.1'
497
+ port #{@port}
498
+ tag monitor
499
+ ")
500
+ d.instance.start
501
+ # To check pretty print
502
+ assert_true !get("http://127.0.0.1:#{@port}/api/config.json").body.include?("\n")
503
+ assert_true get("http://127.0.0.1:#{@port}/api/config.json?debug=1").body.include?("\n")
504
+ end
505
+
506
+ test "/api/config.json/not_found" do
507
+ d = create_driver("
508
+ @type monitor_agent
509
+ bind '127.0.0.1'
510
+ port #{@port}
511
+ tag monitor
512
+ ")
513
+ d.instance.start
514
+ resp = get("http://127.0.0.1:#{@port}/api/config.json/not_found")
515
+ assert_equal('404', resp.code)
516
+ body = JSON.parse(resp.body)
517
+ assert_equal(body['message'], 'Not found')
518
+ end
519
+ end
520
+
521
+ sub_test_case "check retry of buffered plugins" do
522
+ class FluentTestFailWriteOutput < ::Fluent::Plugin::Output
523
+ ::Fluent::Plugin.register_output('test_out_fail_write', self)
524
+
525
+ def write(chunk)
526
+ raise "chunk error!"
527
+ end
528
+ end
529
+
530
+ setup do
531
+ @port = unused_port
532
+ # check @type and type in one configuration
533
+ conf = <<-EOC
534
+ <source>
535
+ @type monitor_agent
536
+ @id monitor_agent
537
+ bind "127.0.0.1"
538
+ port #{@port}
539
+ </source>
540
+ <match **>
541
+ @type test_out_fail_write
542
+ @id test_out_fail_write
543
+ <buffer time>
544
+ timekey 1m
545
+ flush_mode immediate
546
+ </buffer>
547
+ </match>
548
+ EOC
549
+ @ra = Fluent::RootAgent.new(log: $log)
550
+ stub(Fluent::Engine).root_agent { @ra }
551
+ @ra = configure_ra(@ra, conf)
552
+ end
553
+
554
+ test "/api/plugins.json retry object should be filled if flush was failed" do
555
+
556
+ d = create_driver("
557
+ @type monitor_agent
558
+ bind '127.0.0.1'
559
+ port #{@port}
560
+ include_config no
561
+ ")
562
+ d.instance.start
563
+ output = @ra.outputs[0]
564
+ output.start
565
+ output.after_start
566
+ expected_test_out_fail_write_response = {
567
+ "buffer_queue_length" => 1,
568
+ "buffer_timekeys" => [output.calculate_timekey(event_time)],
569
+ "buffer_total_queued_size" => 40,
570
+ "output_plugin" => true,
571
+ "plugin_category" => "output",
572
+ "plugin_id" => "test_out_fail_write",
573
+ "type" => "test_out_fail_write",
574
+ "buffer_newest_timekey" => output.calculate_timekey(event_time),
575
+ "buffer_oldest_timekey" => output.calculate_timekey(event_time),
576
+ "buffer_available_buffer_space_ratios" => Float,
577
+ "buffer_queue_byte_size" => Integer,
578
+ "buffer_stage_byte_size" => Integer,
579
+ "buffer_stage_length" => Integer,
580
+ "emit_count" => Integer,
581
+ "emit_records" => Integer,
582
+ "write_count" => Integer,
583
+ "rollback_count" => Integer,
584
+ 'slow_flush_count' => Integer,
585
+ 'flush_time_count' => Integer,
586
+ }
587
+ output.emit_events('test.tag', Fluent::ArrayEventStream.new([[event_time, {"message" => "test failed flush 1"}]]))
588
+ # flush few times to check steps
589
+ 2.times do
590
+ output.force_flush
591
+ # output.force_flush calls #submit_flush_all, but #submit_flush_all skips to call #submit_flush_once when @retry exists.
592
+ # So that forced flush in retry state should be done by calling #submit_flush_once directly.
593
+ output.submit_flush_once
594
+ sleep 0.1 until output.buffer.queued?
595
+ end
596
+ response = JSON.parse(get("http://127.0.0.1:#{@port}/api/plugins.json").body)
597
+ test_out_fail_write_response = response["plugins"][1]
598
+ # remove dynamic keys
599
+ response_retry_count = test_out_fail_write_response.delete("retry_count")
600
+ response_retry = test_out_fail_write_response.delete("retry")
601
+ assert_fuzzy_equal(expected_test_out_fail_write_response, test_out_fail_write_response)
602
+ assert{ response_retry.has_key?("steps") }
603
+ # it's very hard to check exact retry count (because retries are called by output flush thread scheduling)
604
+ assert{ response_retry_count >= 1 && response_retry["steps"] >= 0 }
605
+ assert{ response_retry_count == response_retry["steps"] + 1 }
606
+ end
607
+ end
608
+
609
+ sub_test_case "check the port number of http server" do
610
+ test "on single worker environment" do
611
+ port = unused_port
612
+ d = create_driver("
613
+ @type monitor_agent
614
+ bind '127.0.0.1'
615
+ port #{port}
616
+ ")
617
+ d.instance.start
618
+ assert_equal("200", get("http://127.0.0.1:#{port}/api/plugins").code)
619
+ end
620
+
621
+ test "worker_id = 2 on multi worker environment" do
622
+ port = unused_port
623
+ Fluent::SystemConfig.overwrite_system_config('workers' => 4) do
624
+ d = Fluent::Test::Driver::Input.new(Fluent::Plugin::MonitorAgentInput)
625
+ d.instance.instance_eval{ @_fluentd_worker_id = 2 }
626
+ d.configure("
627
+ @type monitor_agent
628
+ bind '127.0.0.1'
629
+ port #{port - 2}
630
+ ")
631
+ d.instance.start
632
+ end
633
+ assert_equal("200", get("http://127.0.0.1:#{port}/api/plugins").code)
634
+ end
635
+ end
636
+
637
+ sub_test_case "check NoMethodError does not happen" do
638
+ class FluentTestBufferVariableOutput < ::Fluent::Plugin::Output
639
+ ::Fluent::Plugin.register_output('test_out_buffer_variable', self)
640
+ def configure(conf)
641
+ super
642
+ @buffer = []
643
+ end
644
+
645
+ def write(chunk)
646
+ end
647
+ end
648
+ class FluentTestBufferVariableFilter < ::Fluent::Plugin::Filter
649
+ ::Fluent::Plugin.register_filter("test_filter_buffer_variable", self)
650
+ def initialize
651
+ super
652
+ @buffer = {}
653
+ end
654
+ def filter(tag, time, record)
655
+ record
656
+ end
657
+ end
658
+
659
+ setup do
660
+ conf = <<-EOC
661
+ <match **>
662
+ @type test_out_buffer_variable
663
+ @id test_out_buffer_variable
664
+ </match>
665
+ <filter **>
666
+ @type test_filter_buffer_variable
667
+ @id test_filter_buffer_variable
668
+ </filter>
669
+ EOC
670
+ @ra = Fluent::RootAgent.new(log: $log)
671
+ stub(Fluent::Engine).root_agent { @ra }
672
+ @ra = configure_ra(@ra, conf)
673
+ end
674
+
675
+ test "plugins have a variable named buffer does not throws NoMethodError" do
676
+ port = unused_port
677
+ d = create_driver("
678
+ @type monitor_agent
679
+ bind '127.0.0.1'
680
+ port #{port}
681
+ include_config no
682
+ ")
683
+ d.instance.start
684
+
685
+ assert_equal("200", get("http://127.0.0.1:#{port}/api/plugins.json").code)
686
+ assert{ d.logs.none?{|log| log.include?("NoMethodError") } }
687
+ assert_equal(false, d.instance.instance_variable_get(:@first_warn))
688
+ end
689
+ end
690
+ end