fluentd 1.14.4-x64-mingw-ucrt

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 (558) hide show
  1. checksums.yaml +7 -0
  2. data/.deepsource.toml +13 -0
  3. data/.drone.yml +35 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.yaml +70 -0
  5. data/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. data/.github/ISSUE_TEMPLATE/feature_request.yaml +38 -0
  7. data/.github/ISSUE_TEMPLATE.md +17 -0
  8. data/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  9. data/.github/workflows/issue-auto-closer.yml +12 -0
  10. data/.github/workflows/linux-test.yaml +36 -0
  11. data/.github/workflows/macos-test.yaml +30 -0
  12. data/.github/workflows/stale-actions.yml +22 -0
  13. data/.github/workflows/windows-test.yaml +46 -0
  14. data/.gitignore +30 -0
  15. data/.gitlab-ci.yml +103 -0
  16. data/ADOPTERS.md +5 -0
  17. data/AUTHORS +2 -0
  18. data/CHANGELOG.md +2409 -0
  19. data/CONTRIBUTING.md +45 -0
  20. data/GOVERNANCE.md +55 -0
  21. data/Gemfile +9 -0
  22. data/GithubWorkflow.md +78 -0
  23. data/LICENSE +202 -0
  24. data/MAINTAINERS.md +11 -0
  25. data/README.md +97 -0
  26. data/Rakefile +79 -0
  27. data/SECURITY.md +18 -0
  28. data/bin/fluent-binlog-reader +7 -0
  29. data/bin/fluent-ca-generate +6 -0
  30. data/bin/fluent-cap-ctl +7 -0
  31. data/bin/fluent-cat +5 -0
  32. data/bin/fluent-ctl +7 -0
  33. data/bin/fluent-debug +5 -0
  34. data/bin/fluent-gem +9 -0
  35. data/bin/fluent-plugin-config-format +5 -0
  36. data/bin/fluent-plugin-generate +5 -0
  37. data/bin/fluentd +15 -0
  38. data/code-of-conduct.md +3 -0
  39. data/docs/SECURITY_AUDIT.pdf +0 -0
  40. data/example/copy_roundrobin.conf +39 -0
  41. data/example/counter.conf +18 -0
  42. data/example/filter_stdout.conf +22 -0
  43. data/example/in_forward.conf +14 -0
  44. data/example/in_forward_client.conf +37 -0
  45. data/example/in_forward_shared_key.conf +15 -0
  46. data/example/in_forward_tls.conf +14 -0
  47. data/example/in_forward_users.conf +24 -0
  48. data/example/in_forward_workers.conf +21 -0
  49. data/example/in_http.conf +16 -0
  50. data/example/in_out_forward.conf +17 -0
  51. data/example/in_sample_blocks.conf +17 -0
  52. data/example/in_sample_with_compression.conf +23 -0
  53. data/example/in_syslog.conf +15 -0
  54. data/example/in_tail.conf +14 -0
  55. data/example/in_tcp.conf +13 -0
  56. data/example/in_udp.conf +13 -0
  57. data/example/logevents.conf +25 -0
  58. data/example/multi_filters.conf +61 -0
  59. data/example/out_copy.conf +20 -0
  60. data/example/out_exec_filter.conf +42 -0
  61. data/example/out_file.conf +13 -0
  62. data/example/out_forward.conf +35 -0
  63. data/example/out_forward_buf_file.conf +23 -0
  64. data/example/out_forward_client.conf +109 -0
  65. data/example/out_forward_heartbeat_none.conf +16 -0
  66. data/example/out_forward_sd.conf +17 -0
  67. data/example/out_forward_shared_key.conf +36 -0
  68. data/example/out_forward_tls.conf +18 -0
  69. data/example/out_forward_users.conf +65 -0
  70. data/example/out_null.conf +36 -0
  71. data/example/sd.yaml +8 -0
  72. data/example/secondary_file.conf +42 -0
  73. data/example/suppress_config_dump.conf +7 -0
  74. data/example/v0_12_filter.conf +78 -0
  75. data/example/v1_literal_example.conf +36 -0
  76. data/example/worker_section.conf +36 -0
  77. data/fluent.conf +139 -0
  78. data/fluentd.gemspec +55 -0
  79. data/lib/fluent/agent.rb +168 -0
  80. data/lib/fluent/capability.rb +87 -0
  81. data/lib/fluent/clock.rb +66 -0
  82. data/lib/fluent/command/binlog_reader.rb +244 -0
  83. data/lib/fluent/command/bundler_injection.rb +45 -0
  84. data/lib/fluent/command/ca_generate.rb +184 -0
  85. data/lib/fluent/command/cap_ctl.rb +174 -0
  86. data/lib/fluent/command/cat.rb +365 -0
  87. data/lib/fluent/command/ctl.rb +177 -0
  88. data/lib/fluent/command/debug.rb +103 -0
  89. data/lib/fluent/command/fluentd.rb +374 -0
  90. data/lib/fluent/command/plugin_config_formatter.rb +308 -0
  91. data/lib/fluent/command/plugin_generator.rb +365 -0
  92. data/lib/fluent/compat/call_super_mixin.rb +76 -0
  93. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  94. data/lib/fluent/compat/exec_util.rb +129 -0
  95. data/lib/fluent/compat/file_util.rb +54 -0
  96. data/lib/fluent/compat/filter.rb +68 -0
  97. data/lib/fluent/compat/formatter.rb +111 -0
  98. data/lib/fluent/compat/formatter_utils.rb +85 -0
  99. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  100. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  101. data/lib/fluent/compat/input.rb +49 -0
  102. data/lib/fluent/compat/output.rb +721 -0
  103. data/lib/fluent/compat/output_chain.rb +60 -0
  104. data/lib/fluent/compat/parser.rb +310 -0
  105. data/lib/fluent/compat/parser_utils.rb +40 -0
  106. data/lib/fluent/compat/propagate_default.rb +62 -0
  107. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  108. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  109. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  110. data/lib/fluent/compat/socket_util.rb +165 -0
  111. data/lib/fluent/compat/string_util.rb +34 -0
  112. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  113. data/lib/fluent/compat/type_converter.rb +90 -0
  114. data/lib/fluent/config/basic_parser.rb +123 -0
  115. data/lib/fluent/config/configure_proxy.rb +424 -0
  116. data/lib/fluent/config/dsl.rb +152 -0
  117. data/lib/fluent/config/element.rb +265 -0
  118. data/lib/fluent/config/error.rb +32 -0
  119. data/lib/fluent/config/literal_parser.rb +286 -0
  120. data/lib/fluent/config/parser.rb +107 -0
  121. data/lib/fluent/config/section.rb +272 -0
  122. data/lib/fluent/config/types.rb +249 -0
  123. data/lib/fluent/config/v1_parser.rb +192 -0
  124. data/lib/fluent/config.rb +76 -0
  125. data/lib/fluent/configurable.rb +201 -0
  126. data/lib/fluent/counter/base_socket.rb +44 -0
  127. data/lib/fluent/counter/client.rb +297 -0
  128. data/lib/fluent/counter/error.rb +86 -0
  129. data/lib/fluent/counter/mutex_hash.rb +163 -0
  130. data/lib/fluent/counter/server.rb +273 -0
  131. data/lib/fluent/counter/store.rb +205 -0
  132. data/lib/fluent/counter/validator.rb +145 -0
  133. data/lib/fluent/counter.rb +23 -0
  134. data/lib/fluent/daemon.rb +15 -0
  135. data/lib/fluent/daemonizer.rb +88 -0
  136. data/lib/fluent/engine.rb +253 -0
  137. data/lib/fluent/env.rb +40 -0
  138. data/lib/fluent/error.rb +34 -0
  139. data/lib/fluent/event.rb +326 -0
  140. data/lib/fluent/event_router.rb +297 -0
  141. data/lib/fluent/ext_monitor_require.rb +28 -0
  142. data/lib/fluent/filter.rb +21 -0
  143. data/lib/fluent/fluent_log_event_router.rb +141 -0
  144. data/lib/fluent/formatter.rb +23 -0
  145. data/lib/fluent/input.rb +21 -0
  146. data/lib/fluent/label.rb +46 -0
  147. data/lib/fluent/load.rb +34 -0
  148. data/lib/fluent/log.rb +713 -0
  149. data/lib/fluent/match.rb +187 -0
  150. data/lib/fluent/mixin.rb +31 -0
  151. data/lib/fluent/msgpack_factory.rb +106 -0
  152. data/lib/fluent/oj_options.rb +62 -0
  153. data/lib/fluent/output.rb +29 -0
  154. data/lib/fluent/output_chain.rb +23 -0
  155. data/lib/fluent/parser.rb +23 -0
  156. data/lib/fluent/plugin/bare_output.rb +104 -0
  157. data/lib/fluent/plugin/base.rb +197 -0
  158. data/lib/fluent/plugin/buf_file.rb +213 -0
  159. data/lib/fluent/plugin/buf_file_single.rb +225 -0
  160. data/lib/fluent/plugin/buf_memory.rb +34 -0
  161. data/lib/fluent/plugin/buffer/chunk.rb +240 -0
  162. data/lib/fluent/plugin/buffer/file_chunk.rb +413 -0
  163. data/lib/fluent/plugin/buffer/file_single_chunk.rb +311 -0
  164. data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
  165. data/lib/fluent/plugin/buffer.rb +918 -0
  166. data/lib/fluent/plugin/compressable.rb +96 -0
  167. data/lib/fluent/plugin/exec_util.rb +22 -0
  168. data/lib/fluent/plugin/file_util.rb +22 -0
  169. data/lib/fluent/plugin/file_wrapper.rb +187 -0
  170. data/lib/fluent/plugin/filter.rb +127 -0
  171. data/lib/fluent/plugin/filter_grep.rb +189 -0
  172. data/lib/fluent/plugin/filter_parser.rb +130 -0
  173. data/lib/fluent/plugin/filter_record_transformer.rb +324 -0
  174. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  175. data/lib/fluent/plugin/formatter.rb +75 -0
  176. data/lib/fluent/plugin/formatter_csv.rb +78 -0
  177. data/lib/fluent/plugin/formatter_hash.rb +35 -0
  178. data/lib/fluent/plugin/formatter_json.rb +59 -0
  179. data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
  180. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  181. data/lib/fluent/plugin/formatter_out_file.rb +53 -0
  182. data/lib/fluent/plugin/formatter_single_value.rb +36 -0
  183. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  184. data/lib/fluent/plugin/formatter_tsv.rb +40 -0
  185. data/lib/fluent/plugin/in_debug_agent.rb +71 -0
  186. data/lib/fluent/plugin/in_dummy.rb +18 -0
  187. data/lib/fluent/plugin/in_exec.rb +110 -0
  188. data/lib/fluent/plugin/in_forward.rb +473 -0
  189. data/lib/fluent/plugin/in_gc_stat.rb +72 -0
  190. data/lib/fluent/plugin/in_http.rb +667 -0
  191. data/lib/fluent/plugin/in_monitor_agent.rb +412 -0
  192. data/lib/fluent/plugin/in_object_space.rb +93 -0
  193. data/lib/fluent/plugin/in_sample.rb +141 -0
  194. data/lib/fluent/plugin/in_syslog.rb +276 -0
  195. data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
  196. data/lib/fluent/plugin/in_tail.rb +1228 -0
  197. data/lib/fluent/plugin/in_tcp.rb +181 -0
  198. data/lib/fluent/plugin/in_udp.rb +92 -0
  199. data/lib/fluent/plugin/in_unix.rb +195 -0
  200. data/lib/fluent/plugin/input.rb +75 -0
  201. data/lib/fluent/plugin/metrics.rb +119 -0
  202. data/lib/fluent/plugin/metrics_local.rb +96 -0
  203. data/lib/fluent/plugin/multi_output.rb +195 -0
  204. data/lib/fluent/plugin/out_copy.rb +120 -0
  205. data/lib/fluent/plugin/out_exec.rb +105 -0
  206. data/lib/fluent/plugin/out_exec_filter.rb +319 -0
  207. data/lib/fluent/plugin/out_file.rb +334 -0
  208. data/lib/fluent/plugin/out_forward/ack_handler.rb +161 -0
  209. data/lib/fluent/plugin/out_forward/connection_manager.rb +113 -0
  210. data/lib/fluent/plugin/out_forward/error.rb +28 -0
  211. data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
  212. data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
  213. data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
  214. data/lib/fluent/plugin/out_forward/socket_cache.rb +140 -0
  215. data/lib/fluent/plugin/out_forward.rb +826 -0
  216. data/lib/fluent/plugin/out_http.rb +275 -0
  217. data/lib/fluent/plugin/out_null.rb +74 -0
  218. data/lib/fluent/plugin/out_relabel.rb +32 -0
  219. data/lib/fluent/plugin/out_roundrobin.rb +84 -0
  220. data/lib/fluent/plugin/out_secondary_file.rb +131 -0
  221. data/lib/fluent/plugin/out_stdout.rb +74 -0
  222. data/lib/fluent/plugin/out_stream.rb +130 -0
  223. data/lib/fluent/plugin/output.rb +1556 -0
  224. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  225. data/lib/fluent/plugin/parser.rb +275 -0
  226. data/lib/fluent/plugin/parser_apache.rb +28 -0
  227. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  228. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  229. data/lib/fluent/plugin/parser_csv.rb +114 -0
  230. data/lib/fluent/plugin/parser_json.rb +96 -0
  231. data/lib/fluent/plugin/parser_ltsv.rb +51 -0
  232. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  233. data/lib/fluent/plugin/parser_multiline.rb +152 -0
  234. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  235. data/lib/fluent/plugin/parser_none.rb +36 -0
  236. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  237. data/lib/fluent/plugin/parser_syslog.rb +496 -0
  238. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  239. data/lib/fluent/plugin/sd_file.rb +156 -0
  240. data/lib/fluent/plugin/sd_srv.rb +135 -0
  241. data/lib/fluent/plugin/sd_static.rb +58 -0
  242. data/lib/fluent/plugin/service_discovery.rb +65 -0
  243. data/lib/fluent/plugin/socket_util.rb +22 -0
  244. data/lib/fluent/plugin/storage.rb +84 -0
  245. data/lib/fluent/plugin/storage_local.rb +162 -0
  246. data/lib/fluent/plugin/string_util.rb +22 -0
  247. data/lib/fluent/plugin.rb +206 -0
  248. data/lib/fluent/plugin_helper/cert_option.rb +191 -0
  249. data/lib/fluent/plugin_helper/child_process.rb +366 -0
  250. data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
  251. data/lib/fluent/plugin_helper/counter.rb +51 -0
  252. data/lib/fluent/plugin_helper/event_emitter.rb +100 -0
  253. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  254. data/lib/fluent/plugin_helper/extract.rb +104 -0
  255. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  256. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  257. data/lib/fluent/plugin_helper/http_server/compat/server.rb +92 -0
  258. data/lib/fluent/plugin_helper/http_server/compat/ssl_context_extractor.rb +52 -0
  259. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  260. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  261. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  262. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  263. data/lib/fluent/plugin_helper/http_server/server.rb +93 -0
  264. data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
  265. data/lib/fluent/plugin_helper/http_server.rb +135 -0
  266. data/lib/fluent/plugin_helper/inject.rb +154 -0
  267. data/lib/fluent/plugin_helper/metrics.rb +129 -0
  268. data/lib/fluent/plugin_helper/parser.rb +147 -0
  269. data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
  270. data/lib/fluent/plugin_helper/retry_state.rb +209 -0
  271. data/lib/fluent/plugin_helper/server.rb +801 -0
  272. data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
  273. data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
  274. data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
  275. data/lib/fluent/plugin_helper/socket.rb +277 -0
  276. data/lib/fluent/plugin_helper/socket_option.rb +98 -0
  277. data/lib/fluent/plugin_helper/storage.rb +349 -0
  278. data/lib/fluent/plugin_helper/thread.rb +180 -0
  279. data/lib/fluent/plugin_helper/timer.rb +92 -0
  280. data/lib/fluent/plugin_helper.rb +75 -0
  281. data/lib/fluent/plugin_id.rb +93 -0
  282. data/lib/fluent/process.rb +22 -0
  283. data/lib/fluent/registry.rb +116 -0
  284. data/lib/fluent/root_agent.rb +372 -0
  285. data/lib/fluent/rpc.rb +94 -0
  286. data/lib/fluent/static_config_analysis.rb +194 -0
  287. data/lib/fluent/supervisor.rb +1054 -0
  288. data/lib/fluent/system_config.rb +187 -0
  289. data/lib/fluent/test/base.rb +78 -0
  290. data/lib/fluent/test/driver/base.rb +225 -0
  291. data/lib/fluent/test/driver/base_owned.rb +83 -0
  292. data/lib/fluent/test/driver/base_owner.rb +135 -0
  293. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  294. data/lib/fluent/test/driver/filter.rb +57 -0
  295. data/lib/fluent/test/driver/formatter.rb +30 -0
  296. data/lib/fluent/test/driver/input.rb +31 -0
  297. data/lib/fluent/test/driver/multi_output.rb +53 -0
  298. data/lib/fluent/test/driver/output.rb +102 -0
  299. data/lib/fluent/test/driver/parser.rb +30 -0
  300. data/lib/fluent/test/driver/storage.rb +30 -0
  301. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  302. data/lib/fluent/test/filter_test.rb +77 -0
  303. data/lib/fluent/test/formatter_test.rb +65 -0
  304. data/lib/fluent/test/helpers.rb +134 -0
  305. data/lib/fluent/test/input_test.rb +174 -0
  306. data/lib/fluent/test/log.rb +79 -0
  307. data/lib/fluent/test/output_test.rb +156 -0
  308. data/lib/fluent/test/parser_test.rb +70 -0
  309. data/lib/fluent/test/startup_shutdown.rb +46 -0
  310. data/lib/fluent/test.rb +58 -0
  311. data/lib/fluent/time.rb +512 -0
  312. data/lib/fluent/timezone.rb +171 -0
  313. data/lib/fluent/tls.rb +81 -0
  314. data/lib/fluent/unique_id.rb +39 -0
  315. data/lib/fluent/variable_store.rb +40 -0
  316. data/lib/fluent/version.rb +21 -0
  317. data/lib/fluent/winsvc.rb +103 -0
  318. data/templates/new_gem/Gemfile +3 -0
  319. data/templates/new_gem/README.md.erb +43 -0
  320. data/templates/new_gem/Rakefile +13 -0
  321. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  322. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  323. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  324. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  325. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  326. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  327. data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
  328. data/templates/new_gem/test/helper.rb.erb +8 -0
  329. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  330. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  331. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  332. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  333. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  334. data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
  335. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  336. data/templates/plugin_config_formatter/param.md-table.erb +10 -0
  337. data/templates/plugin_config_formatter/param.md.erb +34 -0
  338. data/templates/plugin_config_formatter/section.md.erb +12 -0
  339. data/test/command/test_binlog_reader.rb +362 -0
  340. data/test/command/test_ca_generate.rb +70 -0
  341. data/test/command/test_cap_ctl.rb +100 -0
  342. data/test/command/test_cat.rb +128 -0
  343. data/test/command/test_ctl.rb +57 -0
  344. data/test/command/test_fluentd.rb +1106 -0
  345. data/test/command/test_plugin_config_formatter.rb +398 -0
  346. data/test/command/test_plugin_generator.rb +109 -0
  347. data/test/compat/test_calls_super.rb +166 -0
  348. data/test/compat/test_parser.rb +92 -0
  349. data/test/config/assertions.rb +42 -0
  350. data/test/config/test_config_parser.rb +551 -0
  351. data/test/config/test_configurable.rb +1784 -0
  352. data/test/config/test_configure_proxy.rb +604 -0
  353. data/test/config/test_dsl.rb +415 -0
  354. data/test/config/test_element.rb +518 -0
  355. data/test/config/test_literal_parser.rb +309 -0
  356. data/test/config/test_plugin_configuration.rb +56 -0
  357. data/test/config/test_section.rb +191 -0
  358. data/test/config/test_system_config.rb +199 -0
  359. data/test/config/test_types.rb +408 -0
  360. data/test/counter/test_client.rb +563 -0
  361. data/test/counter/test_error.rb +44 -0
  362. data/test/counter/test_mutex_hash.rb +179 -0
  363. data/test/counter/test_server.rb +589 -0
  364. data/test/counter/test_store.rb +258 -0
  365. data/test/counter/test_validator.rb +137 -0
  366. data/test/helper.rb +155 -0
  367. data/test/helpers/fuzzy_assert.rb +89 -0
  368. data/test/helpers/process_extenstion.rb +33 -0
  369. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  370. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  371. data/test/plugin/data/2010/01/20100102.log +0 -0
  372. data/test/plugin/data/log/bar +0 -0
  373. data/test/plugin/data/log/foo/bar.log +0 -0
  374. data/test/plugin/data/log/foo/bar2 +0 -0
  375. data/test/plugin/data/log/test.log +0 -0
  376. data/test/plugin/data/sd_file/config +11 -0
  377. data/test/plugin/data/sd_file/config.json +17 -0
  378. data/test/plugin/data/sd_file/config.yaml +11 -0
  379. data/test/plugin/data/sd_file/config.yml +11 -0
  380. data/test/plugin/data/sd_file/invalid_config.yml +7 -0
  381. data/test/plugin/in_tail/test_fifo.rb +121 -0
  382. data/test/plugin/in_tail/test_io_handler.rb +140 -0
  383. data/test/plugin/in_tail/test_position_file.rb +379 -0
  384. data/test/plugin/out_forward/test_ack_handler.rb +101 -0
  385. data/test/plugin/out_forward/test_connection_manager.rb +145 -0
  386. data/test/plugin/out_forward/test_handshake_protocol.rb +112 -0
  387. data/test/plugin/out_forward/test_load_balancer.rb +106 -0
  388. data/test/plugin/out_forward/test_socket_cache.rb +149 -0
  389. data/test/plugin/test_bare_output.rb +131 -0
  390. data/test/plugin/test_base.rb +115 -0
  391. data/test/plugin/test_buf_file.rb +1275 -0
  392. data/test/plugin/test_buf_file_single.rb +833 -0
  393. data/test/plugin/test_buf_memory.rb +42 -0
  394. data/test/plugin/test_buffer.rb +1383 -0
  395. data/test/plugin/test_buffer_chunk.rb +198 -0
  396. data/test/plugin/test_buffer_file_chunk.rb +871 -0
  397. data/test/plugin/test_buffer_file_single_chunk.rb +611 -0
  398. data/test/plugin/test_buffer_memory_chunk.rb +339 -0
  399. data/test/plugin/test_compressable.rb +87 -0
  400. data/test/plugin/test_file_util.rb +96 -0
  401. data/test/plugin/test_file_wrapper.rb +126 -0
  402. data/test/plugin/test_filter.rb +368 -0
  403. data/test/plugin/test_filter_grep.rb +697 -0
  404. data/test/plugin/test_filter_parser.rb +731 -0
  405. data/test/plugin/test_filter_record_transformer.rb +577 -0
  406. data/test/plugin/test_filter_stdout.rb +207 -0
  407. data/test/plugin/test_formatter_csv.rb +136 -0
  408. data/test/plugin/test_formatter_hash.rb +38 -0
  409. data/test/plugin/test_formatter_json.rb +61 -0
  410. data/test/plugin/test_formatter_ltsv.rb +70 -0
  411. data/test/plugin/test_formatter_msgpack.rb +28 -0
  412. data/test/plugin/test_formatter_out_file.rb +116 -0
  413. data/test/plugin/test_formatter_single_value.rb +44 -0
  414. data/test/plugin/test_formatter_tsv.rb +76 -0
  415. data/test/plugin/test_in_debug_agent.rb +49 -0
  416. data/test/plugin/test_in_exec.rb +261 -0
  417. data/test/plugin/test_in_forward.rb +1180 -0
  418. data/test/plugin/test_in_gc_stat.rb +62 -0
  419. data/test/plugin/test_in_http.rb +1080 -0
  420. data/test/plugin/test_in_monitor_agent.rb +923 -0
  421. data/test/plugin/test_in_object_space.rb +60 -0
  422. data/test/plugin/test_in_sample.rb +190 -0
  423. data/test/plugin/test_in_syslog.rb +505 -0
  424. data/test/plugin/test_in_tail.rb +2363 -0
  425. data/test/plugin/test_in_tcp.rb +243 -0
  426. data/test/plugin/test_in_udp.rb +268 -0
  427. data/test/plugin/test_in_unix.rb +181 -0
  428. data/test/plugin/test_input.rb +137 -0
  429. data/test/plugin/test_metadata.rb +89 -0
  430. data/test/plugin/test_metrics.rb +294 -0
  431. data/test/plugin/test_metrics_local.rb +96 -0
  432. data/test/plugin/test_multi_output.rb +204 -0
  433. data/test/plugin/test_out_copy.rb +308 -0
  434. data/test/plugin/test_out_exec.rb +312 -0
  435. data/test/plugin/test_out_exec_filter.rb +606 -0
  436. data/test/plugin/test_out_file.rb +1037 -0
  437. data/test/plugin/test_out_forward.rb +1348 -0
  438. data/test/plugin/test_out_http.rb +428 -0
  439. data/test/plugin/test_out_null.rb +105 -0
  440. data/test/plugin/test_out_relabel.rb +28 -0
  441. data/test/plugin/test_out_roundrobin.rb +146 -0
  442. data/test/plugin/test_out_secondary_file.rb +458 -0
  443. data/test/plugin/test_out_stdout.rb +205 -0
  444. data/test/plugin/test_out_stream.rb +103 -0
  445. data/test/plugin/test_output.rb +1065 -0
  446. data/test/plugin/test_output_as_buffered.rb +2024 -0
  447. data/test/plugin/test_output_as_buffered_backup.rb +363 -0
  448. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  449. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  450. data/test/plugin/test_output_as_buffered_retries.rb +919 -0
  451. data/test/plugin/test_output_as_buffered_secondary.rb +882 -0
  452. data/test/plugin/test_output_as_standard.rb +374 -0
  453. data/test/plugin/test_owned_by.rb +35 -0
  454. data/test/plugin/test_parser.rb +399 -0
  455. data/test/plugin/test_parser_apache.rb +42 -0
  456. data/test/plugin/test_parser_apache2.rb +47 -0
  457. data/test/plugin/test_parser_apache_error.rb +45 -0
  458. data/test/plugin/test_parser_csv.rb +200 -0
  459. data/test/plugin/test_parser_json.rb +138 -0
  460. data/test/plugin/test_parser_labeled_tsv.rb +160 -0
  461. data/test/plugin/test_parser_multiline.rb +111 -0
  462. data/test/plugin/test_parser_nginx.rb +88 -0
  463. data/test/plugin/test_parser_none.rb +52 -0
  464. data/test/plugin/test_parser_regexp.rb +289 -0
  465. data/test/plugin/test_parser_syslog.rb +650 -0
  466. data/test/plugin/test_parser_tsv.rb +122 -0
  467. data/test/plugin/test_sd_file.rb +228 -0
  468. data/test/plugin/test_sd_srv.rb +230 -0
  469. data/test/plugin/test_storage.rb +167 -0
  470. data/test/plugin/test_storage_local.rb +335 -0
  471. data/test/plugin/test_string_util.rb +26 -0
  472. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  473. data/test/plugin_helper/data/cert/cert-with-CRLF.pem +19 -0
  474. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  475. data/test/plugin_helper/data/cert/cert.pem +19 -0
  476. data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +27 -0
  477. data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +20 -0
  478. data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +27 -0
  479. data/test/plugin_helper/data/cert/cert_chains/cert.pem +40 -0
  480. data/test/plugin_helper/data/cert/empty.pem +0 -0
  481. data/test/plugin_helper/data/cert/generate_cert.rb +125 -0
  482. data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +30 -0
  483. data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +27 -0
  484. data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +20 -0
  485. data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +20 -0
  486. data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +30 -0
  487. data/test/plugin_helper/data/cert/with_ca/cert-key.pem +27 -0
  488. data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +21 -0
  489. data/test/plugin_helper/data/cert/with_ca/cert.pem +21 -0
  490. data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +30 -0
  491. data/test/plugin_helper/data/cert/without_ca/cert-key.pem +27 -0
  492. data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +20 -0
  493. data/test/plugin_helper/data/cert/without_ca/cert.pem +20 -0
  494. data/test/plugin_helper/http_server/test_app.rb +65 -0
  495. data/test/plugin_helper/http_server/test_route.rb +32 -0
  496. data/test/plugin_helper/service_discovery/test_manager.rb +93 -0
  497. data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +21 -0
  498. data/test/plugin_helper/test_cert_option.rb +25 -0
  499. data/test/plugin_helper/test_child_process.rb +840 -0
  500. data/test/plugin_helper/test_compat_parameters.rb +358 -0
  501. data/test/plugin_helper/test_event_emitter.rb +80 -0
  502. data/test/plugin_helper/test_event_loop.rb +52 -0
  503. data/test/plugin_helper/test_extract.rb +194 -0
  504. data/test/plugin_helper/test_formatter.rb +255 -0
  505. data/test/plugin_helper/test_http_server_helper.rb +372 -0
  506. data/test/plugin_helper/test_inject.rb +561 -0
  507. data/test/plugin_helper/test_metrics.rb +137 -0
  508. data/test/plugin_helper/test_parser.rb +264 -0
  509. data/test/plugin_helper/test_record_accessor.rb +238 -0
  510. data/test/plugin_helper/test_retry_state.rb +442 -0
  511. data/test/plugin_helper/test_server.rb +1823 -0
  512. data/test/plugin_helper/test_service_discovery.rb +165 -0
  513. data/test/plugin_helper/test_socket.rb +146 -0
  514. data/test/plugin_helper/test_storage.rb +542 -0
  515. data/test/plugin_helper/test_thread.rb +164 -0
  516. data/test/plugin_helper/test_timer.rb +130 -0
  517. data/test/scripts/exec_script.rb +32 -0
  518. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  519. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  520. data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
  521. data/test/scripts/fluent/plugin/out_test.rb +81 -0
  522. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  523. data/test/scripts/fluent/plugin/parser_known.rb +4 -0
  524. data/test/test_capability.rb +74 -0
  525. data/test/test_clock.rb +164 -0
  526. data/test/test_config.rb +202 -0
  527. data/test/test_configdsl.rb +148 -0
  528. data/test/test_daemonizer.rb +91 -0
  529. data/test/test_engine.rb +203 -0
  530. data/test/test_event.rb +531 -0
  531. data/test/test_event_router.rb +331 -0
  532. data/test/test_event_time.rb +199 -0
  533. data/test/test_filter.rb +121 -0
  534. data/test/test_fluent_log_event_router.rb +99 -0
  535. data/test/test_formatter.rb +366 -0
  536. data/test/test_input.rb +31 -0
  537. data/test/test_log.rb +994 -0
  538. data/test/test_logger_initializer.rb +46 -0
  539. data/test/test_match.rb +148 -0
  540. data/test/test_mixin.rb +351 -0
  541. data/test/test_msgpack_factory.rb +18 -0
  542. data/test/test_oj_options.rb +55 -0
  543. data/test/test_output.rb +278 -0
  544. data/test/test_plugin.rb +251 -0
  545. data/test/test_plugin_classes.rb +370 -0
  546. data/test/test_plugin_helper.rb +81 -0
  547. data/test/test_plugin_id.rb +119 -0
  548. data/test/test_process.rb +14 -0
  549. data/test/test_root_agent.rb +951 -0
  550. data/test/test_static_config_analysis.rb +177 -0
  551. data/test/test_supervisor.rb +601 -0
  552. data/test/test_test_drivers.rb +136 -0
  553. data/test/test_time_formatter.rb +301 -0
  554. data/test/test_time_parser.rb +362 -0
  555. data/test/test_tls.rb +65 -0
  556. data/test/test_unique_id.rb +47 -0
  557. data/test/test_variable_store.rb +65 -0
  558. metadata +1261 -0
@@ -0,0 +1,349 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'forwardable'
18
+
19
+ require 'fluent/plugin'
20
+ require 'fluent/plugin/storage'
21
+ require 'fluent/plugin_helper/timer'
22
+ require 'fluent/config/element'
23
+ require 'fluent/configurable'
24
+
25
+ module Fluent
26
+ module PluginHelper
27
+ module Storage
28
+ include Fluent::PluginHelper::Timer
29
+
30
+ StorageState = Struct.new(:storage, :running)
31
+
32
+ def storage_create(usage: '', type: nil, conf: nil, default_type: nil)
33
+ if conf && conf.respond_to?(:arg) && !conf.arg.empty?
34
+ usage = conf.arg
35
+ end
36
+ if !usage.empty? && usage !~ /^[a-zA-Z][-_.a-zA-Z0-9]*$/
37
+ raise Fluent::ConfigError, "Argument in <storage ARG> uses invalid characters: '#{usage}'"
38
+ end
39
+
40
+ s = @_storages[usage]
41
+ if s && s.running
42
+ return s.storage
43
+ elsif s
44
+ # storage is already created, but not loaded / started
45
+ else # !s
46
+ type = if type
47
+ type
48
+ elsif conf && conf.respond_to?(:[])
49
+ raise Fluent::ConfigError, "@type is required in <storage>" unless conf['@type']
50
+ conf['@type']
51
+ elsif default_type
52
+ default_type
53
+ else
54
+ raise ArgumentError, "BUG: both type and conf are not specified"
55
+ end
56
+ storage = Plugin.new_storage(type, parent: self)
57
+ config = case conf
58
+ when Fluent::Config::Element
59
+ conf
60
+ when Hash
61
+ # in code, programmer may use symbols as keys, but Element needs strings
62
+ conf = Hash[conf.map{|k,v| [k.to_s, v]}]
63
+ Fluent::Config::Element.new('storage', usage, conf, [])
64
+ when nil
65
+ Fluent::Config::Element.new('storage', usage, {'@type' => type}, [])
66
+ else
67
+ raise ArgumentError, "BUG: conf must be a Element, Hash (or unspecified), but '#{conf.class}'"
68
+ end
69
+ storage.configure(config)
70
+ if @_storages_started
71
+ storage.start
72
+ end
73
+ s = @_storages[usage] = StorageState.new(wrap_instance(storage), false)
74
+ end
75
+
76
+ s.storage
77
+ end
78
+
79
+ module StorageParams
80
+ include Fluent::Configurable
81
+ # minimum section definition to instantiate storage plugin instances
82
+ config_section :storage, required: false, multi: true, param_name: :storage_configs, init: true do
83
+ config_argument :usage, :string, default: ''
84
+ config_param :@type, :string, default: Fluent::Plugin::Storage::DEFAULT_TYPE
85
+ end
86
+ end
87
+
88
+ def self.included(mod)
89
+ mod.include StorageParams
90
+ end
91
+
92
+ attr_reader :_storages # for tests
93
+
94
+ def initialize
95
+ super
96
+ @_storages_started = false
97
+ @_storages = {} # usage => storage_state
98
+ end
99
+
100
+ def configure(conf)
101
+ super
102
+
103
+ @storage_configs.each do |section|
104
+ if !section.usage.empty? && section.usage !~ /^[a-zA-Z][-_.a-zA-Z0-9]*$/
105
+ raise Fluent::ConfigError, "Argument in <storage ARG> uses invalid characters: '#{section.usage}'"
106
+ end
107
+ if @_storages[section.usage]
108
+ raise Fluent::ConfigError, "duplicated storages configured: #{section.usage}"
109
+ end
110
+ storage = Plugin.new_storage(section[:@type], parent: self)
111
+ storage.configure(section.corresponding_config_element)
112
+ @_storages[section.usage] = StorageState.new(wrap_instance(storage), false)
113
+ end
114
+ end
115
+
116
+ def start
117
+ super
118
+
119
+ @_storages_started = true
120
+ @_storages.each_pair do |usage, s|
121
+ s.storage.start
122
+ s.storage.load
123
+
124
+ if s.storage.autosave && !s.storage.persistent
125
+ timer_execute(:storage_autosave, s.storage.autosave_interval, repeat: true) do
126
+ begin
127
+ s.storage.save
128
+ rescue => e
129
+ log.error "plugin storage failed to save its data", usage: usage, type: type, error: e
130
+ end
131
+ end
132
+ end
133
+ s.running = true
134
+ end
135
+ end
136
+
137
+ def storage_operate(method_name, &block)
138
+ @_storages.each_pair do |usage, s|
139
+ begin
140
+ block.call(s) if block_given?
141
+ s.storage.__send__(method_name)
142
+ rescue => e
143
+ log.error "unexpected error while #{method_name}", usage: usage, storage: s.storage, error: e
144
+ end
145
+ end
146
+ end
147
+
148
+ def stop
149
+ super
150
+ # timer stops automatically in super
151
+ storage_operate(:stop)
152
+ end
153
+
154
+ def before_shutdown
155
+ storage_operate(:before_shutdown)
156
+ super
157
+ end
158
+
159
+ def shutdown
160
+ storage_operate(:shutdown) do |s|
161
+ s.storage.save if s.storage.save_at_shutdown
162
+ end
163
+ super
164
+ end
165
+
166
+ def after_shutdown
167
+ storage_operate(:after_shutdown)
168
+ super
169
+ end
170
+
171
+ def close
172
+ storage_operate(:close){|s| s.running = false }
173
+ super
174
+ end
175
+
176
+ def terminate
177
+ storage_operate(:terminate)
178
+ @_storages = {}
179
+ super
180
+ end
181
+
182
+ def wrap_instance(storage)
183
+ if storage.persistent && storage.persistent_always?
184
+ storage
185
+ elsif storage.persistent
186
+ PersistentWrapper.new(storage)
187
+ elsif !storage.synchronized?
188
+ SynchronizeWrapper.new(storage)
189
+ else
190
+ storage
191
+ end
192
+ end
193
+
194
+ class PersistentWrapper
195
+ # PersistentWrapper always provides synchronized operations
196
+ extend Forwardable
197
+
198
+ def initialize(storage)
199
+ @storage = storage
200
+ @monitor = Monitor.new
201
+ end
202
+
203
+ def_delegators :@storage, :autosave_interval, :save_at_shutdown
204
+ def_delegators :@storage, :start, :stop, :before_shutdown, :shutdown, :after_shutdown, :close, :terminate
205
+ def_delegators :@storage, :started?, :stopped?, :before_shutdown?, :shutdown?, :after_shutdown?, :closed?, :terminated?
206
+
207
+ def method_missing(name, *args)
208
+ @monitor.synchronize{ @storage.__send__(name, *args) }
209
+ end
210
+
211
+ def persistent_always?
212
+ true
213
+ end
214
+
215
+ def persistent
216
+ true
217
+ end
218
+
219
+ def autosave
220
+ false
221
+ end
222
+
223
+ def synchronized?
224
+ true
225
+ end
226
+
227
+ def implementation
228
+ @storage
229
+ end
230
+
231
+ def load
232
+ @monitor.synchronize do
233
+ @storage.load
234
+ end
235
+ end
236
+
237
+ def save
238
+ @monitor.synchronize do
239
+ @storage.save
240
+ end
241
+ end
242
+
243
+ def get(key)
244
+ @monitor.synchronize do
245
+ @storage.load
246
+ @storage.get(key)
247
+ end
248
+ end
249
+
250
+ def fetch(key, defval)
251
+ @monitor.synchronize do
252
+ @storage.load
253
+ @storage.fetch(key, defval)
254
+ end
255
+ end
256
+
257
+ def put(key, value)
258
+ @monitor.synchronize do
259
+ @storage.load
260
+ @storage.put(key, value)
261
+ @storage.save
262
+ value
263
+ end
264
+ end
265
+
266
+ def delete(key)
267
+ @monitor.synchronize do
268
+ @storage.load
269
+ val = @storage.delete(key)
270
+ @storage.save
271
+ val
272
+ end
273
+ end
274
+
275
+ def update(key, &block)
276
+ @monitor.synchronize do
277
+ @storage.load
278
+ v = block.call(@storage.get(key))
279
+ @storage.put(key, v)
280
+ @storage.save
281
+ v
282
+ end
283
+ end
284
+ end
285
+
286
+ class SynchronizeWrapper
287
+ extend Forwardable
288
+
289
+ def initialize(storage)
290
+ @storage = storage
291
+ @monitor = Monitor.new
292
+ end
293
+
294
+ def_delegators :@storage, :persistent, :autosave, :autosave_interval, :save_at_shutdown
295
+ def_delegators :@storage, :persistent_always?
296
+ def_delegators :@storage, :start, :stop, :before_shutdown, :shutdown, :after_shutdown, :close, :terminate
297
+ def_delegators :@storage, :started?, :stopped?, :before_shutdown?, :shutdown?, :after_shutdown?, :closed?, :terminated?
298
+
299
+ def method_missing(name, *args)
300
+ @monitor.synchronize{ @storage.__send__(name, *args) }
301
+ end
302
+
303
+ def synchronized?
304
+ true
305
+ end
306
+
307
+ def implementation
308
+ @storage
309
+ end
310
+
311
+ def load
312
+ @monitor.synchronize do
313
+ @storage.load
314
+ end
315
+ end
316
+
317
+ def save
318
+ @monitor.synchronize do
319
+ @storage.save
320
+ end
321
+ end
322
+
323
+ def get(key)
324
+ @monitor.synchronize{ @storage.get(key) }
325
+ end
326
+
327
+ def fetch(key, defval)
328
+ @monitor.synchronize{ @storage.fetch(key, defval) }
329
+ end
330
+
331
+ def put(key, value)
332
+ @monitor.synchronize{ @storage.put(key, value) }
333
+ end
334
+
335
+ def delete(key)
336
+ @monitor.synchronize{ @storage.delete(key) }
337
+ end
338
+
339
+ def update(key, &block)
340
+ @monitor.synchronize do
341
+ v = block.call(@storage.get(key))
342
+ @storage.put(key, v)
343
+ v
344
+ end
345
+ end
346
+ end
347
+ end
348
+ end
349
+ end
@@ -0,0 +1,180 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'fluent/clock'
18
+
19
+ module Fluent
20
+ module PluginHelper
21
+ module Thread
22
+ THREAD_DEFAULT_WAIT_SECONDS = 1
23
+ THREAD_SHUTDOWN_HARD_TIMEOUT_IN_TESTS = 100 # second
24
+
25
+ # stop : mark callback thread as stopped
26
+ # shutdown : [-]
27
+ # close : correct stopped threads
28
+ # terminate: kill all threads
29
+
30
+ attr_reader :_threads # for test driver
31
+
32
+ def thread_current_running?
33
+ # checker for code in callback of thread_create
34
+ ::Thread.current[:_fluentd_plugin_helper_thread_running] || false
35
+ end
36
+
37
+ def thread_wait_until_start
38
+ until @_threads_mutex.synchronize{ @_threads.values.reduce(true){|r,t| r && t[:_fluentd_plugin_helper_thread_started] } }
39
+ sleep 0.1
40
+ end
41
+ end
42
+
43
+ def thread_wait_until_stop
44
+ timeout_at = Fluent::Clock.now + THREAD_SHUTDOWN_HARD_TIMEOUT_IN_TESTS
45
+ until @_threads_mutex.synchronize{ @_threads.values.reduce(true){|r,t| r && !t[:_fluentd_plugin_helper_thread_running] } }
46
+ break if Fluent::Clock.now > timeout_at
47
+ sleep 0.1
48
+ end
49
+ @_threads_mutex.synchronize{ @_threads.values }.each do |t|
50
+ if t.alive?
51
+ puts "going to kill the thread still running: #{t[:_fluentd_plugin_helper_thread_title]}"
52
+ t.kill rescue nil
53
+ t[:_fluentd_plugin_helper_thread_running] = false
54
+ end
55
+ end
56
+ end
57
+
58
+ # Ruby 2.2.3 or earlier (and all 2.1.x) cause bug about Threading ("Stack consistency error")
59
+ # by passing splatted argument to `yield`
60
+ # https://bugs.ruby-lang.org/issues/11027
61
+ # We can enable to pass arguments after expire of Ruby 2.1 (& older 2.2.x)
62
+ # def thread_create(title, *args)
63
+ # Thread.new(*args) do |*t_args|
64
+ # yield *t_args
65
+ def thread_create(title)
66
+ raise ArgumentError, "BUG: title must be a symbol" unless title.is_a? Symbol
67
+ raise ArgumentError, "BUG: callback not specified" unless block_given?
68
+ m = Mutex.new
69
+ m.lock
70
+ thread = ::Thread.new do
71
+ m.lock # run thread after that thread is successfully set into @_threads
72
+ m.unlock
73
+ thread_exit = false
74
+ ::Thread.current[:_fluentd_plugin_helper_thread_title] = title
75
+ ::Thread.current[:_fluentd_plugin_helper_thread_started] = true
76
+ ::Thread.current[:_fluentd_plugin_helper_thread_running] = true
77
+ begin
78
+ yield
79
+ thread_exit = true
80
+ rescue Exception => e
81
+ log.warn "thread exited by unexpected error", plugin: self.class, title: title, error: e
82
+ thread_exit = true
83
+ raise
84
+ ensure
85
+ @_threads_mutex.synchronize do
86
+ @_threads.delete(::Thread.current.object_id)
87
+ end
88
+ ::Thread.current[:_fluentd_plugin_helper_thread_running] = false
89
+ if ::Thread.current.alive? && !thread_exit
90
+ log.warn "thread doesn't exit correctly (killed or other reason)", plugin: self.class, title: title, thread: ::Thread.current, error: $!
91
+ end
92
+ end
93
+ end
94
+ thread.abort_on_exception = true
95
+ thread.name = title.to_s if thread.respond_to?(:name)
96
+ @_threads_mutex.synchronize do
97
+ @_threads[thread.object_id] = thread
98
+ end
99
+ m.unlock
100
+ thread
101
+ end
102
+
103
+ def thread_exist?(title)
104
+ @_threads.values.select{|thread| title == thread[:_fluentd_plugin_helper_thread_title] }.size > 0
105
+ end
106
+
107
+ def thread_started?(title)
108
+ t = @_threads.values.select{|thread| title == thread[:_fluentd_plugin_helper_thread_title] }.first
109
+ t && t[:_fluentd_plugin_helper_thread_started]
110
+ end
111
+
112
+ def thread_running?(title)
113
+ t = @_threads.values.select{|thread| title == thread[:_fluentd_plugin_helper_thread_title] }.first
114
+ t && t[:_fluentd_plugin_helper_thread_running]
115
+ end
116
+
117
+ def initialize
118
+ super
119
+ @_threads_mutex = Mutex.new
120
+ @_threads = {}
121
+ @_thread_wait_seconds = THREAD_DEFAULT_WAIT_SECONDS
122
+ end
123
+
124
+ def stop
125
+ super
126
+ wakeup_threads = []
127
+ @_threads_mutex.synchronize do
128
+ @_threads.each_value do |thread|
129
+ thread[:_fluentd_plugin_helper_thread_running] = false
130
+ wakeup_threads << thread if thread.alive? && thread.status == "sleep"
131
+ end
132
+ end
133
+ wakeup_threads.each do |thread|
134
+ if thread.alive?
135
+ thread.wakeup
136
+ end
137
+ end
138
+ end
139
+
140
+ def after_shutdown
141
+ super
142
+ wakeup_threads = []
143
+ @_threads_mutex.synchronize do
144
+ @_threads.each_value do |thread|
145
+ wakeup_threads << thread if thread.alive? && thread.status == "sleep"
146
+ end
147
+ end
148
+ wakeup_threads.each do |thread|
149
+ thread.wakeup if thread.alive?
150
+ end
151
+ end
152
+
153
+ def close
154
+ @_threads_mutex.synchronize{ @_threads.keys }.each do |obj_id|
155
+ thread = @_threads[obj_id]
156
+ if !thread || thread.join(@_thread_wait_seconds)
157
+ @_threads_mutex.synchronize{ @_threads.delete(obj_id) }
158
+ end
159
+ end
160
+
161
+ super
162
+ end
163
+
164
+ def terminate
165
+ super
166
+ @_threads_mutex.synchronize{ @_threads.keys }.each do |obj_id|
167
+ thread = @_threads[obj_id]
168
+ log.warn "killing existing thread", thread: thread
169
+ thread.kill if thread
170
+ end
171
+ @_threads_mutex.synchronize{ @_threads.keys }.each do |obj_id|
172
+ thread = @_threads[obj_id]
173
+ thread.join
174
+ @_threads_mutex.synchronize{ @_threads.delete(obj_id) }
175
+ end
176
+ @_thread_wait_seconds = nil
177
+ end
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,92 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'fluent/plugin_helper/event_loop'
18
+ require 'set'
19
+
20
+ module Fluent
21
+ module PluginHelper
22
+ module Timer
23
+ include Fluent::PluginHelper::EventLoop
24
+
25
+ # stop : turn checker into false (callbacks not called anymore)
26
+ # shutdown : [-]
27
+ # close : [-]
28
+ # terminate: [-]
29
+
30
+ attr_reader :_timers # for tests
31
+
32
+ # interval: integer/float, repeat: true/false
33
+ def timer_execute(title, interval, repeat: true, &block)
34
+ raise ArgumentError, "BUG: title must be a symbol" unless title.is_a? Symbol
35
+ raise ArgumentError, "BUG: block not specified for callback" unless block_given?
36
+ checker = ->(){ @_timer_running }
37
+ detacher = ->(watcher){ event_loop_detach(watcher) }
38
+ timer = TimerWatcher.new(title, interval, repeat, log, checker, detacher, &block)
39
+ @_timers << title
40
+ event_loop_attach(timer)
41
+ timer
42
+ end
43
+
44
+ def timer_running?
45
+ defined?(@_timer_running) && @_timer_running
46
+ end
47
+
48
+ def initialize
49
+ super
50
+ @_timers ||= Set.new
51
+ end
52
+
53
+ def start
54
+ super
55
+ @_timer_running = true
56
+ end
57
+
58
+ def stop
59
+ super
60
+ @_timer_running = false
61
+ end
62
+
63
+ def terminate
64
+ super
65
+ @_timers = nil
66
+ end
67
+
68
+ class TimerWatcher < Coolio::TimerWatcher
69
+ def initialize(title, interval, repeat, log, checker, detacher, &callback)
70
+ @title = title
71
+ @callback = callback
72
+ @repeat = repeat
73
+ @log = log
74
+ @checker = checker
75
+ @detacher = detacher
76
+ super(interval, repeat)
77
+ end
78
+
79
+ def on_timer
80
+ @callback.call if @checker.call
81
+ rescue => e
82
+ @log.error "Unexpected error raised. Stopping the timer.", title: @title, error: e
83
+ @log.error_backtrace
84
+ detach
85
+ @log.error "Timer detached.", title: @title
86
+ ensure
87
+ @detacher.call(self) unless @repeat
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,75 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'fluent/plugin_helper/event_emitter'
18
+ require 'fluent/plugin_helper/thread'
19
+ require 'fluent/plugin_helper/event_loop'
20
+ require 'fluent/plugin_helper/timer'
21
+ require 'fluent/plugin_helper/child_process'
22
+ require 'fluent/plugin_helper/storage'
23
+ require 'fluent/plugin_helper/parser'
24
+ require 'fluent/plugin_helper/formatter'
25
+ require 'fluent/plugin_helper/http_server'
26
+ require 'fluent/plugin_helper/inject'
27
+ require 'fluent/plugin_helper/extract'
28
+ require 'fluent/plugin_helper/socket'
29
+ require 'fluent/plugin_helper/server'
30
+ require 'fluent/plugin_helper/counter'
31
+ require 'fluent/plugin_helper/retry_state'
32
+ require 'fluent/plugin_helper/record_accessor'
33
+ require 'fluent/plugin_helper/compat_parameters'
34
+ require 'fluent/plugin_helper/service_discovery'
35
+ require 'fluent/plugin_helper/metrics'
36
+
37
+ module Fluent
38
+ module PluginHelper
39
+ module Mixin
40
+ def self.included(mod)
41
+ mod.extend(Fluent::PluginHelper)
42
+ end
43
+ end
44
+
45
+ def self.extended(mod)
46
+ def mod.inherited(subclass)
47
+ subclass.module_eval do
48
+ @_plugin_helpers_list = []
49
+ end
50
+ end
51
+ end
52
+
53
+ def helpers_internal(*snake_case_symbols)
54
+ helper_modules = []
55
+ snake_case_symbols.each do |name|
56
+ begin
57
+ helper_modules << Fluent::PluginHelper.const_get(name.to_s.split('_').map(&:capitalize).join)
58
+ rescue NameError
59
+ raise "Unknown plugin helper:#{name}"
60
+ end
61
+ end
62
+ include(*helper_modules)
63
+ end
64
+
65
+ def helpers(*snake_case_symbols)
66
+ @_plugin_helpers_list ||= []
67
+ @_plugin_helpers_list.concat(snake_case_symbols)
68
+ helpers_internal(*snake_case_symbols)
69
+ end
70
+
71
+ def plugin_helpers
72
+ @_plugin_helpers_list || []
73
+ end
74
+ end
75
+ end