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
data/lib/fluent/engine.rb CHANGED
@@ -14,14 +14,10 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- require 'socket'
18
-
19
- require 'msgpack'
20
- require 'cool.io'
21
-
22
17
  require 'fluent/config'
23
18
  require 'fluent/event'
24
19
  require 'fluent/event_router'
20
+ require 'fluent/msgpack_factory'
25
21
  require 'fluent/root_agent'
26
22
  require 'fluent/time'
27
23
  require 'fluent/system_config'
@@ -29,54 +25,51 @@ require 'fluent/plugin'
29
25
 
30
26
  module Fluent
31
27
  class EngineClass
32
- class DummyMessagePackFactory
33
- def packer(*args)
34
- MessagePack::Packer.new(*args)
35
- end
36
-
37
- def unpacker(*args)
38
- MessagePack::Unpacker.new(*args)
39
- end
40
- end
28
+ include Fluent::MessagePackFactory::Mixin
41
29
 
42
30
  def initialize
43
31
  @root_agent = nil
44
- @event_router = nil
45
32
  @default_loop = nil
46
33
  @engine_stopped = false
34
+ @_worker_id = nil
47
35
 
36
+ @log_event_router = nil
48
37
  @log_emit_thread = nil
49
38
  @log_event_loop_stop = false
39
+ @log_event_loop_graceful_stop = false
50
40
  @log_event_queue = []
41
+ @log_event_verbose = false
51
42
 
52
43
  @suppress_config_dump = false
53
44
 
54
- @msgpack_factory = DummyMessagePackFactory.new
45
+ @system_config = SystemConfig.new
46
+
47
+ @dry_run_mode = false
55
48
  end
56
49
 
50
+ MAINLOOP_SLEEP_INTERVAL = 0.3
51
+
57
52
  MATCH_CACHE_SIZE = 1024
58
53
  LOG_EMIT_INTERVAL = 0.1
59
54
 
60
55
  attr_reader :root_agent
61
56
  attr_reader :matches, :sources
62
- attr_reader :msgpack_factory
63
57
  attr_reader :system_config
64
58
 
59
+ attr_accessor :dry_run_mode
60
+
65
61
  def init(system_config)
66
62
  @system_config = system_config
67
63
 
68
- BasicSocket.do_not_reverse_lookup = true
69
- Plugin.load_plugins
70
- if defined?(Encoding)
71
- Encoding.default_internal = 'ASCII-8BIT' if Encoding.respond_to?(:default_internal)
72
- Encoding.default_external = 'ASCII-8BIT' if Encoding.respond_to?(:default_external)
73
- end
74
-
75
64
  suppress_interval(system_config.emit_error_log_interval) unless system_config.emit_error_log_interval.nil?
76
65
  @suppress_config_dump = system_config.suppress_config_dump unless system_config.suppress_config_dump.nil?
77
66
  @without_source = system_config.without_source unless system_config.without_source.nil?
78
67
 
79
- @root_agent = RootAgent.new(@system_config)
68
+ @log_event_verbose = system_config.log_event_verbose unless system_config.log_event_verbose.nil?
69
+
70
+ @root_agent = RootAgent.new(log: log, system_config: @system_config)
71
+
72
+ MessagePackFactory.init
80
73
 
81
74
  self
82
75
  end
@@ -109,12 +102,21 @@ module Fluent
109
102
  else
110
103
  "section <#{e.name}> is not used in <#{parent_name}>"
111
104
  end
112
- $log.warn message
105
+ if e.for_every_workers?
106
+ $log.warn :worker0, message
107
+ elsif e.for_this_worker?
108
+ $log.warn message
109
+ end
113
110
  next
114
111
  end
115
112
  unless e.name == 'system'
116
113
  unless @without_source && e.name == 'source'
117
- $log.warn "parameter '#{key}' in #{e.to_s.strip} is not used."
114
+ message = "parameter '#{key}' in #{e.to_s.strip} is not used."
115
+ if e.for_every_workers?
116
+ $log.warn :worker0, message
117
+ elsif e.for_this_worker?
118
+ $log.warn message
119
+ end
118
120
  end
119
121
  end
120
122
  }
@@ -123,33 +125,60 @@ module Fluent
123
125
  def configure(conf)
124
126
  # plugins / configuration dumps
125
127
  Gem::Specification.find_all.select{|x| x.name =~ /^fluent(d|-(plugin|mixin)-.*)$/}.each do |spec|
126
- $log.info "gem '#{spec.name}' version '#{spec.version}'"
128
+ $log.info :worker0, "gem '#{spec.name}' version '#{spec.version}'"
127
129
  end
128
130
 
129
131
  @root_agent.configure(conf)
130
- @event_router = @root_agent.event_router
132
+
133
+ begin
134
+ log_event_agent = @root_agent.find_label(Fluent::Log::LOG_EVENT_LABEL)
135
+ log_event_router = log_event_agent.event_router
136
+
137
+ # suppress mismatched tags only for <label @FLUENT_LOG> label.
138
+ # it's not suppressed in default event router for non-log-event events
139
+ log_event_router.suppress_missing_match!
140
+
141
+ @log_event_router = log_event_router
142
+
143
+ unmatched_tags = Fluent::Log.event_tags.select{|t| !@log_event_router.match?(t) }
144
+ unless unmatched_tags.empty?
145
+ $log.warn "match for some tags of log events are not defined (to be ignored)", tags: unmatched_tags
146
+ end
147
+ rescue ArgumentError # ArgumentError "#{label_name} label not found"
148
+ # use default event router if <label @FLUENT_LOG> is missing in configuration
149
+ log_event_router = @root_agent.event_router
150
+
151
+ if Fluent::Log.event_tags.any?{|t| log_event_router.match?(t) }
152
+ @log_event_router = log_event_router
153
+
154
+ unmatched_tags = Fluent::Log.event_tags.select{|t| !@log_event_router.match?(t) }
155
+ unless unmatched_tags.empty?
156
+ $log.warn "match for some tags of log events are not defined (to be ignored)", tags: unmatched_tags
157
+ end
158
+ end
159
+ end
160
+
161
+ $log.enable_event(true) if @log_event_router
131
162
 
132
163
  unless @suppress_config_dump
133
- $log.info "using configuration file: #{conf.to_s.rstrip}"
164
+ $log.info :supervisor, "using configuration file: #{conf.to_s.rstrip}"
134
165
  end
135
166
  end
136
167
 
137
- def load_plugin_dir(dir)
138
- Plugin.load_plugin_dir(dir)
168
+ def add_plugin_dir(dir)
169
+ Plugin.add_plugin_dir(dir)
139
170
  end
140
171
 
141
172
  def emit(tag, time, record)
142
- unless record.nil?
143
- emit_stream tag, OneEventStream.new(time, record)
144
- end
173
+ raise "BUG: use router.emit instead of Engine.emit"
145
174
  end
146
175
 
147
176
  def emit_array(tag, array)
148
- emit_stream tag, ArrayEventStream.new(array)
177
+ raise "BUG: use router.emit_array instead of Engine.emit_array"
149
178
  end
150
179
 
151
180
  def emit_stream(tag, es)
152
- @event_router.emit_stream(tag, es)
181
+ raise "BUG: use router.emit_stream instead of Engine.emit_stream"
153
182
  end
154
183
 
155
184
  def flush!
@@ -158,7 +187,7 @@ module Fluent
158
187
 
159
188
  def now
160
189
  # TODO thread update
161
- Time.now.to_i
190
+ Fluent::EventTime.now
162
191
  end
163
192
 
164
193
  def log_event_loop
@@ -166,6 +195,7 @@ module Fluent
166
195
 
167
196
  while sleep(LOG_EMIT_INTERVAL)
168
197
  break if @log_event_loop_stop
198
+ break if @log_event_loop_graceful_stop && @log_event_queue.empty?
169
199
  next if @log_event_queue.empty?
170
200
 
171
201
  # NOTE: thead-safe of slice! depends on GVL
@@ -174,9 +204,10 @@ module Fluent
174
204
 
175
205
  events.each {|tag,time,record|
176
206
  begin
177
- @event_router.emit(tag, time, record)
207
+ @log_event_router.emit(tag, time, record)
178
208
  rescue => e
179
- $log.error "failed to emit fluentd's log event", tag: tag, event: record, error_class: e.class, error: e
209
+ # This $log.error doesn't emit log events, because of `$log.disable_events(Thread.current)` above
210
+ $log.error "failed to emit fluentd's log event", tag: tag, event: record, error: e
180
211
  end
181
212
  }
182
213
  end
@@ -184,45 +215,44 @@ module Fluent
184
215
 
185
216
  def run
186
217
  begin
218
+ $log.info "starting fluentd worker", pid: Process.pid, ppid: Process.ppid, worker: worker_id
187
219
  start
188
220
 
189
- if @event_router.match?($log.tag)
190
- $log.enable_event
221
+ if @log_event_router
222
+ $log.enable_event(true)
191
223
  @log_emit_thread = Thread.new(&method(:log_event_loop))
224
+ @log_emit_thread.abort_on_exception = true
192
225
  end
193
226
 
194
- unless @engine_stopped
195
- # for empty loop
196
- @default_loop = Coolio::Loop.default
197
- @default_loop.attach Coolio::TimerWatcher.new(1, true)
198
- # TODO attach async watch for thread pool
199
- @default_loop.run
200
- end
201
-
202
- if @engine_stopped and @default_loop
203
- @default_loop.stop
204
- @default_loop = nil
205
- end
227
+ $log.info "fluentd worker is now running", worker: worker_id
228
+ sleep MAINLOOP_SLEEP_INTERVAL until @engine_stopped
229
+ $log.info "fluentd worker is now stopping", worker: worker_id
206
230
 
207
- rescue => e
208
- $log.error "unexpected error", error_class: e.class, error: e
231
+ rescue Exception => e
232
+ $log.error "unexpected error", error: e
209
233
  $log.error_backtrace
210
- ensure
211
- $log.info "shutting down fluentd"
212
- shutdown
234
+ raise
235
+ end
236
+
237
+ unless @log_event_verbose
238
+ $log.enable_event(false)
213
239
  if @log_emit_thread
214
- @log_event_loop_stop = true
240
+ # to make sure to emit all log events into router, before shutting down
241
+ @log_event_loop_graceful_stop = true
215
242
  @log_emit_thread.join
243
+ @log_emit_thread = nil
216
244
  end
217
245
  end
246
+ $log.info "shutting down fluentd worker", worker: worker_id
247
+ shutdown
248
+ if @log_emit_thread
249
+ @log_event_loop_stop = true
250
+ @log_emit_thread.join
251
+ end
218
252
  end
219
253
 
220
254
  def stop
221
255
  @engine_stopped = true
222
- if @default_loop
223
- @default_loop.stop
224
- @default_loop = nil
225
- end
226
256
  nil
227
257
  end
228
258
 
@@ -231,8 +261,15 @@ module Fluent
231
261
  @log_event_queue.push([tag, time, record])
232
262
  end
233
263
 
234
- private
264
+ def worker_id
265
+ return @_worker_id if @_worker_id
266
+ # if ENV doesn't have SERVERENGINE_WORKER_ID, it is a worker under --no-supervisor or in tests
267
+ # so it's (almost) a single worker, worker_id=0
268
+ @_worker_id = (ENV['SERVERENGINE_WORKER_ID'] || 0).to_i
269
+ @_worker_id
270
+ end
235
271
 
272
+ private
236
273
  def start
237
274
  @root_agent.start
238
275
  end
data/lib/fluent/env.rb CHANGED
@@ -14,12 +14,16 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
+ require 'serverengine/utils'
18
+
17
19
  module Fluent
18
20
  DEFAULT_CONFIG_PATH = ENV['FLUENT_CONF'] || '/etc/fluent/fluent.conf'
19
21
  DEFAULT_PLUGIN_DIR = ENV['FLUENT_PLUGIN'] || '/etc/fluent/plugin'
20
22
  DEFAULT_SOCKET_PATH = ENV['FLUENT_SOCKET'] || '/var/run/fluent/fluent.sock'
23
+ DEFAULT_BACKUP_DIR = ENV['FLUENT_BACKUP_DIR'] || '/tmp/fluent'
21
24
  DEFAULT_OJ_OPTIONS = {bigdecimal_load: :float, mode: :compat, use_to_json: true}
22
- DEFAULT_LISTEN_PORT = 24224
23
- DEFAULT_FILE_PERMISSION = 0644
24
- DEFAULT_DIR_PERMISSION = 0755
25
+
26
+ def self.windows?
27
+ ServerEngine.windows?
28
+ end
25
29
  end
@@ -0,0 +1,30 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ module Fluent
18
+ class UnrecoverableError < StandardError
19
+ def initialize(error_message = nil)
20
+ @message = error_message || "an unrecoverable error occurs in Fluentd process"
21
+ end
22
+
23
+ def to_s
24
+ @message
25
+ end
26
+ end
27
+
28
+ class InvalidRootDirectory < UnrecoverableError
29
+ end
30
+ end
data/lib/fluent/event.rb CHANGED
@@ -14,29 +14,68 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- require 'fluent/engine'
17
+ require 'fluent/msgpack_factory'
18
+ require 'fluent/plugin/compressable'
18
19
 
19
20
  module Fluent
20
21
  class EventStream
21
22
  include Enumerable
23
+ include MessagePackFactory::Mixin
24
+ include Fluent::Plugin::Compressable
25
+
26
+ # dup does deep copy for event stream
27
+ def dup
28
+ raise NotImplementedError, "DO NOT USE THIS CLASS directly."
29
+ end
30
+
31
+ def size
32
+ raise NotImplementedError, "DO NOT USE THIS CLASS directly."
33
+ end
34
+ alias :length :size
35
+
36
+ def empty?
37
+ size == 0
38
+ end
39
+
40
+ # for tests
41
+ def ==(other)
42
+ other.is_a?(EventStream) && self.to_msgpack_stream == other.to_msgpack_stream
43
+ end
22
44
 
23
45
  def repeatable?
24
46
  false
25
47
  end
26
48
 
49
+ def slice(index, num)
50
+ raise NotImplementedError, "DO NOT USE THIS CLASS directly."
51
+ end
52
+
27
53
  def each(&block)
28
54
  raise NotImplementedError, "DO NOT USE THIS CLASS directly."
29
55
  end
30
56
 
31
- def to_msgpack_stream
32
- out = Fluent::Engine.msgpack_factory.packer
57
+ def to_msgpack_stream(time_int: false)
58
+ return to_msgpack_stream_forced_integer if time_int
59
+ out = msgpack_packer
33
60
  each {|time,record|
34
61
  out.write([time,record])
35
62
  }
36
63
  out.to_s
37
64
  end
38
- end
39
65
 
66
+ def to_compressed_msgpack_stream(time_int: false)
67
+ packed = to_msgpack_stream(time_int: time_int)
68
+ compress(packed)
69
+ end
70
+
71
+ def to_msgpack_stream_forced_integer
72
+ out = msgpack_packer
73
+ each {|time,record|
74
+ out.write([time.to_i,record])
75
+ }
76
+ out.to_s
77
+ end
78
+ end
40
79
 
41
80
  class OneEventStream < EventStream
42
81
  def initialize(time, record)
@@ -48,10 +87,22 @@ module Fluent
48
87
  OneEventStream.new(@time, @record.dup)
49
88
  end
50
89
 
90
+ def size
91
+ 1
92
+ end
93
+
51
94
  def repeatable?
52
95
  true
53
96
  end
54
97
 
98
+ def slice(index, num)
99
+ if index > 0 || num == 0
100
+ ArrayEventStream.new([])
101
+ else
102
+ self.dup
103
+ end
104
+ end
105
+
55
106
  def each(&block)
56
107
  block.call(@time, @record)
57
108
  nil
@@ -68,10 +119,14 @@ module Fluent
68
119
  end
69
120
 
70
121
  def dup
71
- entries = @entries.map { |entry| entry.dup } # @entries.map(:dup) doesn't work by ArgumentError
122
+ entries = @entries.map{ |time, record| [time, record.dup] }
72
123
  ArrayEventStream.new(entries)
73
124
  end
74
125
 
126
+ def size
127
+ @entries.size
128
+ end
129
+
75
130
  def repeatable?
76
131
  true
77
132
  end
@@ -80,6 +135,10 @@ module Fluent
80
135
  @entries.empty?
81
136
  end
82
137
 
138
+ def slice(index, num)
139
+ ArrayEventStream.new(@entries.slice(index, num))
140
+ end
141
+
83
142
  def each(&block)
84
143
  @entries.each(&block)
85
144
  nil
@@ -93,21 +152,21 @@ module Fluent
93
152
  #
94
153
  # Use this class as below, in loop of data-enumeration:
95
154
  # 1. initialize blank stream:
96
- # streams[tag] ||= MultiEventStream
155
+ # streams[tag] ||= MultiEventStream.new
97
156
  # 2. add events
98
157
  # stream[tag].add(time, record)
99
158
  class MultiEventStream < EventStream
100
- def initialize
101
- @time_array = []
102
- @record_array = []
159
+ def initialize(time_array = [], record_array = [])
160
+ @time_array = time_array
161
+ @record_array = record_array
103
162
  end
104
163
 
105
164
  def dup
106
- es = MultiEventStream.new
107
- @time_array.zip(@record_array).each { |time, record|
108
- es.add(time, record.dup)
109
- }
110
- es
165
+ MultiEventStream.new(@time_array.dup, @record_array.map(&:dup))
166
+ end
167
+
168
+ def size
169
+ @time_array.size
111
170
  end
112
171
 
113
172
  def add(time, record)
@@ -123,6 +182,10 @@ module Fluent
123
182
  @time_array.empty?
124
183
  end
125
184
 
185
+ def slice(index, num)
186
+ MultiEventStream.new(@time_array.slice(index, num), @record_array.slice(index, num))
187
+ end
188
+
126
189
  def each(&block)
127
190
  time_array = @time_array
128
191
  record_array = @record_array
@@ -134,25 +197,138 @@ module Fluent
134
197
  end
135
198
 
136
199
  class MessagePackEventStream < EventStream
137
- # Keep cached_unpacker argument for existence plugins
138
- def initialize(data, cached_unpacker = nil)
200
+ # https://github.com/msgpack/msgpack-ruby/issues/119
201
+
202
+ # Keep cached_unpacker argument for existing plugins
203
+ def initialize(data, cached_unpacker = nil, size = 0, unpacked_times: nil, unpacked_records: nil)
139
204
  @data = data
205
+ @size = size
206
+ @unpacked_times = unpacked_times
207
+ @unpacked_records = unpacked_records
208
+ end
209
+
210
+ def empty?
211
+ @data.empty?
212
+ end
213
+
214
+ def dup
215
+ if @unpacked_times
216
+ self.class.new(@data.dup, nil, @size, unpacked_times: @unpacked_times, unpacked_records: @unpacked_records.map(&:dup))
217
+ else
218
+ self.class.new(@data.dup, nil, @size)
219
+ end
220
+ end
221
+
222
+ def size
223
+ # @size is unbelievable always when @size == 0
224
+ # If the number of events is really zero, unpacking events takes very short time.
225
+ ensure_unpacked! if @size == 0
226
+ @size
140
227
  end
141
228
 
142
229
  def repeatable?
143
230
  true
144
231
  end
145
232
 
233
+ def ensure_unpacked!
234
+ return if @unpacked_times && @unpacked_records
235
+ @unpacked_times = []
236
+ @unpacked_records = []
237
+ msgpack_unpacker.feed_each(@data) do |time, record|
238
+ @unpacked_times << time
239
+ @unpacked_records << record
240
+ end
241
+ # @size should be updated always right after unpack.
242
+ # The real size of unpacked objects are correct, rather than given size.
243
+ @size = @unpacked_times.size
244
+ end
245
+
246
+ # This method returns MultiEventStream, because there are no reason
247
+ # to surve binary serialized by msgpack.
248
+ def slice(index, num)
249
+ ensure_unpacked!
250
+ MultiEventStream.new(@unpacked_times.slice(index, num), @unpacked_records.slice(index, num))
251
+ end
252
+
146
253
  def each(&block)
147
- # TODO format check
148
- unpacker = Fluent::Engine.msgpack_factory.unpacker
149
- unpacker.feed_each(@data, &block)
254
+ if @unpacked_times
255
+ @unpacked_times.each_with_index do |time, i|
256
+ block.call(time, @unpacked_records[i])
257
+ end
258
+ else
259
+ @unpacked_times = []
260
+ @unpacked_records = []
261
+ msgpack_unpacker.feed_each(@data) do |time, record|
262
+ @unpacked_times << time
263
+ @unpacked_records << record
264
+ block.call(time, record)
265
+ end
266
+ @size = @unpacked_times.size
267
+ end
150
268
  nil
151
269
  end
152
270
 
153
- def to_msgpack_stream
271
+ def to_msgpack_stream(time_int: false)
272
+ # time_int is always ignored because @data is always packed binary in this class
154
273
  @data
155
274
  end
156
275
  end
157
- end
158
276
 
277
+ class CompressedMessagePackEventStream < MessagePackEventStream
278
+ def initialize(data, cached_unpacker = nil, size = 0, unpacked_times: nil, unpacked_records: nil)
279
+ super
280
+ @decompressed_data = nil
281
+ @compressed_data = data
282
+ end
283
+
284
+ def empty?
285
+ ensure_decompressed!
286
+ super
287
+ end
288
+
289
+ def ensure_unpacked!
290
+ ensure_decompressed!
291
+ super
292
+ end
293
+
294
+ def each(&block)
295
+ ensure_decompressed!
296
+ super
297
+ end
298
+
299
+ def to_msgpack_stream(time_int: false)
300
+ ensure_decompressed!
301
+ super
302
+ end
303
+
304
+ def to_compressed_msgpack_stream(time_int: false)
305
+ # time_int is always ignored because @data is always packed binary in this class
306
+ @compressed_data
307
+ end
308
+
309
+ private
310
+
311
+ def ensure_decompressed!
312
+ return if @decompressed_data
313
+ @data = @decompressed_data = decompress(@data)
314
+ end
315
+ end
316
+
317
+ module ChunkMessagePackEventStreamer
318
+ include MessagePackFactory::Mixin
319
+ # chunk.extend(ChunkEventStreamer)
320
+ # => chunk.each{|time, record| ... }
321
+ def each(&block)
322
+ open do |io|
323
+ msgpack_unpacker(io).each(&block)
324
+ end
325
+ nil
326
+ end
327
+ alias :msgpack_each :each
328
+
329
+ def to_msgpack_stream(time_int: false)
330
+ # time_int is always ignored because data is already packed and written in chunk
331
+ read
332
+ end
333
+ end
334
+ end