fluentd 1.20.0-aarch64-mingw-ucrt

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 (341) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +116 -0
  3. data/ADOPTERS.md +5 -0
  4. data/AGENTS.md +46 -0
  5. data/AUTHORS +2 -0
  6. data/CHANGELOG.md +3324 -0
  7. data/CONTRIBUTING.md +45 -0
  8. data/GOVERNANCE.md +55 -0
  9. data/GithubWorkflow.md +78 -0
  10. data/LICENSE +202 -0
  11. data/MAINTAINERS.md +19 -0
  12. data/README.md +73 -0
  13. data/Rakefile +89 -0
  14. data/SECURITY.md +47 -0
  15. data/bin/fluent-binlog-reader +7 -0
  16. data/bin/fluent-ca-generate +6 -0
  17. data/bin/fluent-cap-ctl +7 -0
  18. data/bin/fluent-cat +5 -0
  19. data/bin/fluent-ctl +7 -0
  20. data/bin/fluent-debug +5 -0
  21. data/bin/fluent-gem +9 -0
  22. data/bin/fluent-plugin-config-format +5 -0
  23. data/bin/fluent-plugin-generate +5 -0
  24. data/bin/fluentd +15 -0
  25. data/code-of-conduct.md +3 -0
  26. data/docs/SECURITY_AUDIT.pdf +0 -0
  27. data/example/copy_roundrobin.conf +39 -0
  28. data/example/counter.conf +18 -0
  29. data/example/filter_stdout.conf +22 -0
  30. data/example/in_forward.conf +14 -0
  31. data/example/in_forward_client.conf +37 -0
  32. data/example/in_forward_shared_key.conf +15 -0
  33. data/example/in_forward_tls.conf +14 -0
  34. data/example/in_forward_users.conf +24 -0
  35. data/example/in_forward_workers.conf +21 -0
  36. data/example/in_http.conf +16 -0
  37. data/example/in_out_forward.conf +17 -0
  38. data/example/in_sample_blocks.conf +17 -0
  39. data/example/in_sample_with_compression.conf +23 -0
  40. data/example/in_syslog.conf +15 -0
  41. data/example/in_tail.conf +14 -0
  42. data/example/in_tcp.conf +13 -0
  43. data/example/in_udp.conf +13 -0
  44. data/example/logevents.conf +25 -0
  45. data/example/multi_filters.conf +61 -0
  46. data/example/out_copy.conf +20 -0
  47. data/example/out_exec_filter.conf +42 -0
  48. data/example/out_file.conf +13 -0
  49. data/example/out_forward.conf +35 -0
  50. data/example/out_forward_buf_file.conf +23 -0
  51. data/example/out_forward_client.conf +109 -0
  52. data/example/out_forward_heartbeat_none.conf +16 -0
  53. data/example/out_forward_sd.conf +17 -0
  54. data/example/out_forward_shared_key.conf +36 -0
  55. data/example/out_forward_tls.conf +18 -0
  56. data/example/out_forward_users.conf +65 -0
  57. data/example/out_null.conf +36 -0
  58. data/example/sd.yaml +8 -0
  59. data/example/secondary_file.conf +42 -0
  60. data/example/suppress_config_dump.conf +7 -0
  61. data/example/v0_12_filter.conf +78 -0
  62. data/example/v1_literal_example.conf +36 -0
  63. data/example/worker_section.conf +36 -0
  64. data/fluent.conf +139 -0
  65. data/lib/fluent/agent.rb +168 -0
  66. data/lib/fluent/capability.rb +87 -0
  67. data/lib/fluent/clock.rb +66 -0
  68. data/lib/fluent/command/binlog_reader.rb +244 -0
  69. data/lib/fluent/command/bundler_injection.rb +45 -0
  70. data/lib/fluent/command/ca_generate.rb +184 -0
  71. data/lib/fluent/command/cap_ctl.rb +174 -0
  72. data/lib/fluent/command/cat.rb +365 -0
  73. data/lib/fluent/command/ctl.rb +180 -0
  74. data/lib/fluent/command/debug.rb +103 -0
  75. data/lib/fluent/command/fluentd.rb +385 -0
  76. data/lib/fluent/command/plugin_config_formatter.rb +308 -0
  77. data/lib/fluent/command/plugin_generator.rb +365 -0
  78. data/lib/fluent/compat/call_super_mixin.rb +76 -0
  79. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  80. data/lib/fluent/compat/exec_util.rb +144 -0
  81. data/lib/fluent/compat/file_util.rb +54 -0
  82. data/lib/fluent/compat/filter.rb +68 -0
  83. data/lib/fluent/compat/formatter.rb +117 -0
  84. data/lib/fluent/compat/formatter_utils.rb +85 -0
  85. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  86. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  87. data/lib/fluent/compat/input.rb +49 -0
  88. data/lib/fluent/compat/output.rb +721 -0
  89. data/lib/fluent/compat/output_chain.rb +60 -0
  90. data/lib/fluent/compat/parser.rb +310 -0
  91. data/lib/fluent/compat/parser_utils.rb +40 -0
  92. data/lib/fluent/compat/propagate_default.rb +62 -0
  93. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  94. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  95. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  96. data/lib/fluent/compat/socket_util.rb +165 -0
  97. data/lib/fluent/compat/string_util.rb +34 -0
  98. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  99. data/lib/fluent/compat/type_converter.rb +90 -0
  100. data/lib/fluent/config/basic_parser.rb +122 -0
  101. data/lib/fluent/config/configure_proxy.rb +424 -0
  102. data/lib/fluent/config/dsl.rb +152 -0
  103. data/lib/fluent/config/element.rb +265 -0
  104. data/lib/fluent/config/error.rb +44 -0
  105. data/lib/fluent/config/literal_parser.rb +305 -0
  106. data/lib/fluent/config/parser.rb +119 -0
  107. data/lib/fluent/config/section.rb +272 -0
  108. data/lib/fluent/config/types.rb +257 -0
  109. data/lib/fluent/config/v1_parser.rb +200 -0
  110. data/lib/fluent/config/yaml_parser/fluent_value.rb +47 -0
  111. data/lib/fluent/config/yaml_parser/loader.rb +124 -0
  112. data/lib/fluent/config/yaml_parser/parser.rb +179 -0
  113. data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
  114. data/lib/fluent/config/yaml_parser.rb +56 -0
  115. data/lib/fluent/config.rb +89 -0
  116. data/lib/fluent/configurable.rb +202 -0
  117. data/lib/fluent/counter/base_socket.rb +44 -0
  118. data/lib/fluent/counter/client.rb +297 -0
  119. data/lib/fluent/counter/error.rb +86 -0
  120. data/lib/fluent/counter/mutex_hash.rb +163 -0
  121. data/lib/fluent/counter/server.rb +273 -0
  122. data/lib/fluent/counter/store.rb +205 -0
  123. data/lib/fluent/counter/validator.rb +145 -0
  124. data/lib/fluent/counter.rb +23 -0
  125. data/lib/fluent/daemon.rb +14 -0
  126. data/lib/fluent/daemonizer.rb +88 -0
  127. data/lib/fluent/engine.rb +269 -0
  128. data/lib/fluent/env.rb +45 -0
  129. data/lib/fluent/error.rb +37 -0
  130. data/lib/fluent/event.rb +369 -0
  131. data/lib/fluent/event_router.rb +315 -0
  132. data/lib/fluent/ext_monitor_require.rb +28 -0
  133. data/lib/fluent/file_wrapper.rb +137 -0
  134. data/lib/fluent/filter.rb +21 -0
  135. data/lib/fluent/fluent_log_event_router.rb +139 -0
  136. data/lib/fluent/formatter.rb +23 -0
  137. data/lib/fluent/input.rb +21 -0
  138. data/lib/fluent/label.rb +46 -0
  139. data/lib/fluent/load.rb +33 -0
  140. data/lib/fluent/log/console_adapter.rb +66 -0
  141. data/lib/fluent/log.rb +775 -0
  142. data/lib/fluent/match.rb +187 -0
  143. data/lib/fluent/mixin.rb +31 -0
  144. data/lib/fluent/msgpack_factory.rb +111 -0
  145. data/lib/fluent/oj_options.rb +61 -0
  146. data/lib/fluent/output.rb +29 -0
  147. data/lib/fluent/output_chain.rb +23 -0
  148. data/lib/fluent/parser.rb +23 -0
  149. data/lib/fluent/plugin/bare_output.rb +88 -0
  150. data/lib/fluent/plugin/base.rb +219 -0
  151. data/lib/fluent/plugin/buf_file.rb +256 -0
  152. data/lib/fluent/plugin/buf_file_single.rb +272 -0
  153. data/lib/fluent/plugin/buf_memory.rb +34 -0
  154. data/lib/fluent/plugin/buffer/chunk.rb +313 -0
  155. data/lib/fluent/plugin/buffer/file_chunk.rb +432 -0
  156. data/lib/fluent/plugin/buffer/file_single_chunk.rb +325 -0
  157. data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
  158. data/lib/fluent/plugin/buffer.rb +1063 -0
  159. data/lib/fluent/plugin/compressable.rb +87 -0
  160. data/lib/fluent/plugin/exec_util.rb +22 -0
  161. data/lib/fluent/plugin/extractor.rb +132 -0
  162. data/lib/fluent/plugin/file_util.rb +22 -0
  163. data/lib/fluent/plugin/filter.rb +119 -0
  164. data/lib/fluent/plugin/filter_grep.rb +189 -0
  165. data/lib/fluent/plugin/filter_parser.rb +124 -0
  166. data/lib/fluent/plugin/filter_record_transformer.rb +325 -0
  167. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  168. data/lib/fluent/plugin/formatter.rb +75 -0
  169. data/lib/fluent/plugin/formatter_csv.rb +92 -0
  170. data/lib/fluent/plugin/formatter_hash.rb +35 -0
  171. data/lib/fluent/plugin/formatter_json.rb +62 -0
  172. data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
  173. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  174. data/lib/fluent/plugin/formatter_out_file.rb +55 -0
  175. data/lib/fluent/plugin/formatter_single_value.rb +36 -0
  176. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  177. data/lib/fluent/plugin/formatter_tsv.rb +40 -0
  178. data/lib/fluent/plugin/in_debug_agent.rb +71 -0
  179. data/lib/fluent/plugin/in_dummy.rb +18 -0
  180. data/lib/fluent/plugin/in_exec.rb +124 -0
  181. data/lib/fluent/plugin/in_forward.rb +489 -0
  182. data/lib/fluent/plugin/in_gc_stat.rb +72 -0
  183. data/lib/fluent/plugin/in_http.rb +737 -0
  184. data/lib/fluent/plugin/in_monitor_agent.rb +406 -0
  185. data/lib/fluent/plugin/in_object_space.rb +93 -0
  186. data/lib/fluent/plugin/in_sample.rb +148 -0
  187. data/lib/fluent/plugin/in_syslog.rb +346 -0
  188. data/lib/fluent/plugin/in_tail/compatibility.rb +111 -0
  189. data/lib/fluent/plugin/in_tail/dir_watcher.rb +713 -0
  190. data/lib/fluent/plugin/in_tail/group_watch.rb +204 -0
  191. data/lib/fluent/plugin/in_tail/io_handler.rb +391 -0
  192. data/lib/fluent/plugin/in_tail/line_feeder.rb +230 -0
  193. data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
  194. data/lib/fluent/plugin/in_tail/stat_watcher.rb +52 -0
  195. data/lib/fluent/plugin/in_tail/tail_watcher.rb +276 -0
  196. data/lib/fluent/plugin/in_tail/worker_pool.rb +298 -0
  197. data/lib/fluent/plugin/in_tail.rb +917 -0
  198. data/lib/fluent/plugin/in_tcp.rb +230 -0
  199. data/lib/fluent/plugin/in_udp.rb +101 -0
  200. data/lib/fluent/plugin/in_unix.rb +197 -0
  201. data/lib/fluent/plugin/input.rb +71 -0
  202. data/lib/fluent/plugin/metrics.rb +119 -0
  203. data/lib/fluent/plugin/metrics_local.rb +96 -0
  204. data/lib/fluent/plugin/multi_output.rb +179 -0
  205. data/lib/fluent/plugin/out_buffer.rb +40 -0
  206. data/lib/fluent/plugin/out_copy.rb +120 -0
  207. data/lib/fluent/plugin/out_exec.rb +105 -0
  208. data/lib/fluent/plugin/out_exec_filter.rb +319 -0
  209. data/lib/fluent/plugin/out_file.rb +371 -0
  210. data/lib/fluent/plugin/out_forward/ack_handler.rb +176 -0
  211. data/lib/fluent/plugin/out_forward/connection_manager.rb +131 -0
  212. data/lib/fluent/plugin/out_forward/error.rb +28 -0
  213. data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
  214. data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
  215. data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
  216. data/lib/fluent/plugin/out_forward/socket_cache.rb +177 -0
  217. data/lib/fluent/plugin/out_forward.rb +865 -0
  218. data/lib/fluent/plugin/out_http.rb +419 -0
  219. data/lib/fluent/plugin/out_null.rb +74 -0
  220. data/lib/fluent/plugin/out_relabel.rb +32 -0
  221. data/lib/fluent/plugin/out_roundrobin.rb +84 -0
  222. data/lib/fluent/plugin/out_secondary_file.rb +148 -0
  223. data/lib/fluent/plugin/out_stdout.rb +81 -0
  224. data/lib/fluent/plugin/out_stream.rb +130 -0
  225. data/lib/fluent/plugin/output.rb +1688 -0
  226. data/lib/fluent/plugin/owned_by_mixin.rb +41 -0
  227. data/lib/fluent/plugin/parser.rb +274 -0
  228. data/lib/fluent/plugin/parser_apache.rb +28 -0
  229. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  230. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  231. data/lib/fluent/plugin/parser_csv.rb +124 -0
  232. data/lib/fluent/plugin/parser_json.rb +118 -0
  233. data/lib/fluent/plugin/parser_ltsv.rb +49 -0
  234. data/lib/fluent/plugin/parser_msgpack.rb +72 -0
  235. data/lib/fluent/plugin/parser_multiline.rb +152 -0
  236. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  237. data/lib/fluent/plugin/parser_none.rb +36 -0
  238. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  239. data/lib/fluent/plugin/parser_syslog.rb +543 -0
  240. data/lib/fluent/plugin/parser_tsv.rb +47 -0
  241. data/lib/fluent/plugin/sd_file.rb +157 -0
  242. data/lib/fluent/plugin/sd_srv.rb +135 -0
  243. data/lib/fluent/plugin/sd_static.rb +58 -0
  244. data/lib/fluent/plugin/service_discovery.rb +65 -0
  245. data/lib/fluent/plugin/socket_util.rb +22 -0
  246. data/lib/fluent/plugin/storage.rb +84 -0
  247. data/lib/fluent/plugin/storage_local.rb +166 -0
  248. data/lib/fluent/plugin/string_util.rb +22 -0
  249. data/lib/fluent/plugin.rb +206 -0
  250. data/lib/fluent/plugin_helper/cert_option.rb +199 -0
  251. data/lib/fluent/plugin_helper/child_process.rb +369 -0
  252. data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
  253. data/lib/fluent/plugin_helper/counter.rb +51 -0
  254. data/lib/fluent/plugin_helper/event_emitter.rb +112 -0
  255. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  256. data/lib/fluent/plugin_helper/extract.rb +104 -0
  257. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  258. data/lib/fluent/plugin_helper/http_server/app.rb +81 -0
  259. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  260. data/lib/fluent/plugin_helper/http_server/request.rb +53 -0
  261. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  262. data/lib/fluent/plugin_helper/http_server/server.rb +116 -0
  263. data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
  264. data/lib/fluent/plugin_helper/http_server.rb +129 -0
  265. data/lib/fluent/plugin_helper/inject.rb +154 -0
  266. data/lib/fluent/plugin_helper/metrics.rb +136 -0
  267. data/lib/fluent/plugin_helper/parser.rb +147 -0
  268. data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
  269. data/lib/fluent/plugin_helper/retry_state.rb +219 -0
  270. data/lib/fluent/plugin_helper/server.rb +840 -0
  271. data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
  272. data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
  273. data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
  274. data/lib/fluent/plugin_helper/socket.rb +288 -0
  275. data/lib/fluent/plugin_helper/socket_option.rb +98 -0
  276. data/lib/fluent/plugin_helper/storage.rb +349 -0
  277. data/lib/fluent/plugin_helper/thread.rb +180 -0
  278. data/lib/fluent/plugin_helper/timer.rb +92 -0
  279. data/lib/fluent/plugin_helper.rb +75 -0
  280. data/lib/fluent/plugin_id.rb +93 -0
  281. data/lib/fluent/process.rb +22 -0
  282. data/lib/fluent/registry.rb +117 -0
  283. data/lib/fluent/root_agent.rb +468 -0
  284. data/lib/fluent/rpc.rb +95 -0
  285. data/lib/fluent/source_only_buffer_agent.rb +102 -0
  286. data/lib/fluent/static_config_analysis.rb +195 -0
  287. data/lib/fluent/supervisor.rb +1347 -0
  288. data/lib/fluent/system_config.rb +213 -0
  289. data/lib/fluent/test/base.rb +83 -0
  290. data/lib/fluent/test/driver/base.rb +231 -0
  291. data/lib/fluent/test/driver/base_owned.rb +83 -0
  292. data/lib/fluent/test/driver/base_owner.rb +135 -0
  293. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  294. data/lib/fluent/test/driver/filter.rb +61 -0
  295. data/lib/fluent/test/driver/formatter.rb +30 -0
  296. data/lib/fluent/test/driver/input.rb +31 -0
  297. data/lib/fluent/test/driver/multi_output.rb +53 -0
  298. data/lib/fluent/test/driver/output.rb +102 -0
  299. data/lib/fluent/test/driver/parser.rb +30 -0
  300. data/lib/fluent/test/driver/storage.rb +30 -0
  301. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  302. data/lib/fluent/test/filter_test.rb +77 -0
  303. data/lib/fluent/test/formatter_test.rb +65 -0
  304. data/lib/fluent/test/helpers.rb +138 -0
  305. data/lib/fluent/test/input_test.rb +174 -0
  306. data/lib/fluent/test/log.rb +79 -0
  307. data/lib/fluent/test/output_test.rb +156 -0
  308. data/lib/fluent/test/parser_test.rb +70 -0
  309. data/lib/fluent/test/startup_shutdown.rb +44 -0
  310. data/lib/fluent/test.rb +61 -0
  311. data/lib/fluent/time.rb +513 -0
  312. data/lib/fluent/timezone.rb +171 -0
  313. data/lib/fluent/tls.rb +105 -0
  314. data/lib/fluent/unique_id.rb +39 -0
  315. data/lib/fluent/variable_store.rb +40 -0
  316. data/lib/fluent/version.rb +21 -0
  317. data/lib/fluent/win32api.rb +38 -0
  318. data/lib/fluent/winsvc.rb +130 -0
  319. data/templates/new_gem/.gitignore +8 -0
  320. data/templates/new_gem/Gemfile +3 -0
  321. data/templates/new_gem/README.md.erb +43 -0
  322. data/templates/new_gem/Rakefile +13 -0
  323. data/templates/new_gem/fluent-plugin.gemspec.erb +28 -0
  324. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  325. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  326. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  327. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  328. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  329. data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
  330. data/templates/new_gem/test/helper.rb.erb +7 -0
  331. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  332. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  333. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  334. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  335. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  336. data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
  337. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  338. data/templates/plugin_config_formatter/param.md-table.erb +10 -0
  339. data/templates/plugin_config_formatter/param.md.erb +34 -0
  340. data/templates/plugin_config_formatter/section.md.erb +12 -0
  341. metadata +996 -0
@@ -0,0 +1,406 @@
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 'json'
18
+
19
+ require 'fluent/env'
20
+ require 'fluent/config/types'
21
+ require 'fluent/plugin/input'
22
+ require 'fluent/plugin/output'
23
+ require 'fluent/plugin/multi_output'
24
+ require 'fluent/plugin/filter'
25
+
26
+ module Fluent::Plugin
27
+ class MonitorAgentInput < Input
28
+ Fluent::Plugin.register_input('monitor_agent', self)
29
+
30
+ helpers :timer, :thread, :http_server
31
+
32
+ desc 'The address to bind to.'
33
+ config_param :bind, :string, default: '0.0.0.0'
34
+ desc 'The port to listen to.'
35
+ config_param :port, :integer, default: 24220
36
+ desc 'The tag with which internal metrics are emitted.'
37
+ config_param :tag, :string, default: nil
38
+ desc 'Determine the rate to emit internal metrics as events.'
39
+ config_param :emit_interval, :time, default: 60
40
+ desc 'Determine whether to include the config information.'
41
+ config_param :include_config, :bool, default: false
42
+ desc 'Determine whether to include the retry information.'
43
+ config_param :include_retry, :bool, default: false
44
+ desc 'Determine whether to include the debug information.'
45
+ config_param :include_debug_info, :bool, default: false
46
+
47
+ class APIHandler
48
+ def initialize(agent)
49
+ @agent = agent
50
+ end
51
+
52
+ def plugins_ltsv(req)
53
+ list = build_object(build_option(req))
54
+
55
+ render_ltsv(list)
56
+ end
57
+
58
+ def plugins_json(req)
59
+ opts = build_option(req)
60
+ obj = build_object(opts)
61
+
62
+ render_json({ 'plugins' => obj }, pretty_json: opts[:pretty_json])
63
+ end
64
+
65
+ def config_ltsv(_req)
66
+ obj = {
67
+ 'pid' => Process.pid,
68
+ 'ppid' => Process.ppid,
69
+ 'version' => Fluent::VERSION,
70
+ }.merge(@agent.fluentd_opts)
71
+
72
+ render_ltsv([obj])
73
+ end
74
+
75
+ def config_json(req)
76
+ obj = {
77
+ 'pid' => Process.pid,
78
+ 'ppid' => Process.ppid,
79
+ 'version' => Fluent::VERSION,
80
+ }.merge(@agent.fluentd_opts)
81
+ opts = build_option(req)
82
+
83
+ render_json(obj, pretty_json: opts[:pretty_json])
84
+ end
85
+
86
+ private
87
+
88
+ def render_error_json(code:, msg:, pretty_json: nil, **additional_params)
89
+ resp = additional_params.merge('message' => msg)
90
+ render_json(resp, code: code, pretty_json: pretty_json)
91
+ end
92
+
93
+ def render_json(obj, code: 200, pretty_json: nil)
94
+ body =
95
+ if pretty_json
96
+ JSON.pretty_generate(obj)
97
+ else
98
+ obj.to_json
99
+ end
100
+
101
+ [code, { 'Content-Type' => 'application/json' }, body]
102
+ end
103
+
104
+ def render_ltsv(obj, code: 200)
105
+ normalized = JSON.parse(obj.to_json, **Fluent::DEFAULT_JSON_PARSE_OPTIONS)
106
+ text = ''
107
+ normalized.each do |hash|
108
+ row = []
109
+ hash.each do |k, v|
110
+ if v.is_a?(Array)
111
+ row << "#{k}:#{v.join(',')}"
112
+ elsif v.is_a?(Hash)
113
+ next
114
+ else
115
+ row << "#{k}:#{v}"
116
+ end
117
+ end
118
+
119
+ text << row.join("\t") << "\n"
120
+ end
121
+
122
+ [code, { 'Content-Type' => 'text/plain' }, text]
123
+ end
124
+
125
+ def build_object(opts)
126
+ qs = opts[:query]
127
+ if tag = qs['tag'.freeze].first
128
+ # ?tag= to search an output plugin by match pattern
129
+ if obj = @agent.plugin_info_by_tag(tag, opts)
130
+ list = [obj]
131
+ else
132
+ list = []
133
+ end
134
+ elsif plugin_id = (qs['@id'.freeze].first || qs['id'.freeze].first)
135
+ # ?@id= to search a plugin by 'id <plugin_id>' config param
136
+ if obj = @agent.plugin_info_by_id(plugin_id, opts)
137
+ list = [obj]
138
+ else
139
+ list = []
140
+ end
141
+ elsif plugin_type = (qs['@type'.freeze].first || qs['type'.freeze].first)
142
+ # ?@type= to search plugins by 'type <type>' config param
143
+ list = @agent.plugins_info_by_type(plugin_type, opts)
144
+ else
145
+ # otherwise show all plugins
146
+ list = @agent.plugins_info_all(opts)
147
+ end
148
+
149
+ list
150
+ end
151
+
152
+ def build_option(req)
153
+ qs = Hash.new { |_, _| [] }
154
+ # parse ?=query string
155
+ qs.merge!(req.query || {})
156
+
157
+ opts = {
158
+ query: qs,
159
+ with_config: @agent.include_config,
160
+ with_retry: @agent.include_retry
161
+ }
162
+
163
+ if @agent.include_debug_info
164
+ # if ?debug=1 is set, set :with_debug_info for get_monitor_info
165
+ # and :pretty_json for render_json_error
166
+ if qs['debug'.freeze].first
167
+ opts[:with_debug_info] = true
168
+ opts[:pretty_json] = true
169
+ end
170
+
171
+ if ivars = qs['with_ivars'.freeze].first
172
+ opts[:ivars] = ivars.split(',')
173
+ end
174
+ end
175
+
176
+ opts
177
+ end
178
+ end
179
+
180
+ def initialize
181
+ super
182
+
183
+ @first_warn = false
184
+ end
185
+
186
+ def configure(conf)
187
+ super
188
+ @port += fluentd_worker_id
189
+ end
190
+
191
+ def multi_workers_ready?
192
+ true
193
+ end
194
+
195
+ class NotFoundJson
196
+ BODY = { 'message' => 'Not found' }.to_json
197
+ def self.call(_req)
198
+ [404, { 'Content-Type' => 'application/json' }, BODY]
199
+ end
200
+ end
201
+
202
+ def start
203
+ super
204
+
205
+ log.debug { "listening monitoring http server on http://#{@bind}:#{@port}/api/plugins for worker#{fluentd_worker_id}" }
206
+ api_handler = APIHandler.new(self)
207
+ http_server_create_http_server(:in_monitor_http_server_helper, addr: @bind, port: @port, logger: log, default_app: NotFoundJson) do |serv|
208
+ serv.get('/api/plugins') { |req| api_handler.plugins_ltsv(req) }
209
+ serv.get('/api/plugins.json') { |req| api_handler.plugins_json(req) }
210
+ serv.get('/api/config') { |req| api_handler.config_ltsv(req) }
211
+ serv.get('/api/config.json') { |req| api_handler.config_json(req) }
212
+ end
213
+
214
+ if @tag
215
+ log.debug { "tag parameter is specified. Emit plugins info to '#{@tag}'" }
216
+
217
+ opts = {with_config: false, with_retry: false}
218
+ timer_execute(:in_monitor_agent_emit, @emit_interval, repeat: true) {
219
+ es = Fluent::MultiEventStream.new
220
+ now = Fluent::EventTime.now
221
+ plugins_info_all(opts).each { |record|
222
+ es.add(now, record)
223
+ }
224
+ router.emit_stream(@tag, es)
225
+ }
226
+ end
227
+ end
228
+
229
+ # They are deprecated but remain for compatibility
230
+ MONITOR_INFO = {
231
+ 'output_plugin' => ->(){ is_a?(::Fluent::Plugin::Output) },
232
+ 'buffer_queue_length' => ->(){ throw(:skip) unless instance_variable_defined?(:@buffer) && !@buffer.nil? && @buffer.is_a?(::Fluent::Plugin::Buffer); @buffer.queue.size },
233
+ 'buffer_timekeys' => ->(){ throw(:skip) unless instance_variable_defined?(:@buffer) && !@buffer.nil? && @buffer.is_a?(::Fluent::Plugin::Buffer); @buffer.timekeys },
234
+ 'buffer_total_queued_size' => ->(){ throw(:skip) unless instance_variable_defined?(:@buffer) && !@buffer.nil? && @buffer.is_a?(::Fluent::Plugin::Buffer); @buffer.stage_size + @buffer.queue_size },
235
+ 'retry_count' => ->(){ respond_to?(:num_errors) ? num_errors : nil },
236
+ }
237
+
238
+ def all_plugins
239
+ array = []
240
+
241
+ # get all input plugins
242
+ array.concat Fluent::Engine.root_agent.inputs
243
+
244
+ # get all output plugins
245
+ array.concat Fluent::Engine.root_agent.outputs
246
+
247
+ # get all filter plugins
248
+ array.concat Fluent::Engine.root_agent.filters
249
+
250
+ Fluent::Engine.root_agent.labels.each { |name, l|
251
+ # TODO: Add label name to outputs / filters for identifying plugins
252
+ array.concat l.outputs
253
+ array.concat l.filters
254
+ }
255
+
256
+ array
257
+ end
258
+
259
+ # try to match the tag and get the info from the matched output plugin
260
+ # TODO: Support output in label
261
+ def plugin_info_by_tag(tag, opts={})
262
+ matches = Fluent::Engine.root_agent.event_router.instance_variable_get(:@match_rules)
263
+ matches.each { |rule|
264
+ if rule.match?(tag)
265
+ if rule.collector.is_a?(Fluent::Plugin::Output) || rule.collector.is_a?(Fluent::Output)
266
+ return get_monitor_info(rule.collector, opts)
267
+ end
268
+ end
269
+ }
270
+ nil
271
+ end
272
+
273
+ # search a plugin by plugin_id
274
+ def plugin_info_by_id(plugin_id, opts={})
275
+ found = all_plugins.find {|pe|
276
+ pe.respond_to?(:plugin_id) && pe.plugin_id.to_s == plugin_id
277
+ }
278
+ if found
279
+ get_monitor_info(found, opts)
280
+ else
281
+ nil
282
+ end
283
+ end
284
+
285
+ # This method returns an array because
286
+ # multiple plugins could have the same type
287
+ def plugins_info_by_type(type, opts={})
288
+ array = all_plugins.select {|pe|
289
+ (pe.config['@type'] == type) rescue nil
290
+ }
291
+ array.map {|pe|
292
+ get_monitor_info(pe, opts)
293
+ }
294
+ end
295
+
296
+ def plugins_info_all(opts={})
297
+ all_plugins.map {|pe|
298
+ get_monitor_info(pe, opts)
299
+ }
300
+ end
301
+
302
+ IGNORE_ATTRIBUTES = %i(@config_root_section @config @masked_config)
303
+
304
+ # get monitor info from the plugin `pe` and return a hash object
305
+ def get_monitor_info(pe, opts={})
306
+ obj = {}
307
+
308
+ # Common plugin information
309
+ obj['plugin_id'] = pe.plugin_id
310
+ obj['plugin_category'] = plugin_category(pe)
311
+ obj['type'] = pe.config['@type']
312
+ obj['config'] = pe.config if opts[:with_config]
313
+
314
+ # run MONITOR_INFO in plugins' instance context and store the info to obj
315
+ MONITOR_INFO.each_pair {|key,code|
316
+ begin
317
+ catch(:skip) do
318
+ obj[key] = pe.instance_exec(&code)
319
+ end
320
+ rescue NoMethodError => e
321
+ unless @first_warn
322
+ log.error "NoMethodError in monitoring plugins", key: key, plugin: pe.class, error: e
323
+ log.error_backtrace
324
+ @first_warn = true
325
+ end
326
+ rescue => e
327
+ log.warn "unexpected error in monitoring plugins", key: key, plugin: pe.class, error: e
328
+ end
329
+ }
330
+
331
+ if pe.respond_to?(:statistics)
332
+ obj.merge!(pe.statistics.dig('output') || {})
333
+ obj.merge!(pe.statistics.dig('filter') || {})
334
+ obj.merge!(pe.statistics.dig('input') || {})
335
+ end
336
+
337
+ obj['retry'] = get_retry_info(pe.retry) if opts[:with_retry] && pe.instance_variable_defined?(:@retry)
338
+
339
+ # include all instance variables if :with_debug_info is set
340
+ if opts[:with_debug_info]
341
+ iv = {}
342
+ pe.instance_eval do
343
+ instance_variables.each {|sym|
344
+ next if IGNORE_ATTRIBUTES.include?(sym)
345
+ key = sym.to_s[1..-1] # removes first '@'
346
+ iv[key] = instance_variable_get(sym)
347
+ }
348
+ end
349
+ obj['instance_variables'] = iv
350
+ elsif ivars = opts[:ivars]
351
+ iv = {}
352
+ ivars.each {|name|
353
+ iname = "@#{name}"
354
+ iv[name] = pe.instance_variable_get(iname) if pe.instance_variable_defined?(iname)
355
+ }
356
+ obj['instance_variables'] = iv
357
+ end
358
+
359
+ obj
360
+ end
361
+
362
+ RETRY_INFO = {
363
+ 'start' => '@start',
364
+ 'steps' => '@steps',
365
+ 'next_time' => '@next_time',
366
+ }
367
+
368
+ def get_retry_info(pe_retry)
369
+ retry_variables = {}
370
+
371
+ if pe_retry
372
+ RETRY_INFO.each_pair { |key, param|
373
+ retry_variables[key] = pe_retry.instance_variable_get(param)
374
+ }
375
+ end
376
+
377
+ retry_variables
378
+ end
379
+
380
+ def plugin_category(pe)
381
+ case pe
382
+ when Fluent::Plugin::Input
383
+ 'input'.freeze
384
+ when Fluent::Plugin::Output, Fluent::Plugin::MultiOutput, Fluent::Plugin::BareOutput
385
+ 'output'.freeze
386
+ when Fluent::Plugin::Filter
387
+ 'filter'.freeze
388
+ else
389
+ 'unknown'.freeze
390
+ end
391
+ end
392
+
393
+ def fluentd_opts
394
+ @fluentd_opts ||= get_fluentd_opts
395
+ end
396
+
397
+ def get_fluentd_opts
398
+ opts = {}
399
+ ObjectSpace.each_object(Fluent::Supervisor) { |obj|
400
+ opts.merge!(obj.options)
401
+ break
402
+ }
403
+ opts
404
+ end
405
+ end
406
+ end
@@ -0,0 +1,93 @@
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 'json'
18
+
19
+ require 'fluent/plugin/input'
20
+
21
+ module Fluent::Plugin
22
+ class ObjectSpaceInput < Fluent::Plugin::Input
23
+ Fluent::Plugin.register_input('object_space', self)
24
+
25
+ helpers :timer
26
+
27
+ def initialize
28
+ super
29
+ end
30
+
31
+ config_param :emit_interval, :time, default: 60
32
+ config_param :tag, :string
33
+ config_param :top, :integer, default: 15
34
+
35
+ def multi_workers_ready?
36
+ true
37
+ end
38
+
39
+ def start
40
+ super
41
+
42
+ timer_execute(:object_space_input, @emit_interval, &method(:on_timer))
43
+ end
44
+
45
+ class Counter
46
+ def initialize(klass, init_count)
47
+ @klass = klass
48
+ @count = init_count
49
+ end
50
+
51
+ def incr!
52
+ @count += 1
53
+ end
54
+
55
+ def name
56
+ @klass.name
57
+ end
58
+
59
+ attr_reader :count
60
+ end
61
+
62
+ def on_timer
63
+ now = Fluent::EventTime.now
64
+
65
+ array = []
66
+ map = {}
67
+
68
+ ObjectSpace.each_object {|obj|
69
+ klass = obj.class rescue Object
70
+ if c = map[klass]
71
+ c.incr!
72
+ else
73
+ c = Counter.new(klass, 1)
74
+ array << c
75
+ map[klass] = c
76
+ end
77
+ }
78
+
79
+ array.sort_by! {|c| -c.count }
80
+
81
+ record = {}
82
+ array.each_with_index {|c,i|
83
+ break if i >= @top
84
+ record[c.name] = c.count
85
+ }
86
+
87
+ router.emit(@tag, now, record)
88
+ rescue => e
89
+ log.error "object space failed to emit", error: e, tag: @tag, record: JSON.generate(record)
90
+ log.error_backtrace
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,148 @@
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 'json'
18
+
19
+ require 'fluent/env'
20
+ require 'fluent/plugin/input'
21
+ require 'fluent/config/error'
22
+
23
+ module Fluent::Plugin
24
+ class SampleInput < Input
25
+ Fluent::Plugin.register_input('sample', self)
26
+ Fluent::Plugin.register_input('dummy', self)
27
+
28
+ helpers :thread, :storage
29
+
30
+ BIN_NUM = 10
31
+ DEFAULT_STORAGE_TYPE = 'local'
32
+
33
+ desc "The value is the tag assigned to the generated events."
34
+ config_param :tag, :string
35
+ desc "The number of events in event stream of each emits."
36
+ config_param :size, :integer, default: 1
37
+ desc "It configures how many events to generate per second."
38
+ config_param :rate, :integer, default: 1
39
+ desc "If specified, each generated event has an auto-incremented key field."
40
+ config_param :auto_increment_key, :string, default: nil
41
+ desc "The boolean to suspend-and-resume incremental value after restart"
42
+ config_param :suspend, :bool, default: false,deprecated: 'This parameters is ignored'
43
+ desc "Reuse the sample data to reduce the load when sending large amounts of data. You can enable it if filter does not do destructive change"
44
+ config_param :reuse_record, :bool, default: false
45
+ desc "The sample data to be generated. An array of JSON hashes or a single JSON hash."
46
+ config_param :sample, alias: :dummy, default: [{"message" => "sample"}] do |val|
47
+ begin
48
+ parsed = JSON.parse(val, **Fluent::DEFAULT_JSON_PARSE_OPTIONS)
49
+ rescue JSON::ParserError => ex
50
+ # Fluent::ConfigParseError, "got incomplete JSON" will be raised
51
+ # at literal_parser.rb with --use-v1-config, but I had to
52
+ # take care at here for the case of --use-v0-config.
53
+ raise Fluent::ConfigError, "#{ex.class}: #{ex.message}"
54
+ end
55
+ sample = parsed.is_a?(Array) ? parsed : [parsed]
56
+ sample.each_with_index do |e, i|
57
+ raise Fluent::ConfigError, "#{i}th element of sample, #{e}, is not a hash" unless e.is_a?(Hash)
58
+ end
59
+ sample
60
+ end
61
+
62
+ def initialize
63
+ super
64
+ @storage = nil
65
+ end
66
+
67
+ def configure(conf)
68
+ super
69
+ @sample_index = 0
70
+ config = conf.elements.find{|e| e.name == 'storage' }
71
+ @storage = storage_create(usage: 'suspend', conf: config, default_type: DEFAULT_STORAGE_TYPE)
72
+ end
73
+
74
+ def multi_workers_ready?
75
+ true
76
+ end
77
+
78
+ def start
79
+ super
80
+
81
+ @storage.put(:increment_value, 0) unless @storage.get(:increment_value)
82
+ # keep 'dummy' to avoid breaking changes for existing environment. Change it in fluentd v2
83
+ @storage.put(:dummy_index, 0) unless @storage.get(:dummy_index)
84
+
85
+ if @auto_increment_key && !@storage.get(:auto_increment_value)
86
+ @storage.put(:auto_increment_value, -1)
87
+ end
88
+
89
+ thread_create(:sample_input, &method(:run))
90
+ end
91
+
92
+ def run
93
+ batch_num = (@rate / BIN_NUM).to_i
94
+ residual_num = (@rate % BIN_NUM)
95
+ while thread_current_running?
96
+ current_time = Time.now.to_i
97
+ BIN_NUM.times do
98
+ break unless (thread_current_running? && Time.now.to_i <= current_time)
99
+ wait(0.1) { emit(batch_num) }
100
+ end
101
+ emit(residual_num) if thread_current_running?
102
+ # wait for next second
103
+ while thread_current_running? && Time.now.to_i <= current_time
104
+ sleep 0.01
105
+ end
106
+ end
107
+ end
108
+
109
+ def emit(num)
110
+ begin
111
+ if @size > 1
112
+ num.times do
113
+ router.emit_array(@tag, Array.new(@size) { [Fluent::EventTime.now, generate] })
114
+ end
115
+ else
116
+ num.times { router.emit(@tag, Fluent::EventTime.now, generate) }
117
+ end
118
+ rescue => _
119
+ # ignore all errors not to stop emits by emit errors
120
+ end
121
+ end
122
+
123
+ def next_sample
124
+ d = @reuse_record ? @sample[@sample_index] : @sample[@sample_index].dup
125
+ @sample_index += 1
126
+ return d if d
127
+
128
+ @sample_index = 0
129
+ next_sample
130
+ end
131
+
132
+ def generate
133
+ d = next_sample
134
+ if @auto_increment_key
135
+ d = d.dup if @reuse_record
136
+ d[@auto_increment_key] = @storage.update(:auto_increment_value){|v| v + 1 }
137
+ end
138
+ d
139
+ end
140
+
141
+ def wait(time)
142
+ start_time = Time.now
143
+ yield
144
+ sleep_time = time - (Time.now - start_time)
145
+ sleep sleep_time if sleep_time > 0
146
+ end
147
+ end
148
+ end