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,41 @@
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
+ module Fluent
18
+ module Plugin
19
+ module OwnedByMixin
20
+ def owner=(plugin)
21
+ @_owner = plugin
22
+
23
+ @_plugin_id = plugin.plugin_id
24
+
25
+ @log = plugin.log
26
+ end
27
+
28
+ def owner
29
+ if instance_variable_defined?(:@_owner)
30
+ @_owner
31
+ end
32
+ end
33
+
34
+ def log
35
+ if instance_variable_defined?(:@log)
36
+ @log
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,274 @@
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 'fluent/plugin/base'
18
+ require 'fluent/plugin/owned_by_mixin'
19
+
20
+ require 'fluent/error'
21
+ require 'fluent/mixin' # for TypeConverter
22
+ require 'fluent/time'
23
+ require 'fluent/plugin/string_util'
24
+
25
+ require 'serverengine/blocking_flag'
26
+
27
+ module Fluent
28
+ module Plugin
29
+ class Parser < Base
30
+ class TimeoutChecker
31
+ # This implementation now uses mutex because parser is typically used in input.
32
+ # If this has a performance issue under high concurrent, use concurrent-ruby's map instead.
33
+ def initialize(timeout)
34
+ @map = {}
35
+ @flag = ServerEngine::BlockingFlag.new
36
+ @mutex = Mutex.new
37
+ @timeout = timeout
38
+ @timeout_checker = nil
39
+ end
40
+
41
+ def start
42
+ @thread = ::Thread.new {
43
+ until @flag.wait_for_set(0.5)
44
+ now = Time.now
45
+ @mutex.synchronize {
46
+ @map.keys.each { |th|
47
+ time = @map[th]
48
+ if now - time > @timeout
49
+ @map.delete(th)
50
+ th.raise UncatchableError, "parsing timed out"
51
+ end
52
+ }
53
+ }
54
+ end
55
+ }
56
+ end
57
+
58
+ def stop
59
+ @flag.set!
60
+ @thread.join
61
+ end
62
+
63
+ def execute
64
+ th = Thread.current
65
+ @mutex.synchronize { @map[th] = Time.now }
66
+ yield
67
+ ensure
68
+ # Need clean up here because if next event is delayed, incorrect exception will be raised in normal flow.
69
+ @mutex.synchronize { @map.delete(th) }
70
+ end
71
+ end
72
+
73
+ include OwnedByMixin
74
+ include TimeMixin::Parser
75
+
76
+ class ParserError < StandardError; end
77
+
78
+ configured_in :parse
79
+
80
+ ### types can be specified as string-based hash style
81
+ # field1:type, field2:type, field3:type:option, field4:type:option
82
+ ### or, JSON format
83
+ # {"field1":"type", "field2":"type", "field3":"type:option", "field4":"type:option"}
84
+ config_param :types, :hash, value_type: :string, default: nil
85
+
86
+ # available options are:
87
+ # array: (1st) delimiter
88
+ # time : type[, format, timezone] -> type should be a valid "time_type"(string/unixtime/float)
89
+ # : format[, timezone]
90
+
91
+ config_param :time_key, :string, default: nil
92
+ config_param :null_value_pattern, :regexp, default: nil
93
+ config_param :null_empty_string, :bool, default: false
94
+ config_param :estimate_current_event, :bool, default: true
95
+ config_param :keep_time_key, :bool, default: false
96
+ config_param :timeout, :time, default: nil
97
+
98
+ AVAILABLE_PARSER_VALUE_TYPES = ['string', 'integer', 'float', 'bool', 'time', 'array']
99
+
100
+ # for tests
101
+ attr_reader :type_converters
102
+
103
+ PARSER_TYPES = [:text_per_line, :text, :binary]
104
+ def parser_type
105
+ :text_per_line
106
+ end
107
+
108
+ def initialize
109
+ super
110
+
111
+ @timeout_checker = nil
112
+ end
113
+
114
+ def configure(conf)
115
+ super
116
+
117
+ @time_parser = time_parser_create
118
+ @type_converters = build_type_converters(@types)
119
+ @execute_convert_values = @type_converters || @null_value_pattern || @null_empty_string
120
+ @timeout_checker = if @timeout
121
+ class << self
122
+ alias_method :parse_orig, :parse
123
+ alias_method :parse, :parse_with_timeout
124
+ end
125
+ TimeoutChecker.new(@timeout)
126
+ else
127
+ nil
128
+ end
129
+ end
130
+
131
+ def start
132
+ super
133
+
134
+ @timeout_checker.start if @timeout_checker
135
+ end
136
+
137
+ def stop
138
+ super
139
+
140
+ @timeout_checker.stop if @timeout_checker
141
+ end
142
+
143
+ def parse(text, &block)
144
+ raise NotImplementedError, "Implement this method in child class"
145
+ end
146
+
147
+ def parse_with_timeout(text, &block)
148
+ @timeout_checker.execute {
149
+ parse_orig(text, &block)
150
+ }
151
+ rescue UncatchableError
152
+ log.warn "parsing timed out with #{self.class}: text = #{text}"
153
+ # Return nil instead of raising error. in_tail or other plugin can emit broken line.
154
+ yield nil, nil
155
+ end
156
+
157
+ def call(*a, &b)
158
+ # Keep backward compatibility for existing plugins
159
+ # TODO: warn when deprecated
160
+ parse(*a, &b)
161
+ end
162
+
163
+ def implement?(feature)
164
+ methods_of_plugin = self.class.instance_methods(false)
165
+ case feature
166
+ when :parse_io then methods_of_plugin.include?(:parse_io)
167
+ when :parse_partial_data then methods_of_plugin.include?(:parse_partial_data)
168
+ else
169
+ raise ArgumentError, "Unknown feature for parser plugin: #{feature}"
170
+ end
171
+ end
172
+
173
+ def parse_io(io, &block)
174
+ raise NotImplementedError, "Optional API #parse_io is not implemented"
175
+ end
176
+
177
+ def parse_partial_data(data, &block)
178
+ raise NotImplementedError, "Optional API #parse_partial_data is not implemented"
179
+ end
180
+
181
+ def parse_time(record)
182
+ if @time_key && record.respond_to?(:has_key?) && record.has_key?(@time_key)
183
+ src = if @keep_time_key
184
+ record[@time_key]
185
+ else
186
+ record.delete(@time_key)
187
+ end
188
+ @time_parser.parse(src)
189
+ elsif @estimate_current_event
190
+ Fluent::EventTime.now
191
+ else
192
+ nil
193
+ end
194
+ rescue Fluent::TimeParser::TimeParseError => e
195
+ raise ParserError, e.message
196
+ end
197
+
198
+ # def parse(text, &block)
199
+ # time, record = convert_values(time, record)
200
+ # yield time, record
201
+ # end
202
+ def convert_values(time, record)
203
+ return time, record unless @execute_convert_values
204
+
205
+ record.each_key do |key|
206
+ value = record[key]
207
+ next unless value # nil/null value is always left as-is.
208
+
209
+ if value.is_a?(String) && string_like_null(value)
210
+ record[key] = nil
211
+ next
212
+ end
213
+
214
+ if @type_converters && @type_converters.has_key?(key)
215
+ record[key] = @type_converters[key].call(value)
216
+ end
217
+ end
218
+
219
+ return time, record
220
+ end
221
+
222
+ def string_like_null(value, null_empty_string = @null_empty_string, null_value_regexp = @null_value_pattern)
223
+ null_empty_string && value.empty? || null_value_regexp && string_safe_encoding(value){|s| null_value_regexp.match?(s) }
224
+ end
225
+
226
+ TRUTHY_VALUES = ['true', 'yes', '1']
227
+
228
+ def build_type_converters(types)
229
+ return nil unless types
230
+
231
+ converters = {}
232
+
233
+ types.each_pair do |field_name, type_definition|
234
+ type, option = type_definition.split(":", 2)
235
+ unless AVAILABLE_PARSER_VALUE_TYPES.include?(type)
236
+ raise Fluent::ConfigError, "unknown value conversion for key:'#{field_name}', type:'#{type}'"
237
+ end
238
+
239
+ conv = case type
240
+ when 'string' then ->(v){ v.to_s }
241
+ when 'integer' then ->(v){ v.to_i rescue v.to_s.to_i }
242
+ when 'float' then ->(v){ v.to_f rescue v.to_s.to_f }
243
+ when 'bool' then ->(v){ TRUTHY_VALUES.include?(v.to_s.downcase) }
244
+ when 'time'
245
+ # comma-separated: time:[timezone:]time_format
246
+ # time_format is unixtime/float/string-time-format
247
+ timep = if option
248
+ time_type = 'string' # estimate
249
+ timezone, time_format = option.split(':', 2)
250
+ unless Fluent::Timezone.validate(timezone)
251
+ timezone, time_format = nil, option
252
+ end
253
+ if Fluent::TimeMixin::TIME_TYPES.include?(time_format)
254
+ time_type, time_format = time_format, nil # unixtime/float
255
+ end
256
+ time_parser_create(type: time_type.to_sym, format: time_format, timezone: timezone)
257
+ else
258
+ time_parser_create(type: :string, format: nil, timezone: nil)
259
+ end
260
+ ->(v){ timep.parse(v) rescue nil }
261
+ when 'array'
262
+ delimiter = option ? option.to_s : ','
263
+ ->(v){ string_safe_encoding(v.to_s){|s| s.split(delimiter) } }
264
+ else
265
+ raise "BUG: unknown type even after check: #{type}"
266
+ end
267
+ converters[field_name] = conv
268
+ end
269
+
270
+ converters
271
+ end
272
+ end
273
+ end
274
+ end
@@ -0,0 +1,28 @@
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 'fluent/plugin/parser_regexp'
18
+
19
+ module Fluent
20
+ module Plugin
21
+ class ApacheParser < RegexpParser
22
+ Plugin.register_parser("apache", self)
23
+
24
+ config_set_default :expression, /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/
25
+ config_set_default :time_format, "%d/%b/%Y:%H:%M:%S %z"
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,88 @@
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 'fluent/plugin/parser'
18
+
19
+ module Fluent
20
+ module Plugin
21
+ class Apache2Parser < Parser
22
+ Plugin.register_parser('apache2', self)
23
+
24
+ REGEXP = /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>(?:[^\"]|\\")*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>(?:[^\"]|\\")*)" "(?<agent>(?:[^\"]|\\")*)")?$/
25
+ TIME_FORMAT = "%d/%b/%Y:%H:%M:%S %z"
26
+
27
+ def initialize
28
+ super
29
+ @mutex = Mutex.new
30
+ end
31
+
32
+ def configure(conf)
33
+ super
34
+ @time_parser = time_parser_create(format: TIME_FORMAT)
35
+ end
36
+
37
+ def patterns
38
+ {'format' => REGEXP, 'time_format' => TIME_FORMAT}
39
+ end
40
+
41
+ def parse(text)
42
+ m = REGEXP.match(text)
43
+ unless m
44
+ yield nil, nil
45
+ return
46
+ end
47
+
48
+ host = m['host']
49
+ host = (host == '-') ? nil : host
50
+
51
+ user = m['user']
52
+ user = (user == '-') ? nil : user
53
+
54
+ time = m['time']
55
+ time = @mutex.synchronize { @time_parser.parse(time) }
56
+
57
+ method = m['method']
58
+ path = m['path']
59
+
60
+ code = m['code'].to_i
61
+ code = nil if code == 0
62
+
63
+ size = m['size']
64
+ size = (size == '-') ? nil : size.to_i
65
+
66
+ referer = m['referer']
67
+ referer = (referer == '-') ? nil : referer
68
+
69
+ agent = m['agent']
70
+ agent = (agent == '-') ? nil : agent
71
+
72
+ record = {
73
+ "host" => host,
74
+ "user" => user,
75
+ "method" => method,
76
+ "path" => path,
77
+ "code" => code,
78
+ "size" => size,
79
+ "referer" => referer,
80
+ "agent" => agent,
81
+ }
82
+ record["time"] = m['time'] if @keep_time_key
83
+
84
+ yield time, record
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,26 @@
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 'fluent/plugin/parser_regexp'
18
+
19
+ module Fluent
20
+ module Plugin
21
+ class ApacheErrorParser < RegexpParser
22
+ Plugin.register_parser("apache_error", self)
23
+ config_set_default :expression, /^\[[^ ]* (?<time>[^\]]*)\] \[(?<level>[^\]]*)\](?: \[pid (?<pid>[^\]]*)\])?( \[client (?<client>[^\]]*)\])? (?<message>.*)$/
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,124 @@
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 'fluent/plugin/parser'
18
+
19
+ require 'csv'
20
+
21
+ module Fluent
22
+ module Plugin
23
+ class CSVParser < Parser
24
+ Plugin.register_parser('csv', self)
25
+
26
+ desc 'Names of fields included in each lines'
27
+ config_param :keys, :array, value_type: :string
28
+ desc 'The delimiter character (or string) of CSV values'
29
+ config_param :delimiter, :string, default: ','
30
+ desc 'The parser type used to parse CSV line'
31
+ config_param :parser_engine, :enum, list: [:normal, :fast], default: :normal, alias: :parser_type
32
+
33
+ def configure(conf)
34
+ super
35
+ @key_num = @keys.length
36
+
37
+ if @parser_engine == :fast
38
+ @quote_char = '"'
39
+ @escape_pattern = Regexp.compile(@quote_char * 2)
40
+
41
+ m = method(:parse_fast)
42
+ self.singleton_class.module_eval do
43
+ define_method(:parse, m)
44
+ end
45
+ end
46
+ end
47
+
48
+ def parse(text, &block)
49
+ r = {}
50
+ i = 0
51
+ values = CSV.parse_line(text, col_sep: @delimiter)
52
+ unless values
53
+ yield nil, nil
54
+ return
55
+ end
56
+
57
+ while i < @key_num
58
+ r[@keys[i]] = values[i]
59
+ i += 1
60
+ end
61
+ time, record = convert_values(parse_time(r), r)
62
+ yield time, record
63
+ end
64
+
65
+ def parse_fast(text, &block)
66
+ r = parse_fast_internal(text)
67
+ time, record = convert_values(parse_time(r), r)
68
+ yield time, record
69
+ end
70
+
71
+ # CSV.parse_line is too slow due to initialize lots of object and
72
+ # CSV module doesn't provide the efficient method for parsing single line.
73
+ # This method avoids the overhead of CSV.parse_line for typical patterns
74
+ def parse_fast_internal(text)
75
+ record = {}
76
+ text.chomp!
77
+
78
+ return record if text.empty?
79
+
80
+ # use while because while is now faster than each_with_index
81
+ columns = text.split(@delimiter, -1)
82
+ num_columns = columns.size
83
+ i = 0
84
+ j = 0
85
+ while j < num_columns
86
+ column = columns[j]
87
+
88
+ case column.count(@quote_char)
89
+ when 0
90
+ if column.empty?
91
+ column = nil
92
+ end
93
+ when 1
94
+ if column.start_with?(@quote_char)
95
+ to_merge = [column]
96
+ j += 1
97
+ while j < num_columns
98
+ merged_col = columns[j]
99
+ to_merge << merged_col
100
+ break if merged_col.end_with?(@quote_char)
101
+ j += 1
102
+ end
103
+ column = to_merge.join(@delimiter)[1..-2]
104
+ end
105
+ when 2
106
+ if column.start_with?(@quote_char) && column.end_with?(@quote_char)
107
+ column = column[1..-2]
108
+ end
109
+ else
110
+ if column.start_with?(@quote_char) && column.end_with?(@quote_char)
111
+ column = column[1..-2]
112
+ end
113
+ column.gsub!(@escape_pattern, @quote_char)
114
+ end
115
+
116
+ record[@keys[i]] = column
117
+ j += 1
118
+ i += 1
119
+ end
120
+ record
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,118 @@
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 'fluent/env'
18
+ require 'fluent/plugin/parser'
19
+ require 'fluent/time'
20
+ require 'fluent/oj_options'
21
+
22
+ require 'json'
23
+
24
+ module Fluent
25
+ module Plugin
26
+ class JSONParser < Parser
27
+ Plugin.register_parser('json', self)
28
+
29
+ config_set_default :time_key, 'time'
30
+ desc 'Set JSON parser'
31
+ # NOTE: Contains yajl for backward compatibility
32
+ config_param :json_parser, :enum, list: [:oj, :yajl, :json], default: :oj
33
+
34
+ desc 'Set the buffer size that JSON parser will use when parsing streaming input'
35
+ config_param :stream_buffer_size, :integer, default: 8192
36
+
37
+ config_set_default :time_type, :float
38
+
39
+ # Use a shared proc rather than a per-call lambda so that
40
+ # configure_json_parser returns the same object every time.
41
+ JSON_PARSE_PROC = ->(text) { JSON.parse(text, **Fluent::DEFAULT_JSON_PARSE_OPTIONS) }
42
+
43
+ def configure(conf)
44
+ if conf.has_key?('time_format')
45
+ conf['time_type'] ||= 'string'
46
+ end
47
+
48
+ super
49
+ @load_proc, @error_class = configure_json_parser(@json_parser)
50
+ end
51
+
52
+ def configure_json_parser(name)
53
+ case name
54
+ when :oj
55
+ return [Oj.method(:load), Oj::ParseError] if Fluent::OjOptions.available?
56
+
57
+ log&.info "Oj is not installed, and failing back to JSON for json parser"
58
+ configure_json_parser(:json)
59
+ when :yajl, :json # NOTE: Fallback yajl to json for backward compatibility
60
+ [JSON_PARSE_PROC, JSON::ParserError]
61
+ else
62
+ raise "BUG: unknown json parser specified: #{name}"
63
+ end
64
+ end
65
+
66
+ def parse(text)
67
+ parsed_json = @load_proc.call(text)
68
+
69
+ if parsed_json.is_a?(Hash)
70
+ time, record = parse_one_record(parsed_json)
71
+ yield time, record
72
+ elsif parsed_json.is_a?(Array)
73
+ parsed_json.each do |record|
74
+ unless record.is_a?(Hash)
75
+ yield nil, nil
76
+ next
77
+ end
78
+ time, parsed_record = parse_one_record(record)
79
+ yield time, parsed_record
80
+ end
81
+ else
82
+ yield nil, nil
83
+ end
84
+
85
+ rescue @error_class, EncodingError # EncodingError is for oj 3.x or later
86
+ yield nil, nil
87
+ end
88
+
89
+ def parse_one_record(record)
90
+ time = parse_time(record)
91
+ convert_values(time, record)
92
+ end
93
+
94
+ def parser_type
95
+ :text
96
+ end
97
+
98
+ def parse_io(io, &block)
99
+ parser = JSON::ResumableParser.new(**Fluent::DEFAULT_JSON_PARSE_OPTIONS)
100
+ begin
101
+ chunk = +"".b
102
+ while io.readpartial(@stream_buffer_size, chunk)
103
+ parser << chunk
104
+ while parser.parse
105
+ record = parser.value
106
+ block.call(parse_time(record), record)
107
+ end
108
+ end
109
+ rescue EOFError
110
+ unless parser.empty?
111
+ log&.warn "JSON stream ended in the middle of a document; " \
112
+ "discarding incomplete data"
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end