dtomasgu-fluentd 1.14.7.pre.dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (564) hide show
  1. checksums.yaml +7 -0
  2. data/.deepsource.toml +13 -0
  3. data/.drone.yml +35 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.yaml +70 -0
  5. data/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. data/.github/ISSUE_TEMPLATE/feature_request.yaml +38 -0
  7. data/.github/ISSUE_TEMPLATE.md +17 -0
  8. data/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  9. data/.github/workflows/issue-auto-closer.yml +12 -0
  10. data/.github/workflows/linux-test.yaml +36 -0
  11. data/.github/workflows/macos-test.yaml +34 -0
  12. data/.github/workflows/stale-actions.yml +22 -0
  13. data/.github/workflows/windows-test.yaml +49 -0
  14. data/.gitignore +30 -0
  15. data/.gitlab-ci.yml +103 -0
  16. data/ADOPTERS.md +5 -0
  17. data/AUTHORS +2 -0
  18. data/CHANGELOG.md +2453 -0
  19. data/CONTRIBUTING.md +45 -0
  20. data/GOVERNANCE.md +55 -0
  21. data/Gemfile +9 -0
  22. data/GithubWorkflow.md +78 -0
  23. data/LICENSE +202 -0
  24. data/MAINTAINERS.md +11 -0
  25. data/README.md +76 -0
  26. data/Rakefile +79 -0
  27. data/SECURITY.md +18 -0
  28. data/bin/fluent-binlog-reader +7 -0
  29. data/bin/fluent-ca-generate +6 -0
  30. data/bin/fluent-cap-ctl +7 -0
  31. data/bin/fluent-cat +5 -0
  32. data/bin/fluent-ctl +7 -0
  33. data/bin/fluent-debug +5 -0
  34. data/bin/fluent-gem +9 -0
  35. data/bin/fluent-plugin-config-format +5 -0
  36. data/bin/fluent-plugin-generate +5 -0
  37. data/bin/fluentd +15 -0
  38. data/code-of-conduct.md +3 -0
  39. data/docs/SECURITY_AUDIT.pdf +0 -0
  40. data/example/copy_roundrobin.conf +39 -0
  41. data/example/counter.conf +18 -0
  42. data/example/filter_stdout.conf +22 -0
  43. data/example/in_forward.conf +14 -0
  44. data/example/in_forward_client.conf +37 -0
  45. data/example/in_forward_shared_key.conf +15 -0
  46. data/example/in_forward_tls.conf +14 -0
  47. data/example/in_forward_users.conf +24 -0
  48. data/example/in_forward_workers.conf +21 -0
  49. data/example/in_http.conf +16 -0
  50. data/example/in_out_forward.conf +17 -0
  51. data/example/in_sample_blocks.conf +17 -0
  52. data/example/in_sample_with_compression.conf +23 -0
  53. data/example/in_syslog.conf +15 -0
  54. data/example/in_tail.conf +14 -0
  55. data/example/in_tcp.conf +13 -0
  56. data/example/in_udp.conf +13 -0
  57. data/example/logevents.conf +25 -0
  58. data/example/multi_filters.conf +61 -0
  59. data/example/out_copy.conf +20 -0
  60. data/example/out_exec_filter.conf +42 -0
  61. data/example/out_file.conf +13 -0
  62. data/example/out_forward.conf +35 -0
  63. data/example/out_forward_buf_file.conf +23 -0
  64. data/example/out_forward_client.conf +109 -0
  65. data/example/out_forward_heartbeat_none.conf +16 -0
  66. data/example/out_forward_sd.conf +17 -0
  67. data/example/out_forward_shared_key.conf +36 -0
  68. data/example/out_forward_tls.conf +18 -0
  69. data/example/out_forward_users.conf +65 -0
  70. data/example/out_null.conf +36 -0
  71. data/example/sd.yaml +8 -0
  72. data/example/secondary_file.conf +42 -0
  73. data/example/suppress_config_dump.conf +7 -0
  74. data/example/v0_12_filter.conf +78 -0
  75. data/example/v1_literal_example.conf +36 -0
  76. data/example/worker_section.conf +36 -0
  77. data/fluent.conf +139 -0
  78. data/fluentd.gemspec +57 -0
  79. data/lib/fluent/agent.rb +168 -0
  80. data/lib/fluent/capability.rb +87 -0
  81. data/lib/fluent/clock.rb +66 -0
  82. data/lib/fluent/command/binlog_reader.rb +244 -0
  83. data/lib/fluent/command/bundler_injection.rb +45 -0
  84. data/lib/fluent/command/ca_generate.rb +184 -0
  85. data/lib/fluent/command/cap_ctl.rb +174 -0
  86. data/lib/fluent/command/cat.rb +365 -0
  87. data/lib/fluent/command/ctl.rb +180 -0
  88. data/lib/fluent/command/debug.rb +103 -0
  89. data/lib/fluent/command/fluentd.rb +388 -0
  90. data/lib/fluent/command/plugin_config_formatter.rb +308 -0
  91. data/lib/fluent/command/plugin_generator.rb +365 -0
  92. data/lib/fluent/compat/call_super_mixin.rb +76 -0
  93. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  94. data/lib/fluent/compat/exec_util.rb +129 -0
  95. data/lib/fluent/compat/file_util.rb +54 -0
  96. data/lib/fluent/compat/filter.rb +68 -0
  97. data/lib/fluent/compat/formatter.rb +111 -0
  98. data/lib/fluent/compat/formatter_utils.rb +85 -0
  99. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  100. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  101. data/lib/fluent/compat/input.rb +49 -0
  102. data/lib/fluent/compat/output.rb +721 -0
  103. data/lib/fluent/compat/output_chain.rb +60 -0
  104. data/lib/fluent/compat/parser.rb +310 -0
  105. data/lib/fluent/compat/parser_utils.rb +40 -0
  106. data/lib/fluent/compat/propagate_default.rb +62 -0
  107. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  108. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  109. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  110. data/lib/fluent/compat/socket_util.rb +165 -0
  111. data/lib/fluent/compat/string_util.rb +34 -0
  112. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  113. data/lib/fluent/compat/type_converter.rb +90 -0
  114. data/lib/fluent/config/basic_parser.rb +123 -0
  115. data/lib/fluent/config/configure_proxy.rb +424 -0
  116. data/lib/fluent/config/dsl.rb +152 -0
  117. data/lib/fluent/config/element.rb +265 -0
  118. data/lib/fluent/config/error.rb +44 -0
  119. data/lib/fluent/config/literal_parser.rb +286 -0
  120. data/lib/fluent/config/parser.rb +107 -0
  121. data/lib/fluent/config/section.rb +272 -0
  122. data/lib/fluent/config/types.rb +249 -0
  123. data/lib/fluent/config/v1_parser.rb +192 -0
  124. data/lib/fluent/config/yaml_parser/fluent_value.rb +47 -0
  125. data/lib/fluent/config/yaml_parser/loader.rb +91 -0
  126. data/lib/fluent/config/yaml_parser/parser.rb +166 -0
  127. data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
  128. data/lib/fluent/config/yaml_parser.rb +56 -0
  129. data/lib/fluent/config.rb +89 -0
  130. data/lib/fluent/configurable.rb +201 -0
  131. data/lib/fluent/counter/base_socket.rb +44 -0
  132. data/lib/fluent/counter/client.rb +297 -0
  133. data/lib/fluent/counter/error.rb +86 -0
  134. data/lib/fluent/counter/mutex_hash.rb +163 -0
  135. data/lib/fluent/counter/server.rb +273 -0
  136. data/lib/fluent/counter/store.rb +205 -0
  137. data/lib/fluent/counter/validator.rb +145 -0
  138. data/lib/fluent/counter.rb +23 -0
  139. data/lib/fluent/daemon.rb +15 -0
  140. data/lib/fluent/daemonizer.rb +88 -0
  141. data/lib/fluent/engine.rb +253 -0
  142. data/lib/fluent/env.rb +40 -0
  143. data/lib/fluent/error.rb +34 -0
  144. data/lib/fluent/event.rb +326 -0
  145. data/lib/fluent/event_router.rb +315 -0
  146. data/lib/fluent/ext_monitor_require.rb +28 -0
  147. data/lib/fluent/filter.rb +21 -0
  148. data/lib/fluent/fluent_log_event_router.rb +141 -0
  149. data/lib/fluent/formatter.rb +23 -0
  150. data/lib/fluent/input.rb +21 -0
  151. data/lib/fluent/label.rb +46 -0
  152. data/lib/fluent/load.rb +34 -0
  153. data/lib/fluent/log.rb +713 -0
  154. data/lib/fluent/match.rb +187 -0
  155. data/lib/fluent/mixin.rb +31 -0
  156. data/lib/fluent/msgpack_factory.rb +106 -0
  157. data/lib/fluent/oj_options.rb +62 -0
  158. data/lib/fluent/output.rb +29 -0
  159. data/lib/fluent/output_chain.rb +23 -0
  160. data/lib/fluent/parser.rb +23 -0
  161. data/lib/fluent/plugin/bare_output.rb +104 -0
  162. data/lib/fluent/plugin/base.rb +197 -0
  163. data/lib/fluent/plugin/buf_file.rb +213 -0
  164. data/lib/fluent/plugin/buf_file_single.rb +225 -0
  165. data/lib/fluent/plugin/buf_memory.rb +34 -0
  166. data/lib/fluent/plugin/buffer/chunk.rb +240 -0
  167. data/lib/fluent/plugin/buffer/file_chunk.rb +413 -0
  168. data/lib/fluent/plugin/buffer/file_single_chunk.rb +311 -0
  169. data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
  170. data/lib/fluent/plugin/buffer.rb +918 -0
  171. data/lib/fluent/plugin/compressable.rb +96 -0
  172. data/lib/fluent/plugin/exec_util.rb +22 -0
  173. data/lib/fluent/plugin/file_util.rb +22 -0
  174. data/lib/fluent/plugin/file_wrapper.rb +132 -0
  175. data/lib/fluent/plugin/filter.rb +127 -0
  176. data/lib/fluent/plugin/filter_grep.rb +189 -0
  177. data/lib/fluent/plugin/filter_parser.rb +130 -0
  178. data/lib/fluent/plugin/filter_record_transformer.rb +324 -0
  179. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  180. data/lib/fluent/plugin/formatter.rb +75 -0
  181. data/lib/fluent/plugin/formatter_csv.rb +78 -0
  182. data/lib/fluent/plugin/formatter_hash.rb +35 -0
  183. data/lib/fluent/plugin/formatter_json.rb +59 -0
  184. data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
  185. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  186. data/lib/fluent/plugin/formatter_out_file.rb +53 -0
  187. data/lib/fluent/plugin/formatter_single_value.rb +36 -0
  188. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  189. data/lib/fluent/plugin/formatter_tsv.rb +40 -0
  190. data/lib/fluent/plugin/in_debug_agent.rb +71 -0
  191. data/lib/fluent/plugin/in_dummy.rb +18 -0
  192. data/lib/fluent/plugin/in_exec.rb +110 -0
  193. data/lib/fluent/plugin/in_forward.rb +473 -0
  194. data/lib/fluent/plugin/in_gc_stat.rb +72 -0
  195. data/lib/fluent/plugin/in_http.rb +677 -0
  196. data/lib/fluent/plugin/in_monitor_agent.rb +412 -0
  197. data/lib/fluent/plugin/in_object_space.rb +93 -0
  198. data/lib/fluent/plugin/in_sample.rb +141 -0
  199. data/lib/fluent/plugin/in_syslog.rb +276 -0
  200. data/lib/fluent/plugin/in_tail/group_watch.rb +204 -0
  201. data/lib/fluent/plugin/in_tail/position_file.rb +255 -0
  202. data/lib/fluent/plugin/in_tail.rb +1247 -0
  203. data/lib/fluent/plugin/in_tcp.rb +181 -0
  204. data/lib/fluent/plugin/in_udp.rb +92 -0
  205. data/lib/fluent/plugin/in_unix.rb +195 -0
  206. data/lib/fluent/plugin/input.rb +75 -0
  207. data/lib/fluent/plugin/metrics.rb +119 -0
  208. data/lib/fluent/plugin/metrics_local.rb +96 -0
  209. data/lib/fluent/plugin/multi_output.rb +195 -0
  210. data/lib/fluent/plugin/out_copy.rb +120 -0
  211. data/lib/fluent/plugin/out_exec.rb +105 -0
  212. data/lib/fluent/plugin/out_exec_filter.rb +319 -0
  213. data/lib/fluent/plugin/out_file.rb +334 -0
  214. data/lib/fluent/plugin/out_forward/ack_handler.rb +161 -0
  215. data/lib/fluent/plugin/out_forward/connection_manager.rb +113 -0
  216. data/lib/fluent/plugin/out_forward/error.rb +28 -0
  217. data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
  218. data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
  219. data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
  220. data/lib/fluent/plugin/out_forward/socket_cache.rb +142 -0
  221. data/lib/fluent/plugin/out_forward.rb +826 -0
  222. data/lib/fluent/plugin/out_http.rb +280 -0
  223. data/lib/fluent/plugin/out_null.rb +74 -0
  224. data/lib/fluent/plugin/out_relabel.rb +32 -0
  225. data/lib/fluent/plugin/out_roundrobin.rb +84 -0
  226. data/lib/fluent/plugin/out_secondary_file.rb +131 -0
  227. data/lib/fluent/plugin/out_stdout.rb +74 -0
  228. data/lib/fluent/plugin/out_stream.rb +130 -0
  229. data/lib/fluent/plugin/output.rb +1566 -0
  230. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  231. data/lib/fluent/plugin/parser.rb +274 -0
  232. data/lib/fluent/plugin/parser_apache.rb +28 -0
  233. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  234. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  235. data/lib/fluent/plugin/parser_csv.rb +114 -0
  236. data/lib/fluent/plugin/parser_json.rb +96 -0
  237. data/lib/fluent/plugin/parser_ltsv.rb +51 -0
  238. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  239. data/lib/fluent/plugin/parser_multiline.rb +152 -0
  240. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  241. data/lib/fluent/plugin/parser_none.rb +36 -0
  242. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  243. data/lib/fluent/plugin/parser_syslog.rb +496 -0
  244. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  245. data/lib/fluent/plugin/sd_file.rb +156 -0
  246. data/lib/fluent/plugin/sd_srv.rb +135 -0
  247. data/lib/fluent/plugin/sd_static.rb +58 -0
  248. data/lib/fluent/plugin/service_discovery.rb +65 -0
  249. data/lib/fluent/plugin/socket_util.rb +22 -0
  250. data/lib/fluent/plugin/storage.rb +84 -0
  251. data/lib/fluent/plugin/storage_local.rb +162 -0
  252. data/lib/fluent/plugin/string_util.rb +22 -0
  253. data/lib/fluent/plugin.rb +206 -0
  254. data/lib/fluent/plugin_helper/cert_option.rb +191 -0
  255. data/lib/fluent/plugin_helper/child_process.rb +366 -0
  256. data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
  257. data/lib/fluent/plugin_helper/counter.rb +51 -0
  258. data/lib/fluent/plugin_helper/event_emitter.rb +100 -0
  259. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  260. data/lib/fluent/plugin_helper/extract.rb +104 -0
  261. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  262. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  263. data/lib/fluent/plugin_helper/http_server/compat/server.rb +92 -0
  264. data/lib/fluent/plugin_helper/http_server/compat/ssl_context_extractor.rb +52 -0
  265. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  266. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  267. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  268. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  269. data/lib/fluent/plugin_helper/http_server/server.rb +93 -0
  270. data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
  271. data/lib/fluent/plugin_helper/http_server.rb +135 -0
  272. data/lib/fluent/plugin_helper/inject.rb +154 -0
  273. data/lib/fluent/plugin_helper/metrics.rb +129 -0
  274. data/lib/fluent/plugin_helper/parser.rb +147 -0
  275. data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
  276. data/lib/fluent/plugin_helper/retry_state.rb +219 -0
  277. data/lib/fluent/plugin_helper/server.rb +820 -0
  278. data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
  279. data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
  280. data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
  281. data/lib/fluent/plugin_helper/socket.rb +288 -0
  282. data/lib/fluent/plugin_helper/socket_option.rb +98 -0
  283. data/lib/fluent/plugin_helper/storage.rb +349 -0
  284. data/lib/fluent/plugin_helper/thread.rb +180 -0
  285. data/lib/fluent/plugin_helper/timer.rb +92 -0
  286. data/lib/fluent/plugin_helper.rb +75 -0
  287. data/lib/fluent/plugin_id.rb +93 -0
  288. data/lib/fluent/process.rb +22 -0
  289. data/lib/fluent/registry.rb +117 -0
  290. data/lib/fluent/root_agent.rb +372 -0
  291. data/lib/fluent/rpc.rb +95 -0
  292. data/lib/fluent/static_config_analysis.rb +194 -0
  293. data/lib/fluent/supervisor.rb +1141 -0
  294. data/lib/fluent/system_config.rb +188 -0
  295. data/lib/fluent/test/base.rb +78 -0
  296. data/lib/fluent/test/driver/base.rb +225 -0
  297. data/lib/fluent/test/driver/base_owned.rb +83 -0
  298. data/lib/fluent/test/driver/base_owner.rb +135 -0
  299. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  300. data/lib/fluent/test/driver/filter.rb +57 -0
  301. data/lib/fluent/test/driver/formatter.rb +30 -0
  302. data/lib/fluent/test/driver/input.rb +31 -0
  303. data/lib/fluent/test/driver/multi_output.rb +53 -0
  304. data/lib/fluent/test/driver/output.rb +102 -0
  305. data/lib/fluent/test/driver/parser.rb +30 -0
  306. data/lib/fluent/test/driver/storage.rb +30 -0
  307. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  308. data/lib/fluent/test/filter_test.rb +77 -0
  309. data/lib/fluent/test/formatter_test.rb +65 -0
  310. data/lib/fluent/test/helpers.rb +134 -0
  311. data/lib/fluent/test/input_test.rb +174 -0
  312. data/lib/fluent/test/log.rb +79 -0
  313. data/lib/fluent/test/output_test.rb +156 -0
  314. data/lib/fluent/test/parser_test.rb +70 -0
  315. data/lib/fluent/test/startup_shutdown.rb +46 -0
  316. data/lib/fluent/test.rb +58 -0
  317. data/lib/fluent/time.rb +512 -0
  318. data/lib/fluent/timezone.rb +171 -0
  319. data/lib/fluent/tls.rb +81 -0
  320. data/lib/fluent/unique_id.rb +39 -0
  321. data/lib/fluent/variable_store.rb +40 -0
  322. data/lib/fluent/version.rb +21 -0
  323. data/lib/fluent/winsvc.rb +105 -0
  324. data/templates/new_gem/Gemfile +3 -0
  325. data/templates/new_gem/README.md.erb +43 -0
  326. data/templates/new_gem/Rakefile +13 -0
  327. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  328. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  329. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  330. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  331. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  332. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  333. data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
  334. data/templates/new_gem/test/helper.rb.erb +8 -0
  335. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  336. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  337. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  338. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  339. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  340. data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
  341. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  342. data/templates/plugin_config_formatter/param.md-table.erb +10 -0
  343. data/templates/plugin_config_formatter/param.md.erb +34 -0
  344. data/templates/plugin_config_formatter/section.md.erb +12 -0
  345. data/test/command/test_binlog_reader.rb +362 -0
  346. data/test/command/test_ca_generate.rb +70 -0
  347. data/test/command/test_cap_ctl.rb +100 -0
  348. data/test/command/test_cat.rb +128 -0
  349. data/test/command/test_ctl.rb +56 -0
  350. data/test/command/test_fluentd.rb +1139 -0
  351. data/test/command/test_plugin_config_formatter.rb +398 -0
  352. data/test/command/test_plugin_generator.rb +109 -0
  353. data/test/compat/test_calls_super.rb +166 -0
  354. data/test/compat/test_parser.rb +92 -0
  355. data/test/config/assertions.rb +42 -0
  356. data/test/config/test_config_parser.rb +551 -0
  357. data/test/config/test_configurable.rb +1784 -0
  358. data/test/config/test_configure_proxy.rb +604 -0
  359. data/test/config/test_dsl.rb +415 -0
  360. data/test/config/test_element.rb +518 -0
  361. data/test/config/test_literal_parser.rb +309 -0
  362. data/test/config/test_plugin_configuration.rb +56 -0
  363. data/test/config/test_section.rb +191 -0
  364. data/test/config/test_system_config.rb +201 -0
  365. data/test/config/test_types.rb +408 -0
  366. data/test/counter/test_client.rb +563 -0
  367. data/test/counter/test_error.rb +44 -0
  368. data/test/counter/test_mutex_hash.rb +179 -0
  369. data/test/counter/test_server.rb +589 -0
  370. data/test/counter/test_store.rb +258 -0
  371. data/test/counter/test_validator.rb +137 -0
  372. data/test/helper.rb +155 -0
  373. data/test/helpers/fuzzy_assert.rb +89 -0
  374. data/test/helpers/process_extenstion.rb +33 -0
  375. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  376. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  377. data/test/plugin/data/2010/01/20100102.log +0 -0
  378. data/test/plugin/data/log/bar +0 -0
  379. data/test/plugin/data/log/foo/bar.log +0 -0
  380. data/test/plugin/data/log/foo/bar2 +0 -0
  381. data/test/plugin/data/log/test.log +0 -0
  382. data/test/plugin/data/sd_file/config +11 -0
  383. data/test/plugin/data/sd_file/config.json +17 -0
  384. data/test/plugin/data/sd_file/config.yaml +11 -0
  385. data/test/plugin/data/sd_file/config.yml +11 -0
  386. data/test/plugin/data/sd_file/invalid_config.yml +7 -0
  387. data/test/plugin/in_tail/test_fifo.rb +121 -0
  388. data/test/plugin/in_tail/test_io_handler.rb +150 -0
  389. data/test/plugin/in_tail/test_position_file.rb +316 -0
  390. data/test/plugin/out_forward/test_ack_handler.rb +101 -0
  391. data/test/plugin/out_forward/test_connection_manager.rb +145 -0
  392. data/test/plugin/out_forward/test_handshake_protocol.rb +112 -0
  393. data/test/plugin/out_forward/test_load_balancer.rb +106 -0
  394. data/test/plugin/out_forward/test_socket_cache.rb +174 -0
  395. data/test/plugin/test_bare_output.rb +131 -0
  396. data/test/plugin/test_base.rb +115 -0
  397. data/test/plugin/test_buf_file.rb +1275 -0
  398. data/test/plugin/test_buf_file_single.rb +833 -0
  399. data/test/plugin/test_buf_memory.rb +42 -0
  400. data/test/plugin/test_buffer.rb +1383 -0
  401. data/test/plugin/test_buffer_chunk.rb +198 -0
  402. data/test/plugin/test_buffer_file_chunk.rb +871 -0
  403. data/test/plugin/test_buffer_file_single_chunk.rb +611 -0
  404. data/test/plugin/test_buffer_memory_chunk.rb +339 -0
  405. data/test/plugin/test_compressable.rb +87 -0
  406. data/test/plugin/test_file_util.rb +96 -0
  407. data/test/plugin/test_file_wrapper.rb +58 -0
  408. data/test/plugin/test_filter.rb +368 -0
  409. data/test/plugin/test_filter_grep.rb +697 -0
  410. data/test/plugin/test_filter_parser.rb +731 -0
  411. data/test/plugin/test_filter_record_transformer.rb +577 -0
  412. data/test/plugin/test_filter_stdout.rb +207 -0
  413. data/test/plugin/test_formatter_csv.rb +136 -0
  414. data/test/plugin/test_formatter_hash.rb +38 -0
  415. data/test/plugin/test_formatter_json.rb +61 -0
  416. data/test/plugin/test_formatter_ltsv.rb +70 -0
  417. data/test/plugin/test_formatter_msgpack.rb +28 -0
  418. data/test/plugin/test_formatter_out_file.rb +116 -0
  419. data/test/plugin/test_formatter_single_value.rb +44 -0
  420. data/test/plugin/test_formatter_tsv.rb +76 -0
  421. data/test/plugin/test_in_debug_agent.rb +49 -0
  422. data/test/plugin/test_in_exec.rb +261 -0
  423. data/test/plugin/test_in_forward.rb +1178 -0
  424. data/test/plugin/test_in_gc_stat.rb +62 -0
  425. data/test/plugin/test_in_http.rb +1103 -0
  426. data/test/plugin/test_in_monitor_agent.rb +923 -0
  427. data/test/plugin/test_in_object_space.rb +66 -0
  428. data/test/plugin/test_in_sample.rb +190 -0
  429. data/test/plugin/test_in_syslog.rb +505 -0
  430. data/test/plugin/test_in_tail.rb +2639 -0
  431. data/test/plugin/test_in_tcp.rb +243 -0
  432. data/test/plugin/test_in_udp.rb +268 -0
  433. data/test/plugin/test_in_unix.rb +181 -0
  434. data/test/plugin/test_input.rb +137 -0
  435. data/test/plugin/test_metadata.rb +89 -0
  436. data/test/plugin/test_metrics.rb +294 -0
  437. data/test/plugin/test_metrics_local.rb +96 -0
  438. data/test/plugin/test_multi_output.rb +204 -0
  439. data/test/plugin/test_out_copy.rb +308 -0
  440. data/test/plugin/test_out_exec.rb +312 -0
  441. data/test/plugin/test_out_exec_filter.rb +606 -0
  442. data/test/plugin/test_out_file.rb +1037 -0
  443. data/test/plugin/test_out_forward.rb +1358 -0
  444. data/test/plugin/test_out_http.rb +428 -0
  445. data/test/plugin/test_out_null.rb +105 -0
  446. data/test/plugin/test_out_relabel.rb +28 -0
  447. data/test/plugin/test_out_roundrobin.rb +146 -0
  448. data/test/plugin/test_out_secondary_file.rb +458 -0
  449. data/test/plugin/test_out_stdout.rb +205 -0
  450. data/test/plugin/test_out_stream.rb +103 -0
  451. data/test/plugin/test_output.rb +1065 -0
  452. data/test/plugin/test_output_as_buffered.rb +2024 -0
  453. data/test/plugin/test_output_as_buffered_backup.rb +363 -0
  454. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  455. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  456. data/test/plugin/test_output_as_buffered_retries.rb +966 -0
  457. data/test/plugin/test_output_as_buffered_secondary.rb +882 -0
  458. data/test/plugin/test_output_as_standard.rb +374 -0
  459. data/test/plugin/test_owned_by.rb +35 -0
  460. data/test/plugin/test_parser.rb +399 -0
  461. data/test/plugin/test_parser_apache.rb +42 -0
  462. data/test/plugin/test_parser_apache2.rb +47 -0
  463. data/test/plugin/test_parser_apache_error.rb +45 -0
  464. data/test/plugin/test_parser_csv.rb +200 -0
  465. data/test/plugin/test_parser_json.rb +138 -0
  466. data/test/plugin/test_parser_labeled_tsv.rb +160 -0
  467. data/test/plugin/test_parser_multiline.rb +111 -0
  468. data/test/plugin/test_parser_nginx.rb +88 -0
  469. data/test/plugin/test_parser_none.rb +52 -0
  470. data/test/plugin/test_parser_regexp.rb +289 -0
  471. data/test/plugin/test_parser_syslog.rb +650 -0
  472. data/test/plugin/test_parser_tsv.rb +122 -0
  473. data/test/plugin/test_sd_file.rb +228 -0
  474. data/test/plugin/test_sd_srv.rb +230 -0
  475. data/test/plugin/test_storage.rb +167 -0
  476. data/test/plugin/test_storage_local.rb +335 -0
  477. data/test/plugin/test_string_util.rb +26 -0
  478. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  479. data/test/plugin_helper/data/cert/cert-with-CRLF.pem +19 -0
  480. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  481. data/test/plugin_helper/data/cert/cert.pem +19 -0
  482. data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +27 -0
  483. data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +20 -0
  484. data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +27 -0
  485. data/test/plugin_helper/data/cert/cert_chains/cert.pem +40 -0
  486. data/test/plugin_helper/data/cert/empty.pem +0 -0
  487. data/test/plugin_helper/data/cert/generate_cert.rb +125 -0
  488. data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +30 -0
  489. data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +27 -0
  490. data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +20 -0
  491. data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +20 -0
  492. data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +30 -0
  493. data/test/plugin_helper/data/cert/with_ca/cert-key.pem +27 -0
  494. data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +21 -0
  495. data/test/plugin_helper/data/cert/with_ca/cert.pem +21 -0
  496. data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +30 -0
  497. data/test/plugin_helper/data/cert/without_ca/cert-key.pem +27 -0
  498. data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +20 -0
  499. data/test/plugin_helper/data/cert/without_ca/cert.pem +20 -0
  500. data/test/plugin_helper/http_server/test_app.rb +65 -0
  501. data/test/plugin_helper/http_server/test_route.rb +32 -0
  502. data/test/plugin_helper/service_discovery/test_manager.rb +93 -0
  503. data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +21 -0
  504. data/test/plugin_helper/test_cert_option.rb +25 -0
  505. data/test/plugin_helper/test_child_process.rb +852 -0
  506. data/test/plugin_helper/test_compat_parameters.rb +358 -0
  507. data/test/plugin_helper/test_event_emitter.rb +80 -0
  508. data/test/plugin_helper/test_event_loop.rb +52 -0
  509. data/test/plugin_helper/test_extract.rb +194 -0
  510. data/test/plugin_helper/test_formatter.rb +255 -0
  511. data/test/plugin_helper/test_http_server_helper.rb +372 -0
  512. data/test/plugin_helper/test_inject.rb +561 -0
  513. data/test/plugin_helper/test_metrics.rb +137 -0
  514. data/test/plugin_helper/test_parser.rb +264 -0
  515. data/test/plugin_helper/test_record_accessor.rb +238 -0
  516. data/test/plugin_helper/test_retry_state.rb +1006 -0
  517. data/test/plugin_helper/test_server.rb +1841 -0
  518. data/test/plugin_helper/test_service_discovery.rb +165 -0
  519. data/test/plugin_helper/test_socket.rb +146 -0
  520. data/test/plugin_helper/test_storage.rb +542 -0
  521. data/test/plugin_helper/test_thread.rb +164 -0
  522. data/test/plugin_helper/test_timer.rb +130 -0
  523. data/test/scripts/exec_script.rb +32 -0
  524. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  525. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  526. data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
  527. data/test/scripts/fluent/plugin/out_test.rb +81 -0
  528. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  529. data/test/scripts/fluent/plugin/parser_known.rb +4 -0
  530. data/test/test_capability.rb +74 -0
  531. data/test/test_clock.rb +164 -0
  532. data/test/test_config.rb +333 -0
  533. data/test/test_configdsl.rb +148 -0
  534. data/test/test_daemonizer.rb +91 -0
  535. data/test/test_engine.rb +203 -0
  536. data/test/test_event.rb +531 -0
  537. data/test/test_event_router.rb +348 -0
  538. data/test/test_event_time.rb +199 -0
  539. data/test/test_filter.rb +121 -0
  540. data/test/test_fluent_log_event_router.rb +99 -0
  541. data/test/test_formatter.rb +366 -0
  542. data/test/test_input.rb +31 -0
  543. data/test/test_log.rb +994 -0
  544. data/test/test_logger_initializer.rb +46 -0
  545. data/test/test_match.rb +148 -0
  546. data/test/test_mixin.rb +351 -0
  547. data/test/test_msgpack_factory.rb +18 -0
  548. data/test/test_oj_options.rb +55 -0
  549. data/test/test_output.rb +278 -0
  550. data/test/test_plugin.rb +251 -0
  551. data/test/test_plugin_classes.rb +370 -0
  552. data/test/test_plugin_helper.rb +81 -0
  553. data/test/test_plugin_id.rb +119 -0
  554. data/test/test_process.rb +14 -0
  555. data/test/test_root_agent.rb +951 -0
  556. data/test/test_static_config_analysis.rb +177 -0
  557. data/test/test_supervisor.rb +791 -0
  558. data/test/test_test_drivers.rb +136 -0
  559. data/test/test_time_formatter.rb +301 -0
  560. data/test/test_time_parser.rb +362 -0
  561. data/test/test_tls.rb +65 -0
  562. data/test/test_unique_id.rb +47 -0
  563. data/test/test_variable_store.rb +65 -0
  564. metadata +1191 -0
@@ -0,0 +1,1141 @@
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 'fileutils'
18
+ require 'open3'
19
+ require 'pathname'
20
+
21
+ require 'fluent/config'
22
+ require 'fluent/counter'
23
+ require 'fluent/env'
24
+ require 'fluent/engine'
25
+ require 'fluent/error'
26
+ require 'fluent/log'
27
+ require 'fluent/plugin'
28
+ require 'fluent/rpc'
29
+ require 'fluent/system_config'
30
+ require 'fluent/msgpack_factory'
31
+ require 'fluent/variable_store'
32
+ require 'serverengine'
33
+
34
+ if Fluent.windows?
35
+ require 'windows/library'
36
+ require 'windows/synchronize'
37
+ require 'windows/system_info'
38
+ include Windows::Library
39
+ include Windows::Synchronize
40
+ include Windows::SystemInfo
41
+ require 'win32/ipc'
42
+ require 'win32/event'
43
+ end
44
+
45
+ module Fluent
46
+ module ServerModule
47
+ def before_run
48
+ @fluentd_conf = config[:fluentd_conf]
49
+ @rpc_endpoint = nil
50
+ @rpc_server = nil
51
+ @counter = nil
52
+
53
+ if config[:rpc_endpoint]
54
+ @rpc_endpoint = config[:rpc_endpoint]
55
+ @enable_get_dump = config[:enable_get_dump]
56
+ run_rpc_server
57
+ end
58
+
59
+ if Fluent.windows?
60
+ install_windows_event_handler
61
+ else
62
+ install_supervisor_signal_handlers
63
+ end
64
+
65
+ if counter = config[:counter_server]
66
+ run_counter_server(counter)
67
+ end
68
+
69
+ if config[:disable_shared_socket]
70
+ $log.info "shared socket for multiple workers is disabled"
71
+ else
72
+ socket_manager_path = ServerEngine::SocketManager::Server.generate_path
73
+ ServerEngine::SocketManager::Server.open(socket_manager_path)
74
+ ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = socket_manager_path.to_s
75
+ end
76
+ end
77
+
78
+ def after_run
79
+ stop_windows_event_thread if Fluent.windows?
80
+ stop_rpc_server if @rpc_endpoint
81
+ stop_counter_server if @counter
82
+ Fluent::Supervisor.cleanup_resources
83
+ end
84
+
85
+ def run_rpc_server
86
+ @rpc_server = RPC::Server.new(@rpc_endpoint, $log)
87
+
88
+ # built-in RPC for signals
89
+ @rpc_server.mount_proc('/api/processes.interruptWorkers') { |req, res|
90
+ $log.debug "fluentd RPC got /api/processes.interruptWorkers request"
91
+ Process.kill :INT, $$
92
+ nil
93
+ }
94
+ @rpc_server.mount_proc('/api/processes.killWorkers') { |req, res|
95
+ $log.debug "fluentd RPC got /api/processes.killWorkers request"
96
+ Process.kill :TERM, $$
97
+ nil
98
+ }
99
+ @rpc_server.mount_proc('/api/processes.flushBuffersAndKillWorkers') { |req, res|
100
+ $log.debug "fluentd RPC got /api/processes.flushBuffersAndKillWorkers request"
101
+ if Fluent.windows?
102
+ supervisor_sigusr1_handler
103
+ stop(true)
104
+ else
105
+ Process.kill :USR1, $$
106
+ Process.kill :TERM, $$
107
+ end
108
+ nil
109
+ }
110
+ @rpc_server.mount_proc('/api/plugins.flushBuffers') { |req, res|
111
+ $log.debug "fluentd RPC got /api/plugins.flushBuffers request"
112
+ if Fluent.windows?
113
+ supervisor_sigusr1_handler
114
+ else
115
+ Process.kill :USR1, $$
116
+ end
117
+ nil
118
+ }
119
+ @rpc_server.mount_proc('/api/config.reload') { |req, res|
120
+ $log.debug "fluentd RPC got /api/config.reload request"
121
+ if Fluent.windows?
122
+ # restart worker with auto restarting by killing
123
+ kill_worker
124
+ else
125
+ Process.kill :HUP, $$
126
+ end
127
+ nil
128
+ }
129
+ @rpc_server.mount_proc('/api/config.dump') { |req, res|
130
+ $log.debug "fluentd RPC got /api/config.dump request"
131
+ $log.info "dump in-memory config"
132
+ supervisor_dump_config_handler
133
+ nil
134
+ }
135
+
136
+ @rpc_server.mount_proc('/api/config.gracefulReload') { |req, res|
137
+ $log.debug "fluentd RPC got /api/config.gracefulReload request"
138
+ if Fluent.windows?
139
+ supervisor_sigusr2_handler
140
+ else
141
+ Process.kill :USR2, $$
142
+ end
143
+
144
+ nil
145
+ }
146
+
147
+ @rpc_server.mount_proc('/api/config.getDump') { |req, res|
148
+ $log.debug "fluentd RPC got /api/config.getDump request"
149
+ $log.info "get dump in-memory config via HTTP"
150
+ res.body = supervisor_get_dump_config_handler
151
+ [nil, nil, res]
152
+ } if @enable_get_dump
153
+
154
+ @rpc_server.start
155
+ end
156
+
157
+ def stop_rpc_server
158
+ @rpc_server.shutdown
159
+ end
160
+
161
+ def run_counter_server(counter_conf)
162
+ @counter = Fluent::Counter::Server.new(
163
+ counter_conf.scope,
164
+ {host: counter_conf.bind, port: counter_conf.port, log: $log, path: counter_conf.backup_path}
165
+ )
166
+ @counter.start
167
+ end
168
+
169
+ def stop_counter_server
170
+ @counter.stop
171
+ end
172
+
173
+ def install_supervisor_signal_handlers
174
+ return if Fluent.windows?
175
+
176
+ trap :HUP do
177
+ $log.debug "fluentd supervisor process get SIGHUP"
178
+ supervisor_sighup_handler
179
+ end
180
+
181
+ trap :USR1 do
182
+ $log.debug "fluentd supervisor process get SIGUSR1"
183
+ supervisor_sigusr1_handler
184
+ end
185
+
186
+ trap :USR2 do
187
+ $log.debug 'fluentd supervisor process got SIGUSR2'
188
+ supervisor_sigusr2_handler
189
+ end
190
+ end
191
+
192
+ if Fluent.windows?
193
+ # Override some methods of ServerEngine::MultiSpawnWorker
194
+ # Since Fluentd's Supervisor doesn't use ServerEngine's HUP, USR1 and USR2
195
+ # handlers (see install_supervisor_signal_handlers), they should be
196
+ # disabled also on Windows, just send commands to workers instead.
197
+ def restart(graceful)
198
+ @monitors.each do |m|
199
+ m.send_command(graceful ? "GRACEFUL_RESTART\n" : "IMMEDIATE_RESTART\n")
200
+ end
201
+ end
202
+
203
+ def reload
204
+ @monitors.each do |m|
205
+ m.send_command("RELOAD\n")
206
+ end
207
+ end
208
+ end
209
+
210
+ def install_windows_event_handler
211
+ return unless Fluent.windows?
212
+
213
+ @pid_signame = "fluentd_#{$$}"
214
+ @signame = config[:signame]
215
+
216
+ Thread.new do
217
+ ipc = Win32::Ipc.new(nil)
218
+ events = [
219
+ {win32_event: Win32::Event.new("#{@pid_signame}_STOP_EVENT_THREAD"), action: :stop_event_thread},
220
+ {win32_event: Win32::Event.new("#{@pid_signame}"), action: :stop},
221
+ {win32_event: Win32::Event.new("#{@pid_signame}_HUP"), action: :hup},
222
+ {win32_event: Win32::Event.new("#{@pid_signame}_USR1"), action: :usr1},
223
+ {win32_event: Win32::Event.new("#{@pid_signame}_USR2"), action: :usr2},
224
+ {win32_event: Win32::Event.new("#{@pid_signame}_CONT"), action: :cont},
225
+ ]
226
+ if @signame
227
+ signame_events = [
228
+ {win32_event: Win32::Event.new("#{@signame}"), action: :stop},
229
+ {win32_event: Win32::Event.new("#{@signame}_HUP"), action: :hup},
230
+ {win32_event: Win32::Event.new("#{@signame}_USR1"), action: :usr1},
231
+ {win32_event: Win32::Event.new("#{@signame}_USR2"), action: :usr2},
232
+ {win32_event: Win32::Event.new("#{@signame}_CONT"), action: :cont},
233
+ ]
234
+ events.concat(signame_events)
235
+ end
236
+ begin
237
+ loop do
238
+ ipc_idx = ipc.wait_any(events.map {|e| e[:win32_event]}, Windows::Synchronize::INFINITE)
239
+ event_idx = ipc_idx - 1
240
+
241
+ if event_idx >= 0 && event_idx < events.length
242
+ $log.debug("Got Win32 event \"#{events[event_idx][:win32_event].name}\"")
243
+ else
244
+ $log.warn("Unexpected return value of Win32::Ipc#wait_any: #{ipc_idx}")
245
+ end
246
+ case events[event_idx][:action]
247
+ when :stop
248
+ stop(true)
249
+ when :hup
250
+ supervisor_sighup_handler
251
+ when :usr1
252
+ supervisor_sigusr1_handler
253
+ when :usr2
254
+ supervisor_sigusr2_handler
255
+ when :cont
256
+ supervisor_dump_handler_for_windows
257
+ when :stop_event_thread
258
+ break
259
+ end
260
+ end
261
+ ensure
262
+ events.each { |event| event[:win32_event].close }
263
+ end
264
+ end
265
+ end
266
+
267
+ def stop_windows_event_thread
268
+ if Fluent.windows?
269
+ ev = Win32::Event.open("#{@pid_signame}_STOP_EVENT_THREAD")
270
+ ev.set
271
+ ev.close
272
+ end
273
+ end
274
+
275
+ def supervisor_sighup_handler
276
+ kill_worker
277
+ end
278
+
279
+ def supervisor_sigusr1_handler
280
+ reopen_log
281
+ send_signal_to_workers(:USR1)
282
+ end
283
+
284
+ def supervisor_sigusr2_handler
285
+ conf = nil
286
+ t = Thread.new do
287
+ $log.info 'Reloading new config'
288
+
289
+ # Validate that loading config is valid at first
290
+ conf = Fluent::Config.build(
291
+ config_path: config[:config_path],
292
+ encoding: config[:conf_encoding],
293
+ additional_config: config[:inline_config],
294
+ use_v1_config: config[:use_v1_config],
295
+ )
296
+
297
+ Fluent::VariableStore.try_to_reset do
298
+ Fluent::Engine.reload_config(conf, supervisor: true)
299
+ end
300
+ end
301
+
302
+ t.report_on_exception = false # Error is handled by myself
303
+ t.join
304
+
305
+ reopen_log
306
+ send_signal_to_workers(:USR2)
307
+ @fluentd_conf = conf.to_s
308
+ rescue => e
309
+ $log.error "Failed to reload config file: #{e}"
310
+ end
311
+
312
+ def supervisor_dump_handler_for_windows
313
+ # As for UNIX-like, SIGCONT signal to each process makes the process output its dump-file,
314
+ # and it is implemented before the implementation of the function for Windows.
315
+ # It is possible to trap SIGCONT and handle it here also on UNIX-like,
316
+ # but for backward compatibility, this handler is currently for a Windows-only.
317
+ raise "[BUG] This function is for Windows ONLY." unless Fluent.windows?
318
+
319
+ Thread.new do
320
+ begin
321
+ FluentSigdump.dump_windows
322
+ rescue => e
323
+ $log.error "failed to dump: #{e}"
324
+ end
325
+ end
326
+
327
+ send_signal_to_workers(:CONT)
328
+ rescue => e
329
+ $log.error "failed to dump: #{e}"
330
+ end
331
+
332
+ def kill_worker
333
+ if config[:worker_pid]
334
+ pids = config[:worker_pid].clone
335
+ config[:worker_pid].clear
336
+ pids.each_value do |pid|
337
+ if Fluent.windows?
338
+ Process.kill :KILL, pid
339
+ else
340
+ Process.kill :TERM, pid
341
+ end
342
+ end
343
+ end
344
+ end
345
+
346
+ def supervisor_dump_config_handler
347
+ $log.info @fluentd_conf
348
+ end
349
+
350
+ def supervisor_get_dump_config_handler
351
+ { conf: @fluentd_conf }
352
+ end
353
+
354
+ private
355
+
356
+ def reopen_log
357
+ if (log = config[:logger_initializer])
358
+ # Creating new thread due to mutex can't lock
359
+ # in main thread during trap context
360
+ Thread.new do
361
+ log.reopen!
362
+ end
363
+ end
364
+ end
365
+
366
+ def send_signal_to_workers(signal)
367
+ return unless config[:worker_pid]
368
+
369
+ if Fluent.windows?
370
+ send_command_to_workers(signal)
371
+ else
372
+ config[:worker_pid].each_value do |pid|
373
+ # don't rescue Errno::ESRCH here (invalid status)
374
+ Process.kill(signal, pid)
375
+ end
376
+ end
377
+ end
378
+
379
+ def send_command_to_workers(signal)
380
+ # Use SeverEngine's CommandSender on Windows
381
+ case signal
382
+ when :HUP
383
+ restart(false)
384
+ when :USR1
385
+ restart(true)
386
+ when :USR2
387
+ reload
388
+ when :CONT
389
+ dump_all_windows_workers
390
+ end
391
+ end
392
+
393
+ def dump_all_windows_workers
394
+ @monitors.each do |m|
395
+ m.send_command("DUMP\n")
396
+ end
397
+ end
398
+ end
399
+
400
+ module WorkerModule
401
+ def spawn(process_manager)
402
+ main_cmd = config[:main_cmd]
403
+ env = {
404
+ 'SERVERENGINE_WORKER_ID' => @worker_id.to_i.to_s,
405
+ }
406
+ @pm = process_manager.spawn(env, *main_cmd)
407
+ end
408
+
409
+ def after_start
410
+ (config[:worker_pid] ||= {})[@worker_id] = @pm.pid
411
+ end
412
+ end
413
+
414
+ class Supervisor
415
+ def self.load_config(path, params = {})
416
+ pre_loadtime = 0
417
+ pre_loadtime = params['pre_loadtime'].to_i if params['pre_loadtime']
418
+ pre_config_mtime = nil
419
+ pre_config_mtime = params['pre_config_mtime'] if params['pre_config_mtime']
420
+ config_mtime = File.mtime(path)
421
+
422
+ # reuse previous config if last load time is within 5 seconds and mtime of the config file is not changed
423
+ if (Time.now - Time.at(pre_loadtime) < 5) && (config_mtime == pre_config_mtime)
424
+ return params['pre_conf']
425
+ end
426
+
427
+ log_level = params['log_level']
428
+ suppress_repeated_stacktrace = params['suppress_repeated_stacktrace']
429
+ ignore_repeated_log_interval = params['ignore_repeated_log_interval']
430
+ ignore_same_log_interval = params['ignore_same_log_interval']
431
+
432
+ log_path = params['log_path']
433
+ chuser = params['chuser']
434
+ chgroup = params['chgroup']
435
+ chumask = params['chumask']
436
+ log_rotate_age = params['log_rotate_age']
437
+ log_rotate_size = params['log_rotate_size']
438
+
439
+ log_opts = {suppress_repeated_stacktrace: suppress_repeated_stacktrace, ignore_repeated_log_interval: ignore_repeated_log_interval,
440
+ ignore_same_log_interval: ignore_same_log_interval}
441
+ logger_initializer = Supervisor::LoggerInitializer.new(
442
+ log_path, log_level, chuser, chgroup, log_opts,
443
+ log_rotate_age: log_rotate_age,
444
+ log_rotate_size: log_rotate_size
445
+ )
446
+ # this #init sets initialized logger to $log
447
+ logger_initializer.init(:supervisor, 0)
448
+ logger_initializer.apply_options(format: params['log_format'], time_format: params['log_time_format'])
449
+ logger = $log
450
+
451
+ command_sender = Fluent.windows? ? "pipe" : "signal"
452
+
453
+ # ServerEngine's "daemonize" option is boolean, and path of pid file is brought by "pid_path"
454
+ pid_path = params['daemonize']
455
+ daemonize = !!params['daemonize']
456
+
457
+ se_config = {
458
+ worker_type: 'spawn',
459
+ workers: params['workers'],
460
+ log_stdin: false,
461
+ log_stdout: false,
462
+ log_stderr: false,
463
+ enable_heartbeat: true,
464
+ auto_heartbeat: false,
465
+ unrecoverable_exit_codes: [2],
466
+ stop_immediately_at_unrecoverable_exit: true,
467
+ root_dir: params['root_dir'],
468
+ logger: logger,
469
+ log: logger.out,
470
+ log_path: log_path,
471
+ log_level: log_level,
472
+ logger_initializer: logger_initializer,
473
+ chuser: chuser,
474
+ chgroup: chgroup,
475
+ chumask: chumask,
476
+ suppress_repeated_stacktrace: suppress_repeated_stacktrace,
477
+ ignore_repeated_log_interval: ignore_repeated_log_interval,
478
+ ignore_same_log_interval: ignore_same_log_interval,
479
+ daemonize: daemonize,
480
+ rpc_endpoint: params['rpc_endpoint'],
481
+ counter_server: params['counter_server'],
482
+ enable_get_dump: params['enable_get_dump'],
483
+ windows_daemon_cmdline: [ServerEngine.ruby_bin_path,
484
+ File.join(File.dirname(__FILE__), 'daemon.rb'),
485
+ ServerModule.name,
486
+ WorkerModule.name,
487
+ path,
488
+ JSON.dump(params)],
489
+ command_sender: command_sender,
490
+ fluentd_conf: params['fluentd_conf'],
491
+ conf_encoding: params['conf_encoding'],
492
+ inline_config: params['inline_config'],
493
+ config_path: path,
494
+ main_cmd: params['main_cmd'],
495
+ signame: params['signame'],
496
+ disable_shared_socket: params['disable_shared_socket'],
497
+ restart_worker_interval: params['restart_worker_interval'],
498
+ }
499
+ if daemonize
500
+ se_config[:pid_path] = pid_path
501
+ end
502
+ pre_params = params.dup
503
+ params['pre_loadtime'] = Time.now.to_i
504
+ params['pre_config_mtime'] = config_mtime
505
+ params['pre_conf'] = se_config
506
+ # prevent pre_conf from being too big by reloading many times.
507
+ pre_params['pre_conf'] = nil
508
+ params['pre_conf'][:windows_daemon_cmdline][5] = JSON.dump(pre_params)
509
+
510
+ se_config
511
+ end
512
+
513
+ class LoggerInitializer
514
+ def initialize(path, level, chuser, chgroup, opts, log_rotate_age: nil, log_rotate_size: nil)
515
+ @path = path
516
+ @level = level
517
+ @chuser = chuser
518
+ @chgroup = chgroup
519
+ @opts = opts
520
+ @log_rotate_age = log_rotate_age
521
+ @log_rotate_size = log_rotate_size
522
+ end
523
+
524
+ def worker_id_suffixed_path(worker_id, path)
525
+ require 'pathname'
526
+
527
+ Pathname(path).sub_ext("-#{worker_id}#{Pathname(path).extname}").to_s
528
+ end
529
+
530
+ def init(process_type, worker_id)
531
+ @opts[:process_type] = process_type
532
+ @opts[:worker_id] = worker_id
533
+
534
+ if @path && @path != "-"
535
+ unless File.exist?(@path)
536
+ FileUtils.mkdir_p(File.dirname(@path))
537
+ end
538
+
539
+ @logdev = if @log_rotate_age || @log_rotate_size
540
+ Fluent::LogDeviceIO.new(Fluent.windows? ?
541
+ worker_id_suffixed_path(worker_id, @path) : @path,
542
+ shift_age: @log_rotate_age, shift_size: @log_rotate_size)
543
+ else
544
+ File.open(@path, "a")
545
+ end
546
+ if @chuser || @chgroup
547
+ chuid = @chuser ? ServerEngine::Privilege.get_etc_passwd(@chuser).uid : nil
548
+ chgid = @chgroup ? ServerEngine::Privilege.get_etc_group(@chgroup).gid : nil
549
+ File.chown(chuid, chgid, @path)
550
+ end
551
+ else
552
+ @logdev = STDOUT
553
+ end
554
+
555
+ dl_opts = {}
556
+ # subtract 1 to match serverengine daemon logger side logging severity.
557
+ dl_opts[:log_level] = @level - 1
558
+ dl_opts[:log_rotate_age] = @log_rotate_age if @log_rotate_age
559
+ dl_opts[:log_rotate_size] = @log_rotate_size if @log_rotate_size
560
+ logger = ServerEngine::DaemonLogger.new(@logdev, dl_opts)
561
+ $log = Fluent::Log.new(logger, @opts)
562
+ $log.enable_color(false) if @path
563
+ $log.enable_debug if @level <= Fluent::Log::LEVEL_DEBUG
564
+ end
565
+
566
+ def stdout?
567
+ @logdev == STDOUT
568
+ end
569
+
570
+ def reopen!
571
+ if @path && @path != "-"
572
+ @logdev.reopen(@path, "a")
573
+ end
574
+ self
575
+ end
576
+
577
+ def apply_options(format: nil, time_format: nil, log_dir_perm: nil, ignore_repeated_log_interval: nil, ignore_same_log_interval: nil)
578
+ $log.format = format if format
579
+ $log.time_format = time_format if time_format
580
+ $log.ignore_repeated_log_interval = ignore_repeated_log_interval if ignore_repeated_log_interval
581
+ $log.ignore_same_log_interval = ignore_same_log_interval if ignore_same_log_interval
582
+
583
+ if @path && log_dir_perm
584
+ File.chmod(log_dir_perm || Fluent::DEFAULT_DIR_PERMISSION, File.dirname(@path))
585
+ end
586
+ end
587
+
588
+ def level=(level)
589
+ @level = level
590
+ $log.level = level
591
+ end
592
+ end
593
+
594
+ def self.default_options
595
+ {
596
+ config_path: Fluent::DEFAULT_CONFIG_PATH,
597
+ plugin_dirs: [Fluent::DEFAULT_PLUGIN_DIR],
598
+ log_level: Fluent::Log::LEVEL_INFO,
599
+ log_path: nil,
600
+ daemonize: nil,
601
+ libs: [],
602
+ setup_path: nil,
603
+ chuser: nil,
604
+ chgroup: nil,
605
+ chumask: "0",
606
+ root_dir: nil,
607
+ suppress_interval: 0,
608
+ suppress_repeated_stacktrace: true,
609
+ ignore_repeated_log_interval: nil,
610
+ without_source: nil,
611
+ enable_input_metrics: nil,
612
+ enable_size_metrics: nil,
613
+ use_v1_config: true,
614
+ strict_config_value: nil,
615
+ supervise: true,
616
+ standalone_worker: false,
617
+ signame: nil,
618
+ conf_encoding: 'utf-8',
619
+ disable_shared_socket: nil,
620
+ config_file_type: :guess,
621
+ }
622
+ end
623
+
624
+ def self.cleanup_resources
625
+ unless Fluent.windows?
626
+ if ENV.has_key?('SERVERENGINE_SOCKETMANAGER_PATH')
627
+ FileUtils.rm_f(ENV['SERVERENGINE_SOCKETMANAGER_PATH'])
628
+ end
629
+ end
630
+ end
631
+
632
+ def initialize(opt)
633
+ @config_file_type = opt[:config_file_type]
634
+ @daemonize = opt[:daemonize]
635
+ @standalone_worker= opt[:standalone_worker]
636
+ @config_path = opt[:config_path]
637
+ @inline_config = opt[:inline_config]
638
+ @use_v1_config = opt[:use_v1_config]
639
+ @conf_encoding = opt[:conf_encoding]
640
+ @log_path = opt[:log_path]
641
+ @show_plugin_config = opt[:show_plugin_config]
642
+ @libs = opt[:libs]
643
+ @plugin_dirs = opt[:plugin_dirs]
644
+ @chgroup = opt[:chgroup]
645
+ @chuser = opt[:chuser]
646
+ @chumask = opt[:chumask]
647
+
648
+ @log_rotate_age = opt[:log_rotate_age]
649
+ @log_rotate_size = opt[:log_rotate_size]
650
+ @signame = opt[:signame]
651
+
652
+ @cl_opt = opt
653
+ @conf = nil
654
+ # parse configuration immediately to initialize logger in early stage
655
+ if @config_path and File.exist?(@config_path)
656
+ @conf = Fluent::Config.build(config_path: @config_path,
657
+ encoding: @conf_encoding ? @conf_encoding : 'utf-8',
658
+ additional_config: @inline_config ? @inline_config : nil,
659
+ use_v1_config: !!@use_v1_config,
660
+ type: @config_file_type,
661
+ )
662
+ @system_config = build_system_config(@conf)
663
+ if @system_config.log
664
+ @log_rotate_age ||= @system_config.log.rotate_age
665
+ @log_rotate_size ||= @system_config.log.rotate_size
666
+ end
667
+ @conf = nil
668
+ end
669
+
670
+ log_opts = {suppress_repeated_stacktrace: opt[:suppress_repeated_stacktrace], ignore_repeated_log_interval: opt[:ignore_repeated_log_interval],
671
+ ignore_same_log_interval: opt[:ignore_same_log_interval]}
672
+ @log = LoggerInitializer.new(
673
+ @log_path, opt[:log_level], @chuser, @chgroup, log_opts,
674
+ log_rotate_age: @log_rotate_age,
675
+ log_rotate_size: @log_rotate_size
676
+ )
677
+ @finished = false
678
+ end
679
+
680
+ def run_supervisor(dry_run: false)
681
+ if dry_run
682
+ $log.info "starting fluentd-#{Fluent::VERSION} as dry run mode", ruby: RUBY_VERSION
683
+ end
684
+
685
+ if @system_config.workers < 1
686
+ raise Fluent::ConfigError, "invalid number of workers (must be > 0):#{@system_config.workers}"
687
+ end
688
+
689
+ root_dir = @system_config.root_dir
690
+ if root_dir
691
+ if File.exist?(root_dir)
692
+ unless Dir.exist?(root_dir)
693
+ raise Fluent::InvalidRootDirectory, "non directory entry exists:#{root_dir}"
694
+ end
695
+ else
696
+ begin
697
+ FileUtils.mkdir_p(root_dir, mode: @system_config.dir_permission || Fluent::DEFAULT_DIR_PERMISSION)
698
+ rescue => e
699
+ raise Fluent::InvalidRootDirectory, "failed to create root directory:#{root_dir}, #{e.inspect}"
700
+ end
701
+ end
702
+ end
703
+
704
+ begin
705
+ ServerEngine::Privilege.change(@chuser, @chgroup)
706
+ MessagePackFactory.init(enable_time_support: @system_config.enable_msgpack_time_support)
707
+ Fluent::Engine.init(@system_config, supervisor_mode: true)
708
+ Fluent::Engine.run_configure(@conf, dry_run: dry_run)
709
+ rescue Fluent::ConfigError => e
710
+ $log.error 'config error', file: @config_path, error: e
711
+ $log.debug_backtrace
712
+ exit!(1)
713
+ end
714
+
715
+ if dry_run
716
+ $log.info 'finished dry run mode'
717
+ exit 0
718
+ else
719
+ supervise
720
+ end
721
+ end
722
+
723
+ def options
724
+ {
725
+ 'config_path' => @config_path,
726
+ 'pid_file' => @daemonize,
727
+ 'plugin_dirs' => @plugin_dirs,
728
+ 'log_path' => @log_path,
729
+ 'root_dir' => @system_config.root_dir,
730
+ }
731
+ end
732
+
733
+ def run_worker
734
+ begin
735
+ require 'sigdump/setup'
736
+ rescue Exception
737
+ # ignore LoadError and others (related with signals): it may raise these errors in Windows
738
+ end
739
+
740
+ Process.setproctitle("worker:#{@system_config.process_name}") if @process_name
741
+
742
+ if @standalone_worker && @system_config.workers != 1
743
+ raise Fluent::ConfigError, "invalid number of workers (must be 1 or unspecified) with --no-supervisor: #{@system_config.workers}"
744
+ end
745
+
746
+ install_main_process_signal_handlers
747
+
748
+ # This is the only log messsage for @standalone_worker
749
+ $log.info "starting fluentd-#{Fluent::VERSION} without supervision", pid: Process.pid, ruby: RUBY_VERSION if @standalone_worker
750
+
751
+ main_process do
752
+ create_socket_manager if @standalone_worker
753
+ if @standalone_worker
754
+ ServerEngine::Privilege.change(@chuser, @chgroup)
755
+ File.umask(@chumask.to_i(8))
756
+ end
757
+ MessagePackFactory.init(enable_time_support: @system_config.enable_msgpack_time_support)
758
+ Fluent::Engine.init(@system_config)
759
+ Fluent::Engine.run_configure(@conf)
760
+ Fluent::Engine.run
761
+ self.class.cleanup_resources if @standalone_worker
762
+ exit 0
763
+ end
764
+ end
765
+
766
+ def configure(supervisor: false)
767
+ if supervisor
768
+ @log.init(:supervisor, 0)
769
+ else
770
+ worker_id = ENV['SERVERENGINE_WORKER_ID'].to_i
771
+ process_type = case
772
+ when @standalone_worker then :standalone
773
+ when worker_id == 0 then :worker0
774
+ else :workers
775
+ end
776
+ @log.init(process_type, worker_id)
777
+ end
778
+
779
+ if @show_plugin_config
780
+ show_plugin_config
781
+ end
782
+
783
+ if @inline_config == '-'
784
+ $log.warn('the value "-" for `inline_config` is deprecated. See https://github.com/fluent/fluentd/issues/2711')
785
+ @inline_config = STDIN.read
786
+ end
787
+ @conf = Fluent::Config.build(
788
+ config_path: @config_path,
789
+ encoding: @conf_encoding,
790
+ additional_config: @inline_config,
791
+ use_v1_config: @use_v1_config,
792
+ type: @config_file_type,
793
+ )
794
+ @system_config = build_system_config(@conf)
795
+
796
+ @log.level = @system_config.log_level
797
+ @log.apply_options(
798
+ format: @system_config.log.format,
799
+ time_format: @system_config.log.time_format,
800
+ log_dir_perm: @system_config.dir_permission,
801
+ ignore_repeated_log_interval: @system_config.ignore_repeated_log_interval,
802
+ ignore_same_log_interval: @system_config.ignore_same_log_interval
803
+ )
804
+
805
+ $log.info :supervisor, 'parsing config file is succeeded', path: @config_path
806
+
807
+ @libs.each do |lib|
808
+ require lib
809
+ end
810
+
811
+ @plugin_dirs.each do |dir|
812
+ if Dir.exist?(dir)
813
+ dir = File.expand_path(dir)
814
+ Fluent::Plugin.add_plugin_dir(dir)
815
+ end
816
+ end
817
+
818
+ if supervisor
819
+ # plugins / configuration dumps
820
+ Gem::Specification.find_all.select { |x| x.name =~ /^fluent(d|-(plugin|mixin)-.*)$/ }.each do |spec|
821
+ $log.info("gem '#{spec.name}' version '#{spec.version}'")
822
+ end
823
+ end
824
+ end
825
+
826
+ private
827
+
828
+ def create_socket_manager
829
+ socket_manager_path = ServerEngine::SocketManager::Server.generate_path
830
+ ServerEngine::SocketManager::Server.open(socket_manager_path)
831
+ ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = socket_manager_path.to_s
832
+ end
833
+
834
+ def show_plugin_config
835
+ name, type = @show_plugin_config.split(":") # input:tail
836
+ $log.info "show_plugin_config option is deprecated. Use fluent-plugin-config-format --format=txt #{name} #{type}"
837
+ exit 0
838
+ end
839
+
840
+ def supervise
841
+ Process.setproctitle("supervisor:#{@system_config.process_name}") if @system_config.process_name
842
+ $log.info "starting fluentd-#{Fluent::VERSION}", pid: Process.pid, ruby: RUBY_VERSION
843
+
844
+ fluentd_spawn_cmd = build_spawn_command
845
+ $log.info "spawn command to main: ", cmdline: fluentd_spawn_cmd
846
+
847
+ params = {
848
+ 'main_cmd' => fluentd_spawn_cmd,
849
+ 'daemonize' => @daemonize,
850
+ 'inline_config' => @inline_config,
851
+ 'log_path' => @log_path,
852
+ 'log_rotate_age' => @log_rotate_age,
853
+ 'log_rotate_size' => @log_rotate_size,
854
+ 'chuser' => @chuser,
855
+ 'chgroup' => @chgroup,
856
+ 'use_v1_config' => @use_v1_config,
857
+ 'conf_encoding' => @conf_encoding,
858
+ 'signame' => @signame,
859
+ 'fluentd_conf' => @conf.to_s,
860
+
861
+ 'workers' => @system_config.workers,
862
+ 'root_dir' => @system_config.root_dir,
863
+ 'log_level' => @system_config.log_level,
864
+ 'suppress_repeated_stacktrace' => @system_config.suppress_repeated_stacktrace,
865
+ 'ignore_repeated_log_interval' => @system_config.ignore_repeated_log_interval,
866
+ 'rpc_endpoint' => @system_config.rpc_endpoint,
867
+ 'enable_get_dump' => @system_config.enable_get_dump,
868
+ 'counter_server' => @system_config.counter_server,
869
+ 'log_format' => @system_config.log.format,
870
+ 'log_time_format' => @system_config.log.time_format,
871
+ 'disable_shared_socket' => @system_config.disable_shared_socket,
872
+ 'restart_worker_interval' => @system_config.restart_worker_interval,
873
+ }
874
+
875
+ se = ServerEngine.create(ServerModule, WorkerModule){
876
+ Fluent::Supervisor.load_config(@config_path, params)
877
+ }
878
+ se.run
879
+ end
880
+
881
+ def install_main_process_signal_handlers
882
+ # Fluentd worker process (worker of ServerEngine) don't use code in serverengine to set signal handlers,
883
+ # because it does almost nothing.
884
+ # This method is the only method to set signal handlers in Fluentd worker process.
885
+
886
+ # When user use Ctrl + C not SIGINT, SIGINT is sent to all process in same process group.
887
+ # ServerEngine server process will send SIGTERM to child(spawned) processes by that SIGINT, so
888
+ # worker process SHOULD NOT do anything with SIGINT, SHOULD just ignore.
889
+ trap :INT do
890
+ $log.debug "fluentd main process get SIGINT"
891
+
892
+ # When Fluentd is launched without supervisor, worker should handle ctrl-c by itself
893
+ if @standalone_worker
894
+ @finished = true
895
+ $log.debug "getting start to shutdown main process"
896
+ Fluent::Engine.stop
897
+ end
898
+ end
899
+
900
+ trap :TERM do
901
+ $log.debug "fluentd main process get SIGTERM"
902
+ unless @finished
903
+ @finished = true
904
+ $log.debug "getting start to shutdown main process"
905
+ Fluent::Engine.stop
906
+ end
907
+ end
908
+
909
+ if Fluent.windows?
910
+ install_main_process_command_handlers
911
+ else
912
+ trap :USR1 do
913
+ flush_buffer
914
+ end
915
+
916
+ trap :USR2 do
917
+ reload_config
918
+ end
919
+ end
920
+ end
921
+
922
+ def install_main_process_command_handlers
923
+ command_pipe = $stdin.dup
924
+ $stdin.reopen(File::NULL, "rb")
925
+ command_pipe.binmode
926
+ command_pipe.sync = true
927
+
928
+ Thread.new do
929
+ loop do
930
+ cmd = command_pipe.gets
931
+ break unless cmd
932
+
933
+ case cmd.chomp!
934
+ when "GRACEFUL_STOP", "IMMEDIATE_STOP"
935
+ $log.debug "fluentd main process get #{cmd} command"
936
+ @finished = true
937
+ $log.debug "getting start to shutdown main process"
938
+ Fluent::Engine.stop
939
+ break
940
+ when "GRACEFUL_RESTART"
941
+ $log.debug "fluentd main process get #{cmd} command"
942
+ flush_buffer
943
+ when "RELOAD"
944
+ $log.debug "fluentd main process get #{cmd} command"
945
+ reload_config
946
+ when "DUMP"
947
+ $log.debug "fluentd main process get #{cmd} command"
948
+ dump
949
+ else
950
+ $log.warn "fluentd main process get unknown command [#{cmd}]"
951
+ end
952
+ end
953
+ end
954
+ end
955
+
956
+ def flush_buffer
957
+ # Creating new thread due to mutex can't lock
958
+ # in main thread during trap context
959
+ Thread.new do
960
+ begin
961
+ $log.debug "fluentd main process get SIGUSR1"
962
+ $log.info "force flushing buffered events"
963
+ @log.reopen!
964
+ Fluent::Engine.flush!
965
+ $log.debug "flushing thread: flushed"
966
+ rescue Exception => e
967
+ $log.warn "flushing thread error: #{e}"
968
+ end
969
+ end
970
+ end
971
+
972
+ def reload_config
973
+ Thread.new do
974
+ $log.debug('worker got SIGUSR2')
975
+
976
+ begin
977
+ conf = Fluent::Config.build(
978
+ config_path: @config_path,
979
+ encoding: @conf_encoding,
980
+ additional_config: @inline_config,
981
+ use_v1_config: @use_v1_config,
982
+ type: @config_file_type,
983
+ )
984
+
985
+ Fluent::VariableStore.try_to_reset do
986
+ Fluent::Engine.reload_config(conf)
987
+ end
988
+ rescue => e
989
+ # it is guaranteed that config file is valid by supervisor side. but it's not atomic because of using signals to commnicate between worker and super
990
+ # So need this rescue code
991
+ $log.error("failed to reload config: #{e}")
992
+ next
993
+ end
994
+
995
+ @conf = conf
996
+ end
997
+ end
998
+
999
+ def dump
1000
+ Thread.new do
1001
+ begin
1002
+ FluentSigdump.dump_windows
1003
+ rescue => e
1004
+ $log.error("failed to dump: #{e}")
1005
+ end
1006
+ end
1007
+ end
1008
+
1009
+ def logging_with_console_output
1010
+ yield $log
1011
+ unless @log.stdout?
1012
+ logger = ServerEngine::DaemonLogger.new(STDOUT)
1013
+ log = Fluent::Log.new(logger)
1014
+ log.level = @system_config.log_level
1015
+ console = log.enable_debug
1016
+ yield console
1017
+ end
1018
+ end
1019
+
1020
+ def main_process(&block)
1021
+ if @system_config.process_name
1022
+ if @system_config.workers > 1
1023
+ Process.setproctitle("worker:#{@system_config.process_name}#{ENV['SERVERENGINE_WORKER_ID']}")
1024
+ else
1025
+ Process.setproctitle("worker:#{@system_config.process_name}")
1026
+ end
1027
+ end
1028
+
1029
+ unrecoverable_error = false
1030
+
1031
+ begin
1032
+ block.call
1033
+ rescue Fluent::ConfigError => e
1034
+ logging_with_console_output do |log|
1035
+ log.error "config error", file: @config_path, error: e
1036
+ log.debug_backtrace
1037
+ end
1038
+ unrecoverable_error = true
1039
+ rescue Fluent::UnrecoverableError => e
1040
+ logging_with_console_output do |log|
1041
+ log.error e.message, error: e
1042
+ log.error_backtrace
1043
+ end
1044
+ unrecoverable_error = true
1045
+ rescue ScriptError => e # LoadError, NotImplementedError, SyntaxError
1046
+ logging_with_console_output do |log|
1047
+ if e.respond_to?(:path)
1048
+ log.error e.message, path: e.path, error: e
1049
+ else
1050
+ log.error e.message, error: e
1051
+ end
1052
+ log.error_backtrace
1053
+ end
1054
+ unrecoverable_error = true
1055
+ rescue => e
1056
+ logging_with_console_output do |log|
1057
+ log.error "unexpected error", error: e
1058
+ log.error_backtrace
1059
+ end
1060
+ end
1061
+
1062
+ exit!(unrecoverable_error ? 2 : 1)
1063
+ end
1064
+
1065
+ def build_system_config(conf)
1066
+ system_config = SystemConfig.create(conf, @cl_opt[:strict_config_value])
1067
+ opt = {}
1068
+ Fluent::SystemConfig::SYSTEM_CONFIG_PARAMETERS.each do |param|
1069
+ if @cl_opt.key?(param) && !@cl_opt[param].nil?
1070
+ if param == :log_level && @cl_opt[:log_level] == Fluent::Log::LEVEL_INFO
1071
+ # info level can't be specified via command line option.
1072
+ # log_level is info here, it is default value and <system>'s log_level should be applied if exists.
1073
+ next
1074
+ end
1075
+
1076
+ opt[param] = @cl_opt[param]
1077
+ end
1078
+ end
1079
+ system_config.overwrite_variables(**opt)
1080
+ system_config
1081
+ end
1082
+
1083
+ RUBY_ENCODING_OPTIONS_REGEX = %r{\A(-E|--encoding=|--internal-encoding=|--external-encoding=)}.freeze
1084
+
1085
+ def build_spawn_command
1086
+ if ENV['TEST_RUBY_PATH']
1087
+ fluentd_spawn_cmd = [ENV['TEST_RUBY_PATH']]
1088
+ else
1089
+ fluentd_spawn_cmd = [ServerEngine.ruby_bin_path]
1090
+ end
1091
+
1092
+ rubyopt = ENV['RUBYOPT']
1093
+ if rubyopt
1094
+ encodes, others = rubyopt.split(' ').partition { |e| e.match?(RUBY_ENCODING_OPTIONS_REGEX) }
1095
+ fluentd_spawn_cmd.concat(others)
1096
+
1097
+ adopted_encodes = encodes.empty? ? ['-Eascii-8bit:ascii-8bit'] : encodes
1098
+ fluentd_spawn_cmd.concat(adopted_encodes)
1099
+ else
1100
+ fluentd_spawn_cmd << '-Eascii-8bit:ascii-8bit'
1101
+ end
1102
+
1103
+ # Adding `-h` so that it can avoid ruby's command blocking
1104
+ # e.g. `ruby -Eascii-8bit:ascii-8bit` will block. but `ruby -Eascii-8bit:ascii-8bit -h` won't.
1105
+ _, e, s = Open3.capture3(*fluentd_spawn_cmd, "-h")
1106
+ if s.exitstatus != 0
1107
+ $log.error('Invalid option is passed to RUBYOPT', command: fluentd_spawn_cmd, error: e)
1108
+ exit s.exitstatus
1109
+ end
1110
+
1111
+ fluentd_spawn_cmd << $0
1112
+ fluentd_spawn_cmd += $fluentdargv
1113
+ fluentd_spawn_cmd << '--under-supervisor'
1114
+
1115
+ fluentd_spawn_cmd
1116
+ end
1117
+ end
1118
+
1119
+ module FluentSigdump
1120
+ def self.dump_windows
1121
+ raise "[BUG] WindowsSigdump::dump is for Windows ONLY." unless Fluent.windows?
1122
+
1123
+ # Sigdump outputs under `/tmp` dir without `SIGDUMP_PATH` specified,
1124
+ # but `/tmp` dir may not exist on Windows by default.
1125
+ # So use the systemroot-temp-dir instead.
1126
+ dump_filepath = ENV['SIGDUMP_PATH'].nil? || ENV['SIGDUMP_PATH'].empty? \
1127
+ ? "#{ENV['windir']}/Temp/fluentd-sigdump-#{Process.pid}.log"
1128
+ : get_path_with_pid(ENV['SIGDUMP_PATH'])
1129
+
1130
+ require 'sigdump'
1131
+ Sigdump.dump(dump_filepath)
1132
+
1133
+ $log.info "dump to #{dump_filepath}."
1134
+ end
1135
+
1136
+ def self.get_path_with_pid(raw_path)
1137
+ path = Pathname.new(raw_path)
1138
+ path.sub_ext("-#{Process.pid}#{path.extname}").to_s
1139
+ end
1140
+ end
1141
+ end