fluentd 0.12.40 → 1.6.2

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 (428) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  4. data/.github/ISSUE_TEMPLATE.md +17 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  6. data/.gitignore +5 -0
  7. data/.gitlab/cicd-template.yaml +10 -0
  8. data/.gitlab-ci.yml +147 -0
  9. data/.travis.yml +56 -20
  10. data/ADOPTERS.md +5 -0
  11. data/CHANGELOG.md +1369 -0
  12. data/CONTRIBUTING.md +16 -5
  13. data/GOVERNANCE.md +55 -0
  14. data/Gemfile +5 -0
  15. data/GithubWorkflow.md +78 -0
  16. data/LICENSE +202 -0
  17. data/MAINTAINERS.md +7 -0
  18. data/README.md +23 -11
  19. data/Rakefile +48 -2
  20. data/Vagrantfile +17 -0
  21. data/appveyor.yml +37 -0
  22. data/bin/fluent-binlog-reader +7 -0
  23. data/bin/fluent-ca-generate +6 -0
  24. data/bin/fluent-plugin-config-format +5 -0
  25. data/bin/fluent-plugin-generate +5 -0
  26. data/bin/fluentd +3 -0
  27. data/code-of-conduct.md +3 -0
  28. data/example/copy_roundrobin.conf +39 -0
  29. data/example/counter.conf +18 -0
  30. data/example/in_dummy_blocks.conf +17 -0
  31. data/example/in_dummy_with_compression.conf +23 -0
  32. data/example/in_forward.conf +7 -0
  33. data/example/in_forward_client.conf +37 -0
  34. data/example/in_forward_shared_key.conf +15 -0
  35. data/example/in_forward_tls.conf +14 -0
  36. data/example/in_forward_users.conf +24 -0
  37. data/example/in_forward_workers.conf +21 -0
  38. data/example/in_http.conf +3 -1
  39. data/example/in_out_forward.conf +17 -0
  40. data/example/logevents.conf +25 -0
  41. data/example/multi_filters.conf +61 -0
  42. data/example/out_exec_filter.conf +42 -0
  43. data/example/out_forward.conf +13 -13
  44. data/example/out_forward_buf_file.conf +23 -0
  45. data/example/out_forward_client.conf +109 -0
  46. data/example/out_forward_heartbeat_none.conf +16 -0
  47. data/example/out_forward_shared_key.conf +36 -0
  48. data/example/out_forward_tls.conf +18 -0
  49. data/example/out_forward_users.conf +65 -0
  50. data/example/out_null.conf +36 -0
  51. data/example/secondary_file.conf +42 -0
  52. data/example/suppress_config_dump.conf +7 -0
  53. data/example/worker_section.conf +36 -0
  54. data/fluent.conf +29 -0
  55. data/fluentd.gemspec +21 -11
  56. data/lib/fluent/agent.rb +67 -90
  57. data/lib/fluent/clock.rb +62 -0
  58. data/lib/fluent/command/binlog_reader.rb +244 -0
  59. data/lib/fluent/command/ca_generate.rb +181 -0
  60. data/lib/fluent/command/cat.rb +42 -18
  61. data/lib/fluent/command/debug.rb +12 -10
  62. data/lib/fluent/command/fluentd.rb +153 -5
  63. data/lib/fluent/command/plugin_config_formatter.rb +292 -0
  64. data/lib/fluent/command/plugin_generator.rb +324 -0
  65. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  66. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  67. data/lib/fluent/compat/exec_util.rb +129 -0
  68. data/lib/fluent/compat/file_util.rb +54 -0
  69. data/lib/fluent/compat/filter.rb +68 -0
  70. data/lib/fluent/compat/formatter.rb +111 -0
  71. data/lib/fluent/compat/formatter_utils.rb +85 -0
  72. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  73. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  74. data/lib/fluent/compat/input.rb +49 -0
  75. data/lib/fluent/compat/output.rb +718 -0
  76. data/lib/fluent/compat/output_chain.rb +60 -0
  77. data/lib/fluent/compat/parser.rb +310 -0
  78. data/lib/fluent/compat/parser_utils.rb +40 -0
  79. data/lib/fluent/compat/propagate_default.rb +62 -0
  80. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  81. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  82. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  83. data/lib/fluent/compat/socket_util.rb +165 -0
  84. data/lib/fluent/compat/string_util.rb +34 -0
  85. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  86. data/lib/fluent/compat/type_converter.rb +90 -0
  87. data/lib/fluent/config/configure_proxy.rb +210 -62
  88. data/lib/fluent/config/dsl.rb +12 -5
  89. data/lib/fluent/config/element.rb +107 -9
  90. data/lib/fluent/config/literal_parser.rb +9 -3
  91. data/lib/fluent/config/parser.rb +4 -4
  92. data/lib/fluent/config/section.rb +51 -14
  93. data/lib/fluent/config/types.rb +28 -13
  94. data/lib/fluent/config/v1_parser.rb +3 -5
  95. data/lib/fluent/config.rb +23 -20
  96. data/lib/fluent/configurable.rb +79 -21
  97. data/lib/fluent/counter/base_socket.rb +46 -0
  98. data/lib/fluent/counter/client.rb +297 -0
  99. data/lib/fluent/counter/error.rb +86 -0
  100. data/lib/fluent/counter/mutex_hash.rb +163 -0
  101. data/lib/fluent/counter/server.rb +273 -0
  102. data/lib/fluent/counter/store.rb +205 -0
  103. data/lib/fluent/counter/validator.rb +145 -0
  104. data/lib/fluent/counter.rb +23 -0
  105. data/lib/fluent/daemon.rb +15 -0
  106. data/lib/fluent/engine.rb +102 -65
  107. data/lib/fluent/env.rb +7 -3
  108. data/lib/fluent/error.rb +30 -0
  109. data/lib/fluent/event.rb +197 -21
  110. data/lib/fluent/event_router.rb +93 -10
  111. data/lib/fluent/filter.rb +2 -50
  112. data/lib/fluent/formatter.rb +4 -293
  113. data/lib/fluent/input.rb +2 -32
  114. data/lib/fluent/label.rb +10 -2
  115. data/lib/fluent/load.rb +3 -3
  116. data/lib/fluent/log.rb +348 -81
  117. data/lib/fluent/match.rb +37 -36
  118. data/lib/fluent/mixin.rb +12 -176
  119. data/lib/fluent/msgpack_factory.rb +62 -0
  120. data/lib/fluent/output.rb +10 -612
  121. data/lib/fluent/output_chain.rb +23 -0
  122. data/lib/fluent/parser.rb +4 -800
  123. data/lib/fluent/plugin/bare_output.rb +63 -0
  124. data/lib/fluent/plugin/base.rb +192 -0
  125. data/lib/fluent/plugin/buf_file.rb +128 -174
  126. data/lib/fluent/plugin/buf_memory.rb +9 -92
  127. data/lib/fluent/plugin/buffer/chunk.rb +221 -0
  128. data/lib/fluent/plugin/buffer/file_chunk.rb +383 -0
  129. data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
  130. data/lib/fluent/plugin/buffer.rb +779 -0
  131. data/lib/fluent/plugin/compressable.rb +92 -0
  132. data/lib/fluent/plugin/exec_util.rb +3 -108
  133. data/lib/fluent/plugin/file_util.rb +4 -34
  134. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  135. data/lib/fluent/plugin/filter.rb +93 -0
  136. data/lib/fluent/plugin/filter_grep.rb +117 -34
  137. data/lib/fluent/plugin/filter_parser.rb +85 -62
  138. data/lib/fluent/plugin/filter_record_transformer.rb +27 -39
  139. data/lib/fluent/plugin/filter_stdout.rb +15 -12
  140. data/lib/fluent/plugin/formatter.rb +50 -0
  141. data/lib/fluent/plugin/formatter_csv.rb +52 -0
  142. data/lib/fluent/plugin/formatter_hash.rb +33 -0
  143. data/lib/fluent/plugin/formatter_json.rb +55 -0
  144. data/lib/fluent/plugin/formatter_ltsv.rb +42 -0
  145. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  146. data/lib/fluent/plugin/formatter_out_file.rb +51 -0
  147. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  148. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  149. data/lib/fluent/plugin/formatter_tsv.rb +38 -0
  150. data/lib/fluent/plugin/in_debug_agent.rb +17 -6
  151. data/lib/fluent/plugin/in_dummy.rb +47 -20
  152. data/lib/fluent/plugin/in_exec.rb +55 -123
  153. data/lib/fluent/plugin/in_forward.rb +299 -216
  154. data/lib/fluent/plugin/in_gc_stat.rb +14 -36
  155. data/lib/fluent/plugin/in_http.rb +204 -91
  156. data/lib/fluent/plugin/in_monitor_agent.rb +186 -258
  157. data/lib/fluent/plugin/in_object_space.rb +13 -41
  158. data/lib/fluent/plugin/in_syslog.rb +112 -134
  159. data/lib/fluent/plugin/in_tail.rb +408 -745
  160. data/lib/fluent/plugin/in_tcp.rb +66 -9
  161. data/lib/fluent/plugin/in_udp.rb +60 -11
  162. data/lib/fluent/plugin/{in_stream.rb → in_unix.rb} +8 -4
  163. data/lib/fluent/plugin/input.rb +37 -0
  164. data/lib/fluent/plugin/multi_output.rb +158 -0
  165. data/lib/fluent/plugin/out_copy.rb +23 -35
  166. data/lib/fluent/plugin/out_exec.rb +67 -70
  167. data/lib/fluent/plugin/out_exec_filter.rb +204 -271
  168. data/lib/fluent/plugin/out_file.rb +267 -73
  169. data/lib/fluent/plugin/out_forward.rb +854 -325
  170. data/lib/fluent/plugin/out_null.rb +42 -9
  171. data/lib/fluent/plugin/out_relabel.rb +9 -5
  172. data/lib/fluent/plugin/out_roundrobin.rb +18 -37
  173. data/lib/fluent/plugin/out_secondary_file.rb +133 -0
  174. data/lib/fluent/plugin/out_stdout.rb +43 -10
  175. data/lib/fluent/plugin/out_stream.rb +7 -2
  176. data/lib/fluent/plugin/output.rb +1498 -0
  177. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  178. data/lib/fluent/plugin/parser.rb +191 -0
  179. data/lib/fluent/plugin/parser_apache.rb +28 -0
  180. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  181. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  182. data/lib/fluent/plugin/parser_csv.rb +39 -0
  183. data/lib/fluent/plugin/parser_json.rb +94 -0
  184. data/lib/fluent/plugin/parser_ltsv.rb +49 -0
  185. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  186. data/lib/fluent/plugin/parser_multiline.rb +106 -0
  187. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  188. data/lib/fluent/plugin/parser_none.rb +36 -0
  189. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  190. data/lib/fluent/plugin/parser_syslog.rb +142 -0
  191. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  192. data/lib/fluent/plugin/socket_util.rb +3 -143
  193. data/lib/fluent/plugin/storage.rb +84 -0
  194. data/lib/fluent/plugin/storage_local.rb +164 -0
  195. data/lib/fluent/plugin/string_util.rb +3 -15
  196. data/lib/fluent/plugin.rb +122 -121
  197. data/lib/fluent/plugin_helper/cert_option.rb +178 -0
  198. data/lib/fluent/plugin_helper/child_process.rb +364 -0
  199. data/lib/fluent/plugin_helper/compat_parameters.rb +333 -0
  200. data/lib/fluent/plugin_helper/counter.rb +51 -0
  201. data/lib/fluent/plugin_helper/event_emitter.rb +93 -0
  202. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  203. data/lib/fluent/plugin_helper/extract.rb +104 -0
  204. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  205. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  206. data/lib/fluent/plugin_helper/http_server/compat/server.rb +81 -0
  207. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  208. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  209. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  210. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  211. data/lib/fluent/plugin_helper/http_server/server.rb +87 -0
  212. data/lib/fluent/plugin_helper/http_server.rb +76 -0
  213. data/lib/fluent/plugin_helper/inject.rb +151 -0
  214. data/lib/fluent/plugin_helper/parser.rb +147 -0
  215. data/lib/fluent/plugin_helper/record_accessor.rb +210 -0
  216. data/lib/fluent/plugin_helper/retry_state.rb +205 -0
  217. data/lib/fluent/plugin_helper/server.rb +807 -0
  218. data/lib/fluent/plugin_helper/socket.rb +250 -0
  219. data/lib/fluent/plugin_helper/socket_option.rb +80 -0
  220. data/lib/fluent/plugin_helper/storage.rb +349 -0
  221. data/lib/fluent/plugin_helper/thread.rb +179 -0
  222. data/lib/fluent/plugin_helper/timer.rb +92 -0
  223. data/lib/fluent/plugin_helper.rb +73 -0
  224. data/lib/fluent/plugin_id.rb +80 -0
  225. data/lib/fluent/process.rb +3 -489
  226. data/lib/fluent/registry.rb +52 -10
  227. data/lib/fluent/root_agent.rb +204 -42
  228. data/lib/fluent/supervisor.rb +597 -359
  229. data/lib/fluent/system_config.rb +131 -42
  230. data/lib/fluent/test/base.rb +6 -54
  231. data/lib/fluent/test/driver/base.rb +224 -0
  232. data/lib/fluent/test/driver/base_owned.rb +70 -0
  233. data/lib/fluent/test/driver/base_owner.rb +135 -0
  234. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  235. data/lib/fluent/test/driver/filter.rb +57 -0
  236. data/lib/fluent/test/driver/formatter.rb +30 -0
  237. data/lib/fluent/test/driver/input.rb +31 -0
  238. data/lib/fluent/test/driver/multi_output.rb +53 -0
  239. data/lib/fluent/test/driver/output.rb +102 -0
  240. data/lib/fluent/test/driver/parser.rb +30 -0
  241. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  242. data/lib/fluent/test/filter_test.rb +0 -1
  243. data/lib/fluent/test/formatter_test.rb +4 -1
  244. data/lib/fluent/test/helpers.rb +58 -10
  245. data/lib/fluent/test/input_test.rb +27 -19
  246. data/lib/fluent/test/log.rb +79 -0
  247. data/lib/fluent/test/output_test.rb +28 -39
  248. data/lib/fluent/test/parser_test.rb +3 -1
  249. data/lib/fluent/test/startup_shutdown.rb +46 -0
  250. data/lib/fluent/test.rb +33 -1
  251. data/lib/fluent/time.rb +450 -1
  252. data/lib/fluent/timezone.rb +27 -3
  253. data/lib/fluent/{status.rb → unique_id.rb} +15 -24
  254. data/lib/fluent/version.rb +1 -1
  255. data/lib/fluent/winsvc.rb +85 -0
  256. data/templates/new_gem/Gemfile +3 -0
  257. data/templates/new_gem/README.md.erb +43 -0
  258. data/templates/new_gem/Rakefile +13 -0
  259. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  260. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  261. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  262. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  263. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  264. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  265. data/templates/new_gem/test/helper.rb.erb +8 -0
  266. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  267. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  268. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  269. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  270. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  271. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  272. data/templates/plugin_config_formatter/param.md.erb +34 -0
  273. data/templates/plugin_config_formatter/section.md.erb +12 -0
  274. data/test/command/test_binlog_reader.rb +346 -0
  275. data/test/command/test_ca_generate.rb +70 -0
  276. data/test/command/test_fluentd.rb +901 -0
  277. data/test/command/test_plugin_config_formatter.rb +276 -0
  278. data/test/command/test_plugin_generator.rb +92 -0
  279. data/test/compat/test_calls_super.rb +166 -0
  280. data/test/compat/test_parser.rb +92 -0
  281. data/test/config/test_config_parser.rb +126 -2
  282. data/test/config/test_configurable.rb +946 -187
  283. data/test/config/test_configure_proxy.rb +424 -74
  284. data/test/config/test_dsl.rb +11 -11
  285. data/test/config/test_element.rb +500 -0
  286. data/test/config/test_literal_parser.rb +8 -0
  287. data/test/config/test_plugin_configuration.rb +56 -0
  288. data/test/config/test_section.rb +79 -7
  289. data/test/config/test_system_config.rb +122 -35
  290. data/test/config/test_types.rb +38 -0
  291. data/test/counter/test_client.rb +559 -0
  292. data/test/counter/test_error.rb +44 -0
  293. data/test/counter/test_mutex_hash.rb +179 -0
  294. data/test/counter/test_server.rb +589 -0
  295. data/test/counter/test_store.rb +258 -0
  296. data/test/counter/test_validator.rb +137 -0
  297. data/test/helper.rb +89 -6
  298. data/test/helpers/fuzzy_assert.rb +89 -0
  299. data/test/plugin/test_bare_output.rb +118 -0
  300. data/test/plugin/test_base.rb +115 -0
  301. data/test/plugin/test_buf_file.rb +823 -460
  302. data/test/plugin/test_buf_memory.rb +32 -194
  303. data/test/plugin/test_buffer.rb +1233 -0
  304. data/test/plugin/test_buffer_chunk.rb +198 -0
  305. data/test/plugin/test_buffer_file_chunk.rb +844 -0
  306. data/test/plugin/test_buffer_memory_chunk.rb +338 -0
  307. data/test/plugin/test_compressable.rb +84 -0
  308. data/test/plugin/test_filter.rb +357 -0
  309. data/test/plugin/test_filter_grep.rb +540 -29
  310. data/test/plugin/test_filter_parser.rb +439 -452
  311. data/test/plugin/test_filter_record_transformer.rb +123 -166
  312. data/test/plugin/test_filter_stdout.rb +160 -72
  313. data/test/plugin/test_formatter_csv.rb +111 -0
  314. data/test/plugin/test_formatter_hash.rb +35 -0
  315. data/test/plugin/test_formatter_json.rb +51 -0
  316. data/test/plugin/test_formatter_ltsv.rb +62 -0
  317. data/test/plugin/test_formatter_msgpack.rb +28 -0
  318. data/test/plugin/test_formatter_out_file.rb +95 -0
  319. data/test/plugin/test_formatter_single_value.rb +38 -0
  320. data/test/plugin/test_formatter_tsv.rb +68 -0
  321. data/test/plugin/test_in_debug_agent.rb +24 -1
  322. data/test/plugin/test_in_dummy.rb +111 -18
  323. data/test/plugin/test_in_exec.rb +200 -113
  324. data/test/plugin/test_in_forward.rb +990 -387
  325. data/test/plugin/test_in_gc_stat.rb +10 -8
  326. data/test/plugin/test_in_http.rb +600 -224
  327. data/test/plugin/test_in_monitor_agent.rb +690 -0
  328. data/test/plugin/test_in_object_space.rb +24 -8
  329. data/test/plugin/test_in_syslog.rb +154 -215
  330. data/test/plugin/test_in_tail.rb +1006 -707
  331. data/test/plugin/test_in_tcp.rb +125 -48
  332. data/test/plugin/test_in_udp.rb +204 -63
  333. data/test/plugin/{test_in_stream.rb → test_in_unix.rb} +14 -13
  334. data/test/plugin/test_input.rb +126 -0
  335. data/test/plugin/test_metadata.rb +89 -0
  336. data/test/plugin/test_multi_output.rb +180 -0
  337. data/test/plugin/test_out_copy.rb +117 -112
  338. data/test/plugin/test_out_exec.rb +258 -53
  339. data/test/plugin/test_out_exec_filter.rb +538 -115
  340. data/test/plugin/test_out_file.rb +865 -178
  341. data/test/plugin/test_out_forward.rb +998 -210
  342. data/test/plugin/test_out_null.rb +105 -0
  343. data/test/plugin/test_out_relabel.rb +28 -0
  344. data/test/plugin/test_out_roundrobin.rb +36 -29
  345. data/test/plugin/test_out_secondary_file.rb +458 -0
  346. data/test/plugin/test_out_stdout.rb +135 -37
  347. data/test/plugin/test_out_stream.rb +18 -0
  348. data/test/plugin/test_output.rb +984 -0
  349. data/test/plugin/test_output_as_buffered.rb +2021 -0
  350. data/test/plugin/test_output_as_buffered_backup.rb +312 -0
  351. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  352. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  353. data/test/plugin/test_output_as_buffered_retries.rb +911 -0
  354. data/test/plugin/test_output_as_buffered_secondary.rb +874 -0
  355. data/test/plugin/test_output_as_standard.rb +374 -0
  356. data/test/plugin/test_owned_by.rb +35 -0
  357. data/test/plugin/test_parser.rb +359 -0
  358. data/test/plugin/test_parser_apache.rb +42 -0
  359. data/test/plugin/test_parser_apache2.rb +47 -0
  360. data/test/plugin/test_parser_apache_error.rb +45 -0
  361. data/test/plugin/test_parser_csv.rb +103 -0
  362. data/test/plugin/test_parser_json.rb +138 -0
  363. data/test/plugin/test_parser_labeled_tsv.rb +145 -0
  364. data/test/plugin/test_parser_multiline.rb +100 -0
  365. data/test/plugin/test_parser_nginx.rb +88 -0
  366. data/test/plugin/test_parser_none.rb +52 -0
  367. data/test/plugin/test_parser_regexp.rb +289 -0
  368. data/test/plugin/test_parser_syslog.rb +441 -0
  369. data/test/plugin/test_parser_tsv.rb +122 -0
  370. data/test/plugin/test_storage.rb +167 -0
  371. data/test/plugin/test_storage_local.rb +335 -0
  372. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  373. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  374. data/test/plugin_helper/data/cert/cert.pem +19 -0
  375. data/test/plugin_helper/http_server/test_app.rb +65 -0
  376. data/test/plugin_helper/http_server/test_route.rb +32 -0
  377. data/test/plugin_helper/test_cert_option.rb +16 -0
  378. data/test/plugin_helper/test_child_process.rb +794 -0
  379. data/test/plugin_helper/test_compat_parameters.rb +353 -0
  380. data/test/plugin_helper/test_event_emitter.rb +51 -0
  381. data/test/plugin_helper/test_event_loop.rb +52 -0
  382. data/test/plugin_helper/test_extract.rb +194 -0
  383. data/test/plugin_helper/test_formatter.rb +255 -0
  384. data/test/plugin_helper/test_http_server_helper.rb +205 -0
  385. data/test/plugin_helper/test_inject.rb +519 -0
  386. data/test/plugin_helper/test_parser.rb +264 -0
  387. data/test/plugin_helper/test_record_accessor.rb +197 -0
  388. data/test/plugin_helper/test_retry_state.rb +442 -0
  389. data/test/plugin_helper/test_server.rb +1714 -0
  390. data/test/plugin_helper/test_storage.rb +542 -0
  391. data/test/plugin_helper/test_thread.rb +164 -0
  392. data/test/plugin_helper/test_timer.rb +132 -0
  393. data/test/scripts/exec_script.rb +0 -6
  394. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  395. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  396. data/test/scripts/fluent/plugin/out_test.rb +23 -15
  397. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  398. data/test/test_clock.rb +164 -0
  399. data/test/test_config.rb +16 -7
  400. data/test/test_configdsl.rb +2 -2
  401. data/test/test_event.rb +360 -13
  402. data/test/test_event_router.rb +108 -11
  403. data/test/test_event_time.rb +199 -0
  404. data/test/test_filter.rb +48 -6
  405. data/test/test_formatter.rb +11 -391
  406. data/test/test_input.rb +1 -1
  407. data/test/test_log.rb +591 -31
  408. data/test/test_mixin.rb +1 -1
  409. data/test/test_output.rb +121 -185
  410. data/test/test_plugin.rb +251 -0
  411. data/test/test_plugin_classes.rb +177 -10
  412. data/test/test_plugin_helper.rb +81 -0
  413. data/test/test_plugin_id.rb +101 -0
  414. data/test/test_process.rb +8 -42
  415. data/test/test_root_agent.rb +766 -21
  416. data/test/test_supervisor.rb +481 -0
  417. data/test/test_test_drivers.rb +135 -0
  418. data/test/test_time_formatter.rb +282 -0
  419. data/test/test_time_parser.rb +231 -0
  420. data/test/test_unique_id.rb +47 -0
  421. metadata +454 -60
  422. data/COPYING +0 -14
  423. data/ChangeLog +0 -666
  424. data/lib/fluent/buffer.rb +0 -365
  425. data/lib/fluent/plugin/in_status.rb +0 -76
  426. data/test/plugin/test_in_status.rb +0 -38
  427. data/test/test_buffer.rb +0 -624
  428. data/test/test_parser.rb +0 -1305
@@ -1,107 +1,130 @@
1
- require 'time'
2
- require 'fluent/parser'
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
+ #
3
16
 
4
- class Fluent::ParserFilter < Fluent::Filter
5
- Fluent::Plugin.register_filter('parser', self)
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'
6
22
 
7
- config_param :key_name, :string
8
- config_param :reserve_data, :bool, default: false
9
- config_param :inject_key_prefix, :string, default: nil
10
- config_param :replace_invalid_sequence, :bool, default: false
11
- config_param :hash_value_field, :string, default: nil
12
- config_param :suppress_parse_error_log, :bool, default: false
13
- config_param :time_parse, :bool, default: true
14
- config_param :ignore_key_not_exist, :bool, default: false
15
- config_param :emit_invalid_record_to_error, :bool, default: false
23
+ module Fluent::Plugin
24
+ class ParserFilter < Filter
25
+ Fluent::Plugin.register_filter('parser', self)
16
26
 
17
- attr_reader :parser
27
+ helpers :parser, :record_accessor, :compat_parameters
18
28
 
19
- def configure(conf)
20
- super
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
21
45
 
22
- @parser = Fluent::TextParser.new
23
- @parser.estimate_current_event = false
24
- @parser.configure(conf)
25
- if !@time_parse && @parser.parser.respond_to?("time_key=".to_sym)
26
- # disable parse time
27
- @parser.parser.time_key = nil
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
28
55
  end
29
56
 
30
- self
31
- end
57
+ FAILED_RESULT = [nil, nil].freeze # reduce allocation cost
58
+ REPLACE_CHAR = '?'.freeze
32
59
 
33
- def filter_stream(tag, es)
34
- new_es = Fluent::MultiEventStream.new
35
- es.each do |time,record|
36
- raw_value = record[@key_name]
60
+ def filter_with_time(tag, time, record)
61
+ raw_value = @accessor.call(record)
37
62
  if raw_value.nil?
38
63
  if @emit_invalid_record_to_error
39
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, {})
40
68
  else
41
- log.warn "#{@key_name} does not exist" unless @ignore_key_not_exist
69
+ return FAILED_RESULT
42
70
  end
43
- new_es.add(time, handle_parsed(tag, record, time, {})) if @reserve_data
44
- next
45
71
  end
46
72
  begin
47
- @parser.parse(raw_value) do |t,values|
73
+ @parser.parse(raw_value) do |t, values|
48
74
  if values
49
- t ||= time
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
50
81
  r = handle_parsed(tag, record, t, values)
51
- new_es.add(t, r)
82
+ return t, r
52
83
  else
53
84
  if @emit_invalid_record_to_error
54
- router.emit_error_event(tag, time, record, ::Fluent::ParserError.new("pattern not match with data '#{raw_value}'"))
55
- else
56
- log.warn "pattern not match with data '#{raw_value}'" unless @suppress_parse_error_log
85
+ router.emit_error_event(tag, time, record, Fluent::Plugin::Parser::ParserError.new("pattern not matched with data '#{raw_value}'"))
57
86
  end
58
87
  if @reserve_data
59
88
  t = time
60
89
  r = handle_parsed(tag, record, time, {})
61
- new_es.add(t, r)
90
+ return t, r
91
+ else
92
+ return FAILED_RESULT
62
93
  end
63
94
  end
64
95
  end
65
- rescue Fluent::ParserError => e
96
+ rescue Fluent::Plugin::Parser::ParserError => e
66
97
  if @emit_invalid_record_to_error
67
- router.emit_error_event(tag, time, record, e)
98
+ raise e
68
99
  else
69
- log.warn e.message unless @suppress_parse_error_log
100
+ return FAILED_RESULT
70
101
  end
71
102
  rescue ArgumentError => e
72
103
  raise unless @replace_invalid_sequence
73
104
  raise unless e.message.index("invalid byte sequence in") == 0
74
105
 
75
- raw_value = replace_invalid_byte(raw_value)
106
+ raw_value = raw_value.scrub(REPLACE_CHAR)
76
107
  retry
77
108
  rescue => e
78
109
  if @emit_invalid_record_to_error
79
- router.emit_error_event(tag, time, record, Fluent::ParserError.new("parse failed #{e.message}"))
110
+ raise Fluent::Plugin::Parser::ParserError, "parse failed #{e.message}"
80
111
  else
81
- log.warn "parse failed #{e.message}" unless @suppress_parse_error_log
112
+ return FAILED_RESULT
82
113
  end
83
114
  end
84
115
  end
85
- new_es
86
- end
87
116
 
88
- private
117
+ private
89
118
 
90
- def handle_parsed(tag, record, t, values)
91
- if values && @inject_key_prefix
92
- values = Hash[values.map{|k,v| [ @inject_key_prefix + k, v ]}]
93
- end
94
- r = @hash_value_field ? {@hash_value_field => values} : values
95
- if @reserve_data
96
- r = r ? record.merge(r) : record
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
97
128
  end
98
- r
99
- end
100
-
101
- def replace_invalid_byte(string)
102
- replace_options = { invalid: :replace, undef: :replace, replace: '?' }
103
- original_encoding = string.encoding
104
- temporal_encoding = (original_encoding == Encoding::UTF_8 ? Encoding::UTF_16BE : Encoding::UTF_8)
105
- string.encode(temporal_encoding, original_encoding, replace_options).encode(original_encoding)
106
129
  end
107
130
  end
@@ -18,15 +18,17 @@ require 'socket'
18
18
  require 'json'
19
19
  require 'ostruct'
20
20
 
21
- require 'fluent/filter'
21
+ require 'fluent/plugin/filter'
22
22
  require 'fluent/config/error'
23
23
  require 'fluent/event'
24
24
  require 'fluent/time'
25
25
 
26
- module Fluent
27
- class RecordTransformerFilter < Filter
26
+ module Fluent::Plugin
27
+ class RecordTransformerFilter < Fluent::Plugin::Filter
28
28
  Fluent::Plugin.register_filter('record_transformer', self)
29
29
 
30
+ helpers :record_accessor
31
+
30
32
  desc 'A comma-delimited list of keys to delete.'
31
33
  config_param :remove_keys, :array, default: nil
32
34
  desc 'A comma-delimited list of keys to keep.'
@@ -38,7 +40,7 @@ module Fluent
38
40
  desc 'When set to true, the full Ruby syntax is enabled in the ${...} expression.'
39
41
  config_param :enable_ruby, :bool, default: false
40
42
  desc 'Use original value type.'
41
- config_param :auto_typecast, :bool, default: false # false for lower version compatibility
43
+ config_param :auto_typecast, :bool, default: true
42
44
 
43
45
  def configure(conf)
44
46
  super
@@ -56,6 +58,10 @@ module Fluent
56
58
  raise Fluent::ConfigError, "`renew_record` must be true to use `keep_keys`" unless @renew_record
57
59
  end
58
60
 
61
+ @key_deleters = if @remove_keys
62
+ @remove_keys.map { |k| record_accessor_create(k) }
63
+ end
64
+
59
65
  placeholder_expander_params = {
60
66
  log: log,
61
67
  auto_typecast: @auto_typecast,
@@ -76,7 +82,7 @@ module Fluent
76
82
  end
77
83
 
78
84
  def filter_stream(tag, es)
79
- new_es = MultiEventStream.new
85
+ new_es = Fluent::MultiEventStream.new
80
86
  tag_parts = tag.split('.')
81
87
  tag_prefix = tag_prefix(tag_parts)
82
88
  tag_suffix = tag_suffix(tag_parts)
@@ -87,23 +93,23 @@ module Fluent
87
93
  'tag_suffix' => tag_suffix,
88
94
  'hostname' => @hostname,
89
95
  }
90
- last_record = nil
91
96
  es.each do |time, record|
92
- last_record = record # for debug log
93
- placeholder_values['time'] = @placeholder_expander.time_value(time)
94
- placeholder_values['record'] = record
95
- new_record = reform(record, placeholder_values)
96
- if @renew_time_key && new_record.has_key?(@renew_time_key)
97
- time = new_record[@renew_time_key].to_i
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}" }
98
110
  end
99
- @remove_keys.each { |k| new_record.delete(k) } if @remove_keys
100
- new_es.add(time, new_record)
101
111
  end
102
112
  new_es
103
- rescue => e
104
- log.warn "failed to reform records", error_class: e.class, error: e.message
105
- log.warn_backtrace
106
- log.debug "map:#{@map} record:#{last_record} placeholder_values:#{placeholder_values}"
107
113
  end
108
114
 
109
115
  private
@@ -115,7 +121,7 @@ module Fluent
115
121
  value_str
116
122
  end
117
123
  rescue => e
118
- log.warn "failed to parse #{value_str} as json. Assuming #{value_str} is a string", error_class: e.class, error: e.message
124
+ log.warn "failed to parse #{value_str} as json. Assuming #{value_str} is a string", error: e
119
125
  value_str # emit as string
120
126
  end
121
127
 
@@ -199,9 +205,6 @@ module Fluent
199
205
  end
200
206
  elsif value.kind_of?(Hash) # record, etc
201
207
  value.each do |k, v|
202
- unless placeholder_values.has_key?(k) # prevent overwriting reserved keys such as tag
203
- placeholders.store("${#{k}}", v) # foo
204
- end
205
208
  placeholders.store(%Q[${#{key}["#{k}"]}], v) # record["foo"]
206
209
  end
207
210
  else # string, interger, float, and others?
@@ -304,31 +307,16 @@ module Fluent
304
307
  placeholders['hostname'],
305
308
  )
306
309
  rescue => e
307
- log.warn "failed to expand `#{str}`", error_class: e.class, error: e.message
308
- log.warn_backtrace
309
- nil
310
+ raise "failed to expand `#{str}` : error = #{e}"
310
311
  end
311
312
 
312
313
  class CleanroomExpander
313
314
  def expand(__str_to_eval__, tag, time, record, tag_parts, tag_prefix, tag_suffix, hostname)
314
- tags = tag_parts # for old version compatibility
315
- Thread.current[:record_transformer_record] = record # for old version compatibility
316
315
  instance_eval(__str_to_eval__)
317
316
  end
318
317
 
319
- # for old version compatibility
320
- def method_missing(name)
321
- key = name.to_s
322
- record = Thread.current[:record_transformer_record]
323
- if record.has_key?(key)
324
- record[key]
325
- else
326
- raise NameError, "undefined local variable or method `#{key}'"
327
- end
328
- end
329
-
330
318
  (Object.instance_methods).each do |m|
331
- 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/
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$/
332
320
  end
333
321
  end
334
322
  end
@@ -14,31 +14,34 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- require 'fluent/filter'
18
- require 'fluent/plugin'
17
+ require 'fluent/plugin/filter'
19
18
 
20
- module Fluent
19
+ module Fluent::Plugin
21
20
  class StdoutFilter < Filter
22
- Plugin.register_filter('stdout', self)
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
23
30
 
24
31
  # for tests
25
32
  attr_reader :formatter
26
33
 
27
- desc 'The format of the output.'
28
- config_param :format, :string, default: 'stdout'
29
- # config_param :output_type, :string, :default => 'json' (StdoutFormatter defines this)
30
-
31
34
  def configure(conf)
35
+ compat_parameters_convert(conf, :inject, :formatter)
32
36
  super
33
-
34
- @formatter = Plugin.new_formatter(@format)
35
- @formatter.configure(conf)
37
+ @formatter = formatter_create
36
38
  end
37
39
 
38
40
  def filter_stream(tag, es)
39
41
  es.each { |time, record|
40
42
  begin
41
- log.write @formatter.format(tag, time, record)
43
+ r = inject_values_to_record(tag, time, record)
44
+ log.write @formatter.format(tag, time, r)
42
45
  rescue => e
43
46
  router.emit_error_event(tag, time, record, e)
44
47
  end
@@ -0,0 +1,50 @@
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
+ require 'fluent/time'
20
+
21
+ module Fluent
22
+ module Plugin
23
+ class Formatter < Base
24
+ include OwnedByMixin
25
+ include TimeMixin::Formatter
26
+
27
+ configured_in :format
28
+
29
+ PARSER_TYPES = [:text_per_line, :text, :binary]
30
+ def formatter_type
31
+ :text_per_line
32
+ end
33
+
34
+ def format(tag, time, record)
35
+ raise NotImplementedError, "Implement this method in child class"
36
+ end
37
+ end
38
+
39
+ class ProcWrappedFormatter < Formatter
40
+ def initialize(proc)
41
+ super()
42
+ @proc = proc
43
+ end
44
+
45
+ def format(tag, time, record)
46
+ @proc.call(tag, time, record)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,52 @@
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 'csv'
19
+
20
+ module Fluent
21
+ module Plugin
22
+ class CsvFormatter < Formatter
23
+ Plugin.register_formatter('csv', self)
24
+
25
+ config_param :delimiter, default: ',' do |val|
26
+ ['\t', 'TAB'].include?(val) ? "\t" : val
27
+ end
28
+ config_param :force_quotes, :bool, default: true
29
+ # "array" looks good for type of :fields, but this implementation removes tailing comma
30
+ # TODO: Is it needed to support tailing comma?
31
+ config_param :fields, :array, value_type: :string
32
+ config_param :add_newline, :bool, default: true
33
+
34
+ def configure(conf)
35
+ super
36
+ @fields = fields.select{|f| !f.empty? }
37
+ raise ConfigError, "empty value is specified in fields parameter" if @fields.empty?
38
+
39
+ @generate_opts = {col_sep: @delimiter, force_quotes: @force_quotes}
40
+ end
41
+
42
+ def format(tag, time, record)
43
+ row = @fields.map do |key|
44
+ record[key]
45
+ end
46
+ line = CSV.generate_line(row, @generate_opts)
47
+ line.chomp! unless @add_newline
48
+ line
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,33 @@
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
+ Plugin.register_formatter('hash', self)
23
+
24
+ config_param :add_newline, :bool, default: true
25
+
26
+ def format(tag, time, record)
27
+ line = record.to_s
28
+ line << "\n".freeze if @add_newline
29
+ line
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,55 @@
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/env'
19
+
20
+ module Fluent
21
+ module Plugin
22
+ class JSONFormatter < Formatter
23
+ Plugin.register_formatter('json', self)
24
+
25
+ config_param :json_parser, :string, default: 'oj'
26
+ config_param :add_newline, :bool, default: true
27
+
28
+ def configure(conf)
29
+ super
30
+
31
+ begin
32
+ raise LoadError unless @json_parser == 'oj'
33
+ require 'oj'
34
+ Oj.default_options = Fluent::DEFAULT_OJ_OPTIONS
35
+ @dump_proc = Oj.method(:dump)
36
+ rescue LoadError
37
+ @dump_proc = Yajl.method(:dump)
38
+ end
39
+
40
+ # format json is used on various highload environment, so re-define method to skip if check
41
+ unless @add_newline
42
+ define_singleton_method(:format, method(:format_without_nl))
43
+ end
44
+ end
45
+
46
+ def format(tag, time, record)
47
+ "#{@dump_proc.call(record)}\n"
48
+ end
49
+
50
+ def format_without_nl(tag, time, record)
51
+ @dump_proc.call(record)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,42 @@
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
+ Plugin.register_formatter('ltsv', self)
23
+
24
+ # http://ltsv.org/
25
+
26
+ config_param :delimiter, :string, default: "\t"
27
+ config_param :label_delimiter, :string, default: ":"
28
+ config_param :add_newline, :bool, default: true
29
+
30
+ # TODO: escaping for \t in values
31
+ def format(tag, time, record)
32
+ formatted = ""
33
+ record.each do |label, value|
34
+ formatted << @delimiter if formatted.length.nonzero?
35
+ formatted << "#{label}#{@label_delimiter}#{value}"
36
+ end
37
+ formatted << "\n".freeze if @add_newline
38
+ formatted
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,33 @@
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 MessagePackFormatter < Formatter
22
+ Plugin.register_formatter('msgpack', self)
23
+
24
+ def formatter_type
25
+ :binary
26
+ end
27
+
28
+ def format(tag, time, record)
29
+ record.to_msgpack
30
+ end
31
+ end
32
+ end
33
+ end