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,325 @@
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 'socket'
18
+ require 'json'
19
+ require 'ostruct'
20
+
21
+ require 'fluent/env'
22
+ require 'fluent/plugin/filter'
23
+ require 'fluent/config/error'
24
+ require 'fluent/event'
25
+ require 'fluent/time'
26
+
27
+ module Fluent::Plugin
28
+ class RecordTransformerFilter < Fluent::Plugin::Filter
29
+ Fluent::Plugin.register_filter('record_transformer', self)
30
+
31
+ helpers :record_accessor
32
+
33
+ desc 'A comma-delimited list of keys to delete.'
34
+ config_param :remove_keys, :array, default: nil
35
+ desc 'A comma-delimited list of keys to keep.'
36
+ config_param :keep_keys, :array, default: nil
37
+ desc 'Create new Hash to transform incoming data'
38
+ config_param :renew_record, :bool, default: false
39
+ desc 'Specify field name of the record to overwrite the time of events. Its value must be unix time.'
40
+ config_param :renew_time_key, :string, default: nil
41
+ desc 'When set to true, the full Ruby syntax is enabled in the ${...} expression.'
42
+ config_param :enable_ruby, :bool, default: false
43
+ desc 'Use original value type.'
44
+ config_param :auto_typecast, :bool, default: true
45
+
46
+ def configure(conf)
47
+ super
48
+
49
+ map = {}
50
+ # <record></record> directive
51
+ conf.elements.select { |element| element.name == 'record' }.each do |element|
52
+ element.each_pair do |k, v|
53
+ element.has_key?(k) # to suppress unread configuration warning
54
+ map[k] = parse_value(v)
55
+ end
56
+ end
57
+
58
+ if @keep_keys
59
+ raise Fluent::ConfigError, "`renew_record` must be true to use `keep_keys`" unless @renew_record
60
+ end
61
+
62
+ @key_deleters = if @remove_keys
63
+ @remove_keys.map { |k| record_accessor_create(k) }
64
+ end
65
+
66
+ placeholder_expander_params = {
67
+ log: log,
68
+ auto_typecast: @auto_typecast,
69
+ }
70
+ @placeholder_expander =
71
+ if @enable_ruby
72
+ # require utilities which would be used in ruby placeholders
73
+ require 'pathname'
74
+ require 'uri'
75
+ require 'cgi/escape'
76
+ RubyPlaceholderExpander.new(placeholder_expander_params)
77
+ else
78
+ PlaceholderExpander.new(placeholder_expander_params)
79
+ end
80
+ @map = @placeholder_expander.preprocess_map(map)
81
+
82
+ @hostname = Socket.gethostname
83
+ end
84
+
85
+ def filter_stream(tag, es)
86
+ new_es = Fluent::MultiEventStream.new
87
+ tag_parts = tag.split('.')
88
+ tag_prefix = tag_prefix(tag_parts)
89
+ tag_suffix = tag_suffix(tag_parts)
90
+ placeholder_values = {
91
+ 'tag' => tag,
92
+ 'tag_parts' => tag_parts,
93
+ 'tag_prefix' => tag_prefix,
94
+ 'tag_suffix' => tag_suffix,
95
+ 'hostname' => @hostname,
96
+ }
97
+ es.each do |time, record|
98
+ begin
99
+ placeholder_values['time'] = @placeholder_expander.time_value(time)
100
+ placeholder_values['record'] = record
101
+
102
+ new_record = reform(record, placeholder_values)
103
+ if @renew_time_key && new_record.has_key?(@renew_time_key)
104
+ time = Fluent::EventTime.from_time(Time.at(new_record[@renew_time_key].to_f))
105
+ end
106
+ @key_deleters.each { |deleter| deleter.delete(new_record) } if @key_deleters
107
+ new_es.add(time, new_record)
108
+ rescue => e
109
+ router.emit_error_event(tag, time, record, e)
110
+ log.debug { "map:#{@map} record:#{record} placeholder_values:#{placeholder_values}" }
111
+ end
112
+ end
113
+ new_es
114
+ end
115
+
116
+ private
117
+
118
+ def parse_value(value_str)
119
+ if value_str.start_with?('{', '[')
120
+ JSON.parse(value_str, **Fluent::DEFAULT_JSON_PARSE_OPTIONS)
121
+ else
122
+ value_str
123
+ end
124
+ rescue => e
125
+ log.warn "failed to parse #{value_str} as json. Assuming #{value_str} is a string", error: e
126
+ value_str # emit as string
127
+ end
128
+
129
+ def reform(record, placeholder_values)
130
+ placeholders = @placeholder_expander.prepare_placeholders(placeholder_values)
131
+
132
+ new_record = @renew_record ? {} : record.dup
133
+ @keep_keys.each do |k|
134
+ new_record[k] = record[k] if record.has_key?(k)
135
+ end if @keep_keys && @renew_record
136
+ new_record.merge!(expand_placeholders(@map, placeholders))
137
+
138
+ new_record
139
+ end
140
+
141
+ def expand_placeholders(value, placeholders)
142
+ if value.is_a?(String)
143
+ new_value = @placeholder_expander.expand(value, placeholders)
144
+ elsif value.is_a?(Hash)
145
+ new_value = {}
146
+ value.each_pair do |k, v|
147
+ new_key = @placeholder_expander.expand(k, placeholders, true)
148
+ new_value[new_key] = expand_placeholders(v, placeholders)
149
+ end
150
+ elsif value.is_a?(Array)
151
+ new_value = []
152
+ value.each_with_index do |v, i|
153
+ new_value[i] = expand_placeholders(v, placeholders)
154
+ end
155
+ else
156
+ new_value = value
157
+ end
158
+ new_value
159
+ end
160
+
161
+ def tag_prefix(tag_parts)
162
+ return [] if tag_parts.empty?
163
+ tag_prefix = [tag_parts.first]
164
+ 1.upto(tag_parts.size-1).each do |i|
165
+ tag_prefix[i] = "#{tag_prefix[i-1]}.#{tag_parts[i]}"
166
+ end
167
+ tag_prefix
168
+ end
169
+
170
+ def tag_suffix(tag_parts)
171
+ return [] if tag_parts.empty?
172
+ rev_tag_parts = tag_parts.reverse
173
+ rev_tag_suffix = [rev_tag_parts.first]
174
+ 1.upto(tag_parts.size-1).each do |i|
175
+ rev_tag_suffix[i] = "#{rev_tag_parts[i]}.#{rev_tag_suffix[i-1]}"
176
+ end
177
+ rev_tag_suffix.reverse!
178
+ end
179
+
180
+ # THIS CLASS MUST BE THREAD-SAFE
181
+ class PlaceholderExpander
182
+ attr_reader :placeholders, :log
183
+
184
+ def initialize(params)
185
+ @log = params[:log]
186
+ @auto_typecast = params[:auto_typecast]
187
+ end
188
+
189
+ def time_value(time)
190
+ Time.at(time).to_s
191
+ end
192
+
193
+ def preprocess_map(value, force_stringify = false)
194
+ value
195
+ end
196
+
197
+ def prepare_placeholders(placeholder_values)
198
+ placeholders = {}
199
+
200
+ placeholder_values.each do |key, value|
201
+ if value.kind_of?(Array) # tag_parts, etc
202
+ size = value.size
203
+ value.each_with_index do |v, idx|
204
+ placeholders.store("${#{key}[#{idx}]}", v)
205
+ placeholders.store("${#{key}[#{idx-size}]}", v) # support [-1]
206
+ end
207
+ elsif value.kind_of?(Hash) # record, etc
208
+ value.each do |k, v|
209
+ placeholders.store(%Q[${#{key}["#{k}"]}], v) # record["foo"]
210
+ end
211
+ else # string, integer, float, and others?
212
+ placeholders.store("${#{key}}", value)
213
+ end
214
+ end
215
+
216
+ placeholders
217
+ end
218
+
219
+ # Expand string with placeholders
220
+ #
221
+ # @param [String] str
222
+ # @param [Boolean] force_stringify the value must be string, used for hash key
223
+ def expand(str, placeholders, force_stringify = false)
224
+ if @auto_typecast && !force_stringify
225
+ single_placeholder_matched = str.match(/\A(\${[^}]+}|__[A-Z_]+__)\z/)
226
+ if single_placeholder_matched
227
+ log_if_unknown_placeholder($1, placeholders)
228
+ return placeholders[single_placeholder_matched[1]]
229
+ end
230
+ end
231
+ str.gsub(/(\${[^}]+}|__[A-Z_]+__)/) {
232
+ log_if_unknown_placeholder($1, placeholders)
233
+ placeholders[$1]
234
+ }
235
+ end
236
+
237
+ private
238
+
239
+ def log_if_unknown_placeholder(placeholder, placeholders)
240
+ unless placeholders.include?(placeholder)
241
+ log.warn "unknown placeholder `#{placeholder}` found"
242
+ end
243
+ end
244
+ end
245
+
246
+ # THIS CLASS MUST BE THREAD-SAFE
247
+ class RubyPlaceholderExpander
248
+ attr_reader :log
249
+
250
+ def initialize(params)
251
+ @log = params[:log]
252
+ @auto_typecast = params[:auto_typecast]
253
+ @cleanroom_expander = CleanroomExpander.new
254
+ end
255
+
256
+ def time_value(time)
257
+ Time.at(time)
258
+ end
259
+
260
+ # Preprocess record map to convert into ruby string expansion
261
+ #
262
+ # @param [Hash|String|Array] value record map config
263
+ # @param [Boolean] force_stringify the value must be string, used for hash key
264
+ def preprocess_map(value, force_stringify = false)
265
+ new_value = nil
266
+ if value.is_a?(String)
267
+ if @auto_typecast && !force_stringify
268
+ num_placeholders = value.scan('${').size
269
+ if num_placeholders == 1 && value.start_with?('${') && value.end_with?('}')
270
+ new_value = value[2..-2] # ${..} => ..
271
+ end
272
+ end
273
+ unless new_value
274
+ new_value = "%Q[#{value.gsub('${', '#{')}]" # xx${..}xx => %Q[xx#{..}xx]
275
+ end
276
+ elsif value.is_a?(Hash)
277
+ new_value = {}
278
+ value.each_pair do |k, v|
279
+ new_value[preprocess_map(k, true)] = preprocess_map(v)
280
+ end
281
+ elsif value.is_a?(Array)
282
+ new_value = []
283
+ value.each_with_index do |v, i|
284
+ new_value[i] = preprocess_map(v)
285
+ end
286
+ else
287
+ new_value = value
288
+ end
289
+ new_value
290
+ end
291
+
292
+ def prepare_placeholders(placeholder_values)
293
+ placeholder_values
294
+ end
295
+
296
+ # Expand string with placeholders
297
+ #
298
+ # @param [String] str
299
+ def expand(str, placeholders, force_stringify = false)
300
+ @cleanroom_expander.expand(
301
+ str,
302
+ placeholders['tag'],
303
+ placeholders['time'],
304
+ placeholders['record'],
305
+ placeholders['tag_parts'],
306
+ placeholders['tag_prefix'],
307
+ placeholders['tag_suffix'],
308
+ placeholders['hostname'],
309
+ )
310
+ rescue => e
311
+ raise "failed to expand `#{str}` : error = #{e}"
312
+ end
313
+
314
+ class CleanroomExpander
315
+ def expand(__str_to_eval__, tag, time, record, tag_parts, tag_prefix, tag_suffix, hostname)
316
+ instance_eval(__str_to_eval__)
317
+ end
318
+
319
+ (Object.instance_methods).each do |m|
320
+ undef_method m unless /^__|respond_to_missing\?|object_id|public_methods|instance_eval|method_missing|define_singleton_method|respond_to\?|new_ostruct_member|^class$/.match?(m.to_s)
321
+ end
322
+ end
323
+ end
324
+ end
325
+ end
@@ -0,0 +1,53 @@
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/filter'
18
+
19
+ module Fluent::Plugin
20
+ class StdoutFilter < Filter
21
+ Fluent::Plugin.register_filter('stdout', self)
22
+
23
+ helpers :formatter, :compat_parameters, :inject
24
+
25
+ DEFAULT_FORMAT_TYPE = 'stdout'
26
+
27
+ config_section :format do
28
+ config_set_default :@type, DEFAULT_FORMAT_TYPE
29
+ end
30
+
31
+ # for tests
32
+ attr_reader :formatter
33
+
34
+ def configure(conf)
35
+ compat_parameters_convert(conf, :inject, :formatter)
36
+ super
37
+ @formatter = formatter_create
38
+ end
39
+
40
+ def filter_stream(tag, es)
41
+ es.each { |time, record|
42
+ begin
43
+ r = inject_values_to_record(tag, time, record)
44
+ log.write @formatter.format(tag, time, r)
45
+ rescue => e
46
+ router.emit_error_event(tag, time, record, e)
47
+ end
48
+ }
49
+ log.flush
50
+ es
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,75 @@
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/base'
19
+ require 'fluent/plugin/owned_by_mixin'
20
+ require 'fluent/time'
21
+
22
+ module Fluent
23
+ module Plugin
24
+ class Formatter < Base
25
+ include OwnedByMixin
26
+ include TimeMixin::Formatter
27
+
28
+ configured_in :format
29
+
30
+ PARSER_TYPES = [:text_per_line, :text, :binary]
31
+ def formatter_type
32
+ :text_per_line
33
+ end
34
+
35
+ def format(tag, time, record)
36
+ raise NotImplementedError, "Implement this method in child class"
37
+ end
38
+ end
39
+
40
+ class ProcWrappedFormatter < Formatter
41
+ def initialize(proc)
42
+ super()
43
+ @proc = proc
44
+ end
45
+
46
+ def format(tag, time, record)
47
+ @proc.call(tag, time, record)
48
+ end
49
+ end
50
+
51
+ module Newline
52
+ module Mixin
53
+ include Fluent::Configurable
54
+
55
+ DEFAULT_NEWLINE = if Fluent.windows?
56
+ :crlf
57
+ else
58
+ :lf
59
+ end
60
+
61
+ config_param :newline, :enum, list: [:lf, :crlf], default: DEFAULT_NEWLINE
62
+
63
+ def configure(conf)
64
+ super
65
+ @newline = case newline
66
+ when :lf
67
+ "\n".freeze
68
+ when :crlf
69
+ "\r\n".freeze
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,92 @@
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_helper'
18
+ require 'fluent/plugin/formatter'
19
+ require 'csv'
20
+
21
+ module Fluent
22
+ module Plugin
23
+ class CsvFormatter < Formatter
24
+ Plugin.register_formatter('csv', self)
25
+
26
+ include PluginHelper::Mixin
27
+ helpers :record_accessor
28
+
29
+ config_param :delimiter, default: ',' do |val|
30
+ ['\t', 'TAB'].include?(val) ? "\t".freeze : val.freeze
31
+ end
32
+ config_param :force_quotes, :bool, default: true
33
+ # "array" looks good for type of :fields, but this implementation removes tailing comma
34
+ # TODO: Is it needed to support tailing comma?
35
+ config_param :fields, :array, value_type: :string
36
+ config_param :add_newline, :bool, default: true
37
+
38
+ def csv_cacheable?
39
+ !!owner
40
+ end
41
+
42
+ def csv_thread_key
43
+ csv_cacheable? ? "#{owner.plugin_id}_csv_formatter_#{@usage}_csv" : nil
44
+ end
45
+
46
+ def csv_for_thread
47
+ if csv_cacheable?
48
+ Thread.current[csv_thread_key] ||= CSV.new("".force_encoding(Encoding::ASCII_8BIT), **@generate_opts)
49
+ else
50
+ CSV.new("".force_encoding(Encoding::ASCII_8BIT), **@generate_opts)
51
+ end
52
+ end
53
+
54
+ def configure(conf)
55
+ super
56
+
57
+ @fields = fields.select{|f| !f.empty? }
58
+ raise ConfigError, "empty value is specified in fields parameter" if @fields.empty?
59
+
60
+ if @fields.any? { |f| record_accessor_nested?(f) }
61
+ @accessors = @fields.map { |f| record_accessor_create(f) }
62
+ mformat = method(:format_with_nested_fields)
63
+ singleton_class.module_eval do
64
+ define_method(:format, mformat)
65
+ end
66
+ end
67
+
68
+ @generate_opts = {col_sep: @delimiter, force_quotes: @force_quotes, headers: @fields,
69
+ row_sep: @add_newline ? :auto : "".force_encoding(Encoding::ASCII_8BIT)}
70
+ end
71
+
72
+ def format(tag, time, record)
73
+ csv = csv_for_thread
74
+ line = (csv << record).string.dup
75
+ # Need manual cleanup because CSV writer doesn't provide such method.
76
+ csv.rewind
77
+ csv.truncate(0)
78
+ line
79
+ end
80
+
81
+ def format_with_nested_fields(tag, time, record)
82
+ csv = csv_for_thread
83
+ values = @accessors.map { |a| a.call(record) }
84
+ line = (csv << values).string.dup
85
+ # Need manual cleanup because CSV writer doesn't provide such method.
86
+ csv.rewind
87
+ csv.truncate(0)
88
+ line
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,35 @@
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/formatter'
18
+
19
+ module Fluent
20
+ module Plugin
21
+ class HashFormatter < Formatter
22
+ include Fluent::Plugin::Newline::Mixin
23
+
24
+ Plugin.register_formatter('hash', self)
25
+
26
+ config_param :add_newline, :bool, default: true
27
+
28
+ def format(tag, time, record)
29
+ line = record.to_s
30
+ line << @newline if @add_newline
31
+ line
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,62 @@
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/formatter'
18
+ require 'fluent/oj_options'
19
+
20
+ module Fluent
21
+ module Plugin
22
+ class JSONFormatter < Formatter
23
+ include Fluent::Plugin::Newline::Mixin
24
+
25
+ Plugin.register_formatter('json', self)
26
+
27
+ config_param :json_parser, :string, default: 'oj'
28
+ config_param :add_newline, :bool, default: true
29
+
30
+ def configure(conf)
31
+ super
32
+
33
+ if @json_parser == 'oj'
34
+ if Fluent::OjOptions.available?
35
+ @dump_proc = Oj.method(:dump)
36
+ else
37
+ log.info "Oj isn't installed, fallback to JSON as json parser"
38
+ @dump_proc = JSON.method(:generate)
39
+ end
40
+ else
41
+ @dump_proc = JSON.method(:generate)
42
+ end
43
+
44
+ # format json is used on various highload environment, so re-define method to skip if check
45
+ unless @add_newline
46
+ define_singleton_method(:format, method(:format_without_nl))
47
+ end
48
+ end
49
+
50
+ def format(tag, time, record)
51
+ json_str = @dump_proc.call(record)
52
+ "#{json_str}#{@newline}"
53
+ ensure
54
+ json_str&.clear
55
+ end
56
+
57
+ def format_without_nl(tag, time, record)
58
+ @dump_proc.call(record)
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,44 @@
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/formatter'
18
+
19
+ module Fluent
20
+ module Plugin
21
+ class LabeledTSVFormatter < Formatter
22
+ include Fluent::Plugin::Newline::Mixin
23
+
24
+ Plugin.register_formatter('ltsv', self)
25
+
26
+ # http://ltsv.org/
27
+
28
+ config_param :delimiter, :string, default: "\t".freeze
29
+ config_param :label_delimiter, :string, default: ":".freeze
30
+ config_param :replacement, :string, default: " ".freeze
31
+ config_param :add_newline, :bool, default: true
32
+
33
+ def format(tag, time, record)
34
+ formatted = ""
35
+ record.each do |label, value|
36
+ formatted << @delimiter if formatted.length.nonzero?
37
+ formatted << "#{label}#{@label_delimiter}#{value.to_s.gsub(@delimiter, @replacement)}"
38
+ end
39
+ formatted << @newline if @add_newline
40
+ formatted
41
+ end
42
+ end
43
+ end
44
+ end