fluentd 0.12.40 → 1.6.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fluentd might be problematic. Click here for more details.

Files changed (428) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  4. data/.github/ISSUE_TEMPLATE.md +17 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  6. data/.gitignore +5 -0
  7. data/.gitlab/cicd-template.yaml +10 -0
  8. data/.gitlab-ci.yml +147 -0
  9. data/.travis.yml +56 -20
  10. data/ADOPTERS.md +5 -0
  11. data/CHANGELOG.md +1369 -0
  12. data/CONTRIBUTING.md +16 -5
  13. data/GOVERNANCE.md +55 -0
  14. data/Gemfile +5 -0
  15. data/GithubWorkflow.md +78 -0
  16. data/LICENSE +202 -0
  17. data/MAINTAINERS.md +7 -0
  18. data/README.md +23 -11
  19. data/Rakefile +48 -2
  20. data/Vagrantfile +17 -0
  21. data/appveyor.yml +37 -0
  22. data/bin/fluent-binlog-reader +7 -0
  23. data/bin/fluent-ca-generate +6 -0
  24. data/bin/fluent-plugin-config-format +5 -0
  25. data/bin/fluent-plugin-generate +5 -0
  26. data/bin/fluentd +3 -0
  27. data/code-of-conduct.md +3 -0
  28. data/example/copy_roundrobin.conf +39 -0
  29. data/example/counter.conf +18 -0
  30. data/example/in_dummy_blocks.conf +17 -0
  31. data/example/in_dummy_with_compression.conf +23 -0
  32. data/example/in_forward.conf +7 -0
  33. data/example/in_forward_client.conf +37 -0
  34. data/example/in_forward_shared_key.conf +15 -0
  35. data/example/in_forward_tls.conf +14 -0
  36. data/example/in_forward_users.conf +24 -0
  37. data/example/in_forward_workers.conf +21 -0
  38. data/example/in_http.conf +3 -1
  39. data/example/in_out_forward.conf +17 -0
  40. data/example/logevents.conf +25 -0
  41. data/example/multi_filters.conf +61 -0
  42. data/example/out_exec_filter.conf +42 -0
  43. data/example/out_forward.conf +13 -13
  44. data/example/out_forward_buf_file.conf +23 -0
  45. data/example/out_forward_client.conf +109 -0
  46. data/example/out_forward_heartbeat_none.conf +16 -0
  47. data/example/out_forward_shared_key.conf +36 -0
  48. data/example/out_forward_tls.conf +18 -0
  49. data/example/out_forward_users.conf +65 -0
  50. data/example/out_null.conf +36 -0
  51. data/example/secondary_file.conf +42 -0
  52. data/example/suppress_config_dump.conf +7 -0
  53. data/example/worker_section.conf +36 -0
  54. data/fluent.conf +29 -0
  55. data/fluentd.gemspec +21 -11
  56. data/lib/fluent/agent.rb +67 -90
  57. data/lib/fluent/clock.rb +62 -0
  58. data/lib/fluent/command/binlog_reader.rb +244 -0
  59. data/lib/fluent/command/ca_generate.rb +181 -0
  60. data/lib/fluent/command/cat.rb +42 -18
  61. data/lib/fluent/command/debug.rb +12 -10
  62. data/lib/fluent/command/fluentd.rb +153 -5
  63. data/lib/fluent/command/plugin_config_formatter.rb +292 -0
  64. data/lib/fluent/command/plugin_generator.rb +324 -0
  65. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  66. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  67. data/lib/fluent/compat/exec_util.rb +129 -0
  68. data/lib/fluent/compat/file_util.rb +54 -0
  69. data/lib/fluent/compat/filter.rb +68 -0
  70. data/lib/fluent/compat/formatter.rb +111 -0
  71. data/lib/fluent/compat/formatter_utils.rb +85 -0
  72. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  73. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  74. data/lib/fluent/compat/input.rb +49 -0
  75. data/lib/fluent/compat/output.rb +718 -0
  76. data/lib/fluent/compat/output_chain.rb +60 -0
  77. data/lib/fluent/compat/parser.rb +310 -0
  78. data/lib/fluent/compat/parser_utils.rb +40 -0
  79. data/lib/fluent/compat/propagate_default.rb +62 -0
  80. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  81. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  82. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  83. data/lib/fluent/compat/socket_util.rb +165 -0
  84. data/lib/fluent/compat/string_util.rb +34 -0
  85. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  86. data/lib/fluent/compat/type_converter.rb +90 -0
  87. data/lib/fluent/config/configure_proxy.rb +210 -62
  88. data/lib/fluent/config/dsl.rb +12 -5
  89. data/lib/fluent/config/element.rb +107 -9
  90. data/lib/fluent/config/literal_parser.rb +9 -3
  91. data/lib/fluent/config/parser.rb +4 -4
  92. data/lib/fluent/config/section.rb +51 -14
  93. data/lib/fluent/config/types.rb +28 -13
  94. data/lib/fluent/config/v1_parser.rb +3 -5
  95. data/lib/fluent/config.rb +23 -20
  96. data/lib/fluent/configurable.rb +79 -21
  97. data/lib/fluent/counter/base_socket.rb +46 -0
  98. data/lib/fluent/counter/client.rb +297 -0
  99. data/lib/fluent/counter/error.rb +86 -0
  100. data/lib/fluent/counter/mutex_hash.rb +163 -0
  101. data/lib/fluent/counter/server.rb +273 -0
  102. data/lib/fluent/counter/store.rb +205 -0
  103. data/lib/fluent/counter/validator.rb +145 -0
  104. data/lib/fluent/counter.rb +23 -0
  105. data/lib/fluent/daemon.rb +15 -0
  106. data/lib/fluent/engine.rb +102 -65
  107. data/lib/fluent/env.rb +7 -3
  108. data/lib/fluent/error.rb +30 -0
  109. data/lib/fluent/event.rb +197 -21
  110. data/lib/fluent/event_router.rb +93 -10
  111. data/lib/fluent/filter.rb +2 -50
  112. data/lib/fluent/formatter.rb +4 -293
  113. data/lib/fluent/input.rb +2 -32
  114. data/lib/fluent/label.rb +10 -2
  115. data/lib/fluent/load.rb +3 -3
  116. data/lib/fluent/log.rb +348 -81
  117. data/lib/fluent/match.rb +37 -36
  118. data/lib/fluent/mixin.rb +12 -176
  119. data/lib/fluent/msgpack_factory.rb +62 -0
  120. data/lib/fluent/output.rb +10 -612
  121. data/lib/fluent/output_chain.rb +23 -0
  122. data/lib/fluent/parser.rb +4 -800
  123. data/lib/fluent/plugin/bare_output.rb +63 -0
  124. data/lib/fluent/plugin/base.rb +192 -0
  125. data/lib/fluent/plugin/buf_file.rb +128 -174
  126. data/lib/fluent/plugin/buf_memory.rb +9 -92
  127. data/lib/fluent/plugin/buffer/chunk.rb +221 -0
  128. data/lib/fluent/plugin/buffer/file_chunk.rb +383 -0
  129. data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
  130. data/lib/fluent/plugin/buffer.rb +779 -0
  131. data/lib/fluent/plugin/compressable.rb +92 -0
  132. data/lib/fluent/plugin/exec_util.rb +3 -108
  133. data/lib/fluent/plugin/file_util.rb +4 -34
  134. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  135. data/lib/fluent/plugin/filter.rb +93 -0
  136. data/lib/fluent/plugin/filter_grep.rb +117 -34
  137. data/lib/fluent/plugin/filter_parser.rb +85 -62
  138. data/lib/fluent/plugin/filter_record_transformer.rb +27 -39
  139. data/lib/fluent/plugin/filter_stdout.rb +15 -12
  140. data/lib/fluent/plugin/formatter.rb +50 -0
  141. data/lib/fluent/plugin/formatter_csv.rb +52 -0
  142. data/lib/fluent/plugin/formatter_hash.rb +33 -0
  143. data/lib/fluent/plugin/formatter_json.rb +55 -0
  144. data/lib/fluent/plugin/formatter_ltsv.rb +42 -0
  145. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  146. data/lib/fluent/plugin/formatter_out_file.rb +51 -0
  147. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  148. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  149. data/lib/fluent/plugin/formatter_tsv.rb +38 -0
  150. data/lib/fluent/plugin/in_debug_agent.rb +17 -6
  151. data/lib/fluent/plugin/in_dummy.rb +47 -20
  152. data/lib/fluent/plugin/in_exec.rb +55 -123
  153. data/lib/fluent/plugin/in_forward.rb +299 -216
  154. data/lib/fluent/plugin/in_gc_stat.rb +14 -36
  155. data/lib/fluent/plugin/in_http.rb +204 -91
  156. data/lib/fluent/plugin/in_monitor_agent.rb +186 -258
  157. data/lib/fluent/plugin/in_object_space.rb +13 -41
  158. data/lib/fluent/plugin/in_syslog.rb +112 -134
  159. data/lib/fluent/plugin/in_tail.rb +408 -745
  160. data/lib/fluent/plugin/in_tcp.rb +66 -9
  161. data/lib/fluent/plugin/in_udp.rb +60 -11
  162. data/lib/fluent/plugin/{in_stream.rb → in_unix.rb} +8 -4
  163. data/lib/fluent/plugin/input.rb +37 -0
  164. data/lib/fluent/plugin/multi_output.rb +158 -0
  165. data/lib/fluent/plugin/out_copy.rb +23 -35
  166. data/lib/fluent/plugin/out_exec.rb +67 -70
  167. data/lib/fluent/plugin/out_exec_filter.rb +204 -271
  168. data/lib/fluent/plugin/out_file.rb +267 -73
  169. data/lib/fluent/plugin/out_forward.rb +854 -325
  170. data/lib/fluent/plugin/out_null.rb +42 -9
  171. data/lib/fluent/plugin/out_relabel.rb +9 -5
  172. data/lib/fluent/plugin/out_roundrobin.rb +18 -37
  173. data/lib/fluent/plugin/out_secondary_file.rb +133 -0
  174. data/lib/fluent/plugin/out_stdout.rb +43 -10
  175. data/lib/fluent/plugin/out_stream.rb +7 -2
  176. data/lib/fluent/plugin/output.rb +1498 -0
  177. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  178. data/lib/fluent/plugin/parser.rb +191 -0
  179. data/lib/fluent/plugin/parser_apache.rb +28 -0
  180. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  181. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  182. data/lib/fluent/plugin/parser_csv.rb +39 -0
  183. data/lib/fluent/plugin/parser_json.rb +94 -0
  184. data/lib/fluent/plugin/parser_ltsv.rb +49 -0
  185. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  186. data/lib/fluent/plugin/parser_multiline.rb +106 -0
  187. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  188. data/lib/fluent/plugin/parser_none.rb +36 -0
  189. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  190. data/lib/fluent/plugin/parser_syslog.rb +142 -0
  191. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  192. data/lib/fluent/plugin/socket_util.rb +3 -143
  193. data/lib/fluent/plugin/storage.rb +84 -0
  194. data/lib/fluent/plugin/storage_local.rb +164 -0
  195. data/lib/fluent/plugin/string_util.rb +3 -15
  196. data/lib/fluent/plugin.rb +122 -121
  197. data/lib/fluent/plugin_helper/cert_option.rb +178 -0
  198. data/lib/fluent/plugin_helper/child_process.rb +364 -0
  199. data/lib/fluent/plugin_helper/compat_parameters.rb +333 -0
  200. data/lib/fluent/plugin_helper/counter.rb +51 -0
  201. data/lib/fluent/plugin_helper/event_emitter.rb +93 -0
  202. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  203. data/lib/fluent/plugin_helper/extract.rb +104 -0
  204. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  205. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  206. data/lib/fluent/plugin_helper/http_server/compat/server.rb +81 -0
  207. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  208. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  209. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  210. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  211. data/lib/fluent/plugin_helper/http_server/server.rb +87 -0
  212. data/lib/fluent/plugin_helper/http_server.rb +76 -0
  213. data/lib/fluent/plugin_helper/inject.rb +151 -0
  214. data/lib/fluent/plugin_helper/parser.rb +147 -0
  215. data/lib/fluent/plugin_helper/record_accessor.rb +210 -0
  216. data/lib/fluent/plugin_helper/retry_state.rb +205 -0
  217. data/lib/fluent/plugin_helper/server.rb +807 -0
  218. data/lib/fluent/plugin_helper/socket.rb +250 -0
  219. data/lib/fluent/plugin_helper/socket_option.rb +80 -0
  220. data/lib/fluent/plugin_helper/storage.rb +349 -0
  221. data/lib/fluent/plugin_helper/thread.rb +179 -0
  222. data/lib/fluent/plugin_helper/timer.rb +92 -0
  223. data/lib/fluent/plugin_helper.rb +73 -0
  224. data/lib/fluent/plugin_id.rb +80 -0
  225. data/lib/fluent/process.rb +3 -489
  226. data/lib/fluent/registry.rb +52 -10
  227. data/lib/fluent/root_agent.rb +204 -42
  228. data/lib/fluent/supervisor.rb +597 -359
  229. data/lib/fluent/system_config.rb +131 -42
  230. data/lib/fluent/test/base.rb +6 -54
  231. data/lib/fluent/test/driver/base.rb +224 -0
  232. data/lib/fluent/test/driver/base_owned.rb +70 -0
  233. data/lib/fluent/test/driver/base_owner.rb +135 -0
  234. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  235. data/lib/fluent/test/driver/filter.rb +57 -0
  236. data/lib/fluent/test/driver/formatter.rb +30 -0
  237. data/lib/fluent/test/driver/input.rb +31 -0
  238. data/lib/fluent/test/driver/multi_output.rb +53 -0
  239. data/lib/fluent/test/driver/output.rb +102 -0
  240. data/lib/fluent/test/driver/parser.rb +30 -0
  241. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  242. data/lib/fluent/test/filter_test.rb +0 -1
  243. data/lib/fluent/test/formatter_test.rb +4 -1
  244. data/lib/fluent/test/helpers.rb +58 -10
  245. data/lib/fluent/test/input_test.rb +27 -19
  246. data/lib/fluent/test/log.rb +79 -0
  247. data/lib/fluent/test/output_test.rb +28 -39
  248. data/lib/fluent/test/parser_test.rb +3 -1
  249. data/lib/fluent/test/startup_shutdown.rb +46 -0
  250. data/lib/fluent/test.rb +33 -1
  251. data/lib/fluent/time.rb +450 -1
  252. data/lib/fluent/timezone.rb +27 -3
  253. data/lib/fluent/{status.rb → unique_id.rb} +15 -24
  254. data/lib/fluent/version.rb +1 -1
  255. data/lib/fluent/winsvc.rb +85 -0
  256. data/templates/new_gem/Gemfile +3 -0
  257. data/templates/new_gem/README.md.erb +43 -0
  258. data/templates/new_gem/Rakefile +13 -0
  259. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  260. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  261. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  262. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  263. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  264. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  265. data/templates/new_gem/test/helper.rb.erb +8 -0
  266. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  267. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  268. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  269. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  270. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  271. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  272. data/templates/plugin_config_formatter/param.md.erb +34 -0
  273. data/templates/plugin_config_formatter/section.md.erb +12 -0
  274. data/test/command/test_binlog_reader.rb +346 -0
  275. data/test/command/test_ca_generate.rb +70 -0
  276. data/test/command/test_fluentd.rb +901 -0
  277. data/test/command/test_plugin_config_formatter.rb +276 -0
  278. data/test/command/test_plugin_generator.rb +92 -0
  279. data/test/compat/test_calls_super.rb +166 -0
  280. data/test/compat/test_parser.rb +92 -0
  281. data/test/config/test_config_parser.rb +126 -2
  282. data/test/config/test_configurable.rb +946 -187
  283. data/test/config/test_configure_proxy.rb +424 -74
  284. data/test/config/test_dsl.rb +11 -11
  285. data/test/config/test_element.rb +500 -0
  286. data/test/config/test_literal_parser.rb +8 -0
  287. data/test/config/test_plugin_configuration.rb +56 -0
  288. data/test/config/test_section.rb +79 -7
  289. data/test/config/test_system_config.rb +122 -35
  290. data/test/config/test_types.rb +38 -0
  291. data/test/counter/test_client.rb +559 -0
  292. data/test/counter/test_error.rb +44 -0
  293. data/test/counter/test_mutex_hash.rb +179 -0
  294. data/test/counter/test_server.rb +589 -0
  295. data/test/counter/test_store.rb +258 -0
  296. data/test/counter/test_validator.rb +137 -0
  297. data/test/helper.rb +89 -6
  298. data/test/helpers/fuzzy_assert.rb +89 -0
  299. data/test/plugin/test_bare_output.rb +118 -0
  300. data/test/plugin/test_base.rb +115 -0
  301. data/test/plugin/test_buf_file.rb +823 -460
  302. data/test/plugin/test_buf_memory.rb +32 -194
  303. data/test/plugin/test_buffer.rb +1233 -0
  304. data/test/plugin/test_buffer_chunk.rb +198 -0
  305. data/test/plugin/test_buffer_file_chunk.rb +844 -0
  306. data/test/plugin/test_buffer_memory_chunk.rb +338 -0
  307. data/test/plugin/test_compressable.rb +84 -0
  308. data/test/plugin/test_filter.rb +357 -0
  309. data/test/plugin/test_filter_grep.rb +540 -29
  310. data/test/plugin/test_filter_parser.rb +439 -452
  311. data/test/plugin/test_filter_record_transformer.rb +123 -166
  312. data/test/plugin/test_filter_stdout.rb +160 -72
  313. data/test/plugin/test_formatter_csv.rb +111 -0
  314. data/test/plugin/test_formatter_hash.rb +35 -0
  315. data/test/plugin/test_formatter_json.rb +51 -0
  316. data/test/plugin/test_formatter_ltsv.rb +62 -0
  317. data/test/plugin/test_formatter_msgpack.rb +28 -0
  318. data/test/plugin/test_formatter_out_file.rb +95 -0
  319. data/test/plugin/test_formatter_single_value.rb +38 -0
  320. data/test/plugin/test_formatter_tsv.rb +68 -0
  321. data/test/plugin/test_in_debug_agent.rb +24 -1
  322. data/test/plugin/test_in_dummy.rb +111 -18
  323. data/test/plugin/test_in_exec.rb +200 -113
  324. data/test/plugin/test_in_forward.rb +990 -387
  325. data/test/plugin/test_in_gc_stat.rb +10 -8
  326. data/test/plugin/test_in_http.rb +600 -224
  327. data/test/plugin/test_in_monitor_agent.rb +690 -0
  328. data/test/plugin/test_in_object_space.rb +24 -8
  329. data/test/plugin/test_in_syslog.rb +154 -215
  330. data/test/plugin/test_in_tail.rb +1006 -707
  331. data/test/plugin/test_in_tcp.rb +125 -48
  332. data/test/plugin/test_in_udp.rb +204 -63
  333. data/test/plugin/{test_in_stream.rb → test_in_unix.rb} +14 -13
  334. data/test/plugin/test_input.rb +126 -0
  335. data/test/plugin/test_metadata.rb +89 -0
  336. data/test/plugin/test_multi_output.rb +180 -0
  337. data/test/plugin/test_out_copy.rb +117 -112
  338. data/test/plugin/test_out_exec.rb +258 -53
  339. data/test/plugin/test_out_exec_filter.rb +538 -115
  340. data/test/plugin/test_out_file.rb +865 -178
  341. data/test/plugin/test_out_forward.rb +998 -210
  342. data/test/plugin/test_out_null.rb +105 -0
  343. data/test/plugin/test_out_relabel.rb +28 -0
  344. data/test/plugin/test_out_roundrobin.rb +36 -29
  345. data/test/plugin/test_out_secondary_file.rb +458 -0
  346. data/test/plugin/test_out_stdout.rb +135 -37
  347. data/test/plugin/test_out_stream.rb +18 -0
  348. data/test/plugin/test_output.rb +984 -0
  349. data/test/plugin/test_output_as_buffered.rb +2021 -0
  350. data/test/plugin/test_output_as_buffered_backup.rb +312 -0
  351. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  352. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  353. data/test/plugin/test_output_as_buffered_retries.rb +911 -0
  354. data/test/plugin/test_output_as_buffered_secondary.rb +874 -0
  355. data/test/plugin/test_output_as_standard.rb +374 -0
  356. data/test/plugin/test_owned_by.rb +35 -0
  357. data/test/plugin/test_parser.rb +359 -0
  358. data/test/plugin/test_parser_apache.rb +42 -0
  359. data/test/plugin/test_parser_apache2.rb +47 -0
  360. data/test/plugin/test_parser_apache_error.rb +45 -0
  361. data/test/plugin/test_parser_csv.rb +103 -0
  362. data/test/plugin/test_parser_json.rb +138 -0
  363. data/test/plugin/test_parser_labeled_tsv.rb +145 -0
  364. data/test/plugin/test_parser_multiline.rb +100 -0
  365. data/test/plugin/test_parser_nginx.rb +88 -0
  366. data/test/plugin/test_parser_none.rb +52 -0
  367. data/test/plugin/test_parser_regexp.rb +289 -0
  368. data/test/plugin/test_parser_syslog.rb +441 -0
  369. data/test/plugin/test_parser_tsv.rb +122 -0
  370. data/test/plugin/test_storage.rb +167 -0
  371. data/test/plugin/test_storage_local.rb +335 -0
  372. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  373. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  374. data/test/plugin_helper/data/cert/cert.pem +19 -0
  375. data/test/plugin_helper/http_server/test_app.rb +65 -0
  376. data/test/plugin_helper/http_server/test_route.rb +32 -0
  377. data/test/plugin_helper/test_cert_option.rb +16 -0
  378. data/test/plugin_helper/test_child_process.rb +794 -0
  379. data/test/plugin_helper/test_compat_parameters.rb +353 -0
  380. data/test/plugin_helper/test_event_emitter.rb +51 -0
  381. data/test/plugin_helper/test_event_loop.rb +52 -0
  382. data/test/plugin_helper/test_extract.rb +194 -0
  383. data/test/plugin_helper/test_formatter.rb +255 -0
  384. data/test/plugin_helper/test_http_server_helper.rb +205 -0
  385. data/test/plugin_helper/test_inject.rb +519 -0
  386. data/test/plugin_helper/test_parser.rb +264 -0
  387. data/test/plugin_helper/test_record_accessor.rb +197 -0
  388. data/test/plugin_helper/test_retry_state.rb +442 -0
  389. data/test/plugin_helper/test_server.rb +1714 -0
  390. data/test/plugin_helper/test_storage.rb +542 -0
  391. data/test/plugin_helper/test_thread.rb +164 -0
  392. data/test/plugin_helper/test_timer.rb +132 -0
  393. data/test/scripts/exec_script.rb +0 -6
  394. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  395. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  396. data/test/scripts/fluent/plugin/out_test.rb +23 -15
  397. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  398. data/test/test_clock.rb +164 -0
  399. data/test/test_config.rb +16 -7
  400. data/test/test_configdsl.rb +2 -2
  401. data/test/test_event.rb +360 -13
  402. data/test/test_event_router.rb +108 -11
  403. data/test/test_event_time.rb +199 -0
  404. data/test/test_filter.rb +48 -6
  405. data/test/test_formatter.rb +11 -391
  406. data/test/test_input.rb +1 -1
  407. data/test/test_log.rb +591 -31
  408. data/test/test_mixin.rb +1 -1
  409. data/test/test_output.rb +121 -185
  410. data/test/test_plugin.rb +251 -0
  411. data/test/test_plugin_classes.rb +177 -10
  412. data/test/test_plugin_helper.rb +81 -0
  413. data/test/test_plugin_id.rb +101 -0
  414. data/test/test_process.rb +8 -42
  415. data/test/test_root_agent.rb +766 -21
  416. data/test/test_supervisor.rb +481 -0
  417. data/test/test_test_drivers.rb +135 -0
  418. data/test/test_time_formatter.rb +282 -0
  419. data/test/test_time_parser.rb +231 -0
  420. data/test/test_unique_id.rb +47 -0
  421. metadata +454 -60
  422. data/COPYING +0 -14
  423. data/ChangeLog +0 -666
  424. data/lib/fluent/buffer.rb +0 -365
  425. data/lib/fluent/plugin/in_status.rb +0 -76
  426. data/test/plugin/test_in_status.rb +0 -38
  427. data/test/test_buffer.rb +0 -624
  428. data/test/test_parser.rb +0 -1305
data/lib/fluent/time.rb CHANGED
@@ -1 +1,450 @@
1
- # placeholder for v0.14 time module
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 'time'
18
+ require 'msgpack'
19
+ require 'strptime'
20
+ require 'fluent/timezone'
21
+ require 'fluent/configurable'
22
+ require 'fluent/config/error'
23
+
24
+ module Fluent
25
+ class EventTime
26
+ TYPE = 0
27
+ FORMATTER = Strftime.new('%Y-%m-%d %H:%M:%S.%N %z')
28
+
29
+ def initialize(sec, nsec = 0)
30
+ @sec = sec
31
+ @nsec = nsec
32
+ end
33
+
34
+ def ==(other)
35
+ if other.is_a?(Fluent::EventTime)
36
+ @sec == other.sec
37
+ else
38
+ @sec == other
39
+ end
40
+ end
41
+
42
+ def sec
43
+ @sec
44
+ end
45
+
46
+ def nsec
47
+ @nsec
48
+ end
49
+
50
+ def to_int
51
+ @sec
52
+ end
53
+
54
+ def to_f
55
+ @sec + @nsec / 1_000_000_000.0
56
+ end
57
+
58
+ # for Time.at
59
+ def to_r
60
+ Rational(@sec * 1_000_000_000 + @nsec, 1_000_000_000)
61
+ end
62
+
63
+ # for > and others
64
+ def coerce(other)
65
+ [other, @sec]
66
+ end
67
+
68
+ def to_s
69
+ @sec.to_s
70
+ end
71
+
72
+ begin
73
+ # ruby 2.5 or later
74
+ Time.at(0, 0, :nanosecond)
75
+
76
+ def to_time
77
+ Time.at(@sec, @nsec, :nanosecond)
78
+ end
79
+ rescue
80
+ def to_time
81
+ Time.at(@sec, @nsec / 1000.0)
82
+ end
83
+ end
84
+
85
+ def to_json(*args)
86
+ @sec.to_s
87
+ end
88
+
89
+ def to_msgpack(io = nil)
90
+ @sec.to_msgpack(io)
91
+ end
92
+
93
+ def to_msgpack_ext
94
+ [@sec, @nsec].pack('NN')
95
+ end
96
+
97
+ def self.from_msgpack_ext(data)
98
+ new(*data.unpack('NN'))
99
+ end
100
+
101
+ def self.from_time(time)
102
+ Fluent::EventTime.new(time.to_i, time.nsec)
103
+ end
104
+
105
+ def self.eq?(a, b)
106
+ if a.is_a?(Fluent::EventTime) && b.is_a?(Fluent::EventTime)
107
+ a.sec == b.sec && a.nsec == b.nsec
108
+ else
109
+ a == b
110
+ end
111
+ end
112
+
113
+ def self.now
114
+ from_time(Time.now)
115
+ end
116
+
117
+ def self.parse(*args)
118
+ from_time(Time.parse(*args))
119
+ end
120
+
121
+ ## TODO: For performance, implement +, -, and so on
122
+ def method_missing(name, *args, &block)
123
+ @sec.send(name, *args, &block)
124
+ end
125
+
126
+ def inspect
127
+ FORMATTER.exec(Time.at(self))
128
+ end
129
+ end
130
+
131
+ module TimeMixin
132
+ TIME_TYPES = ['string', 'unixtime', 'float']
133
+
134
+ TIME_PARAMETERS = [
135
+ [:time_format, :string, {default: nil}],
136
+ [:localtime, :bool, {default: true}], # UTC if :localtime is false and :timezone is nil
137
+ [:utc, :bool, {default: false}], # to turn :localtime false
138
+ [:timezone, :string, {default: nil}],
139
+ ]
140
+ TIME_FULL_PARAMETERS = [
141
+ # To avoid to define :time_type twice (in plugin_helper/inject)
142
+ [:time_type, :enum, {default: :string, list: TIME_TYPES.map(&:to_sym)}],
143
+ ] + TIME_PARAMETERS
144
+
145
+ module TimeParameters
146
+ include Fluent::Configurable
147
+ TIME_FULL_PARAMETERS.each do |name, type, opts|
148
+ config_param name, type, opts
149
+ end
150
+
151
+ def configure(conf)
152
+ if conf.has_key?('localtime') || conf.has_key?('utc')
153
+ if conf.has_key?('localtime') && conf.has_key?('utc')
154
+ raise Fluent::ConfigError, "both of utc and localtime are specified, use only one of them"
155
+ elsif conf.has_key?('localtime')
156
+ conf['localtime'] = Fluent::Config.bool_value(conf['localtime'])
157
+ elsif conf.has_key?('utc')
158
+ conf['localtime'] = !(Fluent::Config.bool_value(conf['utc']))
159
+ # Specifying "localtime false" means using UTC in TimeFormatter
160
+ # And specifying "utc" is different from specifying "timezone +0000"(it's not always UTC).
161
+ # There are difference between "Z" and "+0000" in timezone formatting.
162
+ # TODO: add kwargs to TimeFormatter to specify "using localtime", "using UTC" or "using specified timezone" in more explicit way
163
+ end
164
+ end
165
+
166
+ super
167
+
168
+ Fluent::Timezone.validate!(@timezone) if @timezone
169
+ end
170
+ end
171
+
172
+ module Parser
173
+ def self.included(mod)
174
+ mod.include TimeParameters
175
+ end
176
+
177
+ def time_parser_create(type: @time_type, format: @time_format, timezone: @timezone, force_localtime: false)
178
+ return NumericTimeParser.new(type) if type != :string
179
+ return TimeParser.new(format, true, nil) if force_localtime
180
+
181
+ localtime = @localtime && (timezone.nil? && !@utc)
182
+ TimeParser.new(format, localtime, timezone)
183
+ end
184
+ end
185
+
186
+ module Formatter
187
+ def self.included(mod)
188
+ mod.include TimeParameters
189
+ end
190
+
191
+ def time_formatter_create(type: @time_type, format: @time_format, timezone: @timezone, force_localtime: false)
192
+ return NumericTimeFormatter.new(type) if type != :string
193
+ return TimeFormatter.new(format, true, nil) if force_localtime
194
+
195
+ localtime = @localtime && (timezone.nil? && !@utc)
196
+ TimeFormatter.new(format, localtime, timezone)
197
+ end
198
+ end
199
+ end
200
+
201
+ class TimeParser
202
+ class TimeParseError < StandardError; end
203
+
204
+ def initialize(format = nil, localtime = true, timezone = nil)
205
+ if format.nil? && (timezone || !localtime)
206
+ raise Fluent::ConfigError, "specifying timezone requires time format"
207
+ end
208
+
209
+ @cache1_key = nil
210
+ @cache1_time = nil
211
+ @cache2_key = nil
212
+ @cache2_time = nil
213
+
214
+ format_with_timezone = format && (format.include?("%z") || format.include?("%Z"))
215
+
216
+ # unixtime_in_expected_tz = unixtime_in_localtime + offset_diff
217
+ offset_diff = case
218
+ when format_with_timezone then nil
219
+ when timezone then
220
+ offset = Fluent::Timezone.utc_offset(timezone)
221
+ if offset.respond_to?(:call)
222
+ ->(t) { Time.now.localtime.utc_offset - offset.call(t) }
223
+ else
224
+ Time.now.localtime.utc_offset - offset
225
+ end
226
+ when localtime then 0
227
+ else Time.now.localtime.utc_offset # utc
228
+ end
229
+
230
+ strptime = format && (Strptime.new(format) rescue nil)
231
+
232
+ @parse = case
233
+ when format_with_timezone && strptime then ->(v){ Fluent::EventTime.from_time(strptime.exec(v)) }
234
+ when format_with_timezone then ->(v){ Fluent::EventTime.from_time(Time.strptime(v, format)) }
235
+ when format == '%iso8601' then ->(v){ Fluent::EventTime.from_time(Time.iso8601(v)) }
236
+ when strptime then
237
+ if offset_diff.respond_to?(:call)
238
+ ->(v) { t = strptime.exec(v); Fluent::EventTime.new(t.to_i + offset_diff.call(t), t.nsec) }
239
+ else
240
+ ->(v) { t = strptime.exec(v); Fluent::EventTime.new(t.to_i + offset_diff, t.nsec) }
241
+ end
242
+ when format then
243
+ if offset_diff.respond_to?(:call)
244
+ ->(v){ t = Time.strptime(v, format); Fluent::EventTime.new(t.to_i + offset_diff.call(t), t.nsec) }
245
+ else
246
+ ->(v){ t = Time.strptime(v, format); Fluent::EventTime.new(t.to_i + offset_diff, t.nsec) }
247
+ end
248
+ else ->(v){ Fluent::EventTime.parse(v) }
249
+ end
250
+ end
251
+
252
+ # TODO: new cache mechanism using format string
253
+ def parse(value)
254
+ unless value.is_a?(String)
255
+ raise TimeParseError, "value must be string: #{value}"
256
+ end
257
+
258
+ if @cache1_key == value
259
+ return @cache1_time
260
+ elsif @cache2_key == value
261
+ return @cache2_time
262
+ else
263
+ begin
264
+ time = @parse.call(value)
265
+ rescue => e
266
+ raise TimeParseError, "invalid time format: value = #{value}, error_class = #{e.class.name}, error = #{e.message}"
267
+ end
268
+ @cache1_key = @cache2_key
269
+ @cache1_time = @cache2_time
270
+ @cache2_key = value
271
+ @cache2_time = time
272
+ return time
273
+ end
274
+ end
275
+ alias :call :parse
276
+ end
277
+
278
+ class NumericTimeParser < TimeParser # to include TimeParseError
279
+ def initialize(type, localtime = nil, timezone = nil)
280
+ @cache1_key = @cache1_time = @cache2_key = @cache2_time = nil
281
+
282
+ if type == :unixtime
283
+ define_singleton_method(:parse, method(:parse_unixtime))
284
+ define_singleton_method(:call, method(:parse_unixtime))
285
+ else # :float
286
+ define_singleton_method(:parse, method(:parse_float))
287
+ define_singleton_method(:call, method(:parse_float))
288
+ end
289
+ end
290
+
291
+ def parse_unixtime(value)
292
+ unless value.is_a?(String) || value.is_a?(Numeric)
293
+ raise TimeParseError, "value must be a string or a number: #{value}(value.class)"
294
+ end
295
+
296
+ if @cache1_key == value
297
+ return @cache1_time
298
+ elsif @cache2_key == value
299
+ return @cache2_time
300
+ end
301
+
302
+ begin
303
+ time = Fluent::EventTime.new(value.to_i)
304
+ rescue => e
305
+ raise TimeParseError, "invalid time format: value = #{value}, error_class = #{e.class.name}, error = #{e.message}"
306
+ end
307
+ @cache1_key = @cache2_key
308
+ @cache1_time = @cache2_time
309
+ @cache2_key = value
310
+ @cache2_time = time
311
+ time
312
+ end
313
+
314
+ # rough benchmark result to compare handmade parser vs Fluent::EventTime.from_time(Time.at(value.to_r))
315
+ # full: with 9-digits of nsec after dot
316
+ # msec: with 3-digits of msec after dot
317
+ # 10_000_000 times loop on MacBookAir
318
+ ## parse_by_myself(full): 12.162475 sec
319
+ ## parse_by_myself(msec): 15.050435 sec
320
+ ## parse_by_to_r (full): 28.722362 sec
321
+ ## parse_by_to_r (msec): 28.232856 sec
322
+ def parse_float(value)
323
+ unless value.is_a?(String) || value.is_a?(Numeric)
324
+ raise TimeParseError, "value must be a string or a number: #{value}(value.class)"
325
+ end
326
+
327
+ if @cache1_key == value
328
+ return @cache1_time
329
+ elsif @cache2_key == value
330
+ return @cache2_time
331
+ end
332
+
333
+ begin
334
+ sec_s, nsec_s, _ = value.to_s.split('.', 3) # throw away second-dot and later
335
+ nsec_s = nsec_s && nsec_s[0..9] || '0'
336
+ nsec_s += '0' * (9 - nsec_s.size) if nsec_s.size < 9
337
+ time = Fluent::EventTime.new(sec_s.to_i, nsec_s.to_i)
338
+ rescue => e
339
+ raise TimeParseError, "invalid time format: value = #{value}, error_class = #{e.class.name}, error = #{e.message}"
340
+ end
341
+ @cache1_key = @cache2_key
342
+ @cache1_time = @cache2_time
343
+ @cache2_key = value
344
+ @cache2_time = time
345
+ time
346
+ end
347
+ end
348
+
349
+ class TimeFormatter
350
+ def initialize(format = nil, localtime = true, timezone = nil)
351
+ @tc1 = 0
352
+ @tc1_str = nil
353
+ @tc2 = 0
354
+ @tc2_str = nil
355
+
356
+ strftime = format && (Strftime.new(format) rescue nil)
357
+ if format && format =~ /(^|[^%])(%%)*%L|(^|[^%])(%%)*%\d*N/
358
+ define_singleton_method(:format, method(:format_with_subsec))
359
+ define_singleton_method(:call, method(:format_with_subsec))
360
+ else
361
+ define_singleton_method(:format, method(:format_without_subsec))
362
+ define_singleton_method(:call, method(:format_without_subsec))
363
+ end
364
+
365
+ formatter = Fluent::Timezone.formatter(timezone, strftime ? strftime : format)
366
+ @format_nocache = case
367
+ when formatter then formatter
368
+ when strftime && localtime then ->(time){ strftime.exec(Time.at(time)) }
369
+ when format && localtime then ->(time){ Time.at(time).strftime(format) }
370
+ when strftime then ->(time){ strftime.exec(Time.at(time).utc) }
371
+ when format then ->(time){ Time.at(time).utc.strftime(format) }
372
+ when localtime then ->(time){ Time.at(time).iso8601 }
373
+ else ->(time){ Time.at(time).utc.iso8601 }
374
+ end
375
+ end
376
+
377
+ def format_without_subsec(time)
378
+ if @tc1 == time
379
+ return @tc1_str
380
+ elsif @tc2 == time
381
+ return @tc2_str
382
+ else
383
+ str = format_nocache(time)
384
+ if @tc1 < @tc2
385
+ @tc1 = time
386
+ @tc1_str = str
387
+ else
388
+ @tc2 = time
389
+ @tc2_str = str
390
+ end
391
+ return str
392
+ end
393
+ end
394
+
395
+ def format_with_subsec(time)
396
+ if Fluent::EventTime.eq?(@tc1, time)
397
+ return @tc1_str
398
+ elsif Fluent::EventTime.eq?(@tc2, time)
399
+ return @tc2_str
400
+ else
401
+ str = format_nocache(time)
402
+ if @tc1 < @tc2
403
+ @tc1 = time
404
+ @tc1_str = str
405
+ else
406
+ @tc2 = time
407
+ @tc2_str = str
408
+ end
409
+ return str
410
+ end
411
+ end
412
+
413
+ ## Dynamically defined in #initialize
414
+ # def format(time)
415
+ # end
416
+
417
+ def format_nocache(time)
418
+ @format_nocache.call(time)
419
+ end
420
+ end
421
+
422
+ class NumericTimeFormatter < TimeFormatter
423
+ def initialize(type, localtime = nil, timezone = nil)
424
+ @cache1_key = @cache1_time = @cache2_key = @cache2_time = nil
425
+
426
+ if type == :unixtime
427
+ define_singleton_method(:format, method(:format_unixtime))
428
+ define_singleton_method(:call, method(:format_unixtime))
429
+ else # :float
430
+ define_singleton_method(:format, method(:format_float))
431
+ define_singleton_method(:call, method(:format_float))
432
+ end
433
+ end
434
+
435
+ def format_unixtime(time)
436
+ time.to_i.to_s
437
+ end
438
+
439
+ def format_float(time)
440
+ if time.is_a?(Fluent::EventTime) || time.is_a?(Time)
441
+ # 10.015 secs for 10_000_000 times call on MacBookAir
442
+ nsec_s = time.nsec.to_s
443
+ nsec_s = '0' * (9 - nsec_s.size) if nsec_s.size < 9
444
+ "#{time.sec}.#{nsec_s}"
445
+ else # integer (or float?)
446
+ time.to_f.to_s
447
+ end
448
+ end
449
+ end
450
+ end
@@ -88,7 +88,7 @@ module Fluent
88
88
  #
89
89
  # An Proc object is returned. If the given timezone is invalid,
90
90
  # nil is returned.
91
- def self.formatter(timezone, format = nil)
91
+ def self.formatter(timezone = nil, format = nil)
92
92
  if timezone.nil?
93
93
  return nil
94
94
  end
@@ -97,10 +97,15 @@ module Fluent
97
97
  if NUMERIC_PATTERN === timezone
98
98
  offset = Time.zone_offset(timezone)
99
99
 
100
- if format
100
+ case
101
+ when format.is_a?(String)
101
102
  return Proc.new {|time|
102
103
  Time.at(time).localtime(offset).strftime(format)
103
104
  }
105
+ when format.is_a?(Strftime)
106
+ return Proc.new {|time|
107
+ format.exec(Time.at(time).localtime(offset))
108
+ }
104
109
  else
105
110
  return Proc.new {|time|
106
111
  Time.at(time).localtime(offset).iso8601
@@ -116,10 +121,15 @@ module Fluent
116
121
  return nil
117
122
  end
118
123
 
119
- if format
124
+ case
125
+ when format.is_a?(String)
120
126
  return Proc.new {|time|
121
127
  Time.at(time).localtime(tz.period_for_utc(time).utc_total_offset).strftime(format)
122
128
  }
129
+ when format.is_a?(Strftime)
130
+ return Proc.new {|time|
131
+ format.exec(Time.at(time).localtime(tz.period_for_utc(time).utc_total_offset))
132
+ }
123
133
  else
124
134
  return Proc.new {|time|
125
135
  Time.at(time).localtime(tz.period_for_utc(time).utc_total_offset).iso8601
@@ -129,5 +139,19 @@ module Fluent
129
139
 
130
140
  return nil
131
141
  end
142
+
143
+ def self.utc_offset(timezone)
144
+ return 0 if timezone.nil?
145
+
146
+ case timezone
147
+ when NUMERIC_PATTERN
148
+ Time.zone_offset(timezone)
149
+ when NAME_PATTERN
150
+ tz = TZInfo::Timezone.get(timezone)
151
+ ->(time) {
152
+ tz.period_for_utc(time).utc_total_offset
153
+ }
154
+ end
155
+ end
132
156
  end
133
157
  end
@@ -15,34 +15,25 @@
15
15
  #
16
16
 
17
17
  module Fluent
18
- class StatusClass
19
- def initialize
20
- @entries = {}
21
- @mutex = Mutex.new
18
+ module UniqueId
19
+ def self.generate
20
+ now = Time.now.utc
21
+ u1 = ((now.to_i * 1000 * 1000 + now.usec) << 12 | rand(0xfff))
22
+ [u1 >> 32, u1 & 0xffffffff, rand(0xffffffff), rand(0xffffffff)].pack('NNNN')
22
23
  end
23
24
 
24
- def register(instance, name, &block)
25
- @mutex.synchronize {
26
- (@entries[instance.object_id] ||= {})[name] = block
27
- }
28
- nil
25
+ def self.hex(unique_id)
26
+ unique_id.unpack('H*').first
29
27
  end
30
28
 
31
- def each(&block)
32
- @mutex.synchronize {
33
- @entries.each {|obj_id,hash|
34
- record = {}
35
- hash.each_pair {|name,block|
36
- record[name] = block.call
37
- }
38
- block.call(record)
39
- }
40
- }
29
+ module Mixin
30
+ def generate_unique_id
31
+ Fluent::UniqueId.generate
32
+ end
33
+
34
+ def dump_unique_id_hex(unique_id)
35
+ Fluent::UniqueId.hex(unique_id)
36
+ end
41
37
  end
42
38
  end
43
-
44
- # Don't use this class from plugins.
45
- # The interface may be changed
46
- Status = StatusClass.new
47
39
  end
48
-
@@ -16,6 +16,6 @@
16
16
 
17
17
  module Fluent
18
18
 
19
- VERSION = '0.12.40'
19
+ VERSION = '1.6.2'
20
20
 
21
21
  end
@@ -0,0 +1,85 @@
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
+ begin
18
+
19
+ require 'optparse'
20
+ require 'windows/debug'
21
+ require 'Windows/Library'
22
+ require 'win32/daemon'
23
+ require 'win32/event'
24
+
25
+ include Win32
26
+ include Windows::Library
27
+ include Windows::Debug
28
+
29
+ op = OptionParser.new
30
+ opts = {service_name: nil}
31
+ op.on('--service-name NAME', "The name of the Windows Service") {|name|
32
+ opts[:service_name] = name
33
+ }
34
+ op.parse(ARGV)
35
+ if opts[:service_name] == nil
36
+ raise "Error: No Windows Service name set. Use '--service-name'"
37
+ end
38
+
39
+ def read_fluentdopt(service_name)
40
+ require 'win32/Registry'
41
+ Win32::Registry::HKEY_LOCAL_MACHINE.open("SYSTEM\\CurrentControlSet\\Services\\#{service_name}") do |reg|
42
+ reg.read("fluentdopt")[1] rescue ""
43
+ end
44
+ end
45
+
46
+ def service_main_start(service_name)
47
+ ruby_path = 0.chr * 260
48
+ GetModuleFileName.call(0, ruby_path,260)
49
+ ruby_path = ruby_path.rstrip.gsub(/\\/, '/')
50
+ rubybin_dir = ruby_path[0, ruby_path.rindex("/")]
51
+ opt = read_fluentdopt(service_name)
52
+ Process.spawn("\"#{rubybin_dir}/ruby.exe\" \"#{rubybin_dir}/fluentd\" #{opt} -x #{service_name}")
53
+ end
54
+
55
+ class FluentdService < Daemon
56
+ @pid = 0
57
+ @service_name = ''
58
+
59
+ def initialize(service_name)
60
+ @service_name = service_name
61
+ end
62
+
63
+ def service_main
64
+
65
+ @pid = service_main_start(@service_name)
66
+ while running?
67
+ sleep 10
68
+ end
69
+ end
70
+
71
+ def service_stop
72
+ ev = Win32::Event.open(@service_name)
73
+ ev.set
74
+ ev.close
75
+ if @pid > 0
76
+ Process.waitpid(@pid)
77
+ end
78
+ end
79
+ end
80
+
81
+ FluentdService.new(opts[:service_name]).mainloop
82
+
83
+ rescue Exception => err
84
+ raise
85
+ end
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,43 @@
1
+ # <%= gem_name %>
2
+
3
+ [Fluentd](https://fluentd.org/) <%= type %> plugin to do something.
4
+
5
+ TODO: write description for you plugin.
6
+
7
+ ## Installation
8
+
9
+ ### RubyGems
10
+
11
+ ```
12
+ $ gem install <%= gem_name %>
13
+ ```
14
+
15
+ ### Bundler
16
+
17
+ Add following line to your Gemfile:
18
+
19
+ ```ruby
20
+ gem "<%= gem_name %>"
21
+ ```
22
+
23
+ And then execute:
24
+
25
+ ```
26
+ $ bundle
27
+ ```
28
+
29
+ ## Configuration
30
+
31
+ You can generate configuration template:
32
+
33
+ ```
34
+ $ fluent-plugin-config-format <%= type %> <%= name %>
35
+ ```
36
+
37
+ You can copy and paste generated documents here.
38
+
39
+ ## Copyright
40
+
41
+ * Copyright(c) <%= Date.today.year %>- <%= user_name %>
42
+ * License
43
+ * <%= @license.full_name %>