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
@@ -14,78 +14,389 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- require 'etc'
18
- require 'fcntl'
19
-
20
- begin
21
- require 'sigdump/setup'
22
- rescue Exception
23
- # ignore LoadError and others (related with signals): it may raise these errors in Windows
24
- end
17
+ require 'fileutils'
25
18
 
26
19
  require 'fluent/config'
20
+ require 'fluent/counter'
27
21
  require 'fluent/env'
28
22
  require 'fluent/engine'
23
+ require 'fluent/error'
29
24
  require 'fluent/log'
30
25
  require 'fluent/plugin'
31
26
  require 'fluent/rpc'
32
27
  require 'fluent/system_config'
28
+ require 'serverengine'
29
+
30
+ if Fluent.windows?
31
+ require 'windows/library'
32
+ require 'windows/synchronize'
33
+ require 'windows/system_info'
34
+ include Windows::Library
35
+ include Windows::Synchronize
36
+ include Windows::SystemInfo
37
+ require 'win32/ipc'
38
+ require 'win32/event'
39
+ end
33
40
 
34
41
  module Fluent
35
- class Supervisor
36
- def self.get_etc_passwd(user)
37
- if user.to_i.to_s == user
38
- Etc.getpwuid(user.to_i)
39
- else
40
- Etc.getpwnam(user)
42
+ module ServerModule
43
+ def before_run
44
+ @start_time = Time.now
45
+ @rpc_server = nil
46
+ @counter = nil
47
+
48
+ if config[:rpc_endpoint]
49
+ @rpc_endpoint = config[:rpc_endpoint]
50
+ @enable_get_dump = config[:enable_get_dump]
51
+ run_rpc_server
41
52
  end
53
+ install_supervisor_signal_handlers
54
+
55
+ if config[:signame]
56
+ @signame = config[:signame]
57
+ install_windows_event_handler
58
+ end
59
+
60
+ if counter = config[:counter_server]
61
+ run_counter_server(counter)
62
+ end
63
+
64
+ socket_manager_path = ServerEngine::SocketManager::Server.generate_path
65
+ ServerEngine::SocketManager::Server.open(socket_manager_path)
66
+ ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = socket_manager_path.to_s
42
67
  end
43
68
 
44
- def self.get_etc_group(group)
45
- if group.to_i.to_s == group
46
- Etc.getgrgid(group.to_i)
47
- else
48
- Etc.getgrnam(group)
69
+ def after_run
70
+ stop_rpc_server if @rpc_endpoint
71
+ stop_counter_server if @counter
72
+ Fluent::Supervisor.cleanup_resources
73
+ end
74
+
75
+ def run_rpc_server
76
+ @rpc_server = RPC::Server.new(@rpc_endpoint, $log)
77
+
78
+ # built-in RPC for signals
79
+ @rpc_server.mount_proc('/api/processes.interruptWorkers') { |req, res|
80
+ $log.debug "fluentd RPC got /api/processes.interruptWorkers request"
81
+ Process.kill :INT, $$
82
+ nil
83
+ }
84
+ @rpc_server.mount_proc('/api/processes.killWorkers') { |req, res|
85
+ $log.debug "fluentd RPC got /api/processes.killWorkers request"
86
+ Process.kill :TERM, $$
87
+ nil
88
+ }
89
+ @rpc_server.mount_proc('/api/processes.flushBuffersAndKillWorkers') { |req, res|
90
+ $log.debug "fluentd RPC got /api/processes.flushBuffersAndKillWorkers request"
91
+ if Fluent.windows?
92
+ $log.warn "operation 'flushBuffersAndKillWorkers' is not supported on Windows now."
93
+ else
94
+ Process.kill :USR1, $$
95
+ Process.kill :TERM, $$
96
+ end
97
+ nil
98
+ }
99
+ @rpc_server.mount_proc('/api/plugins.flushBuffers') { |req, res|
100
+ $log.debug "fluentd RPC got /api/plugins.flushBuffers request"
101
+ unless Fluent.windows?
102
+ Process.kill :USR1, $$
103
+ end
104
+ nil
105
+ }
106
+ @rpc_server.mount_proc('/api/config.reload') { |req, res|
107
+ $log.debug "fluentd RPC got /api/config.reload request"
108
+ if Fluent.windows?
109
+ # restart worker with auto restarting by killing
110
+ kill_worker
111
+ else
112
+ Process.kill :HUP, $$
113
+ end
114
+ nil
115
+ }
116
+ @rpc_server.mount_proc('/api/config.dump') { |req, res|
117
+ $log.debug "fluentd RPC got /api/config.dump request"
118
+ $log.info "dump in-memory config"
119
+ supervisor_dump_config_handler
120
+ nil
121
+ }
122
+
123
+ @rpc_server.mount_proc('/api/config.getDump') { |req, res|
124
+ $log.debug "fluentd RPC got /api/config.dump request"
125
+ $log.info "get dump in-memory config via HTTP"
126
+ res.body = supervisor_get_dump_config_handler
127
+ [nil, nil, res]
128
+ } if @enable_get_dump
129
+
130
+ @rpc_server.start
131
+ end
132
+
133
+ def stop_rpc_server
134
+ @rpc_server.shutdown
135
+ end
136
+
137
+ def run_counter_server(counter_conf)
138
+ @counter = Fluent::Counter::Server.new(
139
+ counter_conf.scope,
140
+ {host: counter_conf.bind, port: counter_conf.port, log: $log, path: counter_conf.backup_path}
141
+ )
142
+ @counter.start
143
+ end
144
+
145
+ def stop_counter_server
146
+ @counter.stop
147
+ end
148
+
149
+ def install_supervisor_signal_handlers
150
+ trap :HUP do
151
+ $log.debug "fluentd supervisor process get SIGHUP"
152
+ supervisor_sighup_handler
153
+ end unless Fluent.windows?
154
+
155
+ trap :USR1 do
156
+ $log.debug "fluentd supervisor process get SIGUSR1"
157
+ supervisor_sigusr1_handler
158
+ end unless Fluent.windows?
159
+ end
160
+
161
+ def install_windows_event_handler
162
+ Thread.new do
163
+ ev = Win32::Event.new(@signame)
164
+ begin
165
+ ev.reset
166
+ until WaitForSingleObject(ev.handle, 0) == WAIT_OBJECT_0
167
+ sleep 1
168
+ end
169
+ kill_worker
170
+ stop(true)
171
+ ensure
172
+ ev.close
173
+ end
49
174
  end
50
175
  end
51
176
 
177
+ def supervisor_sighup_handler
178
+ kill_worker
179
+ end
180
+
181
+ def supervisor_sigusr1_handler
182
+ if log = config[:logger_initializer]
183
+ # Creating new thread due to mutex can't lock
184
+ # in main thread during trap context
185
+ Thread.new {
186
+ log.reopen!
187
+ }.run
188
+ end
189
+
190
+ if config[:worker_pid]
191
+ config[:worker_pid].each_value do |pid|
192
+ Process.kill(:USR1, pid)
193
+ # don't rescue Errno::ESRCH here (invalid status)
194
+ end
195
+ end
196
+ end
197
+
198
+ def kill_worker
199
+ if config[:worker_pid]
200
+ pids = config[:worker_pid].clone
201
+ config[:worker_pid].clear
202
+ pids.each_value do |pid|
203
+ if Fluent.windows?
204
+ Process.kill :KILL, pid
205
+ else
206
+ Process.kill :TERM, pid
207
+ end
208
+ end
209
+ end
210
+ end
211
+
212
+ def supervisor_dump_config_handler
213
+ $log.info config[:fluentd_conf].to_s
214
+ end
215
+
216
+ def supervisor_get_dump_config_handler
217
+ {conf: config[:fluentd_conf].to_s}
218
+ end
219
+ end
220
+
221
+ module WorkerModule
222
+ def spawn(process_manager)
223
+ main_cmd = config[:main_cmd]
224
+ env = {
225
+ 'SERVERENGINE_WORKER_ID' => @worker_id.to_i.to_s,
226
+ }
227
+ @pm = process_manager.spawn(env, *main_cmd)
228
+ end
229
+
230
+ def after_start
231
+ (config[:worker_pid] ||= {})[@worker_id] = @pm.pid
232
+ end
233
+ end
234
+
235
+ class Supervisor
236
+ def self.load_config(path, params = {})
237
+
238
+ pre_loadtime = 0
239
+ pre_loadtime = params['pre_loadtime'].to_i if params['pre_loadtime']
240
+ pre_config_mtime = nil
241
+ pre_config_mtime = params['pre_config_mtime'] if params['pre_config_mtime']
242
+ config_mtime = File.mtime(path)
243
+
244
+ # reuse previous config if last load time is within 5 seconds and mtime of the config file is not changed
245
+ if Time.now - Time.at(pre_loadtime) < 5 and config_mtime == pre_config_mtime
246
+ return params['pre_conf']
247
+ end
248
+
249
+ config_fname = File.basename(path)
250
+ config_basedir = File.dirname(path)
251
+ # Assume fluent.conf encoding is UTF-8
252
+ config_data = File.open(path, "r:#{params['conf_encoding']}:utf-8") {|f| f.read }
253
+ inline_config = params['inline_config']
254
+ if inline_config == '-'
255
+ config_data << "\n" << STDIN.read
256
+ elsif inline_config
257
+ config_data << "\n" << inline_config.gsub("\\n","\n")
258
+ end
259
+ fluentd_conf = Fluent::Config.parse(config_data, config_fname, config_basedir, params['use_v1_config'])
260
+ system_config = SystemConfig.create(fluentd_conf)
261
+
262
+ # these params must NOT be configured via system config here.
263
+ # these may be overridden by command line params.
264
+ workers = params['workers']
265
+ root_dir = params['root_dir']
266
+ log_level = params['log_level']
267
+ suppress_repeated_stacktrace = params['suppress_repeated_stacktrace']
268
+
269
+ log_path = params['log_path']
270
+ chuser = params['chuser']
271
+ chgroup = params['chgroup']
272
+ log_rotate_age = params['log_rotate_age']
273
+ log_rotate_size = params['log_rotate_size']
274
+ rpc_endpoint = system_config.rpc_endpoint
275
+ enable_get_dump = system_config.enable_get_dump
276
+ counter_server = system_config.counter_server
277
+
278
+ log_opts = {suppress_repeated_stacktrace: suppress_repeated_stacktrace}
279
+ logger_initializer = Supervisor::LoggerInitializer.new(
280
+ log_path, log_level, chuser, chgroup, log_opts,
281
+ log_rotate_age: log_rotate_age,
282
+ log_rotate_size: log_rotate_size
283
+ )
284
+ # this #init sets initialized logger to $log
285
+ logger_initializer.init(:supervisor, 0)
286
+ logger = $log
287
+
288
+ command_sender = Fluent.windows? ? "pipe" : "signal"
289
+
290
+ # ServerEngine's "daemonize" option is boolean, and path of pid file is brought by "pid_path"
291
+ pid_path = params['daemonize']
292
+ daemonize = !!params['daemonize']
293
+ main_cmd = params['main_cmd']
294
+ signame = params['signame']
295
+
296
+ se_config = {
297
+ worker_type: 'spawn',
298
+ workers: workers,
299
+ log_stdin: false,
300
+ log_stdout: false,
301
+ log_stderr: false,
302
+ enable_heartbeat: true,
303
+ auto_heartbeat: false,
304
+ unrecoverable_exit_codes: [2],
305
+ stop_immediately_at_unrecoverable_exit: true,
306
+ root_dir: root_dir,
307
+ logger: logger,
308
+ log: logger.out,
309
+ log_path: log_path,
310
+ log_level: log_level,
311
+ logger_initializer: logger_initializer,
312
+ chuser: chuser,
313
+ chgroup: chgroup,
314
+ chumask: 0,
315
+ suppress_repeated_stacktrace: suppress_repeated_stacktrace,
316
+ daemonize: daemonize,
317
+ rpc_endpoint: rpc_endpoint,
318
+ counter_server: counter_server,
319
+ enable_get_dump: enable_get_dump,
320
+ windows_daemon_cmdline: [ServerEngine.ruby_bin_path,
321
+ File.join(File.dirname(__FILE__), 'daemon.rb'),
322
+ ServerModule.name,
323
+ WorkerModule.name,
324
+ path,
325
+ JSON.dump(params)],
326
+ command_sender: command_sender,
327
+ fluentd_conf: fluentd_conf,
328
+ main_cmd: main_cmd,
329
+ signame: signame,
330
+ }
331
+ if daemonize
332
+ se_config[:pid_path] = pid_path
333
+ end
334
+ pre_params = params.dup
335
+ params['pre_loadtime'] = Time.now.to_i
336
+ params['pre_config_mtime'] = config_mtime
337
+ params['pre_conf'] = se_config
338
+ # prevent pre_conf from being too big by reloading many times.
339
+ pre_params['pre_conf'] = nil
340
+ params['pre_conf'][:windows_daemon_cmdline][5] = JSON.dump(pre_params)
341
+
342
+ return se_config
343
+ end
344
+
52
345
  class LoggerInitializer
53
- def initialize(path, level, chuser, chgroup, opts)
346
+ def initialize(path, level, chuser, chgroup, opts, log_rotate_age: nil, log_rotate_size: nil)
54
347
  @path = path
55
348
  @level = level
56
349
  @chuser = chuser
57
350
  @chgroup = chgroup
58
351
  @opts = opts
352
+ @log_rotate_age = log_rotate_age
353
+ @log_rotate_size = log_rotate_size
59
354
  end
60
355
 
61
- def init
356
+ def init(process_type, worker_id)
357
+ @opts[:process_type] = process_type
358
+ @opts[:worker_id] = worker_id
359
+
62
360
  if @path && @path != "-"
63
- @io = File.open(@path, "a")
361
+ @logdev = if @log_rotate_age || @log_rotate_size
362
+ Fluent::LogDeviceIO.new(@path, shift_age: @log_rotate_age, shift_size: @log_rotate_size)
363
+ else
364
+ File.open(@path, "a")
365
+ end
64
366
  if @chuser || @chgroup
65
- chuid = @chuser ? Supervisor.get_etc_passwd(@chuser).uid : nil
66
- chgid = @chgroup ? Supervisor.get_etc_group(@chgroup).gid : nil
367
+ chuid = @chuser ? ServerEngine::Privilege.get_etc_passwd(@chuser).uid : nil
368
+ chgid = @chgroup ? ServerEngine::Privilege.get_etc_group(@chgroup).gid : nil
67
369
  File.chown(chuid, chgid, @path)
68
370
  end
69
371
  else
70
- @io = STDOUT
372
+ @logdev = STDOUT
71
373
  end
72
374
 
73
- $log = Fluent::Log.new(@io, @level, @opts)
375
+ dl_opts = {}
376
+ # subtract 1 to match serverengine daemon logger side logging severity.
377
+ dl_opts[:log_level] = @level - 1
378
+ logger = ServerEngine::DaemonLogger.new(@logdev, dl_opts)
379
+ $log = Fluent::Log.new(logger, @opts)
74
380
  $log.enable_color(false) if @path
75
381
  $log.enable_debug if @level <= Fluent::Log::LEVEL_DEBUG
76
382
  end
77
383
 
78
384
  def stdout?
79
- @io == STDOUT
385
+ @logdev == STDOUT
80
386
  end
81
387
 
82
388
  def reopen!
83
389
  if @path && @path != "-"
84
- @io.reopen(@path, "a")
390
+ @logdev.reopen(@path, "a")
85
391
  end
86
392
  self
87
393
  end
88
394
 
395
+ def apply_options(opts)
396
+ $log.format = opts[:format] if opts[:format]
397
+ $log.time_format = opts[:time_format] if opts[:time_format]
398
+ end
399
+
89
400
  def level=(level)
90
401
  @level = level
91
402
  $log.level = level
@@ -103,20 +414,34 @@ module Fluent
103
414
  setup_path: nil,
104
415
  chuser: nil,
105
416
  chgroup: nil,
417
+ root_dir: nil,
106
418
  suppress_interval: 0,
107
419
  suppress_repeated_stacktrace: true,
108
- without_source: false,
420
+ without_source: nil,
109
421
  use_v1_config: true,
110
422
  supervise: true,
423
+ standalone_worker: false,
424
+ signame: nil,
425
+ conf_encoding: 'utf-8'
111
426
  }
112
427
  end
113
428
 
429
+ def self.cleanup_resources
430
+ unless Fluent.windows?
431
+ if ENV.has_key?('SERVERENGINE_SOCKETMANAGER_PATH')
432
+ FileUtils.rm_f(ENV['SERVERENGINE_SOCKETMANAGER_PATH'])
433
+ end
434
+ end
435
+ end
436
+
114
437
  def initialize(opt)
115
438
  @daemonize = opt[:daemonize]
116
439
  @supervise = opt[:supervise]
440
+ @standalone_worker= opt[:standalone_worker]
117
441
  @config_path = opt[:config_path]
118
442
  @inline_config = opt[:inline_config]
119
443
  @use_v1_config = opt[:use_v1_config]
444
+ @conf_encoding = opt[:conf_encoding]
120
445
  @log_path = opt[:log_path]
121
446
  @dry_run = opt[:dry_run]
122
447
  @show_plugin_config = opt[:show_plugin_config]
@@ -127,57 +452,56 @@ module Fluent
127
452
  @rpc_server = nil
128
453
  @process_name = nil
129
454
 
455
+ @workers = opt[:workers]
456
+ @root_dir = opt[:root_dir]
130
457
  @log_level = opt[:log_level]
458
+ @log_rotate_age = opt[:log_rotate_age]
459
+ @log_rotate_size = opt[:log_rotate_size]
131
460
  @suppress_interval = opt[:suppress_interval]
132
461
  @suppress_config_dump = opt[:suppress_config_dump]
462
+ @log_event_verbose = opt[:log_event_verbose]
133
463
  @without_source = opt[:without_source]
134
-
135
- log_opts = {suppress_repeated_stacktrace: opt[:suppress_repeated_stacktrace]}
136
- @log = LoggerInitializer.new(@log_path, @log_level, @chuser, @chgroup, log_opts)
464
+ @signame = opt[:signame]
465
+
466
+ @suppress_repeated_stacktrace = opt[:suppress_repeated_stacktrace]
467
+ log_opts = {suppress_repeated_stacktrace: @suppress_repeated_stacktrace}
468
+ @log = LoggerInitializer.new(
469
+ @log_path, @log_level, @chuser, @chgroup, log_opts,
470
+ log_rotate_age: @log_rotate_age,
471
+ log_rotate_size: @log_rotate_size
472
+ )
137
473
  @finished = false
138
- @main_pid = nil
139
474
  end
140
475
 
141
- def start
142
- @log.init
476
+ def run_supervisor
477
+ @log.init(:supervisor, 0)
143
478
  show_plugin_config if @show_plugin_config
144
479
  read_config
145
480
  set_system_config
481
+ @log.apply_options(format: @system_config.log.format, time_format: @system_config.log.time_format)
482
+
483
+ $log.info :supervisor, "parsing config file is succeeded", path: @config_path
146
484
 
147
- dry_run if @dry_run
148
- start_daemonize if @daemonize
149
- setup_rpc_server if @rpc_endpoint
150
- setup_rpc_get_dump if @enable_get_dump
151
-
152
- if @supervise
153
- install_supervisor_signal_handlers
154
- run_rpc_server if @rpc_endpoint
155
- until @finished
156
- supervise do
157
- change_privilege
158
- init_engine
159
- install_main_process_signal_handlers
160
- run_configure
161
- finish_daemonize if @daemonize
162
- run_engine
163
- exit 0
485
+ if @workers < 1
486
+ raise Fluent::ConfigError, "invalid number of workers (must be > 0):#{@workers}"
487
+ end
488
+
489
+ if @root_dir
490
+ if File.exist?(@root_dir)
491
+ unless Dir.exist?(@root_dir)
492
+ raise Fluent::InvalidRootDirectory, "non directory entry exists:#{@root_dir}"
493
+ end
494
+ else
495
+ begin
496
+ FileUtils.mkdir_p(@root_dir)
497
+ rescue => e
498
+ raise Fluent::InvalidRootDirectory, "failed to create root directory:#{@root_dir}, #{e.inspect}"
164
499
  end
165
- $log.error "fluentd main process died unexpectedly. restarting." unless @finished
166
- end
167
- else
168
- $log.info "starting fluentd-#{Fluent::VERSION} without supervision"
169
- run_rpc_server if @rpc_endpoint
170
- main_process do
171
- change_privilege
172
- init_engine
173
- install_main_process_signal_handlers
174
- run_configure
175
- finish_daemonize if @daemonize
176
- run_engine
177
- exit 0
178
500
  end
179
501
  end
180
- stop_rpc_server if @rpc_endpoint
502
+
503
+ dry_run_cmd if @dry_run
504
+ supervise
181
505
  end
182
506
 
183
507
  def options
@@ -185,293 +509,264 @@ module Fluent
185
509
  'config_path' => @config_path,
186
510
  'pid_file' => @daemonize,
187
511
  'plugin_dirs' => @plugin_dirs,
188
- 'log_path' => @log_path
512
+ 'log_path' => @log_path,
513
+ 'root_dir' => @root_dir,
189
514
  }
190
515
  end
191
516
 
192
- private
193
-
194
- def dry_run
195
- $log.info "starting fluentd-#{Fluent::VERSION} as dry run mode"
196
-
197
- change_privilege
198
- init_engine
199
- install_main_process_signal_handlers
200
- run_configure
201
- exit 0
202
- rescue => e
203
- $log.error "dry run failed: #{e}"
204
- exit 1
205
- end
206
-
207
- def show_plugin_config
208
- $log.info "Show config for #{@show_plugin_config}"
209
- name, type = @show_plugin_config.split(":")
210
- plugin = Plugin.__send__("new_#{name}", type)
211
- dumped_config = "\n"
212
- level = 0
213
- plugin.class.ancestors.reverse_each do |plugin_class|
214
- if plugin_class.respond_to?(:dump)
215
- $log.on_debug do
216
- dumped_config << plugin_class.name
217
- dumped_config << "\n"
218
- level = 1
219
- end
220
- dumped_config << plugin_class.dump(level)
221
- end
222
- end
223
- $log.info dumped_config
224
- exit 0
225
- rescue => e
226
- $log.error "show config failed: #{e}"
227
- exit 1
228
- end
229
-
230
- def start_daemonize
231
- @wait_daemonize_pipe_r, @wait_daemonize_pipe_w = IO.pipe
232
-
233
- if fork
234
- # console process
235
- @wait_daemonize_pipe_w.close
236
- @wait_daemonize_pipe_w = nil
237
- wait_daemonize
238
- exit 0
517
+ def run_worker
518
+ begin
519
+ require 'sigdump/setup'
520
+ rescue Exception
521
+ # ignore LoadError and others (related with signals): it may raise these errors in Windows
239
522
  end
523
+ worker_id = ENV['SERVERENGINE_WORKER_ID'].to_i
524
+ process_type = case
525
+ when @standalone_worker then :standalone
526
+ when worker_id == 0 then :worker0
527
+ else :workers
528
+ end
529
+ @log.init(process_type, worker_id)
530
+ show_plugin_config if @show_plugin_config
531
+ read_config
532
+ set_system_config
533
+ @log.apply_options(format: @system_config.log.format, time_format: @system_config.log.time_format)
240
534
 
241
- # daemonize intermediate process
242
- @wait_daemonize_pipe_r.close
243
- @wait_daemonize_pipe_r = nil
244
-
245
- # in case the child process forked during run_configure
246
- @wait_daemonize_pipe_w.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
247
-
248
- Process.setsid
249
- exit!(0) if fork
250
- File.umask(0)
251
-
252
- # supervisor process
253
- @supervisor_pid = Process.pid
254
- end
535
+ Process.setproctitle("worker:#{@process_name}") if @process_name
255
536
 
256
- def wait_daemonize
257
- supervisor_pid = @wait_daemonize_pipe_r.read
258
- if supervisor_pid.empty?
259
- # initialization failed
260
- exit! 1
537
+ if @standalone_worker && @workers != 1
538
+ raise Fluent::ConfigError, "invalid number of workers (must be 1 or unspecified) with --no-supervisor: #{@workers}"
261
539
  end
262
540
 
263
- @wait_daemonize_pipe_r.close
264
- @wait_daemonize_pipe_r = nil
541
+ install_main_process_signal_handlers
265
542
 
266
- # write pid file
267
- File.open(@daemonize, "w") {|f|
268
- f.write supervisor_pid
269
- }
270
- end
543
+ # This is the only log messsage for @standalone_worker
544
+ $log.info "starting fluentd-#{Fluent::VERSION} without supervision", pid: Process.pid, ruby: RUBY_VERSION if @standalone_worker
271
545
 
272
- def finish_daemonize
273
- if @wait_daemonize_pipe_w
274
- STDIN.reopen("/dev/null")
275
- STDOUT.reopen("/dev/null", "w")
276
- STDERR.reopen("/dev/null", "w")
277
- @wait_daemonize_pipe_w.write @supervisor_pid.to_s
278
- @wait_daemonize_pipe_w.close
279
- @wait_daemonize_pipe_w = nil
546
+ main_process do
547
+ create_socket_manager if @standalone_worker
548
+ change_privilege if @standalone_worker
549
+ init_engine
550
+ run_configure
551
+ run_engine
552
+ self.class.cleanup_resources if @standalone_worker
553
+ exit 0
280
554
  end
281
555
  end
282
556
 
283
- def setup_rpc_server
284
- @rpc_server = RPC::Server.new(@rpc_endpoint, $log)
557
+ private
285
558
 
286
- # built-in RPC for signals
287
- @rpc_server.mount_proc('/api/processes.interruptWorkers') { |req, res|
288
- $log.debug "fluentd RPC got /api/processes.interruptWorkers request"
289
- supervisor_sigint_handler
290
- nil
291
- }
292
- @rpc_server.mount_proc('/api/processes.killWorkers') { |req, res|
293
- $log.debug "fluentd RPC got /api/processes.killWorkers request"
294
- supervisor_sigterm_handler
295
- nil
296
- }
297
- @rpc_server.mount_proc('/api/plugins.flushBuffers') { |req, res|
298
- $log.debug "fluentd RPC got /api/plugins.flushBuffers request"
299
- supervisor_sigusr1_handler
300
- nil
301
- }
302
- @rpc_server.mount_proc('/api/config.reload') { |req, res|
303
- $log.debug "fluentd RPC got /api/config.reload request"
304
- $log.info "restarting"
305
- supervisor_sighup_handler
306
- nil
307
- }
308
- @rpc_server.mount_proc('/api/config.dump') { |req, res|
309
- $log.debug "fluentd RPC got /api/config.dump request"
310
- $log.info "dump in-memory config"
311
- supervisor_dump_config_handler
312
- nil
313
- }
559
+ def create_socket_manager
560
+ socket_manager_path = ServerEngine::SocketManager::Server.generate_path
561
+ ServerEngine::SocketManager::Server.open(socket_manager_path)
562
+ ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = socket_manager_path.to_s
314
563
  end
315
564
 
316
- def setup_rpc_get_dump
317
- @rpc_server.mount_proc('/api/config.getDump') { |req, res|
318
- $log.debug "fluentd RPC got /api/config.dump request"
319
- $log.info "get dump in-memory config via HTTP"
320
- res.body = supervisor_get_dump_config_handler
321
- [nil, nil, res]
322
- }
565
+ def dry_run_cmd
566
+ $log.info "starting fluentd-#{Fluent::VERSION} as dry run mode", ruby: RUBY_VERSION
567
+ @system_config.suppress_config_dump = true
568
+ dry_run
569
+ exit 0
570
+ rescue => e
571
+ $log.error "dry run failed: #{e}"
572
+ exit 1
323
573
  end
324
574
 
325
- def run_rpc_server
326
- @rpc_server.start
575
+ ## Set Engine's dry_run_mode true to override all target_id of worker sections
576
+ def dry_run
577
+ begin
578
+ Fluent::Engine.dry_run_mode = true
579
+ change_privilege
580
+ init_engine
581
+ run_configure
582
+ rescue Fluent::ConfigError => e
583
+ $log.error "config error", file: @config_path, error: e
584
+ $log.debug_backtrace
585
+ exit!(1)
586
+ ensure
587
+ Fluent::Engine.dry_run_mode = false
588
+ end
327
589
  end
328
590
 
329
- def stop_rpc_server
330
- @rpc_server.shutdown
591
+ def show_plugin_config
592
+ name, type = @show_plugin_config.split(":") # input:tail
593
+ $log.info "show_plugin_config option is deprecated. Use fluent-plugin-config-format --format=txt #{name} #{type}"
594
+ exit 0
331
595
  end
332
596
 
333
- def supervise(&block)
334
- start_time = Time.now
597
+ def supervise
598
+ # Make dumpable conf, which is set corresponding_proxies for all elements in all worker sections
599
+ dry_run
335
600
 
336
601
  Process.setproctitle("supervisor:#{@process_name}") if @process_name
337
- $log.info "starting fluentd-#{Fluent::VERSION}"
338
- @main_pid = fork do
339
- main_process(&block)
340
- end
341
-
342
- if @daemonize && @wait_daemonize_pipe_w
343
- STDIN.reopen("/dev/null")
344
- STDOUT.reopen("/dev/null", "w")
345
- STDERR.reopen("/dev/null", "w")
346
- @wait_daemonize_pipe_w.close
347
- @wait_daemonize_pipe_w = nil
348
- end
349
-
350
- Process.waitpid(@main_pid)
351
- @main_pid = nil
352
- ecode = $?.to_i
353
-
354
- $log.info "process finished", code: ecode
355
-
356
- if !@finished && Time.now - start_time < 1
357
- $log.warn "process died within 1 second. exit."
358
- exit ecode
359
- end
602
+ $log.info "starting fluentd-#{Fluent::VERSION}", pid: Process.pid, ruby: RUBY_VERSION
603
+
604
+ rubyopt = ENV["RUBYOPT"]
605
+ fluentd_spawn_cmd = [ServerEngine.ruby_bin_path, "-Eascii-8bit:ascii-8bit"]
606
+ fluentd_spawn_cmd << rubyopt if rubyopt
607
+ fluentd_spawn_cmd << $0
608
+ fluentd_spawn_cmd += $fluentdargv
609
+ fluentd_spawn_cmd << "--under-supervisor"
610
+
611
+ $log.info "spawn command to main: ", cmdline: fluentd_spawn_cmd
612
+
613
+ params = {}
614
+ params['main_cmd'] = fluentd_spawn_cmd
615
+ params['daemonize'] = @daemonize
616
+ params['inline_config'] = @inline_config
617
+ params['log_path'] = @log_path
618
+ params['log_rotate_age'] = @log_rotate_age
619
+ params['log_rotate_size'] = @log_rotate_size
620
+ params['chuser'] = @chuser
621
+ params['chgroup'] = @chgroup
622
+ params['use_v1_config'] = @use_v1_config
623
+ params['conf_encoding'] = @conf_encoding
624
+
625
+ # system config parameters
626
+ params['workers'] = @workers
627
+ params['root_dir'] = @root_dir
628
+ params['log_level'] = @log_level
629
+ params['suppress_repeated_stacktrace'] = @suppress_repeated_stacktrace
630
+ params['signame'] = @signame
631
+
632
+ se = ServerEngine.create(ServerModule, WorkerModule){
633
+ Fluent::Supervisor.load_config(@config_path, params)
634
+ }
635
+ se.run
360
636
  end
361
637
 
362
- def main_process(&block)
363
- Process.setproctitle("worker:#{@process_name}") if @process_name
364
-
365
- begin
366
- block.call
638
+ def install_main_process_signal_handlers
639
+ # Fluentd worker process (worker of ServerEngine) don't use code in serverengine to set signal handlers,
640
+ # because it does almost nothing.
641
+ # This method is the only method to set signal handlers in Fluentd worker process.
367
642
 
368
- rescue Fluent::ConfigError
369
- $log.error "config error", file: @config_path, error: $!.to_s
370
- $log.debug_backtrace
371
- unless @log.stdout?
372
- console = Fluent::Log.new(STDOUT, @log_level).enable_debug
373
- console.error "config error", file: @config_path, error: $!.to_s
374
- console.debug_backtrace
375
- end
643
+ # When user use Ctrl + C not SIGINT, SIGINT is sent to all process in same process group.
644
+ # ServerEngine server process will send SIGTERM to child(spawned) processes by that SIGINT, so
645
+ # worker process SHOULD NOT do anything with SIGINT, SHOULD just ignore.
646
+ trap :INT do
647
+ $log.debug "fluentd main process get SIGINT"
376
648
 
377
- rescue
378
- $log.error "unexpected error", error: $!.to_s
379
- $log.error_backtrace
380
- unless @log.stdout?
381
- console = Fluent::Log.new(STDOUT, @log_level).enable_debug
382
- console.error "unexpected error", error: $!.to_s
383
- console.error_backtrace
649
+ # When Fluentd is launched without supervisor, worker should handle ctrl-c by itself
650
+ if @standalone_worker
651
+ @finished = true
652
+ $log.debug "getting start to shutdown main process"
653
+ Fluent::Engine.stop
384
654
  end
385
655
  end
386
656
 
387
- exit! 1
388
- end
389
-
390
- def install_supervisor_signal_handlers
391
- trap :INT do
392
- $log.debug "fluentd supervisor process get SIGINT"
393
- supervisor_sigint_handler
394
- end
395
-
396
657
  trap :TERM do
397
- $log.debug "fluentd supervisor process get SIGTERM"
398
- supervisor_sigterm_handler
399
- end
400
-
401
- trap :HUP do
402
- $log.debug "fluentd supervisor process get SIGHUP"
403
- $log.info "restarting"
404
- supervisor_sighup_handler
405
- end
406
-
407
- trap :USR1 do
408
- $log.debug "fluentd supervisor process get SIGUSR1"
409
- supervisor_sigusr1_handler
410
- end
411
- end
412
-
413
- def supervisor_sigint_handler
414
- @finished = true
415
- if pid = @main_pid
416
- # kill processes only still exists
417
- unless Process.waitpid(pid, Process::WNOHANG)
418
- begin
419
- Process.kill(:INT, pid)
420
- rescue Errno::ESRCH
421
- # ignore processes already died
422
- end
658
+ $log.debug "fluentd main process get SIGTERM"
659
+ unless @finished
660
+ @finished = true
661
+ $log.debug "getting start to shutdown main process"
662
+ Fluent::Engine.stop
423
663
  end
424
664
  end
425
- end
426
665
 
427
- def supervisor_sigterm_handler
428
- @finished = true
429
- if pid = @main_pid
430
- # kill processes only still exists
431
- unless Process.waitpid(pid, Process::WNOHANG)
432
- begin
433
- Process.kill(:TERM, pid)
434
- rescue Errno::ESRCH
435
- # ignore processes already died
666
+ trap :USR1 do
667
+ flush_buffer
668
+ end unless Fluent.windows?
669
+
670
+ if Fluent.windows?
671
+ command_pipe = STDIN.dup
672
+ STDIN.reopen(File::NULL, "rb")
673
+ command_pipe.binmode
674
+ command_pipe.sync = true
675
+
676
+ Thread.new do
677
+ loop do
678
+ cmd = command_pipe.gets.chomp
679
+ case cmd
680
+ when "GRACEFUL_STOP", "IMMEDIATE_STOP"
681
+ $log.debug "fluentd main process get #{cmd} command"
682
+ @finished = true
683
+ $log.debug "getting start to shutdown main process"
684
+ Fluent::Engine.stop
685
+ break
686
+ else
687
+ $log.warn "fluentd main process get unknown command [#{cmd}]"
688
+ end
436
689
  end
437
690
  end
438
691
  end
439
692
  end
440
693
 
441
- def supervisor_sighup_handler
694
+ def flush_buffer
442
695
  # Creating new thread due to mutex can't lock
443
696
  # in main thread during trap context
444
697
  Thread.new {
445
- read_config
446
- set_system_config
447
- if pid = @main_pid
448
- Process.kill(:TERM, pid)
449
- # don't resuce Erro::ESRSH here (invalid status)
698
+ begin
699
+ $log.debug "fluentd main process get SIGUSR1"
700
+ $log.info "force flushing buffered events"
701
+ @log.reopen!
702
+ Fluent::Engine.flush!
703
+ $log.debug "flushing thread: flushed"
704
+ rescue Exception => e
705
+ $log.warn "flushing thread error: #{e}"
450
706
  end
451
707
  }.run
452
708
  end
453
709
 
454
- def supervisor_sigusr1_handler
455
- @log.reopen!
456
- if pid = @main_pid
457
- Process.kill(:USR1, pid)
458
- # don't resuce Erro::ESRSH here (invalid status)
710
+ def logging_with_console_output
711
+ yield $log
712
+ unless @log.stdout?
713
+ logger = ServerEngine::DaemonLogger.new(STDOUT)
714
+ log = Fluent::Log.new(logger)
715
+ log.level = @log_level
716
+ console = log.enable_debug
717
+ yield console
459
718
  end
460
719
  end
461
720
 
462
- def supervisor_dump_config_handler
463
- $log.info @conf.to_s
464
- end
721
+ def main_process(&block)
722
+ if @process_name
723
+ if @workers > 1
724
+ Process.setproctitle("worker:#{@process_name}#{ENV['SERVERENGINE_WORKER_ID']}")
725
+ else
726
+ Process.setproctitle("worker:#{@process_name}")
727
+ end
728
+ end
465
729
 
466
- def supervisor_get_dump_config_handler
467
- {conf: @conf.to_s}
730
+ unrecoverable_error = false
731
+
732
+ begin
733
+ block.call
734
+ rescue Fluent::ConfigError => e
735
+ logging_with_console_output do |log|
736
+ log.error "config error", file: @config_path, error: e
737
+ log.debug_backtrace
738
+ end
739
+ unrecoverable_error = true
740
+ rescue Fluent::UnrecoverableError => e
741
+ logging_with_console_output do |log|
742
+ log.error e.message, error: e
743
+ log.error_backtrace
744
+ end
745
+ unrecoverable_error = true
746
+ rescue ScriptError => e # LoadError, NotImplementedError, SyntaxError
747
+ logging_with_console_output do |log|
748
+ if e.respond_to?(:path)
749
+ log.error e.message, path: e.path, error: e
750
+ else
751
+ log.error e.message, error: e
752
+ end
753
+ log.error_backtrace
754
+ end
755
+ unrecoverable_error = true
756
+ rescue => e
757
+ logging_with_console_output do |log|
758
+ log.error "unexpected error", error: e
759
+ log.error_backtrace
760
+ end
761
+ end
762
+
763
+ exit!(unrecoverable_error ? 2 : 1)
468
764
  end
469
765
 
470
766
  def read_config
471
- $log.info "reading config file", path: @config_path
472
767
  @config_fname = File.basename(@config_path)
473
768
  @config_basedir = File.dirname(@config_path)
474
- @config_data = File.read(@config_path)
769
+ @config_data = File.open(@config_path, "r:#{@conf_encoding}:utf-8") {|f| f.read }
475
770
  if @inline_config == '-'
476
771
  @config_data << "\n" << STDIN.read
477
772
  elsif @inline_config
@@ -482,28 +777,12 @@ module Fluent
482
777
 
483
778
  def set_system_config
484
779
  @system_config = SystemConfig.create(@conf) # @conf is set in read_config
780
+ @system_config.attach(self)
485
781
  @system_config.apply(self)
486
782
  end
487
783
 
488
- def run_configure
489
- Fluent::Engine.run_configure(@conf)
490
- end
491
-
492
784
  def change_privilege
493
- if @chgroup
494
- etc_group = Supervisor.get_etc_group(@chgroup)
495
- Process::GID.change_privilege(etc_group.gid)
496
- end
497
-
498
- if @chuser
499
- etc_pw = Supervisor.get_etc_passwd(@chuser)
500
- user_groups = [etc_pw.gid]
501
- Etc.setgrent
502
- Etc.group { |gr| user_groups << gr.gid if gr.mem.include?(etc_pw.name) } # emulate 'id -G'
503
-
504
- Process.groups = Process.groups | user_groups
505
- Process::UID.change_privilege(etc_pw.uid)
506
- end
785
+ ServerEngine::Privilege.change(@chuser, @chgroup)
507
786
  end
508
787
 
509
788
  def init_engine
@@ -516,54 +795,13 @@ module Fluent
516
795
  @plugin_dirs.each {|dir|
517
796
  if Dir.exist?(dir)
518
797
  dir = File.expand_path(dir)
519
- Fluent::Engine.load_plugin_dir(dir)
798
+ Fluent::Engine.add_plugin_dir(dir)
520
799
  end
521
800
  }
522
801
  end
523
802
 
524
- def install_main_process_signal_handlers
525
- # Strictly speaking, these signal handling is not thread safe.
526
- # But enough safe to limit twice call of Fluent::Engine.stop.
527
-
528
- trap :INT do
529
- $log.debug "fluentd main process get SIGINT"
530
- unless @finished
531
- @finished = true
532
- $log.debug "getting start to shutdown main process"
533
- Fluent::Engine.stop
534
- end
535
- end
536
-
537
- trap :TERM do
538
- $log.debug "fluentd main process get SIGTERM"
539
- unless @finished
540
- @finished = true
541
- $log.debug "getting start to shutdown main process"
542
- Fluent::Engine.stop
543
- end
544
- end
545
-
546
- trap :HUP do
547
- # TODO
548
- $log.debug "fluentd main process get SIGHUP"
549
- end
550
-
551
- trap :USR1 do
552
- $log.debug "fluentd main process get SIGUSR1"
553
- $log.info "force flushing buffered events"
554
- @log.reopen!
555
-
556
- # Creating new thread due to mutex can't lock
557
- # in main thread during trap context
558
- Thread.new {
559
- begin
560
- Fluent::Engine.flush!
561
- $log.debug "flushing thread: flushed"
562
- rescue Exception => e
563
- $log.warn "flushing thread error: #{e}"
564
- end
565
- }.run
566
- end
803
+ def run_configure
804
+ Fluent::Engine.run_configure(@conf)
567
805
  end
568
806
 
569
807
  def run_engine