fluentd222 1.16.2-x86_64-linux

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