fluentd 1.14.4-x64-mingw-ucrt

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fluentd might be problematic. Click here for more details.

Files changed (558) hide show
  1. checksums.yaml +7 -0
  2. data/.deepsource.toml +13 -0
  3. data/.drone.yml +35 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.yaml +70 -0
  5. data/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. data/.github/ISSUE_TEMPLATE/feature_request.yaml +38 -0
  7. data/.github/ISSUE_TEMPLATE.md +17 -0
  8. data/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  9. data/.github/workflows/issue-auto-closer.yml +12 -0
  10. data/.github/workflows/linux-test.yaml +36 -0
  11. data/.github/workflows/macos-test.yaml +30 -0
  12. data/.github/workflows/stale-actions.yml +22 -0
  13. data/.github/workflows/windows-test.yaml +46 -0
  14. data/.gitignore +30 -0
  15. data/.gitlab-ci.yml +103 -0
  16. data/ADOPTERS.md +5 -0
  17. data/AUTHORS +2 -0
  18. data/CHANGELOG.md +2409 -0
  19. data/CONTRIBUTING.md +45 -0
  20. data/GOVERNANCE.md +55 -0
  21. data/Gemfile +9 -0
  22. data/GithubWorkflow.md +78 -0
  23. data/LICENSE +202 -0
  24. data/MAINTAINERS.md +11 -0
  25. data/README.md +97 -0
  26. data/Rakefile +79 -0
  27. data/SECURITY.md +18 -0
  28. data/bin/fluent-binlog-reader +7 -0
  29. data/bin/fluent-ca-generate +6 -0
  30. data/bin/fluent-cap-ctl +7 -0
  31. data/bin/fluent-cat +5 -0
  32. data/bin/fluent-ctl +7 -0
  33. data/bin/fluent-debug +5 -0
  34. data/bin/fluent-gem +9 -0
  35. data/bin/fluent-plugin-config-format +5 -0
  36. data/bin/fluent-plugin-generate +5 -0
  37. data/bin/fluentd +15 -0
  38. data/code-of-conduct.md +3 -0
  39. data/docs/SECURITY_AUDIT.pdf +0 -0
  40. data/example/copy_roundrobin.conf +39 -0
  41. data/example/counter.conf +18 -0
  42. data/example/filter_stdout.conf +22 -0
  43. data/example/in_forward.conf +14 -0
  44. data/example/in_forward_client.conf +37 -0
  45. data/example/in_forward_shared_key.conf +15 -0
  46. data/example/in_forward_tls.conf +14 -0
  47. data/example/in_forward_users.conf +24 -0
  48. data/example/in_forward_workers.conf +21 -0
  49. data/example/in_http.conf +16 -0
  50. data/example/in_out_forward.conf +17 -0
  51. data/example/in_sample_blocks.conf +17 -0
  52. data/example/in_sample_with_compression.conf +23 -0
  53. data/example/in_syslog.conf +15 -0
  54. data/example/in_tail.conf +14 -0
  55. data/example/in_tcp.conf +13 -0
  56. data/example/in_udp.conf +13 -0
  57. data/example/logevents.conf +25 -0
  58. data/example/multi_filters.conf +61 -0
  59. data/example/out_copy.conf +20 -0
  60. data/example/out_exec_filter.conf +42 -0
  61. data/example/out_file.conf +13 -0
  62. data/example/out_forward.conf +35 -0
  63. data/example/out_forward_buf_file.conf +23 -0
  64. data/example/out_forward_client.conf +109 -0
  65. data/example/out_forward_heartbeat_none.conf +16 -0
  66. data/example/out_forward_sd.conf +17 -0
  67. data/example/out_forward_shared_key.conf +36 -0
  68. data/example/out_forward_tls.conf +18 -0
  69. data/example/out_forward_users.conf +65 -0
  70. data/example/out_null.conf +36 -0
  71. data/example/sd.yaml +8 -0
  72. data/example/secondary_file.conf +42 -0
  73. data/example/suppress_config_dump.conf +7 -0
  74. data/example/v0_12_filter.conf +78 -0
  75. data/example/v1_literal_example.conf +36 -0
  76. data/example/worker_section.conf +36 -0
  77. data/fluent.conf +139 -0
  78. data/fluentd.gemspec +55 -0
  79. data/lib/fluent/agent.rb +168 -0
  80. data/lib/fluent/capability.rb +87 -0
  81. data/lib/fluent/clock.rb +66 -0
  82. data/lib/fluent/command/binlog_reader.rb +244 -0
  83. data/lib/fluent/command/bundler_injection.rb +45 -0
  84. data/lib/fluent/command/ca_generate.rb +184 -0
  85. data/lib/fluent/command/cap_ctl.rb +174 -0
  86. data/lib/fluent/command/cat.rb +365 -0
  87. data/lib/fluent/command/ctl.rb +177 -0
  88. data/lib/fluent/command/debug.rb +103 -0
  89. data/lib/fluent/command/fluentd.rb +374 -0
  90. data/lib/fluent/command/plugin_config_formatter.rb +308 -0
  91. data/lib/fluent/command/plugin_generator.rb +365 -0
  92. data/lib/fluent/compat/call_super_mixin.rb +76 -0
  93. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  94. data/lib/fluent/compat/exec_util.rb +129 -0
  95. data/lib/fluent/compat/file_util.rb +54 -0
  96. data/lib/fluent/compat/filter.rb +68 -0
  97. data/lib/fluent/compat/formatter.rb +111 -0
  98. data/lib/fluent/compat/formatter_utils.rb +85 -0
  99. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  100. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  101. data/lib/fluent/compat/input.rb +49 -0
  102. data/lib/fluent/compat/output.rb +721 -0
  103. data/lib/fluent/compat/output_chain.rb +60 -0
  104. data/lib/fluent/compat/parser.rb +310 -0
  105. data/lib/fluent/compat/parser_utils.rb +40 -0
  106. data/lib/fluent/compat/propagate_default.rb +62 -0
  107. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  108. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  109. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  110. data/lib/fluent/compat/socket_util.rb +165 -0
  111. data/lib/fluent/compat/string_util.rb +34 -0
  112. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  113. data/lib/fluent/compat/type_converter.rb +90 -0
  114. data/lib/fluent/config/basic_parser.rb +123 -0
  115. data/lib/fluent/config/configure_proxy.rb +424 -0
  116. data/lib/fluent/config/dsl.rb +152 -0
  117. data/lib/fluent/config/element.rb +265 -0
  118. data/lib/fluent/config/error.rb +32 -0
  119. data/lib/fluent/config/literal_parser.rb +286 -0
  120. data/lib/fluent/config/parser.rb +107 -0
  121. data/lib/fluent/config/section.rb +272 -0
  122. data/lib/fluent/config/types.rb +249 -0
  123. data/lib/fluent/config/v1_parser.rb +192 -0
  124. data/lib/fluent/config.rb +76 -0
  125. data/lib/fluent/configurable.rb +201 -0
  126. data/lib/fluent/counter/base_socket.rb +44 -0
  127. data/lib/fluent/counter/client.rb +297 -0
  128. data/lib/fluent/counter/error.rb +86 -0
  129. data/lib/fluent/counter/mutex_hash.rb +163 -0
  130. data/lib/fluent/counter/server.rb +273 -0
  131. data/lib/fluent/counter/store.rb +205 -0
  132. data/lib/fluent/counter/validator.rb +145 -0
  133. data/lib/fluent/counter.rb +23 -0
  134. data/lib/fluent/daemon.rb +15 -0
  135. data/lib/fluent/daemonizer.rb +88 -0
  136. data/lib/fluent/engine.rb +253 -0
  137. data/lib/fluent/env.rb +40 -0
  138. data/lib/fluent/error.rb +34 -0
  139. data/lib/fluent/event.rb +326 -0
  140. data/lib/fluent/event_router.rb +297 -0
  141. data/lib/fluent/ext_monitor_require.rb +28 -0
  142. data/lib/fluent/filter.rb +21 -0
  143. data/lib/fluent/fluent_log_event_router.rb +141 -0
  144. data/lib/fluent/formatter.rb +23 -0
  145. data/lib/fluent/input.rb +21 -0
  146. data/lib/fluent/label.rb +46 -0
  147. data/lib/fluent/load.rb +34 -0
  148. data/lib/fluent/log.rb +713 -0
  149. data/lib/fluent/match.rb +187 -0
  150. data/lib/fluent/mixin.rb +31 -0
  151. data/lib/fluent/msgpack_factory.rb +106 -0
  152. data/lib/fluent/oj_options.rb +62 -0
  153. data/lib/fluent/output.rb +29 -0
  154. data/lib/fluent/output_chain.rb +23 -0
  155. data/lib/fluent/parser.rb +23 -0
  156. data/lib/fluent/plugin/bare_output.rb +104 -0
  157. data/lib/fluent/plugin/base.rb +197 -0
  158. data/lib/fluent/plugin/buf_file.rb +213 -0
  159. data/lib/fluent/plugin/buf_file_single.rb +225 -0
  160. data/lib/fluent/plugin/buf_memory.rb +34 -0
  161. data/lib/fluent/plugin/buffer/chunk.rb +240 -0
  162. data/lib/fluent/plugin/buffer/file_chunk.rb +413 -0
  163. data/lib/fluent/plugin/buffer/file_single_chunk.rb +311 -0
  164. data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
  165. data/lib/fluent/plugin/buffer.rb +918 -0
  166. data/lib/fluent/plugin/compressable.rb +96 -0
  167. data/lib/fluent/plugin/exec_util.rb +22 -0
  168. data/lib/fluent/plugin/file_util.rb +22 -0
  169. data/lib/fluent/plugin/file_wrapper.rb +187 -0
  170. data/lib/fluent/plugin/filter.rb +127 -0
  171. data/lib/fluent/plugin/filter_grep.rb +189 -0
  172. data/lib/fluent/plugin/filter_parser.rb +130 -0
  173. data/lib/fluent/plugin/filter_record_transformer.rb +324 -0
  174. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  175. data/lib/fluent/plugin/formatter.rb +75 -0
  176. data/lib/fluent/plugin/formatter_csv.rb +78 -0
  177. data/lib/fluent/plugin/formatter_hash.rb +35 -0
  178. data/lib/fluent/plugin/formatter_json.rb +59 -0
  179. data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
  180. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  181. data/lib/fluent/plugin/formatter_out_file.rb +53 -0
  182. data/lib/fluent/plugin/formatter_single_value.rb +36 -0
  183. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  184. data/lib/fluent/plugin/formatter_tsv.rb +40 -0
  185. data/lib/fluent/plugin/in_debug_agent.rb +71 -0
  186. data/lib/fluent/plugin/in_dummy.rb +18 -0
  187. data/lib/fluent/plugin/in_exec.rb +110 -0
  188. data/lib/fluent/plugin/in_forward.rb +473 -0
  189. data/lib/fluent/plugin/in_gc_stat.rb +72 -0
  190. data/lib/fluent/plugin/in_http.rb +667 -0
  191. data/lib/fluent/plugin/in_monitor_agent.rb +412 -0
  192. data/lib/fluent/plugin/in_object_space.rb +93 -0
  193. data/lib/fluent/plugin/in_sample.rb +141 -0
  194. data/lib/fluent/plugin/in_syslog.rb +276 -0
  195. data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
  196. data/lib/fluent/plugin/in_tail.rb +1228 -0
  197. data/lib/fluent/plugin/in_tcp.rb +181 -0
  198. data/lib/fluent/plugin/in_udp.rb +92 -0
  199. data/lib/fluent/plugin/in_unix.rb +195 -0
  200. data/lib/fluent/plugin/input.rb +75 -0
  201. data/lib/fluent/plugin/metrics.rb +119 -0
  202. data/lib/fluent/plugin/metrics_local.rb +96 -0
  203. data/lib/fluent/plugin/multi_output.rb +195 -0
  204. data/lib/fluent/plugin/out_copy.rb +120 -0
  205. data/lib/fluent/plugin/out_exec.rb +105 -0
  206. data/lib/fluent/plugin/out_exec_filter.rb +319 -0
  207. data/lib/fluent/plugin/out_file.rb +334 -0
  208. data/lib/fluent/plugin/out_forward/ack_handler.rb +161 -0
  209. data/lib/fluent/plugin/out_forward/connection_manager.rb +113 -0
  210. data/lib/fluent/plugin/out_forward/error.rb +28 -0
  211. data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
  212. data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
  213. data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
  214. data/lib/fluent/plugin/out_forward/socket_cache.rb +140 -0
  215. data/lib/fluent/plugin/out_forward.rb +826 -0
  216. data/lib/fluent/plugin/out_http.rb +275 -0
  217. data/lib/fluent/plugin/out_null.rb +74 -0
  218. data/lib/fluent/plugin/out_relabel.rb +32 -0
  219. data/lib/fluent/plugin/out_roundrobin.rb +84 -0
  220. data/lib/fluent/plugin/out_secondary_file.rb +131 -0
  221. data/lib/fluent/plugin/out_stdout.rb +74 -0
  222. data/lib/fluent/plugin/out_stream.rb +130 -0
  223. data/lib/fluent/plugin/output.rb +1556 -0
  224. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  225. data/lib/fluent/plugin/parser.rb +275 -0
  226. data/lib/fluent/plugin/parser_apache.rb +28 -0
  227. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  228. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  229. data/lib/fluent/plugin/parser_csv.rb +114 -0
  230. data/lib/fluent/plugin/parser_json.rb +96 -0
  231. data/lib/fluent/plugin/parser_ltsv.rb +51 -0
  232. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  233. data/lib/fluent/plugin/parser_multiline.rb +152 -0
  234. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  235. data/lib/fluent/plugin/parser_none.rb +36 -0
  236. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  237. data/lib/fluent/plugin/parser_syslog.rb +496 -0
  238. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  239. data/lib/fluent/plugin/sd_file.rb +156 -0
  240. data/lib/fluent/plugin/sd_srv.rb +135 -0
  241. data/lib/fluent/plugin/sd_static.rb +58 -0
  242. data/lib/fluent/plugin/service_discovery.rb +65 -0
  243. data/lib/fluent/plugin/socket_util.rb +22 -0
  244. data/lib/fluent/plugin/storage.rb +84 -0
  245. data/lib/fluent/plugin/storage_local.rb +162 -0
  246. data/lib/fluent/plugin/string_util.rb +22 -0
  247. data/lib/fluent/plugin.rb +206 -0
  248. data/lib/fluent/plugin_helper/cert_option.rb +191 -0
  249. data/lib/fluent/plugin_helper/child_process.rb +366 -0
  250. data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
  251. data/lib/fluent/plugin_helper/counter.rb +51 -0
  252. data/lib/fluent/plugin_helper/event_emitter.rb +100 -0
  253. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  254. data/lib/fluent/plugin_helper/extract.rb +104 -0
  255. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  256. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  257. data/lib/fluent/plugin_helper/http_server/compat/server.rb +92 -0
  258. data/lib/fluent/plugin_helper/http_server/compat/ssl_context_extractor.rb +52 -0
  259. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  260. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  261. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  262. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  263. data/lib/fluent/plugin_helper/http_server/server.rb +93 -0
  264. data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
  265. data/lib/fluent/plugin_helper/http_server.rb +135 -0
  266. data/lib/fluent/plugin_helper/inject.rb +154 -0
  267. data/lib/fluent/plugin_helper/metrics.rb +129 -0
  268. data/lib/fluent/plugin_helper/parser.rb +147 -0
  269. data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
  270. data/lib/fluent/plugin_helper/retry_state.rb +209 -0
  271. data/lib/fluent/plugin_helper/server.rb +801 -0
  272. data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
  273. data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
  274. data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
  275. data/lib/fluent/plugin_helper/socket.rb +277 -0
  276. data/lib/fluent/plugin_helper/socket_option.rb +98 -0
  277. data/lib/fluent/plugin_helper/storage.rb +349 -0
  278. data/lib/fluent/plugin_helper/thread.rb +180 -0
  279. data/lib/fluent/plugin_helper/timer.rb +92 -0
  280. data/lib/fluent/plugin_helper.rb +75 -0
  281. data/lib/fluent/plugin_id.rb +93 -0
  282. data/lib/fluent/process.rb +22 -0
  283. data/lib/fluent/registry.rb +116 -0
  284. data/lib/fluent/root_agent.rb +372 -0
  285. data/lib/fluent/rpc.rb +94 -0
  286. data/lib/fluent/static_config_analysis.rb +194 -0
  287. data/lib/fluent/supervisor.rb +1054 -0
  288. data/lib/fluent/system_config.rb +187 -0
  289. data/lib/fluent/test/base.rb +78 -0
  290. data/lib/fluent/test/driver/base.rb +225 -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 +57 -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 +134 -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 +46 -0
  310. data/lib/fluent/test.rb +58 -0
  311. data/lib/fluent/time.rb +512 -0
  312. data/lib/fluent/timezone.rb +171 -0
  313. data/lib/fluent/tls.rb +81 -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/winsvc.rb +103 -0
  318. data/templates/new_gem/Gemfile +3 -0
  319. data/templates/new_gem/README.md.erb +43 -0
  320. data/templates/new_gem/Rakefile +13 -0
  321. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  322. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  323. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  324. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  325. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  326. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  327. data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
  328. data/templates/new_gem/test/helper.rb.erb +8 -0
  329. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  330. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  331. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  332. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  333. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  334. data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
  335. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  336. data/templates/plugin_config_formatter/param.md-table.erb +10 -0
  337. data/templates/plugin_config_formatter/param.md.erb +34 -0
  338. data/templates/plugin_config_formatter/section.md.erb +12 -0
  339. data/test/command/test_binlog_reader.rb +362 -0
  340. data/test/command/test_ca_generate.rb +70 -0
  341. data/test/command/test_cap_ctl.rb +100 -0
  342. data/test/command/test_cat.rb +128 -0
  343. data/test/command/test_ctl.rb +57 -0
  344. data/test/command/test_fluentd.rb +1106 -0
  345. data/test/command/test_plugin_config_formatter.rb +398 -0
  346. data/test/command/test_plugin_generator.rb +109 -0
  347. data/test/compat/test_calls_super.rb +166 -0
  348. data/test/compat/test_parser.rb +92 -0
  349. data/test/config/assertions.rb +42 -0
  350. data/test/config/test_config_parser.rb +551 -0
  351. data/test/config/test_configurable.rb +1784 -0
  352. data/test/config/test_configure_proxy.rb +604 -0
  353. data/test/config/test_dsl.rb +415 -0
  354. data/test/config/test_element.rb +518 -0
  355. data/test/config/test_literal_parser.rb +309 -0
  356. data/test/config/test_plugin_configuration.rb +56 -0
  357. data/test/config/test_section.rb +191 -0
  358. data/test/config/test_system_config.rb +199 -0
  359. data/test/config/test_types.rb +408 -0
  360. data/test/counter/test_client.rb +563 -0
  361. data/test/counter/test_error.rb +44 -0
  362. data/test/counter/test_mutex_hash.rb +179 -0
  363. data/test/counter/test_server.rb +589 -0
  364. data/test/counter/test_store.rb +258 -0
  365. data/test/counter/test_validator.rb +137 -0
  366. data/test/helper.rb +155 -0
  367. data/test/helpers/fuzzy_assert.rb +89 -0
  368. data/test/helpers/process_extenstion.rb +33 -0
  369. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  370. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  371. data/test/plugin/data/2010/01/20100102.log +0 -0
  372. data/test/plugin/data/log/bar +0 -0
  373. data/test/plugin/data/log/foo/bar.log +0 -0
  374. data/test/plugin/data/log/foo/bar2 +0 -0
  375. data/test/plugin/data/log/test.log +0 -0
  376. data/test/plugin/data/sd_file/config +11 -0
  377. data/test/plugin/data/sd_file/config.json +17 -0
  378. data/test/plugin/data/sd_file/config.yaml +11 -0
  379. data/test/plugin/data/sd_file/config.yml +11 -0
  380. data/test/plugin/data/sd_file/invalid_config.yml +7 -0
  381. data/test/plugin/in_tail/test_fifo.rb +121 -0
  382. data/test/plugin/in_tail/test_io_handler.rb +140 -0
  383. data/test/plugin/in_tail/test_position_file.rb +379 -0
  384. data/test/plugin/out_forward/test_ack_handler.rb +101 -0
  385. data/test/plugin/out_forward/test_connection_manager.rb +145 -0
  386. data/test/plugin/out_forward/test_handshake_protocol.rb +112 -0
  387. data/test/plugin/out_forward/test_load_balancer.rb +106 -0
  388. data/test/plugin/out_forward/test_socket_cache.rb +149 -0
  389. data/test/plugin/test_bare_output.rb +131 -0
  390. data/test/plugin/test_base.rb +115 -0
  391. data/test/plugin/test_buf_file.rb +1275 -0
  392. data/test/plugin/test_buf_file_single.rb +833 -0
  393. data/test/plugin/test_buf_memory.rb +42 -0
  394. data/test/plugin/test_buffer.rb +1383 -0
  395. data/test/plugin/test_buffer_chunk.rb +198 -0
  396. data/test/plugin/test_buffer_file_chunk.rb +871 -0
  397. data/test/plugin/test_buffer_file_single_chunk.rb +611 -0
  398. data/test/plugin/test_buffer_memory_chunk.rb +339 -0
  399. data/test/plugin/test_compressable.rb +87 -0
  400. data/test/plugin/test_file_util.rb +96 -0
  401. data/test/plugin/test_file_wrapper.rb +126 -0
  402. data/test/plugin/test_filter.rb +368 -0
  403. data/test/plugin/test_filter_grep.rb +697 -0
  404. data/test/plugin/test_filter_parser.rb +731 -0
  405. data/test/plugin/test_filter_record_transformer.rb +577 -0
  406. data/test/plugin/test_filter_stdout.rb +207 -0
  407. data/test/plugin/test_formatter_csv.rb +136 -0
  408. data/test/plugin/test_formatter_hash.rb +38 -0
  409. data/test/plugin/test_formatter_json.rb +61 -0
  410. data/test/plugin/test_formatter_ltsv.rb +70 -0
  411. data/test/plugin/test_formatter_msgpack.rb +28 -0
  412. data/test/plugin/test_formatter_out_file.rb +116 -0
  413. data/test/plugin/test_formatter_single_value.rb +44 -0
  414. data/test/plugin/test_formatter_tsv.rb +76 -0
  415. data/test/plugin/test_in_debug_agent.rb +49 -0
  416. data/test/plugin/test_in_exec.rb +261 -0
  417. data/test/plugin/test_in_forward.rb +1180 -0
  418. data/test/plugin/test_in_gc_stat.rb +62 -0
  419. data/test/plugin/test_in_http.rb +1080 -0
  420. data/test/plugin/test_in_monitor_agent.rb +923 -0
  421. data/test/plugin/test_in_object_space.rb +60 -0
  422. data/test/plugin/test_in_sample.rb +190 -0
  423. data/test/plugin/test_in_syslog.rb +505 -0
  424. data/test/plugin/test_in_tail.rb +2363 -0
  425. data/test/plugin/test_in_tcp.rb +243 -0
  426. data/test/plugin/test_in_udp.rb +268 -0
  427. data/test/plugin/test_in_unix.rb +181 -0
  428. data/test/plugin/test_input.rb +137 -0
  429. data/test/plugin/test_metadata.rb +89 -0
  430. data/test/plugin/test_metrics.rb +294 -0
  431. data/test/plugin/test_metrics_local.rb +96 -0
  432. data/test/plugin/test_multi_output.rb +204 -0
  433. data/test/plugin/test_out_copy.rb +308 -0
  434. data/test/plugin/test_out_exec.rb +312 -0
  435. data/test/plugin/test_out_exec_filter.rb +606 -0
  436. data/test/plugin/test_out_file.rb +1037 -0
  437. data/test/plugin/test_out_forward.rb +1348 -0
  438. data/test/plugin/test_out_http.rb +428 -0
  439. data/test/plugin/test_out_null.rb +105 -0
  440. data/test/plugin/test_out_relabel.rb +28 -0
  441. data/test/plugin/test_out_roundrobin.rb +146 -0
  442. data/test/plugin/test_out_secondary_file.rb +458 -0
  443. data/test/plugin/test_out_stdout.rb +205 -0
  444. data/test/plugin/test_out_stream.rb +103 -0
  445. data/test/plugin/test_output.rb +1065 -0
  446. data/test/plugin/test_output_as_buffered.rb +2024 -0
  447. data/test/plugin/test_output_as_buffered_backup.rb +363 -0
  448. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  449. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  450. data/test/plugin/test_output_as_buffered_retries.rb +919 -0
  451. data/test/plugin/test_output_as_buffered_secondary.rb +882 -0
  452. data/test/plugin/test_output_as_standard.rb +374 -0
  453. data/test/plugin/test_owned_by.rb +35 -0
  454. data/test/plugin/test_parser.rb +399 -0
  455. data/test/plugin/test_parser_apache.rb +42 -0
  456. data/test/plugin/test_parser_apache2.rb +47 -0
  457. data/test/plugin/test_parser_apache_error.rb +45 -0
  458. data/test/plugin/test_parser_csv.rb +200 -0
  459. data/test/plugin/test_parser_json.rb +138 -0
  460. data/test/plugin/test_parser_labeled_tsv.rb +160 -0
  461. data/test/plugin/test_parser_multiline.rb +111 -0
  462. data/test/plugin/test_parser_nginx.rb +88 -0
  463. data/test/plugin/test_parser_none.rb +52 -0
  464. data/test/plugin/test_parser_regexp.rb +289 -0
  465. data/test/plugin/test_parser_syslog.rb +650 -0
  466. data/test/plugin/test_parser_tsv.rb +122 -0
  467. data/test/plugin/test_sd_file.rb +228 -0
  468. data/test/plugin/test_sd_srv.rb +230 -0
  469. data/test/plugin/test_storage.rb +167 -0
  470. data/test/plugin/test_storage_local.rb +335 -0
  471. data/test/plugin/test_string_util.rb +26 -0
  472. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  473. data/test/plugin_helper/data/cert/cert-with-CRLF.pem +19 -0
  474. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  475. data/test/plugin_helper/data/cert/cert.pem +19 -0
  476. data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +27 -0
  477. data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +20 -0
  478. data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +27 -0
  479. data/test/plugin_helper/data/cert/cert_chains/cert.pem +40 -0
  480. data/test/plugin_helper/data/cert/empty.pem +0 -0
  481. data/test/plugin_helper/data/cert/generate_cert.rb +125 -0
  482. data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +30 -0
  483. data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +27 -0
  484. data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +20 -0
  485. data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +20 -0
  486. data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +30 -0
  487. data/test/plugin_helper/data/cert/with_ca/cert-key.pem +27 -0
  488. data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +21 -0
  489. data/test/plugin_helper/data/cert/with_ca/cert.pem +21 -0
  490. data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +30 -0
  491. data/test/plugin_helper/data/cert/without_ca/cert-key.pem +27 -0
  492. data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +20 -0
  493. data/test/plugin_helper/data/cert/without_ca/cert.pem +20 -0
  494. data/test/plugin_helper/http_server/test_app.rb +65 -0
  495. data/test/plugin_helper/http_server/test_route.rb +32 -0
  496. data/test/plugin_helper/service_discovery/test_manager.rb +93 -0
  497. data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +21 -0
  498. data/test/plugin_helper/test_cert_option.rb +25 -0
  499. data/test/plugin_helper/test_child_process.rb +840 -0
  500. data/test/plugin_helper/test_compat_parameters.rb +358 -0
  501. data/test/plugin_helper/test_event_emitter.rb +80 -0
  502. data/test/plugin_helper/test_event_loop.rb +52 -0
  503. data/test/plugin_helper/test_extract.rb +194 -0
  504. data/test/plugin_helper/test_formatter.rb +255 -0
  505. data/test/plugin_helper/test_http_server_helper.rb +372 -0
  506. data/test/plugin_helper/test_inject.rb +561 -0
  507. data/test/plugin_helper/test_metrics.rb +137 -0
  508. data/test/plugin_helper/test_parser.rb +264 -0
  509. data/test/plugin_helper/test_record_accessor.rb +238 -0
  510. data/test/plugin_helper/test_retry_state.rb +442 -0
  511. data/test/plugin_helper/test_server.rb +1823 -0
  512. data/test/plugin_helper/test_service_discovery.rb +165 -0
  513. data/test/plugin_helper/test_socket.rb +146 -0
  514. data/test/plugin_helper/test_storage.rb +542 -0
  515. data/test/plugin_helper/test_thread.rb +164 -0
  516. data/test/plugin_helper/test_timer.rb +130 -0
  517. data/test/scripts/exec_script.rb +32 -0
  518. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  519. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  520. data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
  521. data/test/scripts/fluent/plugin/out_test.rb +81 -0
  522. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  523. data/test/scripts/fluent/plugin/parser_known.rb +4 -0
  524. data/test/test_capability.rb +74 -0
  525. data/test/test_clock.rb +164 -0
  526. data/test/test_config.rb +202 -0
  527. data/test/test_configdsl.rb +148 -0
  528. data/test/test_daemonizer.rb +91 -0
  529. data/test/test_engine.rb +203 -0
  530. data/test/test_event.rb +531 -0
  531. data/test/test_event_router.rb +331 -0
  532. data/test/test_event_time.rb +199 -0
  533. data/test/test_filter.rb +121 -0
  534. data/test/test_fluent_log_event_router.rb +99 -0
  535. data/test/test_formatter.rb +366 -0
  536. data/test/test_input.rb +31 -0
  537. data/test/test_log.rb +994 -0
  538. data/test/test_logger_initializer.rb +46 -0
  539. data/test/test_match.rb +148 -0
  540. data/test/test_mixin.rb +351 -0
  541. data/test/test_msgpack_factory.rb +18 -0
  542. data/test/test_oj_options.rb +55 -0
  543. data/test/test_output.rb +278 -0
  544. data/test/test_plugin.rb +251 -0
  545. data/test/test_plugin_classes.rb +370 -0
  546. data/test/test_plugin_helper.rb +81 -0
  547. data/test/test_plugin_id.rb +119 -0
  548. data/test/test_process.rb +14 -0
  549. data/test/test_root_agent.rb +951 -0
  550. data/test/test_static_config_analysis.rb +177 -0
  551. data/test/test_supervisor.rb +601 -0
  552. data/test/test_test_drivers.rb +136 -0
  553. data/test/test_time_formatter.rb +301 -0
  554. data/test/test_time_parser.rb +362 -0
  555. data/test/test_tls.rb +65 -0
  556. data/test/test_unique_id.rb +47 -0
  557. data/test/test_variable_store.rb +65 -0
  558. metadata +1261 -0
@@ -0,0 +1,130 @@
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/time'
18
+ require 'fluent/config/error'
19
+ require 'fluent/plugin/filter'
20
+ require 'fluent/plugin_helper/parser'
21
+ require 'fluent/plugin_helper/compat_parameters'
22
+
23
+ module Fluent::Plugin
24
+ class ParserFilter < Filter
25
+ Fluent::Plugin.register_filter('parser', self)
26
+
27
+ helpers :parser, :record_accessor, :compat_parameters
28
+
29
+ desc 'Specify field name in the record to parse.'
30
+ config_param :key_name, :string
31
+ desc 'Keep original key-value pair in parsed result.'
32
+ config_param :reserve_data, :bool, default: false
33
+ desc 'Keep original event time in parsed result.'
34
+ config_param :reserve_time, :bool, default: false
35
+ desc 'Remove "key_name" field from the record when parsing is succeeded'
36
+ config_param :remove_key_name_field, :bool, default: false
37
+ desc 'Store parsed values with specified key name prefix.'
38
+ config_param :inject_key_prefix, :string, default: nil
39
+ desc 'If true, invalid string is replaced with safe characters and re-parse it.'
40
+ config_param :replace_invalid_sequence, :bool, default: false
41
+ desc 'Store parsed values as a hash value in a field.'
42
+ config_param :hash_value_field, :string, default: nil
43
+ desc 'Emit invalid record to @ERROR label'
44
+ config_param :emit_invalid_record_to_error, :bool, default: true
45
+
46
+ attr_reader :parser
47
+
48
+ def configure(conf)
49
+ compat_parameters_convert(conf, :parser)
50
+
51
+ super
52
+
53
+ @accessor = record_accessor_create(@key_name)
54
+ @parser = parser_create
55
+ end
56
+
57
+ FAILED_RESULT = [nil, nil].freeze # reduce allocation cost
58
+ REPLACE_CHAR = '?'.freeze
59
+
60
+ def filter_with_time(tag, time, record)
61
+ raw_value = @accessor.call(record)
62
+ if raw_value.nil?
63
+ if @emit_invalid_record_to_error
64
+ router.emit_error_event(tag, time, record, ArgumentError.new("#{@key_name} does not exist"))
65
+ end
66
+ if @reserve_data
67
+ return time, handle_parsed(tag, record, time, {})
68
+ else
69
+ return FAILED_RESULT
70
+ end
71
+ end
72
+ begin
73
+ @parser.parse(raw_value) do |t, values|
74
+ if values
75
+ t = if @reserve_time
76
+ time
77
+ else
78
+ t.nil? ? time : t
79
+ end
80
+ @accessor.delete(record) if @remove_key_name_field
81
+ r = handle_parsed(tag, record, t, values)
82
+ return t, r
83
+ else
84
+ if @emit_invalid_record_to_error
85
+ router.emit_error_event(tag, time, record, Fluent::Plugin::Parser::ParserError.new("pattern not matched with data '#{raw_value}'"))
86
+ end
87
+ if @reserve_data
88
+ t = time
89
+ r = handle_parsed(tag, record, time, {})
90
+ return t, r
91
+ else
92
+ return FAILED_RESULT
93
+ end
94
+ end
95
+ end
96
+ rescue Fluent::Plugin::Parser::ParserError => e
97
+ if @emit_invalid_record_to_error
98
+ raise e
99
+ else
100
+ return FAILED_RESULT
101
+ end
102
+ rescue ArgumentError => e
103
+ raise unless @replace_invalid_sequence
104
+ raise unless e.message.index("invalid byte sequence in") == 0
105
+
106
+ raw_value = raw_value.scrub(REPLACE_CHAR)
107
+ retry
108
+ rescue => e
109
+ if @emit_invalid_record_to_error
110
+ raise Fluent::Plugin::Parser::ParserError, "parse failed #{e.message}"
111
+ else
112
+ return FAILED_RESULT
113
+ end
114
+ end
115
+ end
116
+
117
+ private
118
+
119
+ def handle_parsed(tag, record, t, values)
120
+ if values && @inject_key_prefix
121
+ values = Hash[values.map { |k, v| [@inject_key_prefix + k, v] }]
122
+ end
123
+ r = @hash_value_field ? {@hash_value_field => values} : values
124
+ if @reserve_data
125
+ r = r ? record.merge(r) : record
126
+ end
127
+ r
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,324 @@
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/plugin/filter'
22
+ require 'fluent/config/error'
23
+ require 'fluent/event'
24
+ require 'fluent/time'
25
+
26
+ module Fluent::Plugin
27
+ class RecordTransformerFilter < Fluent::Plugin::Filter
28
+ Fluent::Plugin.register_filter('record_transformer', self)
29
+
30
+ helpers :record_accessor
31
+
32
+ desc 'A comma-delimited list of keys to delete.'
33
+ config_param :remove_keys, :array, default: nil
34
+ desc 'A comma-delimited list of keys to keep.'
35
+ config_param :keep_keys, :array, default: nil
36
+ desc 'Create new Hash to transform incoming data'
37
+ config_param :renew_record, :bool, default: false
38
+ desc 'Specify field name of the record to overwrite the time of events. Its value must be unix time.'
39
+ config_param :renew_time_key, :string, default: nil
40
+ desc 'When set to true, the full Ruby syntax is enabled in the ${...} expression.'
41
+ config_param :enable_ruby, :bool, default: false
42
+ desc 'Use original value type.'
43
+ config_param :auto_typecast, :bool, default: true
44
+
45
+ def configure(conf)
46
+ super
47
+
48
+ map = {}
49
+ # <record></record> directive
50
+ conf.elements.select { |element| element.name == 'record' }.each do |element|
51
+ element.each_pair do |k, v|
52
+ element.has_key?(k) # to suppress unread configuration warning
53
+ map[k] = parse_value(v)
54
+ end
55
+ end
56
+
57
+ if @keep_keys
58
+ raise Fluent::ConfigError, "`renew_record` must be true to use `keep_keys`" unless @renew_record
59
+ end
60
+
61
+ @key_deleters = if @remove_keys
62
+ @remove_keys.map { |k| record_accessor_create(k) }
63
+ end
64
+
65
+ placeholder_expander_params = {
66
+ log: log,
67
+ auto_typecast: @auto_typecast,
68
+ }
69
+ @placeholder_expander =
70
+ if @enable_ruby
71
+ # require utilities which would be used in ruby placeholders
72
+ require 'pathname'
73
+ require 'uri'
74
+ require 'cgi'
75
+ RubyPlaceholderExpander.new(placeholder_expander_params)
76
+ else
77
+ PlaceholderExpander.new(placeholder_expander_params)
78
+ end
79
+ @map = @placeholder_expander.preprocess_map(map)
80
+
81
+ @hostname = Socket.gethostname
82
+ end
83
+
84
+ def filter_stream(tag, es)
85
+ new_es = Fluent::MultiEventStream.new
86
+ tag_parts = tag.split('.')
87
+ tag_prefix = tag_prefix(tag_parts)
88
+ tag_suffix = tag_suffix(tag_parts)
89
+ placeholder_values = {
90
+ 'tag' => tag,
91
+ 'tag_parts' => tag_parts,
92
+ 'tag_prefix' => tag_prefix,
93
+ 'tag_suffix' => tag_suffix,
94
+ 'hostname' => @hostname,
95
+ }
96
+ es.each do |time, record|
97
+ begin
98
+ placeholder_values['time'] = @placeholder_expander.time_value(time)
99
+ placeholder_values['record'] = record
100
+
101
+ new_record = reform(record, placeholder_values)
102
+ if @renew_time_key && new_record.has_key?(@renew_time_key)
103
+ time = Fluent::EventTime.from_time(Time.at(new_record[@renew_time_key].to_f))
104
+ end
105
+ @key_deleters.each { |deleter| deleter.delete(new_record) } if @key_deleters
106
+ new_es.add(time, new_record)
107
+ rescue => e
108
+ router.emit_error_event(tag, time, record, e)
109
+ log.debug { "map:#{@map} record:#{record} placeholder_values:#{placeholder_values}" }
110
+ end
111
+ end
112
+ new_es
113
+ end
114
+
115
+ private
116
+
117
+ def parse_value(value_str)
118
+ if value_str.start_with?('{', '[')
119
+ JSON.parse(value_str)
120
+ else
121
+ value_str
122
+ end
123
+ rescue => e
124
+ log.warn "failed to parse #{value_str} as json. Assuming #{value_str} is a string", error: e
125
+ value_str # emit as string
126
+ end
127
+
128
+ def reform(record, placeholder_values)
129
+ placeholders = @placeholder_expander.prepare_placeholders(placeholder_values)
130
+
131
+ new_record = @renew_record ? {} : record.dup
132
+ @keep_keys.each do |k|
133
+ new_record[k] = record[k] if record.has_key?(k)
134
+ end if @keep_keys && @renew_record
135
+ new_record.merge!(expand_placeholders(@map, placeholders))
136
+
137
+ new_record
138
+ end
139
+
140
+ def expand_placeholders(value, placeholders)
141
+ if value.is_a?(String)
142
+ new_value = @placeholder_expander.expand(value, placeholders)
143
+ elsif value.is_a?(Hash)
144
+ new_value = {}
145
+ value.each_pair do |k, v|
146
+ new_key = @placeholder_expander.expand(k, placeholders, true)
147
+ new_value[new_key] = expand_placeholders(v, placeholders)
148
+ end
149
+ elsif value.is_a?(Array)
150
+ new_value = []
151
+ value.each_with_index do |v, i|
152
+ new_value[i] = expand_placeholders(v, placeholders)
153
+ end
154
+ else
155
+ new_value = value
156
+ end
157
+ new_value
158
+ end
159
+
160
+ def tag_prefix(tag_parts)
161
+ return [] if tag_parts.empty?
162
+ tag_prefix = [tag_parts.first]
163
+ 1.upto(tag_parts.size-1).each do |i|
164
+ tag_prefix[i] = "#{tag_prefix[i-1]}.#{tag_parts[i]}"
165
+ end
166
+ tag_prefix
167
+ end
168
+
169
+ def tag_suffix(tag_parts)
170
+ return [] if tag_parts.empty?
171
+ rev_tag_parts = tag_parts.reverse
172
+ rev_tag_suffix = [rev_tag_parts.first]
173
+ 1.upto(tag_parts.size-1).each do |i|
174
+ rev_tag_suffix[i] = "#{rev_tag_parts[i]}.#{rev_tag_suffix[i-1]}"
175
+ end
176
+ rev_tag_suffix.reverse!
177
+ end
178
+
179
+ # THIS CLASS MUST BE THREAD-SAFE
180
+ class PlaceholderExpander
181
+ attr_reader :placeholders, :log
182
+
183
+ def initialize(params)
184
+ @log = params[:log]
185
+ @auto_typecast = params[:auto_typecast]
186
+ end
187
+
188
+ def time_value(time)
189
+ Time.at(time).to_s
190
+ end
191
+
192
+ def preprocess_map(value, force_stringify = false)
193
+ value
194
+ end
195
+
196
+ def prepare_placeholders(placeholder_values)
197
+ placeholders = {}
198
+
199
+ placeholder_values.each do |key, value|
200
+ if value.kind_of?(Array) # tag_parts, etc
201
+ size = value.size
202
+ value.each_with_index do |v, idx|
203
+ placeholders.store("${#{key}[#{idx}]}", v)
204
+ placeholders.store("${#{key}[#{idx-size}]}", v) # support [-1]
205
+ end
206
+ elsif value.kind_of?(Hash) # record, etc
207
+ value.each do |k, v|
208
+ placeholders.store(%Q[${#{key}["#{k}"]}], v) # record["foo"]
209
+ end
210
+ else # string, interger, float, and others?
211
+ placeholders.store("${#{key}}", value)
212
+ end
213
+ end
214
+
215
+ placeholders
216
+ end
217
+
218
+ # Expand string with placeholders
219
+ #
220
+ # @param [String] str
221
+ # @param [Boolean] force_stringify the value must be string, used for hash key
222
+ def expand(str, placeholders, force_stringify = false)
223
+ if @auto_typecast && !force_stringify
224
+ single_placeholder_matched = str.match(/\A(\${[^}]+}|__[A-Z_]+__)\z/)
225
+ if single_placeholder_matched
226
+ log_if_unknown_placeholder($1, placeholders)
227
+ return placeholders[single_placeholder_matched[1]]
228
+ end
229
+ end
230
+ str.gsub(/(\${[^}]+}|__[A-Z_]+__)/) {
231
+ log_if_unknown_placeholder($1, placeholders)
232
+ placeholders[$1]
233
+ }
234
+ end
235
+
236
+ private
237
+
238
+ def log_if_unknown_placeholder(placeholder, placeholders)
239
+ unless placeholders.include?(placeholder)
240
+ log.warn "unknown placeholder `#{placeholder}` found"
241
+ end
242
+ end
243
+ end
244
+
245
+ # THIS CLASS MUST BE THREAD-SAFE
246
+ class RubyPlaceholderExpander
247
+ attr_reader :log
248
+
249
+ def initialize(params)
250
+ @log = params[:log]
251
+ @auto_typecast = params[:auto_typecast]
252
+ @cleanroom_expander = CleanroomExpander.new
253
+ end
254
+
255
+ def time_value(time)
256
+ Time.at(time)
257
+ end
258
+
259
+ # Preprocess record map to convert into ruby string expansion
260
+ #
261
+ # @param [Hash|String|Array] value record map config
262
+ # @param [Boolean] force_stringify the value must be string, used for hash key
263
+ def preprocess_map(value, force_stringify = false)
264
+ new_value = nil
265
+ if value.is_a?(String)
266
+ if @auto_typecast && !force_stringify
267
+ num_placeholders = value.scan('${').size
268
+ if num_placeholders == 1 && value.start_with?('${') && value.end_with?('}')
269
+ new_value = value[2..-2] # ${..} => ..
270
+ end
271
+ end
272
+ unless new_value
273
+ new_value = "%Q[#{value.gsub('${', '#{')}]" # xx${..}xx => %Q[xx#{..}xx]
274
+ end
275
+ elsif value.is_a?(Hash)
276
+ new_value = {}
277
+ value.each_pair do |k, v|
278
+ new_value[preprocess_map(k, true)] = preprocess_map(v)
279
+ end
280
+ elsif value.is_a?(Array)
281
+ new_value = []
282
+ value.each_with_index do |v, i|
283
+ new_value[i] = preprocess_map(v)
284
+ end
285
+ else
286
+ new_value = value
287
+ end
288
+ new_value
289
+ end
290
+
291
+ def prepare_placeholders(placeholder_values)
292
+ placeholder_values
293
+ end
294
+
295
+ # Expand string with placeholders
296
+ #
297
+ # @param [String] str
298
+ def expand(str, placeholders, force_stringify = false)
299
+ @cleanroom_expander.expand(
300
+ str,
301
+ placeholders['tag'],
302
+ placeholders['time'],
303
+ placeholders['record'],
304
+ placeholders['tag_parts'],
305
+ placeholders['tag_prefix'],
306
+ placeholders['tag_suffix'],
307
+ placeholders['hostname'],
308
+ )
309
+ rescue => e
310
+ raise "failed to expand `#{str}` : error = #{e}"
311
+ end
312
+
313
+ class CleanroomExpander
314
+ def expand(__str_to_eval__, tag, time, record, tag_parts, tag_prefix, tag_suffix, hostname)
315
+ instance_eval(__str_to_eval__)
316
+ end
317
+
318
+ (Object.instance_methods).each do |m|
319
+ undef_method m unless m.to_s =~ /^__|respond_to_missing\?|object_id|public_methods|instance_eval|method_missing|define_singleton_method|respond_to\?|new_ostruct_member|^class$/
320
+ end
321
+ end
322
+ end
323
+ end
324
+ 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,78 @@
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 configure(conf)
39
+ super
40
+
41
+ @fields = fields.select{|f| !f.empty? }
42
+ raise ConfigError, "empty value is specified in fields parameter" if @fields.empty?
43
+
44
+ if @fields.any? { |f| record_accessor_nested?(f) }
45
+ @accessors = @fields.map { |f| record_accessor_create(f) }
46
+ mformat = method(:format_with_nested_fields)
47
+ singleton_class.module_eval do
48
+ define_method(:format, mformat)
49
+ end
50
+ end
51
+
52
+ @generate_opts = {col_sep: @delimiter, force_quotes: @force_quotes, headers: @fields,
53
+ row_sep: @add_newline ? :auto : "".force_encoding(Encoding::ASCII_8BIT)}
54
+ # Cache CSV object per thread to avoid internal state sharing
55
+ @cache = {}
56
+ end
57
+
58
+ def format(tag, time, record)
59
+ csv = (@cache[Thread.current] ||= CSV.new("".force_encoding(Encoding::ASCII_8BIT), **@generate_opts))
60
+ line = (csv << record).string.dup
61
+ # Need manual cleanup because CSV writer doesn't provide such method.
62
+ csv.rewind
63
+ csv.truncate(0)
64
+ line
65
+ end
66
+
67
+ def format_with_nested_fields(tag, time, record)
68
+ csv = (@cache[Thread.current] ||= CSV.new("".force_encoding(Encoding::ASCII_8BIT), **@generate_opts))
69
+ values = @accessors.map { |a| a.call(record) }
70
+ line = (csv << values).string.dup
71
+ # Need manual cleanup because CSV writer doesn't provide such method.
72
+ csv.rewind
73
+ csv.truncate(0)
74
+ line
75
+ end
76
+ end
77
+ end
78
+ 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