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
@@ -18,344 +18,255 @@ require 'json'
18
18
  require 'webrick'
19
19
  require 'cgi'
20
20
 
21
- require 'cool.io'
21
+ require 'fluent/config/types'
22
+ require 'fluent/plugin/input'
23
+ require 'fluent/plugin/output'
24
+ require 'fluent/plugin/multi_output'
25
+ require 'fluent/plugin/filter'
22
26
 
23
- require 'fluent/input'
24
- require 'fluent/output'
25
- require 'fluent/filter'
26
-
27
- module Fluent
27
+ module Fluent::Plugin
28
28
  class MonitorAgentInput < Input
29
- Plugin.register_input('monitor_agent', self)
29
+ Fluent::Plugin.register_input('monitor_agent', self)
30
+
31
+ helpers :timer, :thread, :http_server
30
32
 
33
+ desc 'The address to bind to.'
31
34
  config_param :bind, :string, default: '0.0.0.0'
35
+ desc 'The port to listen to.'
32
36
  config_param :port, :integer, default: 24220
37
+ desc 'The tag with which internal metrics are emitted.'
33
38
  config_param :tag, :string, default: nil
39
+ desc 'Determine the rate to emit internal metrics as events.'
34
40
  config_param :emit_interval, :time, default: 60
35
- config_param :emit_config, :bool, default: false
41
+ desc 'Determine whether to include the config information.'
36
42
  config_param :include_config, :bool, default: true
43
+ desc 'Determine whether to include the retry information.'
37
44
  config_param :include_retry, :bool, default: true
38
45
 
39
- class MonitorServlet < WEBrick::HTTPServlet::AbstractServlet
40
- def initialize(server, agent)
46
+ class APIHandler
47
+ def initialize(agent)
41
48
  @agent = agent
42
49
  end
43
50
 
44
- def do_GET(req, res)
45
- begin
46
- code, header, body = process(req, res)
47
- rescue
48
- code, header, body = render_json_error(500, {
49
- 'message '=> 'Internal Server Error',
50
- 'error' => "#{$!}",
51
- 'backgrace'=> $!.backtrace,
52
- })
53
- end
51
+ def plugins_ltsv(req)
52
+ list = build_object(build_option(req))
54
53
 
55
- # set response code, header and body
56
- res.status = code
57
- header.each_pair {|k,v|
58
- res[k] = v
59
- }
60
- res.body = body
54
+ render_ltsv(list)
61
55
  end
62
56
 
63
- def build_object(req, res)
64
- unless req.path_info == ""
65
- return render_json_error(404, "Not found")
66
- end
57
+ def plugins_json(req)
58
+ opts = build_option(req)
59
+ obj = build_object(opts)
67
60
 
68
- # parse ?=query string
69
- if req.query_string
70
- begin
71
- qs = CGI.parse(req.query_string)
72
- rescue
73
- return render_json_error(400, "Invalid query string")
61
+ render_json({ 'plugins' => obj }, pretty_json: opts[:pretty_json])
62
+ end
63
+
64
+ def config_ltsv(_req)
65
+ obj = {
66
+ 'pid' => Process.pid,
67
+ 'ppid' => Process.ppid
68
+ }.merge(@agent.fluentd_opts)
69
+
70
+ render_ltsv([obj])
71
+ end
72
+
73
+ def config_json(req)
74
+ obj = {
75
+ 'pid' => Process.pid,
76
+ 'ppid' => Process.ppid
77
+ }.merge(@agent.fluentd_opts)
78
+ opts = build_option(req)
79
+
80
+ render_json(obj, pretty_json: opts[:pretty_json])
81
+ end
82
+
83
+ private
84
+
85
+ def render_error_json(code:, msg:, pretty_json: nil, **additional_params)
86
+ resp = additional_params.merge('message' => msg)
87
+ render_json(resp, code: code, pretty_json: pretty_json)
88
+ end
89
+
90
+ def render_json(obj, code: 200, pretty_json: nil)
91
+ body =
92
+ if pretty_json
93
+ JSON.pretty_generate(obj)
94
+ else
95
+ obj.to_json
74
96
  end
75
- else
76
- qs = Hash.new {|h,k| [] }
77
- end
78
97
 
79
- # if ?debug=1 is set, set :with_debug_info for get_monitor_info
80
- # and :pretty_json for render_json_error
81
- opts = {with_config: @agent.include_config, with_retry: @agent.include_retry}
82
- if s = qs['debug'] and s[0]
83
- opts[:with_debug_info] = true
84
- opts[:pretty_json] = true
85
- end
98
+ [code, { 'Content-Type' => 'application/json' }, body]
99
+ end
86
100
 
87
- if ivars = (qs['with_ivars'] || []).first
88
- opts[:ivars] = ivars.split(',')
89
- end
101
+ def render_ltsv(obj, code: 200)
102
+ normalized = JSON.parse(obj.to_json)
103
+ text = ''
104
+ normalized.each do |hash|
105
+ row = []
106
+ hash.each do |k, v|
107
+ if v.is_a?(Array)
108
+ row << "#{k}:#{v.join(',')}"
109
+ elsif v.is_a?(Hash)
110
+ next
111
+ else
112
+ row << "#{k}:#{v}"
113
+ end
114
+ end
90
115
 
91
- if with_config = get_search_parameter(qs, 'with_config'.freeze)
92
- opts[:with_config] = Fluent::Config.bool_value(with_config)
116
+ text << row.join("\t") << "\n"
93
117
  end
94
118
 
95
- if with_retry = get_search_parameter(qs, 'with_retry'.freeze)
96
- opts[:with_retry] = Fluent::Config.bool_value(with_retry)
97
- end
119
+ [code, { 'Content-Type' => 'text/plain' }, text]
120
+ end
98
121
 
99
- if tag = get_search_parameter(qs, 'tag'.freeze)
122
+ def build_object(opts)
123
+ qs = opts[:query]
124
+ if tag = qs['tag'.freeze].first
100
125
  # ?tag= to search an output plugin by match pattern
101
126
  if obj = @agent.plugin_info_by_tag(tag, opts)
102
127
  list = [obj]
103
128
  else
104
129
  list = []
105
130
  end
106
-
107
- elsif plugin_id = get_search_parameter(qs, '@id'.freeze)
131
+ elsif plugin_id = (qs['@id'.freeze].first || qs['id'.freeze].first)
108
132
  # ?@id= to search a plugin by 'id <plugin_id>' config param
109
133
  if obj = @agent.plugin_info_by_id(plugin_id, opts)
110
134
  list = [obj]
111
135
  else
112
136
  list = []
113
137
  end
114
-
115
- elsif plugin_id = get_search_parameter(qs, 'id'.freeze)
116
- # Without @ version of ?@id= for backward compatibility
117
- if obj = @agent.plugin_info_by_id(plugin_id, opts)
118
- list = [obj]
119
- else
120
- list = []
121
- end
122
-
123
- elsif plugin_type = get_search_parameter(qs, '@type'.freeze)
138
+ elsif plugin_type = (qs['@type'.freeze].first || qs['type'.freeze].first)
124
139
  # ?@type= to search plugins by 'type <type>' config param
125
140
  list = @agent.plugins_info_by_type(plugin_type, opts)
126
-
127
- elsif plugin_type = get_search_parameter(qs, 'type'.freeze)
128
- # Without @ version of ?@type= for backward compatibility
129
- list = @agent.plugins_info_by_type(plugin_type, opts)
130
-
131
141
  else
132
142
  # otherwise show all plugins
133
143
  list = @agent.plugins_info_all(opts)
134
144
  end
135
145
 
136
- return list, opts
137
- end
138
-
139
- def get_search_parameter(qs, param_name)
140
- return nil unless qs.has_key?(param_name)
141
- qs[param_name].first
146
+ list
142
147
  end
143
148
 
144
- def render_json(obj, opts={})
145
- render_json_error(200, obj, opts)
146
- end
147
-
148
- def render_json_error(code, obj, opts={})
149
- if opts[:pretty_json]
150
- js = JSON.pretty_generate(obj)
151
- else
152
- js = obj.to_json
149
+ def build_option(req)
150
+ qs = Hash.new { |_, _| [] }
151
+ # parse ?=query string
152
+ if req.query_string
153
+ qs.merge!(CGI.parse(req.query_string))
153
154
  end
154
- [code, {'Content-Type'=>'application/json'}, js]
155
- end
156
- end
157
155
 
158
- class LTSVMonitorServlet < MonitorServlet
159
- def process(req, res)
160
- list, opts = build_object(req, res)
161
- return unless list
156
+ # if ?debug=1 is set, set :with_debug_info for get_monitor_info
157
+ # and :pretty_json for render_json_error
158
+ opts = { query: qs }
159
+ if qs['debug'.freeze].first
160
+ opts[:with_debug_info] = true
161
+ opts[:pretty_json] = true
162
+ end
162
163
 
163
- normalized = JSON.parse(list.to_json)
164
+ if ivars = qs['with_ivars'.freeze].first
165
+ opts[:ivars] = ivars.split(',')
166
+ end
164
167
 
165
- text = ''
168
+ if with_config = qs['with_config'.freeze].first
169
+ opts[:with_config] = Fluent::Config.bool_value(with_config)
170
+ else
171
+ opts[:with_config] = @agent.include_config
172
+ end
166
173
 
167
- normalized.map {|hash|
168
- row = []
169
- hash.each_pair {|k,v|
170
- unless v.is_a?(Hash) || v.is_a?(Array)
171
- row << "#{k}:#{v}"
172
- end
173
- }
174
- text << row.join("\t") << "\n"
175
- }
174
+ if with_retry = qs['with_retry'.freeze].first
175
+ opts[:with_retry] = Fluent::Config.bool_value(with_retry)
176
+ else
177
+ opts[:with_retry] = @agent.include_retry
178
+ end
176
179
 
177
- [200, {'Content-Type'=>'text/plain'}, text]
180
+ opts
178
181
  end
179
182
  end
180
183
 
181
- class JSONMonitorServlet < MonitorServlet
182
- def process(req, res)
183
- list, opts = build_object(req, res)
184
- return unless list
184
+ def initialize
185
+ super
185
186
 
186
- render_json({
187
- 'plugins' => list
188
- }, opts)
189
- end
187
+ @first_warn = false
190
188
  end
191
189
 
192
- class ConfigMonitorServlet < MonitorServlet
193
- def build_object(req, res)
194
- {
195
- 'pid' => Process.pid,
196
- 'ppid' => Process.ppid
197
- }.merge(@agent.fluentd_opts)
198
- end
190
+ def configure(conf)
191
+ super
192
+ @port += fluentd_worker_id
199
193
  end
200
194
 
201
- class LTSVConfigMonitorServlet < ConfigMonitorServlet
202
- def process(req, res)
203
- result = build_object(req, res)
204
-
205
- row = []
206
- JSON.parse(result.to_json).each_pair { |k, v|
207
- row << "#{k}:#{v}"
208
- }
209
- text = row.join("\t")
210
-
211
- [200, {'Content-Type'=>'text/plain'}, text]
212
- end
195
+ def multi_workers_ready?
196
+ true
213
197
  end
214
198
 
215
- class JSONConfigMonitorServlet < ConfigMonitorServlet
216
- def process(req, res)
217
- result = build_object(req, res)
218
- render_json(result)
199
+ class NotFoundJson
200
+ BODY = { 'message' => 'Not found' }.to_json
201
+ def self.call(_req)
202
+ [404, { 'Content-Type' => 'application/json' }, BODY]
219
203
  end
220
204
  end
221
205
 
222
- class TimerWatcher < Coolio::TimerWatcher
223
- def initialize(interval, log, &callback)
224
- @callback = callback
225
- @log = log
226
-
227
- # Avoid long shutdown time
228
- @num_call = 0
229
- if interval >= 10
230
- min_interval = 10
231
- @call_interval = interval / 10
232
- else
233
- min_interval = interval
234
- @call_interval = 0
235
- end
236
-
237
- super(min_interval, true)
238
- end
239
-
240
- def on_timer
241
- @num_call += 1
242
- if @num_call >= @call_interval
243
- @num_call = 0
244
- @callback.call
245
- end
246
- rescue => e
247
- @log.error e.to_s
248
- @log.error_backtrace
206
+ def start
207
+ super
208
+
209
+ log.debug "listening monitoring http server on http://#{@bind}:#{@port}/api/plugins for worker#{fluentd_worker_id}"
210
+ api_handler = APIHandler.new(self)
211
+ create_http_server(:in_monitor_http_server_helper, addr: @bind, port: @port, logger: log, default_app: NotFoundJson) do |serv|
212
+ serv.get('/api/plugins') { |req| api_handler.plugins_ltsv(req) }
213
+ serv.get('/api/plugins.json') { |req| api_handler.plugins_json(req) }
214
+ serv.get('/api/config') { |req| api_handler.config_ltsv(req) }
215
+ serv.get('/api/config.json') { |req| api_handler.config_json(req) }
249
216
  end
250
- end
251
217
 
252
- def start
253
- log.debug "listening monitoring http server on http://#{@bind}:#{@port}/api/plugins"
254
- @srv = WEBrick::HTTPServer.new({
255
- BindAddress: @bind,
256
- Port: @port,
257
- Logger: WEBrick::Log.new(STDERR, WEBrick::Log::FATAL),
258
- AccessLog: [],
259
- })
260
- @srv.mount('/api/plugins', LTSVMonitorServlet, self)
261
- @srv.mount('/api/plugins.json', JSONMonitorServlet, self)
262
- @srv.mount('/api/config', LTSVConfigMonitorServlet, self)
263
- @srv.mount('/api/config.json', JSONConfigMonitorServlet, self)
264
- @thread = Thread.new {
265
- @srv.start
266
- }
267
218
  if @tag
268
219
  log.debug "tag parameter is specified. Emit plugins info to '#{@tag}'"
269
220
 
270
- @loop = Coolio::Loop.new
271
- opts = {with_config: @emit_config, with_retry: false}
272
- timer = TimerWatcher.new(@emit_interval, log) {
273
- es = MultiEventStream.new
274
- now = Engine.now
221
+ opts = {with_config: false, with_retry: false}
222
+ timer_execute(:in_monitor_agent_emit, @emit_interval, repeat: true) {
223
+ es = Fluent::MultiEventStream.new
224
+ now = Fluent::Engine.now
275
225
  plugins_info_all(opts).each { |record|
276
226
  es.add(now, record)
277
227
  }
278
228
  router.emit_stream(@tag, es)
279
229
  }
280
- @loop.attach(timer)
281
- @thread_for_emit = Thread.new(&method(:run))
282
- end
283
- end
284
-
285
- def run
286
- @loop.run
287
- rescue => e
288
- log.error "unexpected error", error: e.to_s
289
- log.error_backtrace
290
- end
291
-
292
- def shutdown
293
- if @srv
294
- @srv.shutdown
295
- @srv = nil
296
- end
297
- if @thread
298
- @thread.join
299
- @thread = nil
300
- end
301
- if @tag
302
- @loop.watchers.each { |w| w.detach }
303
- @loop.stop
304
- @loop = nil
305
- @thread_for_emit.join
306
- @thread_for_emit = nil
307
230
  end
308
231
  end
309
232
 
233
+ # They are deprecated but remain for compatibility
310
234
  MONITOR_INFO = {
311
- 'output_plugin' => 'is_a?(::Fluent::Output)', # deprecated. Use plugin_category instead
312
- 'buffer_queue_length' => '@buffer.queue_size',
313
- 'buffer_total_queued_size' => '@buffer.total_queued_chunk_size',
314
- 'retry_count' => '@num_errors',
235
+ 'output_plugin' => ->(){ is_a?(::Fluent::Plugin::Output) },
236
+ 'buffer_queue_length' => ->(){ throw(:skip) unless instance_variable_defined?(:@buffer) && !@buffer.nil? && @buffer.is_a?(::Fluent::Plugin::Buffer); @buffer.queue.size },
237
+ 'buffer_timekeys' => ->(){ throw(:skip) unless instance_variable_defined?(:@buffer) && !@buffer.nil? && @buffer.is_a?(::Fluent::Plugin::Buffer); @buffer.timekeys },
238
+ 'buffer_total_queued_size' => ->(){ throw(:skip) unless instance_variable_defined?(:@buffer) && !@buffer.nil? && @buffer.is_a?(::Fluent::Plugin::Buffer); @buffer.stage_size + @buffer.queue_size },
239
+ 'retry_count' => ->(){ instance_variable_defined?(:@num_errors) ? @num_errors : nil },
315
240
  }
316
241
 
317
242
  def all_plugins
318
243
  array = []
319
244
 
320
245
  # get all input plugins
321
- array.concat Engine.root_agent.inputs
246
+ array.concat Fluent::Engine.root_agent.inputs
322
247
 
323
248
  # get all output plugins
324
- Engine.root_agent.outputs.each { |o|
325
- MonitorAgentInput.collect_children(o, array)
326
- }
249
+ array.concat Fluent::Engine.root_agent.outputs
250
+
327
251
  # get all filter plugins
328
- Engine.root_agent.filters.each { |f|
329
- MonitorAgentInput.collect_children(f, array)
330
- }
331
- Engine.root_agent.labels.each { |name, l|
252
+ array.concat Fluent::Engine.root_agent.filters
253
+
254
+ Fluent::Engine.root_agent.labels.each { |name, l|
332
255
  # TODO: Add label name to outputs / filters for identifing plugins
333
- l.outputs.each { |o| MonitorAgentInput.collect_children(o, array) }
334
- l.filters.each { |f| MonitorAgentInput.collect_children(f, array) }
256
+ array.concat l.outputs
257
+ array.concat l.filters
335
258
  }
336
259
 
337
260
  array
338
261
  end
339
262
 
340
- # get nexted plugins (such as <store> of the copy plugin)
341
- # from the plugin `pe` recursively
342
- def self.collect_children(pe, array=[])
343
- array << pe
344
- if pe.is_a?(MultiOutput) && pe.respond_to?(:outputs)
345
- pe.outputs.each {|nop|
346
- collect_children(nop, array)
347
- }
348
- end
349
- array
350
- end
351
-
352
263
  # try to match the tag and get the info from the matched output plugin
353
264
  # TODO: Support output in label
354
265
  def plugin_info_by_tag(tag, opts={})
355
- matches = Engine.root_agent.event_router.instance_variable_get(:@match_rules)
266
+ matches = Fluent::Engine.root_agent.event_router.instance_variable_get(:@match_rules)
356
267
  matches.each { |rule|
357
268
  if rule.match?(tag)
358
- if rule.collector.is_a?(Output)
269
+ if rule.collector.is_a?(Fluent::Plugin::Output) || rule.collector.is_a?(Fluent::Output)
359
270
  return get_monitor_info(rule.collector, opts)
360
271
  end
361
272
  end
@@ -379,7 +290,7 @@ module Fluent
379
290
  # multiple plugins could have the same type
380
291
  def plugins_info_by_type(type, opts={})
381
292
  array = all_plugins.select {|pe|
382
- (pe.config['@type'] == type || pe.config['type'] == type || Fluent::Plugin.lookup_name_from_class(pe.class)) rescue nil
293
+ (pe.config['@type'] == type) rescue nil
383
294
  }
384
295
  array.map {|pe|
385
296
  get_monitor_info(pe, opts)
@@ -392,9 +303,7 @@ module Fluent
392
303
  }
393
304
  end
394
305
 
395
- # TODO: use %i() after drop ruby v1.9.3 support.
396
- IGNORE_ATTRIBUTES = %W(@config_root_section @config @masked_config).map(&:to_sym)
397
- EMPTY_RESULT = {}
306
+ IGNORE_ATTRIBUTES = %i(@config_root_section @config @masked_config)
398
307
 
399
308
  # get monitor info from the plugin `pe` and return a hash object
400
309
  def get_monitor_info(pe, opts={})
@@ -403,24 +312,32 @@ module Fluent
403
312
  # Common plugin information
404
313
  obj['plugin_id'] = pe.plugin_id
405
314
  obj['plugin_category'] = plugin_category(pe)
406
- obj['type'] = pe.config['@type'] || pe.config['type'] || Fluent::Plugin.lookup_name_from_class(pe.class)
315
+ obj['type'] = pe.config['@type']
407
316
  obj['config'] = pe.config if opts[:with_config]
408
317
 
409
318
  # run MONITOR_INFO in plugins' instance context and store the info to obj
410
319
  MONITOR_INFO.each_pair {|key,code|
411
320
  begin
412
- obj[key] = pe.instance_eval(code)
413
- rescue
321
+ catch(:skip) do
322
+ obj[key] = pe.instance_exec(&code)
323
+ end
324
+ rescue NoMethodError => e
325
+ unless @first_warn
326
+ log.error "NoMethodError in monitoring plugins", key: key, plugin: pe.class, error: e
327
+ log.error_backtrace
328
+ @first_warn = true
329
+ end
330
+ rescue => e
331
+ log.warn "unexpected error in monitoring plugins", key: key, plugin: pe.class, error: e
414
332
  end
415
333
  }
416
334
 
417
- if opts[:with_retry]
418
- num_errors = pe.instance_variable_get(:@num_errors)
419
- if num_errors
420
- obj['retry'] = num_errors.zero? ? EMPTY_RESULT : get_retry_info(pe, num_errors)
421
- end
335
+ if pe.respond_to?(:statistics)
336
+ obj.merge!(pe.statistics['output'] || {})
422
337
  end
423
338
 
339
+ obj['retry'] = get_retry_info(pe.retry) if opts[:with_retry] and pe.instance_variable_defined?(:@retry)
340
+
424
341
  # include all instance variables if :with_debug_info is set
425
342
  if opts[:with_debug_info]
426
343
  iv = {}
@@ -444,20 +361,31 @@ module Fluent
444
361
  obj
445
362
  end
446
363
 
447
- def get_retry_info(pe, num_errors)
364
+ RETRY_INFO = {
365
+ 'start' => '@start',
366
+ 'steps' => '@steps',
367
+ 'next_time' => '@next_time',
368
+ }
369
+
370
+ def get_retry_info(pe_retry)
448
371
  retry_variables = {}
449
- retry_variables['steps'] = num_errors
450
- retry_variables['next_time'] = Time.at(pe.instance_variable_get('@next_retry_time'.freeze))
372
+
373
+ if pe_retry
374
+ RETRY_INFO.each_pair { |key, param|
375
+ retry_variables[key] = pe_retry.instance_variable_get(param)
376
+ }
377
+ end
378
+
451
379
  retry_variables
452
380
  end
453
381
 
454
382
  def plugin_category(pe)
455
383
  case pe
456
- when Fluent::Input
384
+ when Fluent::Plugin::Input
457
385
  'input'.freeze
458
- when Fluent::Output
386
+ when Fluent::Plugin::Output, Fluent::Plugin::MultiOutput, Fluent::Plugin::BareOutput
459
387
  'output'.freeze
460
- when Fluent::Filter
388
+ when Fluent::Plugin::Filter
461
389
  'filter'.freeze
462
390
  else
463
391
  'unknown'.freeze
@@ -14,14 +14,15 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- require 'cool.io'
18
17
  require 'yajl'
19
18
 
20
- require 'fluent/input'
19
+ require 'fluent/plugin/input'
21
20
 
22
- module Fluent
23
- class ObjectSpaceInput < Input
24
- Plugin.register_input('object_space', self)
21
+ module Fluent::Plugin
22
+ class ObjectSpaceInput < Fluent::Plugin::Input
23
+ Fluent::Plugin.register_input('object_space', self)
24
+
25
+ helpers :timer
25
26
 
26
27
  def initialize
27
28
  super
@@ -31,44 +32,14 @@ module Fluent
31
32
  config_param :tag, :string
32
33
  config_param :top, :integer, default: 15
33
34
 
34
- class TimerWatcher < Coolio::TimerWatcher
35
- def initialize(interval, repeat, log, &callback)
36
- @callback = callback
37
- @log = log
38
- super(interval, repeat)
39
- end
40
-
41
- def on_timer
42
- @callback.call
43
- rescue
44
- # TODO log?
45
- @log.error $!.to_s
46
- @log.error_backtrace
47
- end
48
- end
49
-
50
- def configure(conf)
51
- super
35
+ def multi_workers_ready?
36
+ true
52
37
  end
53
38
 
54
39
  def start
55
- @loop = Coolio::Loop.new
56
- @timer = TimerWatcher.new(@emit_interval, true, log, &method(:on_timer))
57
- @loop.attach(@timer)
58
- @thread = Thread.new(&method(:run))
59
- end
60
-
61
- def shutdown
62
- @loop.watchers.each {|w| w.detach }
63
- @loop.stop
64
- @thread.join
65
- end
40
+ super
66
41
 
67
- def run
68
- @loop.run
69
- rescue
70
- log.error "unexpected error", error: $!.to_s
71
- log.error_backtrace
42
+ timer_execute(:object_space_input, @emit_interval, &method(:on_timer))
72
43
  end
73
44
 
74
45
  class Counter
@@ -89,7 +60,7 @@ module Fluent
89
60
  end
90
61
 
91
62
  def on_timer
92
- now = Engine.now
63
+ now = Fluent::EventTime.now
93
64
 
94
65
  array = []
95
66
  map = {}
@@ -115,7 +86,8 @@ module Fluent
115
86
 
116
87
  router.emit(@tag, now, record)
117
88
  rescue => e
118
- log.error "object space failed to emit", error: e.to_s, error_class: e.class.to_s, tag: @tag, record: Yajl.dump(record)
89
+ log.error "object space failed to emit", error: e, tag: @tag, record: Yajl.dump(record)
90
+ log.error_backtrace
119
91
  end
120
92
  end
121
93
  end