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
@@ -14,13 +14,12 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- require 'fluent/configurable'
18
-
19
17
  module Fluent
20
18
  module Config
21
19
  class ConfigureProxy
22
- attr_accessor :name, :final, :param_name, :required, :multi, :alias, :argument, :params, :defaults, :descriptions, :sections
23
- # config_param :desc, :string, :default => '....'
20
+ attr_accessor :name, :final, :param_name, :init, :required, :multi, :alias, :configured_in_section
21
+ attr_accessor :argument, :params, :defaults, :descriptions, :sections
22
+ # config_param :desc, :string, default: '....'
24
23
  # config_set_default :buffer_type, :memory
25
24
  #
26
25
  # config_section :default, required: true, multi: false do
@@ -38,20 +37,48 @@ module Fluent
38
37
  # end
39
38
  # end
40
39
 
41
- def initialize(name, opts = {})
40
+ def initialize(name, root: false, param_name: nil, final: nil, init: nil, required: nil, multi: nil, alias: nil, type_lookup:)
42
41
  @name = name.to_sym
43
- @final = opts.fetch(:final, false)
42
+ @final = final
43
+
44
+ # For ConfigureProxy of root section, "@name" should be a class name of plugins.
45
+ # Otherwise (like subsections), "@name" should be a name of section, like "buffer", "store".
46
+ # For subsections, name will be used as parameter names (unless param_name exists), so overriding proxy's name
47
+ # should override "@name".
48
+ @root_section = root
49
+
50
+ @param_name = param_name && param_name.to_sym
51
+ @init = init
52
+ @required = required
53
+ @multi = multi
54
+ @alias = binding.local_variable_get(:alias)
55
+ @type_lookup = type_lookup
56
+
57
+ raise "init and required are exclusive" if @init && @required
44
58
 
45
- @param_name = (opts[:param_name] || @name).to_sym
46
- @required = opts[:required]
47
- @multi = opts[:multi]
48
- @alias = opts[:alias]
59
+ # specify section name for viewpoint of owner(parent) plugin
60
+ # for buffer plugins: all params are in <buffer> section of owner
61
+ # others: <storage>, <format> (formatter/parser), ...
62
+ @configured_in_section = nil
49
63
 
50
64
  @argument = nil # nil: ignore argument
51
65
  @params = {}
52
66
  @defaults = {}
53
67
  @descriptions = {}
54
68
  @sections = {}
69
+ @current_description = nil
70
+ end
71
+
72
+ def variable_name
73
+ @param_name || @name
74
+ end
75
+
76
+ def root?
77
+ @root_section
78
+ end
79
+
80
+ def init?
81
+ @init.nil? ? false : @init
55
82
  end
56
83
 
57
84
  def required?
@@ -63,18 +90,40 @@ module Fluent
63
90
  end
64
91
 
65
92
  def final?
66
- @final
93
+ !!@final
67
94
  end
68
95
 
69
96
  def merge(other) # self is base class, other is subclass
70
97
  return merge_for_finalized(other) if self.final?
71
98
 
72
- options = {
73
- param_name: other.param_name,
74
- required: (other.required.nil? ? self.required : other.required),
75
- multi: (other.multi.nil? ? self.multi : other.multi)
76
- }
77
- merged = self.class.new(other.name, options)
99
+ [:param_name, :required, :multi, :alias, :configured_in_section].each do |prohibited_name|
100
+ if overwrite?(other, prohibited_name)
101
+ raise ConfigError, "BUG: subclass cannot overwrite base class's config_section: #{prohibited_name}"
102
+ end
103
+ end
104
+
105
+ options = {}
106
+ # param_name affects instance variable name, which is just "internal" of each plugins.
107
+ # so it must not be changed. base class's name (or param_name) is always used.
108
+ options[:param_name] = @param_name
109
+
110
+ # subclass cannot overwrite base class's definition
111
+ options[:init] = @init.nil? ? other.init : self.init
112
+ options[:required] = @required.nil? ? other.required : self.required
113
+ options[:multi] = @multi.nil? ? other.multi : self.multi
114
+ options[:alias] = @alias.nil? ? other.alias : self.alias
115
+ options[:final] = @final || other.final
116
+ options[:type_lookup] = @type_lookup
117
+
118
+ merged = if self.root?
119
+ options[:root] = true
120
+ self.class.new(other.name, options)
121
+ else
122
+ self.class.new(@name, options)
123
+ end
124
+
125
+ # configured_in MUST be kept
126
+ merged.configured_in_section = self.configured_in_section || other.configured_in_section
78
127
 
79
128
  merged.argument = other.argument || self.argument
80
129
  merged.params = self.params.merge(other.params)
@@ -98,20 +147,41 @@ module Fluent
98
147
 
99
148
  def merge_for_finalized(other)
100
149
  # list what subclass can do for finalized section
101
- # * overwrite param_name to escape duplicated name of instance variable
102
150
  # * append params/defaults/sections which are missing in superclass
151
+ # * change default values of superclass
152
+ # * overwrite init to make it enable to instantiate section objects with added default values
153
+
154
+ if other.final == false && overwrite?(other, :final)
155
+ raise ConfigError, "BUG: subclass cannot overwrite finalized base class's config_section"
156
+ end
157
+
158
+ [:param_name, :required, :multi, :alias, :configured_in_section].each do |prohibited_name|
159
+ if overwrite?(other, prohibited_name)
160
+ raise ConfigError, "BUG: subclass cannot overwrite base class's config_section: #{prohibited_name}"
161
+ end
162
+ end
103
163
 
104
- options = {
105
- param_name: other.param_name,
106
- required: (self.required.nil? ? other.required : self.required),
107
- multi: (self.multi.nil? ? other.multi : self.multi),
108
- final: true,
109
- }
110
- merged = self.class.new(other.name, options)
164
+ options = {}
165
+ options[:param_name] = @param_name
166
+ options[:init] = @init || other.init
167
+ options[:required] = @required.nil? ? other.required : self.required
168
+ options[:multi] = @multi.nil? ? other.multi : self.multi
169
+ options[:alias] = @alias.nil? ? other.alias : self.alias
170
+ options[:final] = true
171
+ options[:type_lookup] = @type_lookup
172
+
173
+ merged = if self.root?
174
+ options[:root] = true
175
+ self.class.new(other.name, options)
176
+ else
177
+ self.class.new(@name, options)
178
+ end
179
+
180
+ merged.configured_in_section = self.configured_in_section || other.configured_in_section
111
181
 
112
182
  merged.argument = self.argument || other.argument
113
183
  merged.params = other.params.merge(self.params)
114
- merged.defaults = other.defaults.merge(self.defaults)
184
+ merged.defaults = self.defaults.merge(other.defaults)
115
185
  merged.sections = {}
116
186
  (self.sections.keys + other.sections.keys).uniq.each do |section_key|
117
187
  self_section = self.sections[section_key]
@@ -129,49 +199,88 @@ module Fluent
129
199
  merged
130
200
  end
131
201
 
132
- def option_value_type!(name, opts, key, klass)
133
- if opts.has_key?(key) && !opts[key].is_a?(klass)
134
- raise ArgumentError, "#{name}: #{key} must be a #{klass}, but #{opts[key].class}"
202
+ def overwrite_defaults(other) # other is owner plugin's corresponding proxy
203
+ self.defaults = self.defaults.merge(other.defaults)
204
+ self.sections.keys.each do |section_key|
205
+ if other.sections.has_key?(section_key)
206
+ self.sections[section_key].overwrite_defaults(other.sections[section_key])
207
+ end
135
208
  end
136
209
  end
137
210
 
138
- def parameter_configuration(name, *args, &block)
139
- name = name.to_sym
211
+ def option_value_type!(name, opts, key, klass=nil, type: nil)
212
+ if opts.has_key?(key)
213
+ if klass && !opts[key].is_a?(klass)
214
+ raise ArgumentError, "#{name}: #{key} must be a #{klass}, but #{opts[key].class}"
215
+ end
216
+ case type
217
+ when :boolean
218
+ unless opts[key].is_a?(TrueClass) || opts[key].is_a?(FalseClass)
219
+ raise ArgumentError, "#{name}: #{key} must be true or false, but #{opts[key].class}"
220
+ end
221
+ when nil
222
+ # ignore
223
+ else
224
+ raise "unknown type: #{type} for option #{key}"
225
+ end
226
+ end
227
+ end
140
228
 
141
- opts = {}
142
- args.each { |a|
143
- if a.is_a?(Symbol)
144
- opts[:type] = a
145
- elsif a.is_a?(Hash)
146
- opts.merge!(a)
229
+ def config_parameter_option_validate!(name, type, **kwargs, &block)
230
+ if type.nil? && !block
231
+ type = :string
232
+ end
233
+ kwargs.each_key do |key|
234
+ case key
235
+ when :default, :alias, :secret, :skip_accessor, :deprecated, :obsoleted, :desc
236
+ # valid for all types
237
+ when :list
238
+ raise ArgumentError, ":list is valid only for :enum type, but #{type}: #{name}" if type != :enum
239
+ when :value_type
240
+ raise ArgumentError, ":value_type is valid only for :hash and :array, but #{type}: #{name}" if type != :hash && type != :array
241
+ when :symbolize_keys
242
+ raise ArgumentError, ":symbolize_keys is valid only for :hash, but #{type}: #{name}" if type != :hash
147
243
  else
148
- raise ArgumentError, "#{self.name}: wrong number of arguments (#{1 + args.length} for #{block ? 2 : 3})"
244
+ raise ArgumentError, "unknown option '#{key}' for configuration parameter: #{name}"
149
245
  end
150
- }
246
+ end
247
+ end
248
+
249
+ def parameter_configuration(name, type = nil, **kwargs, &block)
250
+ config_parameter_option_validate!(name, type, **kwargs, &block)
251
+
252
+ name = name.to_sym
151
253
 
152
- type = opts[:type]
153
254
  if block && type
154
255
  raise ArgumentError, "#{name}: both of block and type cannot be specified"
256
+ elsif !block && !type
257
+ type = :string
155
258
  end
259
+ opts = {}
260
+ opts[:type] = type
261
+ opts.merge!(kwargs)
156
262
 
157
263
  begin
158
- type = :string if type.nil?
159
- block ||= Configurable.lookup_type(type)
264
+ block ||= @type_lookup.call(type)
160
265
  rescue ConfigError
161
266
  # override error message
162
267
  raise ArgumentError, "#{name}: unknown config_argument type `#{type}'"
163
268
  end
164
269
 
270
+ # options for config_param
165
271
  option_value_type!(name, opts, :desc, String)
166
272
  option_value_type!(name, opts, :alias, Symbol)
273
+ option_value_type!(name, opts, :secret, type: :boolean)
167
274
  option_value_type!(name, opts, :deprecated, String)
168
275
  option_value_type!(name, opts, :obsoleted, String)
169
276
  if type == :enum
170
- if !opts.has_key?(:list) || !opts[:list].all?{|v| v.is_a?(Symbol) }
277
+ if !opts.has_key?(:list) || !opts[:list].is_a?(Array) || opts[:list].empty? || !opts[:list].all?{|v| v.is_a?(Symbol) }
171
278
  raise ArgumentError, "#{name}: enum parameter requires :list of Symbols"
172
279
  end
173
280
  end
281
+ option_value_type!(name, opts, :symbolize_keys, type: :boolean)
174
282
  option_value_type!(name, opts, :value_type, Symbol) # hash, array
283
+ option_value_type!(name, opts, :skip_accessor, type: :boolean)
175
284
 
176
285
  if opts.has_key?(:default)
177
286
  config_set_default(name, opts[:default])
@@ -188,18 +297,25 @@ module Fluent
188
297
  [name, block, opts]
189
298
  end
190
299
 
191
- def config_argument(name, *args, &block)
300
+ def configured_in(section_name)
301
+ if @configured_in_section
302
+ raise ArgumentError, "#{self.name}: configured_in called twice"
303
+ end
304
+ @configured_in_section = section_name.to_sym
305
+ end
306
+
307
+ def config_argument(name, type = nil, **kwargs, &block)
192
308
  if @argument
193
309
  raise ArgumentError, "#{self.name}: config_argument called twice"
194
310
  end
195
- name, block, opts = parameter_configuration(name, *args, &block)
311
+ name, block, opts = parameter_configuration(name, type, **kwargs, &block)
196
312
 
197
313
  @argument = [name, block, opts]
198
314
  name
199
315
  end
200
316
 
201
- def config_param(name, *args, &block)
202
- name, block, opts = parameter_configuration(name, *args, &block)
317
+ def config_param(name, type = nil, **kwargs, &block)
318
+ name, block, opts = parameter_configuration(name, type, **kwargs, &block)
203
319
 
204
320
  if @current_description
205
321
  config_set_desc(name, @current_description)
@@ -237,18 +353,13 @@ module Fluent
237
353
  @current_description = description
238
354
  end
239
355
 
240
- def config_section(name, *args, &block)
356
+ def config_section(name, **kwargs, &block)
241
357
  unless block_given?
242
358
  raise ArgumentError, "#{name}: config_section requires block parameter"
243
359
  end
244
360
  name = name.to_sym
245
361
 
246
- opts = {}
247
- unless args.empty? || args.size == 1 && args.first.is_a?(Hash)
248
- raise ArgumentError, "#{self.name}: unknown config_section arguments: #{args.inspect}"
249
- end
250
-
251
- sub_proxy = ConfigureProxy.new(name, *args)
362
+ sub_proxy = ConfigureProxy.new(name, type_lookup: @type_lookup, **kwargs)
252
363
  sub_proxy.instance_exec(&block)
253
364
 
254
365
  @params.delete(name)
@@ -257,20 +368,57 @@ module Fluent
257
368
  name
258
369
  end
259
370
 
260
- def dump(level = 0)
261
- dumped_config = ""
262
- indent = " " * level
371
+ def dump_config_definition
372
+ dumped_config = {}
373
+ if @argument
374
+ argument_name, _block, options = @argument
375
+ options[:required] = !@defaults.key?(argument_name)
376
+ options[:argument] = true
377
+ dumped_config[argument_name] = options
378
+ end
263
379
  @params.each do |name, config|
264
- dumped_config << "#{indent}#{name}: #{config[1][:type]}: <#{@defaults[name].inspect}>"
265
- dumped_config << " # #{@descriptions[name]}" if @descriptions[name]
266
- dumped_config << "\n"
380
+ dumped_config[name] = config[1]
381
+ dumped_config[name][:required] = !@defaults.key?(name)
382
+ dumped_config[name][:default] = @defaults[name] if @defaults.key?(name)
383
+ dumped_config[name][:desc] = @descriptions[name] if @descriptions.key?(name)
384
+ end
385
+ # Overwrite by config_set_default
386
+ @defaults.each do |name, value|
387
+ if @params.key?(name) || (@argument && @argument.first == name)
388
+ dumped_config[name][:default] = value
389
+ else
390
+ dumped_config[name] = { default: value }
391
+ end
392
+ end
393
+ # Overwrite by config_set_desc
394
+ @descriptions.each do |name, value|
395
+ if @params.key?(name)
396
+ dumped_config[name][:desc] = value
397
+ else
398
+ dumped_config[name] = { desc: value }
399
+ end
267
400
  end
268
401
  @sections.each do |section_name, sub_proxy|
269
- dumped_config << "#{indent}#{section_name}\n#{sub_proxy.dump(level + 1)}"
402
+ if dumped_config.key?(section_name)
403
+ dumped_config[section_name].update(sub_proxy.dump_config_definition)
404
+ else
405
+ dumped_config[section_name] = sub_proxy.dump_config_definition
406
+ dumped_config[section_name][:required] = sub_proxy.required?
407
+ dumped_config[section_name][:multi] = sub_proxy.multi?
408
+ dumped_config[section_name][:alias] = sub_proxy.alias
409
+ dumped_config[section_name][:section] = true
410
+ end
270
411
  end
271
412
  dumped_config
272
413
  end
414
+
415
+ private
416
+
417
+ def overwrite?(other, attribute_name)
418
+ value = instance_variable_get("@#{attribute_name}")
419
+ other_value = other.__send__(attribute_name)
420
+ !value.nil? && !other_value.nil? && value != other_value
421
+ end
273
422
  end
274
423
  end
275
424
  end
276
-
@@ -22,6 +22,8 @@ require 'fluent/config/element'
22
22
  module Fluent
23
23
  module Config
24
24
  module DSL
25
+ RESERVED_PARAMETERS = [:type, :id, :log_level, :label] # Need '@' prefix for reserved parameters
26
+
25
27
  module Parser
26
28
  def self.read(path)
27
29
  path = File.expand_path(path)
@@ -82,6 +84,10 @@ module Fluent
82
84
  @proxy = proxy
83
85
  end
84
86
 
87
+ def to_int
88
+ __id__
89
+ end
90
+
85
91
  def method_missing(name, *args, &block)
86
92
  ::Kernel.raise ::ArgumentError, "Configuration DSL Syntax Error: only one argument allowed" if args.size > 1
87
93
  value = args.first
@@ -91,11 +97,12 @@ module Fluent
91
97
  proxy.element.instance_exec(&block)
92
98
  @elements.push(proxy.to_config_element)
93
99
  else
94
- @attrs[name.to_s] = if value.is_a?(Array) || value.is_a?(Hash)
95
- JSON.dump(value)
96
- else
97
- value.to_s
98
- end
100
+ param_name = RESERVED_PARAMETERS.include?(name) ? "@#{name}" : name.to_s
101
+ @attrs[param_name] = if value.is_a?(Array) || value.is_a?(Hash)
102
+ JSON.dump(value)
103
+ else
104
+ value.to_s
105
+ end
99
106
  end
100
107
 
101
108
  self
@@ -32,11 +32,39 @@ module Fluent
32
32
  @v1_config = false
33
33
  @corresponding_proxies = [] # some plugins use flat parameters, e.g. in_http doesn't provide <format> section for parser.
34
34
  @unused_in = false # if this element is not used in plugins, correspoing plugin name and parent element name is set, e.g. [source, plugin class].
35
+
36
+ # it's global logger, not plugin logger: deprecated message should be global warning, not plugin level.
37
+ @logger = defined?($log) ? $log : nil
38
+
39
+ @target_worker_ids = []
35
40
  end
36
41
 
37
- attr_accessor :name, :arg, :elements, :unused, :v1_config, :corresponding_proxies, :unused_in
42
+ attr_accessor :name, :arg, :unused, :v1_config, :corresponding_proxies, :unused_in
43
+ attr_writer :elements
44
+ attr_reader :target_worker_ids
45
+
46
+ RESERVED_PARAMETERS_COMPAT = {
47
+ '@type' => 'type',
48
+ '@id' => 'id',
49
+ '@log_level' => 'log_level',
50
+ '@label' => nil,
51
+ }
52
+ RESERVED_PARAMETERS = RESERVED_PARAMETERS_COMPAT.keys
53
+
54
+ def elements(*names, name: nil, arg: nil)
55
+ raise ArgumentError, "name and names are exclusive" if name && !names.empty?
56
+ raise ArgumentError, "arg is available only with name" if arg && !name
57
+
58
+ if name
59
+ @elements.select{|e| e.name == name && (!arg || e.arg == arg) }
60
+ elsif !names.empty?
61
+ @elements.select{|e| names.include?(e.name) }
62
+ else
63
+ @elements
64
+ end
65
+ end
38
66
 
39
- def add_element(name, arg='')
67
+ def add_element(name, arg = '')
40
68
  e = Element.new(name, arg, {}, [])
41
69
  e.v1_config = @v1_config
42
70
  @elements << e
@@ -48,6 +76,11 @@ module Fluent
48
76
  "name:#{@name}, arg:#{@arg}, " + attrs + ", " + @elements.inspect
49
77
  end
50
78
 
79
+ # Used by PP and Pry
80
+ def pretty_print(q)
81
+ q.text(inspect)
82
+ end
83
+
51
84
  # This method assumes _o_ is an Element object. Should return false for nil or other object
52
85
  def ==(o)
53
86
  self.name == o.name && self.arg == o.arg &&
@@ -63,6 +96,7 @@ module Fluent
63
96
  e
64
97
  end
65
98
 
99
+ # no code in fluentd uses this method
66
100
  def each_element(*names, &block)
67
101
  if names.empty?
68
102
  @elements.each(&block)
@@ -76,7 +110,7 @@ module Fluent
76
110
  end
77
111
 
78
112
  def has_key?(key)
79
- @unused_in = false # some sections, e.g. <store> in copy, is not defined by config_section so clear unused flag for better warning message in chgeck_not_fetched.
113
+ @unused_in = false # some sections, e.g. <store> in copy, is not defined by config_section so clear unused flag for better warning message in check_not_fetched.
80
114
  @unused.delete(key)
81
115
  super
82
116
  end
@@ -84,6 +118,12 @@ module Fluent
84
118
  def [](key)
85
119
  @unused_in = false # ditto
86
120
  @unused.delete(key)
121
+
122
+ if RESERVED_PARAMETERS.include?(key) && !has_key?(key) && has_key?(RESERVED_PARAMETERS_COMPAT[key])
123
+ @logger.warn "'#{RESERVED_PARAMETERS_COMPAT[key]}' is deprecated parameter name. use '#{key}' instead." if @logger
124
+ return self[RESERVED_PARAMETERS_COMPAT[key]]
125
+ end
126
+
87
127
  super
88
128
  end
89
129
 
@@ -108,11 +148,7 @@ module Fluent
108
148
  out << "#{indent}<#{@name} #{@arg}>\n"
109
149
  end
110
150
  each_pair { |k, v|
111
- if secret_param?(k)
112
- out << "#{nindent}#{k} xxxxxx\n"
113
- else
114
- out << "#{nindent}#{k} #{v}\n"
115
- end
151
+ out << dump_value(k, v, nindent)
116
152
  }
117
153
  @elements.each { |e|
118
154
  out << e.to_s(nest + 1)
@@ -124,6 +160,8 @@ module Fluent
124
160
  def to_masked_element
125
161
  new_elems = @elements.map { |e| e.to_masked_element }
126
162
  new_elem = Element.new(@name, @arg, {}, new_elems, @unused)
163
+ new_elem.v1_config = @v1_config
164
+ new_elem.corresponding_proxies = @corresponding_proxies
127
165
  each_pair { |k, v|
128
166
  new_elem[k] = secret_param?(k) ? 'xxxxxx' : v
129
167
  }
@@ -135,7 +173,7 @@ module Fluent
135
173
 
136
174
  param_key = key.to_sym
137
175
  @corresponding_proxies.each { |proxy|
138
- block, opts = proxy.params[param_key]
176
+ _block, opts = proxy.params[param_key]
139
177
  if opts && opts.has_key?(:secret)
140
178
  return opts[:secret]
141
179
  end
@@ -144,11 +182,71 @@ module Fluent
144
182
  false
145
183
  end
146
184
 
185
+ def param_type(key)
186
+ return nil if @corresponding_proxies.empty?
187
+
188
+ param_key = key.to_sym
189
+ proxy = @corresponding_proxies.detect do |_proxy|
190
+ _proxy.params.has_key?(param_key)
191
+ end
192
+ return nil unless proxy
193
+ _block, opts = proxy.params[param_key]
194
+ opts[:type]
195
+ end
196
+
197
+ def dump_value(k, v, nindent)
198
+ if secret_param?(k)
199
+ "#{nindent}#{k} xxxxxx\n"
200
+ else
201
+ if @v1_config
202
+ case param_type(k)
203
+ when :string
204
+ "#{nindent}#{k} \"#{self.class.unescape_parameter(v)}\"\n"
205
+ when :enum, :integer, :float, :size, :bool, :time
206
+ "#{nindent}#{k} #{v}\n"
207
+ when :hash, :array
208
+ "#{nindent}#{k} #{v}\n"
209
+ else
210
+ # Unknown type
211
+ "#{nindent}#{k} #{v}\n"
212
+ end
213
+ else
214
+ "#{nindent}#{k} #{v}\n"
215
+ end
216
+ end
217
+ end
218
+
147
219
  def self.unescape_parameter(v)
148
220
  result = ''
149
221
  v.each_char { |c| result << LiteralParser.unescape_char(c) }
150
222
  result
151
223
  end
224
+
225
+ def set_target_worker_id(worker_id)
226
+ @target_worker_ids = [worker_id]
227
+ @elements.each { |e|
228
+ e.set_target_worker_id(worker_id)
229
+ }
230
+ end
231
+
232
+ def set_target_worker_ids(worker_ids)
233
+ @target_worker_ids = worker_ids.uniq
234
+ @elements.each { |e|
235
+ e.set_target_worker_ids(worker_ids.uniq)
236
+ }
237
+ end
238
+
239
+ def for_every_workers?
240
+ @target_worker_ids.empty?
241
+ end
242
+
243
+ def for_this_worker?
244
+ @target_worker_ids.include?(Fluent::Engine.worker_id)
245
+ end
246
+
247
+ def for_another_worker?
248
+ !@target_worker_ids.empty? && !@target_worker_ids.include?(Fluent::Engine.worker_id)
249
+ end
152
250
  end
153
251
  end
154
252
  end
@@ -18,6 +18,7 @@ require 'stringio'
18
18
 
19
19
  require 'json'
20
20
  require 'yajl'
21
+ require 'socket'
21
22
  require 'irb/ruby-lex' # RubyLex
22
23
 
23
24
  require 'fluent/config/basic_parser'
@@ -162,6 +163,11 @@ module Fluent
162
163
  if @eval_context.nil?
163
164
  parse_error! "embedded code is not allowed in this file"
164
165
  end
166
+ # Add hostname and worker_id to code for preventing unused warnings
167
+ code = <<EOM + code
168
+ hostname = Socket.gethostname
169
+ worker_id = ENV['SERVERENGINE_WORKER_ID'] || ''
170
+ EOM
165
171
  @eval_context.instance_eval(code)
166
172
  end
167
173
 
@@ -192,7 +198,7 @@ module Fluent
192
198
 
193
199
  def scan_json(is_array)
194
200
  result = nil
195
- # Yajl does not raise ParseError for imcomplete json string, like '[1', '{"h"', '{"h":' or '{"h1":1'
201
+ # Yajl does not raise ParseError for incomplete json string, like '[1', '{"h"', '{"h":' or '{"h1":1'
196
202
  # This is the reason to use JSON module.
197
203
 
198
204
  buffer = (is_array ? "[" : "{")
@@ -209,7 +215,7 @@ module Fluent
209
215
  parsed = nil
210
216
  begin
211
217
  parsed = JSON.parse(buffer + line_buffer.rstrip.sub(/,$/, '') + (is_array ? "]" : "}"))
212
- rescue JSON::ParserError => e
218
+ rescue JSON::ParserError
213
219
  # This '#' is in json string literals
214
220
  end
215
221
 
@@ -237,7 +243,7 @@ module Fluent
237
243
  line_buffer << char
238
244
  begin
239
245
  result = JSON.parse(buffer + line_buffer)
240
- rescue JSON::ParserError => e
246
+ rescue JSON::ParserError
241
247
  # Incomplete json string yet
242
248
  end
243
249
  end
@@ -81,10 +81,10 @@ module Fluent
81
81
  pattern = path
82
82
  end
83
83
 
84
- Dir.glob(pattern).sort.each { |path|
85
- basepath = File.dirname(path)
86
- fname = File.basename(path)
87
- File.open(path) { |f|
84
+ Dir.glob(pattern).sort.each { |entry|
85
+ basepath = File.dirname(entry)
86
+ fname = File.basename(entry)
87
+ File.open(entry) { |f|
88
88
  Parser.new(basepath, f.each_line, fname).parse!(allow_include, nil, attrs, elems)
89
89
  }
90
90
  }