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,163 @@
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 'timeout'
18
+
19
+ module Fluent
20
+ module Counter
21
+ class MutexHash
22
+ def initialize(data_store)
23
+ @mutex = Mutex.new
24
+ @data_store = data_store
25
+ @mutex_hash = {}
26
+ @thread = nil
27
+ @cleanup_thread = CleanupThread.new(@data_store, @mutex_hash, @mutex)
28
+ end
29
+
30
+ def start
31
+ @data_store.start
32
+ @cleanup_thread.start
33
+ end
34
+
35
+ def stop
36
+ @data_store.stop
37
+ @cleanup_thread.stop
38
+ end
39
+
40
+ def synchronize(*keys)
41
+ return if keys.empty?
42
+
43
+ locks = {}
44
+ loop do
45
+ @mutex.synchronize do
46
+ keys.each do |key|
47
+ mutex = @mutex_hash[key]
48
+ unless mutex
49
+ v = Mutex.new
50
+ @mutex_hash[key] = v
51
+ mutex = v
52
+ end
53
+
54
+ if mutex.try_lock
55
+ locks[key] = mutex
56
+ else
57
+ locks.values.each(&:unlock)
58
+ locks = {} # flush locked keys
59
+ break
60
+ end
61
+ end
62
+ end
63
+
64
+ next if locks.empty? # failed to lock all keys
65
+
66
+ locks.each do |(k, v)|
67
+ yield @data_store, k
68
+ v.unlock
69
+ end
70
+ break
71
+ end
72
+ end
73
+
74
+ def synchronize_keys(*keys)
75
+ return if keys.empty?
76
+ keys = keys.dup
77
+
78
+ while key = keys.shift
79
+ @mutex.lock
80
+
81
+ mutex = @mutex_hash[key]
82
+ unless mutex
83
+ v = Mutex.new
84
+ @mutex_hash[key] = v
85
+ mutex = v
86
+ end
87
+
88
+ if mutex.try_lock
89
+ @mutex.unlock
90
+ yield @data_store, key
91
+ mutex.unlock
92
+ else
93
+ # release global lock
94
+ @mutex.unlock
95
+ keys.push(key) # failed lock, retry this key
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ class CleanupThread
102
+ CLEANUP_INTERVAL = 60 * 15 # 15 min
103
+
104
+ def initialize(store, mutex_hash, mutex)
105
+ @store = store
106
+ @mutex_hash = mutex_hash
107
+ @mutex = mutex
108
+ @thread = nil
109
+ @running = false
110
+ end
111
+
112
+ def start
113
+ @running = true
114
+ @thread = Thread.new do
115
+ while @running
116
+ sleep CLEANUP_INTERVAL
117
+ run_once
118
+ end
119
+ end
120
+ end
121
+
122
+ def stop
123
+ return unless @running
124
+ @running = false
125
+ begin
126
+ # Avoid waiting CLEANUP_INTERVAL
127
+ Timeout.timeout(1) do
128
+ @thread.join
129
+ end
130
+ rescue Timeout::Error
131
+ @thread.kill
132
+ end
133
+ end
134
+
135
+ private
136
+
137
+ def run_once
138
+ @mutex.synchronize do
139
+ last_cleanup_at = (Time.now - CLEANUP_INTERVAL).to_i
140
+ @mutex_hash.each do |(key, mutex)|
141
+ v = @store.get(key, raw: true)
142
+ next unless v
143
+ next if last_cleanup_at < v['last_modified_at'][0] # v['last_modified_at'] = [sec, nsec]
144
+ next unless mutex.try_lock
145
+
146
+ @mutex_hash[key] = nil
147
+ mutex.unlock
148
+
149
+ # Check that a waiting thread is in a lock queue.
150
+ # Can't get a lock here means this key is used in other places.
151
+ # So restore a mutex value to a corresponding key.
152
+ if mutex.try_lock
153
+ @mutex_hash.delete(key)
154
+ mutex.unlock
155
+ else
156
+ @mutex_hash[key] = mutex
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,273 @@
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 'cool.io'
18
+ require 'fluent/counter/base_socket'
19
+ require 'fluent/counter/validator'
20
+ require 'fluent/counter/store'
21
+ require 'fluent/counter/mutex_hash'
22
+
23
+ module Fluent
24
+ module Counter
25
+ class Server
26
+ DEFAULT_ADDR = '127.0.0.1'
27
+ DEFAULT_PORT = 24321
28
+
29
+ def initialize(name, opt = {})
30
+ raise 'Counter server name is invalid' unless Validator::VALID_NAME =~ name
31
+ @name = name
32
+ @opt = opt
33
+ @addr = @opt[:addr] || DEFAULT_ADDR
34
+ @port = @opt[:port] || DEFAULT_PORT
35
+ @loop = @opt[:loop] || Coolio::Loop.new
36
+ @log = @opt[:log] || $log
37
+
38
+ @store = Fluent::Counter::Store.new(opt)
39
+ @mutex_hash = MutexHash.new(@store)
40
+
41
+ @server = Coolio::TCPServer.new(@addr, @port, Handler, method(:on_message))
42
+ @thread = nil
43
+ @running = false
44
+ end
45
+
46
+ def start
47
+ @server.attach(@loop)
48
+ @thread = Thread.new do
49
+ @running = true
50
+ @loop.run(0.5)
51
+ @running = false
52
+ end
53
+ @log.debug("starting counter server #{@addr}:#{@port}")
54
+ @mutex_hash.start
55
+ self
56
+ end
57
+
58
+ def stop
59
+ # This `sleep` for a test to wait for a `@loop` to begin to run
60
+ sleep 0.1
61
+ @server.close
62
+ @loop.stop if @running
63
+ @mutex_hash.stop
64
+ @thread.join if @thread
65
+ @log.debug("calling stop in counter server #{@addr}:#{@port}")
66
+ end
67
+
68
+ def on_message(data)
69
+ errors = Validator.request(data)
70
+ unless errors.empty?
71
+ return { 'id' => data['id'], 'data' => [], 'errors' => errors }
72
+ end
73
+
74
+ result = safe_run do
75
+ send(data['method'], data['params'], data['scope'], data['options'])
76
+ end
77
+ result.merge('id' => data['id'])
78
+ rescue => e
79
+ @log.error e.to_s
80
+ end
81
+
82
+ private
83
+
84
+ def establish(params, _scope, _options)
85
+ validator = Fluent::Counter::ArrayValidator.new(:empty, :scope)
86
+ valid_params, errors = validator.call(params)
87
+ res = Response.new(errors)
88
+
89
+ if scope = valid_params.first
90
+ new_scope = "#{@name}\t#{scope}"
91
+ res.push_data new_scope
92
+ @log.debug("Establish new key: #{new_scope}")
93
+ end
94
+
95
+ res.to_hash
96
+ end
97
+
98
+ def init(params, scope, options)
99
+ validator = Fluent::Counter::HashValidator.new(:empty, :name, :reset_interval)
100
+ valid_params, errors = validator.call(params)
101
+ res = Response.new(errors)
102
+ key_hash = valid_params.reduce({}) do |acc, vp|
103
+ acc.merge(Store.gen_key(scope, vp['name']) => vp)
104
+ end
105
+
106
+ do_init = lambda do |store, key|
107
+ begin
108
+ param = key_hash[key]
109
+ v = store.init(key, param, ignore: options['ignore'])
110
+ @log.debug("Create new key: #{param['name']}")
111
+ res.push_data v
112
+ rescue => e
113
+ res.push_error e
114
+ end
115
+ end
116
+
117
+ if options['random']
118
+ @mutex_hash.synchronize_keys(*(key_hash.keys), &do_init)
119
+ else
120
+ @mutex_hash.synchronize(*(key_hash.keys), &do_init)
121
+ end
122
+
123
+ res.to_hash
124
+ end
125
+
126
+ def delete(params, scope, options)
127
+ validator = Fluent::Counter::ArrayValidator.new(:empty, :key)
128
+ valid_params, errors = validator.call(params)
129
+ res = Response.new(errors)
130
+ keys = valid_params.map { |vp| Store.gen_key(scope, vp) }
131
+
132
+ do_delete = lambda do |store, key|
133
+ begin
134
+ v = store.delete(key)
135
+ @log.debug("delete a key: #{key}")
136
+ res.push_data v
137
+ rescue => e
138
+ res.push_error e
139
+ end
140
+ end
141
+
142
+ if options['random']
143
+ @mutex_hash.synchronize_keys(*keys, &do_delete)
144
+ else
145
+ @mutex_hash.synchronize(*keys, &do_delete)
146
+ end
147
+
148
+ res.to_hash
149
+ end
150
+
151
+ def inc(params, scope, options)
152
+ validate_param = [:empty, :name, :value]
153
+ validate_param << :reset_interval if options['force']
154
+ validator = Fluent::Counter::HashValidator.new(*validate_param)
155
+ valid_params, errors = validator.call(params)
156
+ res = Response.new(errors)
157
+ key_hash = valid_params.reduce({}) do |acc, vp|
158
+ acc.merge(Store.gen_key(scope, vp['name']) => vp)
159
+ end
160
+
161
+ do_inc = lambda do |store, key|
162
+ begin
163
+ param = key_hash[key]
164
+ v = store.inc(key, param, force: options['force'])
165
+ @log.debug("Increment #{key} by #{param['value']}")
166
+ res.push_data v
167
+ rescue => e
168
+ res.push_error e
169
+ end
170
+ end
171
+
172
+ if options['random']
173
+ @mutex_hash.synchronize_keys(*(key_hash.keys), &do_inc)
174
+ else
175
+ @mutex_hash.synchronize(*(key_hash.keys), &do_inc)
176
+ end
177
+
178
+ res.to_hash
179
+ end
180
+
181
+ def reset(params, scope, options)
182
+ validator = Fluent::Counter::ArrayValidator.new(:empty, :key)
183
+ valid_params, errors = validator.call(params)
184
+ res = Response.new(errors)
185
+ keys = valid_params.map { |vp| Store.gen_key(scope, vp) }
186
+
187
+ do_reset = lambda do |store, key|
188
+ begin
189
+ v = store.reset(key)
190
+ @log.debug("Reset #{key}'s' counter value")
191
+ res.push_data v
192
+ rescue => e
193
+ res.push_error e
194
+ end
195
+ end
196
+
197
+ if options['random']
198
+ @mutex_hash.synchronize_keys(*keys, &do_reset)
199
+ else
200
+ @mutex_hash.synchronize(*keys, &do_reset)
201
+ end
202
+
203
+ res.to_hash
204
+ end
205
+
206
+ def get(params, scope, _options)
207
+ validator = Fluent::Counter::ArrayValidator.new(:empty, :key)
208
+ valid_params, errors = validator.call(params)
209
+ res = Response.new(errors)
210
+
211
+ keys = valid_params.map { |vp| Store.gen_key(scope, vp) }
212
+ keys.each do |key|
213
+ begin
214
+ v = @store.get(key, raise_error: true)
215
+ @log.debug("Get counter value: #{key}")
216
+ res.push_data v
217
+ rescue => e
218
+ res.push_error e
219
+ end
220
+ end
221
+ res.to_hash
222
+ end
223
+
224
+ def safe_run
225
+ yield
226
+ rescue => e
227
+ {
228
+ 'errors' => [InternalServerError.new(e).to_hash],
229
+ 'data' => []
230
+ }
231
+ end
232
+
233
+ class Response
234
+ def initialize(errors = [], data = [])
235
+ @errors = errors
236
+ @data = data
237
+ end
238
+
239
+ def push_error(error)
240
+ @errors << error
241
+ end
242
+
243
+ def push_data(data)
244
+ @data << data
245
+ end
246
+
247
+ def to_hash
248
+ if @errors.empty?
249
+ { 'data' => @data }
250
+ else
251
+ errors = @errors.map do |e|
252
+ error = e.respond_to?(:to_hash) ? e : InternalServerError.new(e.to_s)
253
+ error.to_hash
254
+ end
255
+ { 'data' => @data, 'errors' => errors }
256
+ end
257
+ end
258
+ end
259
+ end
260
+
261
+ class Handler < Fluent::Counter::BaseSocket
262
+ def initialize(io, on_message)
263
+ super(io)
264
+ @on_message = on_message
265
+ end
266
+
267
+ def on_message(data)
268
+ res = @on_message.call(data)
269
+ packed_write res if res
270
+ end
271
+ end
272
+ end
273
+ end
@@ -0,0 +1,205 @@
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/config'
18
+ require 'fluent/counter/error'
19
+ require 'fluent/plugin/storage_local'
20
+ require 'fluent/time'
21
+
22
+ module Fluent
23
+ module Counter
24
+ class Store
25
+ def self.gen_key(scope, key)
26
+ "#{scope}\t#{key}"
27
+ end
28
+
29
+ def initialize(opt = {})
30
+ @log = opt[:log] || $log
31
+
32
+ # Notice: This storage is not be implemented auto save.
33
+ @storage = Plugin.new_storage('local', parent: DummyParent.new(@log))
34
+ conf = if opt[:path]
35
+ {'persistent' => true, 'path' => opt[:path] }
36
+ else
37
+ {'persistent' => false }
38
+ end
39
+ @storage.configure(Fluent::Config::Element.new('storage', {}, conf, []))
40
+ end
41
+
42
+ # This class behaves as a configurable plugin for using in storage (OwnedByMixin).
43
+ class DummyParent
44
+ include Configurable
45
+
46
+ attr_reader :log
47
+
48
+ def initialize(log)
49
+ @log = log
50
+ end
51
+
52
+ def plugin_id
53
+ 'dummy_parent_store'
54
+ end
55
+
56
+ def plugin_id_configured?
57
+ false
58
+ end
59
+
60
+ # storage_local calls PluginId#plugin_root_dir
61
+ def plugin_root_dir
62
+ nil
63
+ end
64
+ end
65
+
66
+ def start
67
+ @storage.load
68
+ end
69
+
70
+ def stop
71
+ @storage.save
72
+ end
73
+
74
+ def init(key, data, ignore: false)
75
+ ret = if v = get(key)
76
+ raise InvalidParams.new("#{key} already exists in counter") unless ignore
77
+ v
78
+ else
79
+ @storage.put(key, build_value(data))
80
+ end
81
+
82
+ build_response(ret)
83
+ end
84
+
85
+ def get(key, raise_error: false, raw: false)
86
+ ret = if raise_error
87
+ @storage.get(key) or raise UnknownKey.new("`#{key}` doesn't exist in counter")
88
+ else
89
+ @storage.get(key)
90
+ end
91
+ if raw
92
+ ret
93
+ else
94
+ ret && build_response(ret)
95
+ end
96
+ end
97
+
98
+ def key?(key)
99
+ !!@storage.get(key)
100
+ end
101
+
102
+ def delete(key)
103
+ ret = @storage.delete(key) or raise UnknownKey.new("`#{key}` doesn't exist in counter")
104
+ build_response(ret)
105
+ end
106
+
107
+ def inc(key, data, force: false)
108
+ value = data.delete('value')
109
+ init(key, data) if !key?(key) && force
110
+ v = get(key, raise_error: true, raw: true)
111
+ valid_type!(v, value)
112
+
113
+ v['total'] += value
114
+ v['current'] += value
115
+ t = EventTime.now
116
+ v['last_modified_at'] = [t.sec, t.nsec]
117
+ @storage.put(key, v)
118
+
119
+ build_response(v)
120
+ end
121
+
122
+ def reset(key)
123
+ v = get(key, raise_error: true, raw: true)
124
+ success = false
125
+ old_data = v.dup
126
+ now = EventTime.now
127
+ last_reset_at = EventTime.new(*v['last_reset_at'])
128
+
129
+ # Does it need reset?
130
+ if (last_reset_at + v['reset_interval']) <= now
131
+ success = true
132
+ v['current'] = initial_value(v['type'])
133
+ t = [now.sec, now.nsec]
134
+ v['last_reset_at'] = t
135
+ v['last_modified_at'] = t
136
+ @storage.put(key, v)
137
+ end
138
+
139
+ {
140
+ 'elapsed_time' => now - last_reset_at,
141
+ 'success' => success,
142
+ 'counter_data' => build_response(old_data)
143
+ }
144
+ end
145
+
146
+ private
147
+
148
+ def build_response(d)
149
+ {
150
+ 'name' => d['name'],
151
+ 'total' => d['total'],
152
+ 'current' => d['current'],
153
+ 'type' => d['type'],
154
+ 'reset_interval' => d['reset_interval'],
155
+ 'last_reset_at' => EventTime.new(*d['last_reset_at']),
156
+ }
157
+ end
158
+
159
+ # value is Hash. value requires these fileds.
160
+ # :name, :total, :current, :type, :reset_interval, :last_reset_at, :last_modified_at
161
+ def build_value(data)
162
+ type = data['type'] || 'numeric'
163
+ now = EventTime.now
164
+ t = [now.sec, now.nsec]
165
+
166
+ v = initial_value(type)
167
+
168
+ data.merge(
169
+ 'type' => type,
170
+ 'last_reset_at' => t,
171
+ 'last_modified_at' => t,
172
+ 'current' => v,
173
+ 'total' => v,
174
+ )
175
+ end
176
+
177
+ def initial_value(type)
178
+ case type
179
+ when 'numeric', 'integer' then 0
180
+ when 'float' then 0.0
181
+ else raise InvalidParams.new('`type` should be integer, float, or numeric')
182
+ end
183
+ end
184
+
185
+ def valid_type!(v, value)
186
+ type = v['type']
187
+ return unless (type != 'numeric') && (type_str(value) != type)
188
+ raise InvalidParams.new("`type` is #{type}. You should pass #{type} value as a `value`")
189
+ end
190
+
191
+ def type_str(v)
192
+ case v
193
+ when Integer
194
+ 'integer'
195
+ when Float
196
+ 'float'
197
+ when Numeric
198
+ 'numeric'
199
+ else
200
+ raise InvalidParams.new("`type` should be integer, float, or numeric")
201
+ end
202
+ end
203
+ end
204
+ end
205
+ end