fluentd 1.17.0-x64-mingw-ucrt → 1.18.0-x64-mingw-ucrt

Sign up to get free protection for your applications and to get access to all the features.
Files changed (278) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +100 -0
  3. data/README.md +1 -0
  4. data/SECURITY.md +2 -2
  5. data/fluent.conf +14 -14
  6. data/lib/fluent/command/cap_ctl.rb +4 -4
  7. data/lib/fluent/command/fluentd.rb +7 -1
  8. data/lib/fluent/compat/call_super_mixin.rb +3 -3
  9. data/lib/fluent/compat/propagate_default.rb +4 -4
  10. data/lib/fluent/config/literal_parser.rb +9 -2
  11. data/lib/fluent/config/yaml_parser/parser.rb +4 -0
  12. data/lib/fluent/engine.rb +49 -33
  13. data/lib/fluent/env.rb +3 -0
  14. data/lib/fluent/event_router.rb +2 -2
  15. data/lib/fluent/log/console_adapter.rb +4 -2
  16. data/lib/fluent/plugin/filter_parser.rb +27 -51
  17. data/lib/fluent/plugin/in_exec.rb +14 -2
  18. data/lib/fluent/plugin/in_http.rb +6 -1
  19. data/lib/fluent/plugin/in_sample.rb +13 -7
  20. data/lib/fluent/plugin/in_syslog.rb +4 -0
  21. data/lib/fluent/plugin/in_tail.rb +65 -23
  22. data/lib/fluent/plugin/in_tcp.rb +4 -0
  23. data/lib/fluent/plugin/in_udp.rb +10 -1
  24. data/lib/fluent/plugin/input.rb +4 -0
  25. data/lib/fluent/plugin/out_buffer.rb +40 -0
  26. data/lib/fluent/plugin/out_copy.rb +1 -1
  27. data/lib/fluent/plugin/out_file.rb +8 -0
  28. data/lib/fluent/plugin/out_http.rb +12 -0
  29. data/lib/fluent/plugin/output.rb +2 -0
  30. data/lib/fluent/plugin/parser_json.rb +4 -12
  31. data/lib/fluent/plugin_helper/cert_option.rb +8 -0
  32. data/lib/fluent/plugin_helper/event_emitter.rb +12 -0
  33. data/lib/fluent/plugin_helper/http_server/server.rb +24 -8
  34. data/lib/fluent/plugin_helper/server.rb +9 -0
  35. data/lib/fluent/root_agent.rb +114 -19
  36. data/lib/fluent/source_only_buffer_agent.rb +102 -0
  37. data/lib/fluent/supervisor.rb +207 -34
  38. data/lib/fluent/system_config.rb +15 -3
  39. data/lib/fluent/version.rb +1 -1
  40. data/templates/new_gem/fluent-plugin.gemspec.erb +6 -5
  41. metadata +24 -483
  42. data/.github/DISCUSSION_TEMPLATE/q-a-japanese.yml +0 -50
  43. data/.github/DISCUSSION_TEMPLATE/q-a.yml +0 -47
  44. data/.github/ISSUE_TEMPLATE/bug_report.yml +0 -71
  45. data/.github/ISSUE_TEMPLATE/config.yml +0 -5
  46. data/.github/ISSUE_TEMPLATE/feature_request.yml +0 -39
  47. data/.github/ISSUE_TEMPLATE.md +0 -17
  48. data/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  49. data/.github/workflows/stale-actions.yml +0 -24
  50. data/.github/workflows/test-ruby-head.yml +0 -31
  51. data/.github/workflows/test.yml +0 -32
  52. data/.gitignore +0 -30
  53. data/Gemfile +0 -9
  54. data/fluentd.gemspec +0 -62
  55. data/test/command/test_binlog_reader.rb +0 -362
  56. data/test/command/test_ca_generate.rb +0 -70
  57. data/test/command/test_cap_ctl.rb +0 -100
  58. data/test/command/test_cat.rb +0 -128
  59. data/test/command/test_ctl.rb +0 -56
  60. data/test/command/test_fluentd.rb +0 -1291
  61. data/test/command/test_plugin_config_formatter.rb +0 -397
  62. data/test/command/test_plugin_generator.rb +0 -109
  63. data/test/compat/test_calls_super.rb +0 -166
  64. data/test/compat/test_parser.rb +0 -92
  65. data/test/config/assertions.rb +0 -42
  66. data/test/config/test_config_parser.rb +0 -551
  67. data/test/config/test_configurable.rb +0 -1784
  68. data/test/config/test_configure_proxy.rb +0 -604
  69. data/test/config/test_dsl.rb +0 -415
  70. data/test/config/test_element.rb +0 -518
  71. data/test/config/test_literal_parser.rb +0 -309
  72. data/test/config/test_plugin_configuration.rb +0 -56
  73. data/test/config/test_section.rb +0 -191
  74. data/test/config/test_system_config.rb +0 -195
  75. data/test/config/test_types.rb +0 -408
  76. data/test/counter/test_client.rb +0 -563
  77. data/test/counter/test_error.rb +0 -44
  78. data/test/counter/test_mutex_hash.rb +0 -179
  79. data/test/counter/test_server.rb +0 -589
  80. data/test/counter/test_store.rb +0 -258
  81. data/test/counter/test_validator.rb +0 -137
  82. data/test/helper.rb +0 -155
  83. data/test/helpers/fuzzy_assert.rb +0 -89
  84. data/test/helpers/process_extenstion.rb +0 -33
  85. data/test/log/test_console_adapter.rb +0 -117
  86. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  87. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  88. data/test/plugin/data/2010/01/20100102.log +0 -0
  89. data/test/plugin/data/log/bar +0 -0
  90. data/test/plugin/data/log/foo/bar.log +0 -0
  91. data/test/plugin/data/log/foo/bar2 +0 -0
  92. data/test/plugin/data/log/test.log +0 -0
  93. data/test/plugin/data/log_numeric/01.log +0 -0
  94. data/test/plugin/data/log_numeric/02.log +0 -0
  95. data/test/plugin/data/log_numeric/12.log +0 -0
  96. data/test/plugin/data/log_numeric/14.log +0 -0
  97. data/test/plugin/data/sd_file/config +0 -11
  98. data/test/plugin/data/sd_file/config.json +0 -17
  99. data/test/plugin/data/sd_file/config.yaml +0 -11
  100. data/test/plugin/data/sd_file/config.yml +0 -11
  101. data/test/plugin/data/sd_file/invalid_config.yml +0 -7
  102. data/test/plugin/in_tail/test_fifo.rb +0 -121
  103. data/test/plugin/in_tail/test_io_handler.rb +0 -150
  104. data/test/plugin/in_tail/test_position_file.rb +0 -346
  105. data/test/plugin/out_forward/test_ack_handler.rb +0 -140
  106. data/test/plugin/out_forward/test_connection_manager.rb +0 -145
  107. data/test/plugin/out_forward/test_handshake_protocol.rb +0 -112
  108. data/test/plugin/out_forward/test_load_balancer.rb +0 -106
  109. data/test/plugin/out_forward/test_socket_cache.rb +0 -174
  110. data/test/plugin/test_bare_output.rb +0 -131
  111. data/test/plugin/test_base.rb +0 -247
  112. data/test/plugin/test_buf_file.rb +0 -1314
  113. data/test/plugin/test_buf_file_single.rb +0 -898
  114. data/test/plugin/test_buf_memory.rb +0 -42
  115. data/test/plugin/test_buffer.rb +0 -1493
  116. data/test/plugin/test_buffer_chunk.rb +0 -209
  117. data/test/plugin/test_buffer_file_chunk.rb +0 -871
  118. data/test/plugin/test_buffer_file_single_chunk.rb +0 -611
  119. data/test/plugin/test_buffer_memory_chunk.rb +0 -339
  120. data/test/plugin/test_compressable.rb +0 -87
  121. data/test/plugin/test_file_util.rb +0 -96
  122. data/test/plugin/test_filter.rb +0 -368
  123. data/test/plugin/test_filter_grep.rb +0 -697
  124. data/test/plugin/test_filter_parser.rb +0 -731
  125. data/test/plugin/test_filter_record_transformer.rb +0 -577
  126. data/test/plugin/test_filter_stdout.rb +0 -207
  127. data/test/plugin/test_formatter_csv.rb +0 -136
  128. data/test/plugin/test_formatter_hash.rb +0 -38
  129. data/test/plugin/test_formatter_json.rb +0 -61
  130. data/test/plugin/test_formatter_ltsv.rb +0 -70
  131. data/test/plugin/test_formatter_msgpack.rb +0 -28
  132. data/test/plugin/test_formatter_out_file.rb +0 -116
  133. data/test/plugin/test_formatter_single_value.rb +0 -44
  134. data/test/plugin/test_formatter_tsv.rb +0 -76
  135. data/test/plugin/test_in_debug_agent.rb +0 -49
  136. data/test/plugin/test_in_exec.rb +0 -261
  137. data/test/plugin/test_in_forward.rb +0 -1178
  138. data/test/plugin/test_in_gc_stat.rb +0 -62
  139. data/test/plugin/test_in_http.rb +0 -1124
  140. data/test/plugin/test_in_monitor_agent.rb +0 -922
  141. data/test/plugin/test_in_object_space.rb +0 -66
  142. data/test/plugin/test_in_sample.rb +0 -190
  143. data/test/plugin/test_in_syslog.rb +0 -505
  144. data/test/plugin/test_in_tail.rb +0 -3429
  145. data/test/plugin/test_in_tcp.rb +0 -328
  146. data/test/plugin/test_in_udp.rb +0 -296
  147. data/test/plugin/test_in_unix.rb +0 -181
  148. data/test/plugin/test_input.rb +0 -137
  149. data/test/plugin/test_metadata.rb +0 -89
  150. data/test/plugin/test_metrics.rb +0 -294
  151. data/test/plugin/test_metrics_local.rb +0 -96
  152. data/test/plugin/test_multi_output.rb +0 -204
  153. data/test/plugin/test_out_copy.rb +0 -308
  154. data/test/plugin/test_out_exec.rb +0 -312
  155. data/test/plugin/test_out_exec_filter.rb +0 -606
  156. data/test/plugin/test_out_file.rb +0 -1038
  157. data/test/plugin/test_out_forward.rb +0 -1349
  158. data/test/plugin/test_out_http.rb +0 -557
  159. data/test/plugin/test_out_null.rb +0 -105
  160. data/test/plugin/test_out_relabel.rb +0 -28
  161. data/test/plugin/test_out_roundrobin.rb +0 -146
  162. data/test/plugin/test_out_secondary_file.rb +0 -458
  163. data/test/plugin/test_out_stdout.rb +0 -205
  164. data/test/plugin/test_out_stream.rb +0 -103
  165. data/test/plugin/test_output.rb +0 -1334
  166. data/test/plugin/test_output_as_buffered.rb +0 -2024
  167. data/test/plugin/test_output_as_buffered_backup.rb +0 -363
  168. data/test/plugin/test_output_as_buffered_compress.rb +0 -179
  169. data/test/plugin/test_output_as_buffered_overflow.rb +0 -250
  170. data/test/plugin/test_output_as_buffered_retries.rb +0 -966
  171. data/test/plugin/test_output_as_buffered_secondary.rb +0 -882
  172. data/test/plugin/test_output_as_standard.rb +0 -374
  173. data/test/plugin/test_owned_by.rb +0 -34
  174. data/test/plugin/test_parser.rb +0 -399
  175. data/test/plugin/test_parser_apache.rb +0 -42
  176. data/test/plugin/test_parser_apache2.rb +0 -47
  177. data/test/plugin/test_parser_apache_error.rb +0 -45
  178. data/test/plugin/test_parser_csv.rb +0 -200
  179. data/test/plugin/test_parser_json.rb +0 -244
  180. data/test/plugin/test_parser_labeled_tsv.rb +0 -160
  181. data/test/plugin/test_parser_msgpack.rb +0 -127
  182. data/test/plugin/test_parser_multiline.rb +0 -111
  183. data/test/plugin/test_parser_nginx.rb +0 -88
  184. data/test/plugin/test_parser_none.rb +0 -52
  185. data/test/plugin/test_parser_regexp.rb +0 -284
  186. data/test/plugin/test_parser_syslog.rb +0 -650
  187. data/test/plugin/test_parser_tsv.rb +0 -122
  188. data/test/plugin/test_sd_file.rb +0 -228
  189. data/test/plugin/test_sd_srv.rb +0 -230
  190. data/test/plugin/test_storage.rb +0 -166
  191. data/test/plugin/test_storage_local.rb +0 -335
  192. data/test/plugin/test_string_util.rb +0 -26
  193. data/test/plugin_helper/data/cert/cert-key.pem +0 -27
  194. data/test/plugin_helper/data/cert/cert-with-CRLF.pem +0 -19
  195. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +0 -19
  196. data/test/plugin_helper/data/cert/cert.pem +0 -19
  197. data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +0 -27
  198. data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +0 -20
  199. data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +0 -27
  200. data/test/plugin_helper/data/cert/cert_chains/cert.pem +0 -40
  201. data/test/plugin_helper/data/cert/empty.pem +0 -0
  202. data/test/plugin_helper/data/cert/generate_cert.rb +0 -125
  203. data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +0 -30
  204. data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +0 -27
  205. data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +0 -20
  206. data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +0 -20
  207. data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +0 -30
  208. data/test/plugin_helper/data/cert/with_ca/cert-key.pem +0 -27
  209. data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +0 -21
  210. data/test/plugin_helper/data/cert/with_ca/cert.pem +0 -21
  211. data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +0 -30
  212. data/test/plugin_helper/data/cert/without_ca/cert-key.pem +0 -27
  213. data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +0 -20
  214. data/test/plugin_helper/data/cert/without_ca/cert.pem +0 -20
  215. data/test/plugin_helper/http_server/test_app.rb +0 -65
  216. data/test/plugin_helper/http_server/test_route.rb +0 -32
  217. data/test/plugin_helper/service_discovery/test_manager.rb +0 -93
  218. data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +0 -21
  219. data/test/plugin_helper/test_cert_option.rb +0 -25
  220. data/test/plugin_helper/test_child_process.rb +0 -862
  221. data/test/plugin_helper/test_compat_parameters.rb +0 -358
  222. data/test/plugin_helper/test_event_emitter.rb +0 -80
  223. data/test/plugin_helper/test_event_loop.rb +0 -52
  224. data/test/plugin_helper/test_extract.rb +0 -194
  225. data/test/plugin_helper/test_formatter.rb +0 -255
  226. data/test/plugin_helper/test_http_server_helper.rb +0 -372
  227. data/test/plugin_helper/test_inject.rb +0 -561
  228. data/test/plugin_helper/test_metrics.rb +0 -137
  229. data/test/plugin_helper/test_parser.rb +0 -264
  230. data/test/plugin_helper/test_record_accessor.rb +0 -238
  231. data/test/plugin_helper/test_retry_state.rb +0 -1006
  232. data/test/plugin_helper/test_server.rb +0 -1895
  233. data/test/plugin_helper/test_service_discovery.rb +0 -165
  234. data/test/plugin_helper/test_socket.rb +0 -146
  235. data/test/plugin_helper/test_storage.rb +0 -542
  236. data/test/plugin_helper/test_thread.rb +0 -164
  237. data/test/plugin_helper/test_timer.rb +0 -130
  238. data/test/scripts/exec_script.rb +0 -32
  239. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +0 -7
  240. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +0 -7
  241. data/test/scripts/fluent/plugin/formatter_known.rb +0 -8
  242. data/test/scripts/fluent/plugin/out_test.rb +0 -81
  243. data/test/scripts/fluent/plugin/out_test2.rb +0 -80
  244. data/test/scripts/fluent/plugin/parser_known.rb +0 -4
  245. data/test/test_capability.rb +0 -74
  246. data/test/test_clock.rb +0 -164
  247. data/test/test_config.rb +0 -369
  248. data/test/test_configdsl.rb +0 -148
  249. data/test/test_daemonizer.rb +0 -91
  250. data/test/test_engine.rb +0 -203
  251. data/test/test_event.rb +0 -531
  252. data/test/test_event_router.rb +0 -348
  253. data/test/test_event_time.rb +0 -199
  254. data/test/test_file_wrapper.rb +0 -53
  255. data/test/test_filter.rb +0 -121
  256. data/test/test_fluent_log_event_router.rb +0 -99
  257. data/test/test_formatter.rb +0 -369
  258. data/test/test_input.rb +0 -31
  259. data/test/test_log.rb +0 -1076
  260. data/test/test_match.rb +0 -148
  261. data/test/test_mixin.rb +0 -351
  262. data/test/test_msgpack_factory.rb +0 -50
  263. data/test/test_oj_options.rb +0 -55
  264. data/test/test_output.rb +0 -278
  265. data/test/test_plugin.rb +0 -251
  266. data/test/test_plugin_classes.rb +0 -370
  267. data/test/test_plugin_helper.rb +0 -81
  268. data/test/test_plugin_id.rb +0 -119
  269. data/test/test_process.rb +0 -14
  270. data/test/test_root_agent.rb +0 -951
  271. data/test/test_static_config_analysis.rb +0 -177
  272. data/test/test_supervisor.rb +0 -821
  273. data/test/test_test_drivers.rb +0 -136
  274. data/test/test_time_formatter.rb +0 -301
  275. data/test/test_time_parser.rb +0 -362
  276. data/test/test_tls.rb +0 -65
  277. data/test/test_unique_id.rb +0 -47
  278. data/test/test_variable_store.rb +0 -65
@@ -1,882 +0,0 @@
1
- require_relative '../helper'
2
- require 'fluent/plugin/output'
3
- require 'fluent/plugin/buffer'
4
- require 'fluent/event'
5
-
6
- require 'json'
7
- require 'time'
8
- require 'timeout'
9
- require 'timecop'
10
-
11
- module FluentPluginOutputAsBufferedSecondaryTest
12
- class DummyBareOutput < Fluent::Plugin::Output
13
- def register(name, &block)
14
- instance_variable_set("@#{name}", block)
15
- end
16
- end
17
- class DummySyncOutput < DummyBareOutput
18
- def initialize
19
- super
20
- @process = nil
21
- end
22
- def process(tag, es)
23
- @process ? @process.call(tag, es) : nil
24
- end
25
- end
26
- class DummyFullFeatureOutput < DummyBareOutput
27
- def initialize
28
- super
29
- @prefer_buffered_processing = nil
30
- @prefer_delayed_commit = nil
31
- @process = nil
32
- @format = nil
33
- @write = nil
34
- @try_write = nil
35
- end
36
- def prefer_buffered_processing
37
- @prefer_buffered_processing ? @prefer_buffered_processing.call : false
38
- end
39
- def prefer_delayed_commit
40
- @prefer_delayed_commit ? @prefer_delayed_commit.call : false
41
- end
42
- def process(tag, es)
43
- @process ? @process.call(tag, es) : nil
44
- end
45
- def format(tag, time, record)
46
- @format ? @format.call(tag, time, record) : [tag, time, record].to_json
47
- end
48
- def write(chunk)
49
- @write ? @write.call(chunk) : nil
50
- end
51
- def try_write(chunk)
52
- @try_write ? @try_write.call(chunk) : nil
53
- end
54
- end
55
- class DummyFullFeatureOutput2 < DummyFullFeatureOutput
56
- def prefer_buffered_processing; true; end
57
- def prefer_delayed_commit; super; end
58
- def format(tag, time, record); super; end
59
- def write(chunk); super; end
60
- def try_write(chunk); super; end
61
- end
62
- end
63
-
64
- class BufferedOutputSecondaryTest < Test::Unit::TestCase
65
- def create_output(type=:full)
66
- case type
67
- when :bare then FluentPluginOutputAsBufferedSecondaryTest::DummyBareOutput.new
68
- when :sync then FluentPluginOutputAsBufferedSecondaryTest::DummySyncOutput.new
69
- when :full then FluentPluginOutputAsBufferedSecondaryTest::DummyFullFeatureOutput.new
70
- else
71
- raise ArgumentError, "unknown type: #{type}"
72
- end
73
- end
74
- def create_metadata(timekey: nil, tag: nil, variables: nil)
75
- Fluent::Plugin::Buffer::Metadata.new(timekey, tag, variables)
76
- end
77
- def waiting(seconds)
78
- begin
79
- Timeout.timeout(seconds) do
80
- yield
81
- end
82
- rescue Timeout::Error
83
- STDERR.print(*@i.log.out.logs)
84
- raise
85
- end
86
- end
87
- def dummy_event_stream
88
- Fluent::ArrayEventStream.new([
89
- [ event_time('2016-04-13 18:33:00'), {"name" => "moris", "age" => 36, "message" => "data1"} ],
90
- [ event_time('2016-04-13 18:33:13'), {"name" => "moris", "age" => 36, "message" => "data2"} ],
91
- [ event_time('2016-04-13 18:33:32'), {"name" => "moris", "age" => 36, "message" => "data3"} ],
92
- ])
93
- end
94
-
95
- setup do
96
- @i = create_output
97
- end
98
-
99
- teardown do
100
- if @i
101
- @i.stop unless @i.stopped?
102
- @i.before_shutdown unless @i.before_shutdown?
103
- @i.shutdown unless @i.shutdown?
104
- @i.after_shutdown unless @i.after_shutdown?
105
- @i.close unless @i.closed?
106
- @i.terminate unless @i.terminated?
107
- end
108
- Timecop.return
109
- end
110
-
111
- sub_test_case 'secondary plugin feature for buffered output with periodical retry' do
112
- setup do
113
- Fluent::Plugin.register_output('output_secondary_test', FluentPluginOutputAsBufferedSecondaryTest::DummyFullFeatureOutput)
114
- Fluent::Plugin.register_output('output_secondary_test2', FluentPluginOutputAsBufferedSecondaryTest::DummyFullFeatureOutput2)
115
- end
116
-
117
- test 'raises configuration error if primary does not support buffering' do
118
- i = create_output(:sync)
119
- assert_raise Fluent::ConfigError do
120
- i.configure(config_element('ROOT','',{},[config_element('secondary','',{'@type'=>'output_secondary_test'})]))
121
- end
122
- end
123
-
124
- test 'raises configuration error if <buffer>/<secondary> section is specified in <secondary> section' do
125
- priconf = config_element('buffer','tag',{'flush_interval' => 1, 'retry_type' => :periodic, 'retry_wait' => 3, 'retry_timeout' => 30, 'retry_randomize' => false})
126
- secconf1 = config_element('secondary','',{'@type' => 'output_secondary_test'},[config_element('buffer', 'time')])
127
- secconf2 = config_element('secondary','',{'@type' => 'output_secondary_test'},[config_element('secondary', '')])
128
- i = create_output()
129
- assert_raise Fluent::ConfigError do
130
- i.configure(config_element('ROOT','',{},[priconf,secconf1]))
131
- end
132
- assert_raise Fluent::ConfigError do
133
- i.configure(config_element('ROOT','',{},[priconf,secconf2]))
134
- end
135
- end
136
-
137
- test 'uses same plugin type with primary if @type is missing in secondary' do
138
- bufconf = config_element('buffer','tag',{'flush_interval' => 1, 'retry_type' => :periodic, 'retry_wait' => 3, 'retry_timeout' => 30, 'retry_randomize' => false})
139
- secconf = config_element('secondary','',{})
140
- priconf = config_element('ROOT', '', {'@type' => 'output_secondary_test'}, [bufconf, secconf])
141
- i = create_output()
142
- assert_nothing_raised do
143
- i.configure(priconf)
144
- end
145
- logs = i.log.out.logs
146
- assert{ logs.empty? }
147
- assert{ i.secondary.is_a? FluentPluginOutputAsBufferedSecondaryTest::DummyFullFeatureOutput }
148
- end
149
-
150
- test 'warns if secondary plugin is different type from primary one' do
151
- priconf = config_element('buffer','tag',{'flush_interval' => 1, 'retry_type' => :periodic, 'retry_wait' => 3, 'retry_timeout' => 30, 'retry_randomize' => false})
152
- secconf = config_element('secondary','',{'@type' => 'output_secondary_test2'})
153
- i = create_output()
154
- i.configure(config_element('ROOT','',{},[priconf,secconf]))
155
- logs = i.log.out.logs
156
- assert{ logs.any?{|l| l.include?("Use different plugin for secondary. Check the plugin works with primary like secondary_file") } }
157
- end
158
-
159
- test 'secondary plugin lifecycle is kicked by primary' do
160
- priconf = config_element('buffer','tag',{'flush_interval' => 1, 'retry_type' => :periodic, 'retry_wait' => 3, 'retry_timeout' => 30, 'retry_randomize' => false})
161
- secconf = config_element('secondary','',{'@type' => 'output_secondary_test2'})
162
- i = create_output()
163
- i.configure(config_element('ROOT','',{},[priconf,secconf]))
164
- logs = i.log.out.logs
165
- assert{ logs.any?{|l| l.include?("Use different plugin for secondary. Check the plugin works with primary like secondary_file") } }
166
-
167
- assert i.secondary.configured?
168
-
169
- assert !i.secondary.started?
170
- i.start
171
- assert i.secondary.started?
172
-
173
- assert !i.secondary.after_started?
174
- i.after_start
175
- assert i.secondary.after_started?
176
-
177
- assert !i.secondary.stopped?
178
- i.stop
179
- assert i.secondary.stopped?
180
-
181
- assert !i.secondary.before_shutdown?
182
- i.before_shutdown
183
- assert i.secondary.before_shutdown?
184
-
185
- assert !i.secondary.shutdown?
186
- i.shutdown
187
- assert i.secondary.shutdown?
188
-
189
- assert !i.secondary.after_shutdown?
190
- i.after_shutdown
191
- assert i.secondary.after_shutdown?
192
-
193
- assert !i.secondary.closed?
194
- i.close
195
- assert i.secondary.closed?
196
-
197
- assert !i.secondary.terminated?
198
- i.terminate
199
- assert i.secondary.terminated?
200
- end
201
-
202
- test 'primary plugin will emit event streams to secondary after retries for time of retry_timeout * retry_secondary_threshold' do
203
- written = []
204
- priconf = config_element('buffer','tag',{'flush_interval' => 1, 'retry_type' => :periodic, 'retry_wait' => 3, 'retry_timeout' => 60, 'retry_randomize' => false})
205
- secconf = config_element('secondary','',{'@type' => 'output_secondary_test2'})
206
- @i.configure(config_element('ROOT','',{},[priconf,secconf]))
207
- @i.register(:prefer_buffered_processing){ true }
208
- @i.register(:prefer_delayed_commit){ false }
209
- @i.register(:format){|tag,time,record| [tag,time.to_i,record].to_json + "\n" }
210
- @i.register(:write){|chunk| raise "yay, your #write must fail" }
211
- @i.secondary.register(:prefer_delayed_commit){ false }
212
- @i.secondary.register(:write){|chunk| chunk.read.split("\n").each{|line| written << JSON.parse(line) } }
213
- @i.start
214
- @i.after_start
215
-
216
- @i.interrupt_flushes
217
-
218
- now = Time.parse('2016-04-13 18:33:30 -0700')
219
- Timecop.freeze( now )
220
-
221
- @i.emit_events("test.tag.1", dummy_event_stream())
222
-
223
- now = Time.parse('2016-04-13 18:33:31 -0700')
224
- Timecop.freeze( now )
225
-
226
- @i.emit_events("test.tag.2", dummy_event_stream())
227
-
228
- assert_equal 0, @i.write_count
229
- assert_equal 0, @i.num_errors
230
-
231
- @i.enqueue_thread_wait
232
- @i.flush_thread_wakeup
233
- waiting(4){ sleep 0.1 until @i.write_count > 0 && @i.num_errors > 0 }
234
-
235
- assert{ @i.buffer.queue.size > 0 }
236
- assert{ @i.buffer.queue.first.metadata.tag == 'test.tag.1' }
237
-
238
- assert{ @i.write_count > 0 }
239
- assert{ @i.num_errors > 0 }
240
-
241
- prev_write_count = @i.write_count
242
- prev_num_errors = @i.num_errors
243
-
244
- first_failure = @i.retry.start
245
-
246
- # retry_timeout == 60(sec), retry_secondary_threshold == 0.8
247
- now = first_failure + 60 * 0.8 + 1 # to step from primary to secondary
248
- Timecop.freeze( now )
249
-
250
- unless @i.retry.secondary?
251
- @i.enqueue_thread_wait
252
- @i.flush_thread_wakeup
253
- waiting(4){ sleep 0.1 until @i.write_count > prev_write_count }
254
-
255
- prev_write_count = @i.write_count
256
- prev_num_errors = @i.num_errors
257
-
258
- # next step is on secondary
259
- now = first_failure + 60 * 0.8 + 10
260
- Timecop.freeze( now )
261
- end
262
-
263
- @i.enqueue_thread_wait
264
- @i.flush_thread_wakeup
265
- waiting(4){ sleep 0.1 until @i.write_count > prev_write_count }
266
-
267
- current_write_count = @i.write_count
268
- current_num_errors = @i.num_errors
269
- assert{ current_write_count > prev_write_count }
270
- assert{ current_num_errors == prev_num_errors }
271
-
272
- assert_nil @i.retry
273
-
274
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:00').to_i, {"name" => "moris", "age" => 36, "message" => "data1"} ], written[0]
275
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:13').to_i, {"name" => "moris", "age" => 36, "message" => "data2"} ], written[1]
276
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:32').to_i, {"name" => "moris", "age" => 36, "message" => "data3"} ], written[2]
277
-
278
- logs = @i.log.out.logs
279
- waiting(4){ sleep 0.1 until logs.any?{|l| l.include?("[warn]: retry succeeded by secondary.") } }
280
- assert{ logs.any?{|l| l.include?("[warn]: retry succeeded by secondary.") } }
281
- end
282
-
283
- test 'secondary can do non-delayed commit even if primary do delayed commit' do
284
- written = []
285
- priconf = config_element('buffer','tag',{'flush_interval' => 1, 'retry_type' => :periodic, 'retry_wait' => 3, 'retry_timeout' => 60, 'retry_randomize' => false})
286
- secconf = config_element('secondary','',{'@type' => 'output_secondary_test2'})
287
- @i.configure(config_element('ROOT','',{},[priconf,secconf]))
288
- @i.register(:prefer_buffered_processing){ true }
289
- @i.register(:prefer_delayed_commit){ true }
290
- @i.register(:format){|tag,time,record| [tag,time.to_i,record].to_json + "\n" }
291
- @i.register(:try_write){|chunk| raise "yay, your #write must fail" }
292
- @i.secondary.register(:prefer_delayed_commit){ false }
293
- @i.secondary.register(:write){|chunk| chunk.read.split("\n").each{|line| written << JSON.parse(line) } }
294
- @i.start
295
- @i.after_start
296
-
297
- @i.interrupt_flushes
298
-
299
- now = Time.parse('2016-04-13 18:33:30 -0700')
300
- Timecop.freeze( now )
301
-
302
- @i.emit_events("test.tag.1", dummy_event_stream())
303
-
304
- now = Time.parse('2016-04-13 18:33:31 -0700')
305
- Timecop.freeze( now )
306
-
307
- @i.emit_events("test.tag.2", dummy_event_stream())
308
-
309
- assert_equal 0, @i.write_count
310
- assert_equal 0, @i.num_errors
311
-
312
- @i.enqueue_thread_wait
313
- @i.flush_thread_wakeup
314
- waiting(4){ sleep 0.1 until @i.write_count > 0 && @i.num_errors > 0 }
315
-
316
- assert{ @i.buffer.queue.size > 0 }
317
- assert{ @i.buffer.queue.first.metadata.tag == 'test.tag.1' }
318
-
319
- assert{ @i.write_count > 0 }
320
- assert{ @i.num_errors > 0 }
321
-
322
- prev_write_count = @i.write_count
323
- prev_num_errors = @i.num_errors
324
-
325
- first_failure = @i.retry.start
326
-
327
- # retry_timeout == 60(sec), retry_secondary_threshold == 0.8
328
- now = first_failure + 60 * 0.8 + 1 # to step from primary to secondary
329
- Timecop.freeze( now )
330
-
331
- unless @i.retry.secondary?
332
- @i.enqueue_thread_wait
333
- @i.flush_thread_wakeup
334
- waiting(4){ sleep 0.1 until @i.write_count > prev_write_count }
335
-
336
- prev_write_count = @i.write_count
337
- prev_num_errors = @i.num_errors
338
-
339
- # next step is on secondary
340
- now = first_failure + 60 * 0.8 + 10
341
- Timecop.freeze( now )
342
- end
343
-
344
- @i.enqueue_thread_wait
345
- @i.flush_thread_wakeup
346
- waiting(4){ sleep 0.1 until @i.write_count > prev_write_count }
347
-
348
- assert{ @i.write_count > prev_write_count }
349
- assert{ @i.num_errors == prev_num_errors }
350
-
351
- assert_nil @i.retry
352
-
353
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:00').to_i, {"name" => "moris", "age" => 36, "message" => "data1"} ], written[0]
354
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:13').to_i, {"name" => "moris", "age" => 36, "message" => "data2"} ], written[1]
355
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:32').to_i, {"name" => "moris", "age" => 36, "message" => "data3"} ], written[2]
356
-
357
- logs = @i.log.out.logs
358
- waiting(4){ sleep 0.1 until logs.any?{|l| l.include?("[warn]: retry succeeded by secondary.") } }
359
- assert{ logs.any?{|l| l.include?("[warn]: retry succeeded by secondary.") } }
360
- end
361
-
362
- test 'secondary plugin can do delayed commit if primary do it' do
363
- written = []
364
- chunks = []
365
- priconf = config_element('buffer','tag',{'flush_interval' => 1, 'retry_type' => :periodic, 'retry_wait' => 3, 'retry_timeout' => 60, 'retry_randomize' => false})
366
- secconf = config_element('secondary','',{'@type' => 'output_secondary_test2'})
367
- @i.configure(config_element('ROOT','',{},[priconf,secconf]))
368
- @i.register(:prefer_buffered_processing){ true }
369
- @i.register(:prefer_delayed_commit){ true }
370
- @i.register(:format){|tag,time,record| [tag,time.to_i,record].to_json + "\n" }
371
- @i.register(:try_write){|chunk| raise "yay, your #write must fail" }
372
- @i.secondary.register(:prefer_delayed_commit){ true }
373
- @i.secondary.register(:try_write){|chunk| chunks << chunk; chunk.read.split("\n").each{|line| written << JSON.parse(line) } }
374
- @i.start
375
- @i.after_start
376
-
377
- @i.interrupt_flushes
378
-
379
- now = Time.parse('2016-04-13 18:33:30 -0700')
380
- Timecop.freeze( now )
381
-
382
- @i.emit_events("test.tag.1", dummy_event_stream())
383
-
384
- now = Time.parse('2016-04-13 18:33:31 -0700')
385
- Timecop.freeze( now )
386
-
387
- @i.emit_events("test.tag.2", dummy_event_stream())
388
-
389
- assert_equal 0, @i.write_count
390
- assert_equal 0, @i.num_errors
391
-
392
- @i.enqueue_thread_wait
393
- @i.flush_thread_wakeup
394
- waiting(4){ sleep 0.1 until @i.write_count > 0 && @i.num_errors > 0 }
395
-
396
- assert{ @i.buffer.queue.size > 0 }
397
- assert{ @i.buffer.queue.first.metadata.tag == 'test.tag.1' }
398
-
399
- assert{ @i.write_count > 0 }
400
- assert{ @i.num_errors > 0 }
401
-
402
- prev_write_count = @i.write_count
403
- prev_num_errors = @i.num_errors
404
-
405
- first_failure = @i.retry.start
406
-
407
- # retry_timeout == 60(sec), retry_secondary_threshold == 0.8
408
- now = first_failure + 60 * 0.8 + 1 # to step from primary to secondary
409
- Timecop.freeze( now )
410
-
411
- unless @i.retry.secondary?
412
- @i.enqueue_thread_wait
413
- @i.flush_thread_wakeup
414
- waiting(4){ sleep 0.1 until @i.write_count > prev_write_count }
415
-
416
- prev_write_count = @i.write_count
417
- prev_num_errors = @i.num_errors
418
-
419
- # next step is on secondary
420
- now = first_failure + 60 * 0.8 + 10
421
- Timecop.freeze( now )
422
- end
423
-
424
- @i.enqueue_thread_wait
425
- @i.flush_thread_wakeup
426
- waiting(4){ sleep 0.1 until @i.write_count > prev_write_count }
427
-
428
- assert{ @i.write_count > prev_write_count }
429
- assert{ @i.num_errors == prev_num_errors }
430
-
431
- assert @i.retry
432
-
433
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:00').to_i, {"name" => "moris", "age" => 36, "message" => "data1"} ], written[0]
434
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:13').to_i, {"name" => "moris", "age" => 36, "message" => "data2"} ], written[1]
435
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:32').to_i, {"name" => "moris", "age" => 36, "message" => "data3"} ], written[2]
436
-
437
- assert{ @i.buffer.dequeued.size > 0 }
438
- assert{ chunks.size > 0 }
439
- assert{ !chunks.first.empty? }
440
-
441
- @i.secondary.commit_write(chunks[0].unique_id)
442
-
443
- assert{ @i.buffer.dequeued[chunks[0].unique_id].nil? }
444
- assert{ chunks.first.empty? }
445
-
446
- assert_nil @i.retry
447
-
448
- logs = @i.log.out.logs
449
- waiting(4){ sleep 0.1 until logs.any?{|l| l.include?("[warn]: retry succeeded by secondary.") } }
450
- assert{ logs.any?{|l| l.include?("[warn]: retry succeeded by secondary.") } }
451
- end
452
-
453
- test 'secondary plugin can do delayed commit even if primary does not do it' do
454
- written = []
455
- chunks = []
456
- priconf = config_element('buffer','tag',{'flush_interval' => 1, 'retry_type' => :periodic, 'retry_wait' => 3, 'retry_timeout' => 60, 'retry_randomize' => false})
457
- secconf = config_element('secondary','',{'@type' => 'output_secondary_test2'})
458
- @i.configure(config_element('ROOT','',{},[priconf,secconf]))
459
- @i.register(:prefer_buffered_processing){ true }
460
- @i.register(:prefer_delayed_commit){ false }
461
- @i.register(:format){|tag,time,record| [tag,time.to_i,record].to_json + "\n" }
462
- @i.register(:write){|chunk| raise "yay, your #write must fail" }
463
- @i.secondary.register(:prefer_delayed_commit){ true }
464
- @i.secondary.register(:try_write){|chunk| chunks << chunk; chunk.read.split("\n").each{|line| written << JSON.parse(line) } }
465
- @i.start
466
- @i.after_start
467
-
468
- @i.interrupt_flushes
469
-
470
- now = Time.parse('2016-04-13 18:33:30 -0700')
471
- Timecop.freeze( now )
472
-
473
- @i.emit_events("test.tag.1", dummy_event_stream())
474
-
475
- now = Time.parse('2016-04-13 18:33:31 -0700')
476
- Timecop.freeze( now )
477
-
478
- @i.emit_events("test.tag.2", dummy_event_stream())
479
-
480
- assert_equal 0, @i.write_count
481
- assert_equal 0, @i.num_errors
482
-
483
- @i.enqueue_thread_wait
484
- @i.flush_thread_wakeup
485
- waiting(4){ sleep 0.1 until @i.write_count > 0 && @i.num_errors > 0 }
486
-
487
- assert{ @i.buffer.queue.size > 0 }
488
- assert{ @i.buffer.queue.first.metadata.tag == 'test.tag.1' }
489
-
490
- assert{ @i.write_count > 0 }
491
- assert{ @i.num_errors > 0 }
492
-
493
- prev_write_count = @i.write_count
494
- prev_num_errors = @i.num_errors
495
-
496
- first_failure = @i.retry.start
497
-
498
- # retry_timeout == 60(sec), retry_secondary_threshold == 0.8
499
- now = first_failure + 60 * 0.8 + 1 # to step from primary to secondary
500
- Timecop.freeze( now )
501
-
502
- unless @i.retry.secondary?
503
- @i.enqueue_thread_wait
504
- @i.flush_thread_wakeup
505
- waiting(4){ sleep 0.1 until @i.write_count > prev_write_count }
506
-
507
- prev_write_count = @i.write_count
508
- prev_num_errors = @i.num_errors
509
-
510
- # next step is on secondary
511
- now = first_failure + 60 * 0.8 + 10
512
- Timecop.freeze( now )
513
- end
514
-
515
- @i.enqueue_thread_wait
516
- @i.flush_thread_wakeup
517
- waiting(4){ sleep 0.1 until @i.write_count > prev_write_count }
518
-
519
- assert{ @i.write_count > prev_write_count }
520
- assert{ @i.num_errors == prev_num_errors }
521
-
522
- assert @i.retry
523
-
524
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:00').to_i, {"name" => "moris", "age" => 36, "message" => "data1"} ], written[0]
525
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:13').to_i, {"name" => "moris", "age" => 36, "message" => "data2"} ], written[1]
526
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:32').to_i, {"name" => "moris", "age" => 36, "message" => "data3"} ], written[2]
527
-
528
- assert{ @i.buffer.dequeued.size > 0 }
529
- assert{ chunks.size > 0 }
530
- assert{ !chunks.first.empty? }
531
-
532
- @i.secondary.commit_write(chunks[0].unique_id)
533
-
534
- assert{ @i.buffer.dequeued[chunks[0].unique_id].nil? }
535
- assert{ chunks.first.empty? }
536
-
537
- assert_nil @i.retry
538
-
539
- logs = @i.log.out.logs
540
- waiting(4){ sleep 0.1 until logs.any?{|l| l.include?("[warn]: retry succeeded by secondary.") } }
541
- assert{ logs.any?{|l| l.include?("[warn]: retry succeeded by secondary.") } }
542
- end
543
-
544
- test 'secondary plugin can do delayed commit even if primary does not do it, and non-committed chunks will be rollbacked by primary' do
545
- written = []
546
- chunks = []
547
- priconf = config_element('buffer','tag',{'flush_interval' => 1, 'retry_type' => :periodic, 'retry_wait' => 3, 'retry_timeout' => 60, 'delayed_commit_timeout' => 2, 'retry_randomize' => false, 'queued_chunks_limit_size' => 10})
548
- secconf = config_element('secondary','',{'@type' => 'output_secondary_test2'})
549
- @i.configure(config_element('ROOT','',{},[priconf,secconf]))
550
- @i.register(:prefer_buffered_processing){ true }
551
- @i.register(:prefer_delayed_commit){ false }
552
- @i.register(:format){|tag,time,record| [tag,time.to_i,record].to_json + "\n" }
553
- @i.register(:write){|chunk| raise "yay, your #write must fail" }
554
- @i.secondary.register(:prefer_delayed_commit){ true }
555
- @i.secondary.register(:try_write){|chunk| chunks << chunk; chunk.read.split("\n").each{|line| written << JSON.parse(line) } }
556
- @i.secondary.register(:write){|chunk| raise "don't use this" }
557
- @i.start
558
- @i.after_start
559
-
560
- @i.interrupt_flushes
561
-
562
- now = Time.parse('2016-04-13 18:33:30 -0700')
563
- Timecop.freeze( now )
564
-
565
- @i.emit_events("test.tag.1", dummy_event_stream())
566
- @i.emit_events("test.tag.2", dummy_event_stream())
567
-
568
- now = Time.parse('2016-04-13 18:33:31 -0700')
569
- Timecop.freeze( now )
570
-
571
- assert_equal 0, @i.write_count
572
- assert_equal 0, @i.num_errors
573
-
574
- @i.enqueue_thread_wait
575
- @i.flush_thread_wakeup
576
- waiting(4){ sleep 0.1 until @i.write_count > 0 && @i.num_errors > 0 }
577
-
578
- assert{ @i.buffer.queue.size == 2 }
579
- assert{ @i.buffer.queue.first.metadata.tag == 'test.tag.1' }
580
-
581
- assert{ @i.write_count > 0 }
582
- assert{ @i.num_errors > 0 }
583
-
584
- prev_write_count = @i.write_count
585
- prev_num_errors = @i.num_errors
586
-
587
- first_failure = @i.retry.start
588
-
589
- # retry_timeout == 60(sec), retry_secondary_threshold == 0.8
590
-
591
- now = first_failure + 60 * 0.8 + 1
592
- Timecop.freeze( now )
593
- @i.enqueue_thread_wait
594
- @i.flush_thread_wakeup
595
- now = first_failure + 60 * 0.8 + 2
596
- Timecop.freeze( now )
597
- @i.enqueue_thread_wait
598
- @i.flush_thread_wakeup
599
-
600
- waiting(4){ sleep 0.1 until chunks.size == 2 }
601
-
602
- assert{ @i.write_count > prev_write_count }
603
- assert{ @i.num_errors == prev_num_errors }
604
-
605
- assert @i.retry
606
-
607
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:00').to_i, {"name" => "moris", "age" => 36, "message" => "data1"} ], written[0]
608
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:13').to_i, {"name" => "moris", "age" => 36, "message" => "data2"} ], written[1]
609
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:32').to_i, {"name" => "moris", "age" => 36, "message" => "data3"} ], written[2]
610
- assert_equal [ 'test.tag.2', event_time('2016-04-13 18:33:00').to_i, {"name" => "moris", "age" => 36, "message" => "data1"} ], written[3]
611
- assert_equal [ 'test.tag.2', event_time('2016-04-13 18:33:13').to_i, {"name" => "moris", "age" => 36, "message" => "data2"} ], written[4]
612
- assert_equal [ 'test.tag.2', event_time('2016-04-13 18:33:32').to_i, {"name" => "moris", "age" => 36, "message" => "data3"} ], written[5]
613
-
614
- assert{ @i.buffer.dequeued.size == 2 }
615
- assert{ chunks.size == 2 }
616
- assert{ !chunks[0].empty? }
617
- assert{ !chunks[1].empty? }
618
-
619
- 30.times do |i| # large enough
620
- # In https://github.com/fluent/fluentd/blob/c90c024576b3d35f356a55fd33d1232947114a9a/lib/fluent/plugin_helper/retry_state.rb
621
- # @timeout_at is 2016-04-13 18:34:31, @next_time must be less than 2016-04-13 18:34:30
622
- #
623
- # first_failure + 60 * 0.8 + 2 # => 2016-04-13 18:34:21
624
- # @next_time is not added by 1, but by randomize(@retry_wait) https://github.com/fluent/fluentd/blob/c90c024576b3d35f356a55fd33d1232947114a9a/lib/fluent/plugin_helper/retry_state.rb#L196
625
- # current_time(=Time.now) + randomize(@retry_wait) < @timeout_at
626
- # (2016-04-13 18:34:21 + 6) + 3 < 2016-04-13 18:34:31
627
- # So, current_time must be at most 6
628
- now = first_failure + 60 * 0.8 + 2 + [i, 6].min
629
- Timecop.freeze( now )
630
- @i.flush_thread_wakeup
631
-
632
- break if @i.buffer.dequeued.size == 0
633
- end
634
-
635
- assert @i.retry
636
- logs = @i.log.out.logs
637
- waiting(4){ sleep 0.1 until logs.count{|l| l.include?("[warn]: failed to flush the buffer chunk, timeout to commit.") } == 2 }
638
- assert{ logs.count{|l| l.include?("[warn]: failed to flush the buffer chunk, timeout to commit.") } == 2 }
639
- end
640
-
641
- test 'retry_wait for secondary is same with one for primary' do
642
- priconf = config_element('buffer','tag',{'flush_interval' => 1, 'retry_type' => :periodic, 'retry_wait' => 3, 'retry_timeout' => 60, 'retry_randomize' => false})
643
- secconf = config_element('secondary','',{'@type' => 'output_secondary_test2'})
644
- @i.configure(config_element('ROOT','',{},[priconf,secconf]))
645
- @i.register(:prefer_buffered_processing){ true }
646
- @i.register(:prefer_delayed_commit){ false }
647
- @i.register(:format){|tag,time,record| [tag,time.to_i,record].to_json + "\n" }
648
- @i.register(:write){|chunk| raise "yay, your #write must fail" }
649
- @i.secondary.register(:prefer_delayed_commit){ false }
650
- @i.secondary.register(:write){|chunk| raise "your secondary is also useless." }
651
- @i.start
652
- @i.after_start
653
-
654
- @i.interrupt_flushes
655
-
656
- now = Time.parse('2016-04-13 18:33:30 -0700')
657
- Timecop.freeze( now )
658
-
659
- @i.emit_events("test.tag.1", dummy_event_stream())
660
-
661
- now = Time.parse('2016-04-13 18:33:31 -0700')
662
- Timecop.freeze( now )
663
-
664
- @i.emit_events("test.tag.2", dummy_event_stream())
665
-
666
- assert_equal 0, @i.write_count
667
- assert_equal 0, @i.num_errors
668
-
669
- @i.enqueue_thread_wait
670
- @i.flush_thread_wakeup
671
- waiting(4){ sleep 0.1 until @i.write_count > 0 && @i.num_errors > 0 }
672
-
673
- assert{ @i.buffer.queue.size > 0 }
674
- assert{ @i.buffer.queue.first.metadata.tag == 'test.tag.1' }
675
-
676
- assert{ @i.write_count > 0 }
677
- assert{ @i.num_errors > 0 }
678
-
679
- prev_write_count = @i.write_count
680
- prev_num_errors = @i.num_errors
681
-
682
- first_failure = @i.retry.start
683
-
684
- # retry_timeout == 60(sec), retry_secondary_threshold == 0.8
685
-
686
- now = first_failure + 60 * 0.8 + 1
687
-
688
- Timecop.freeze( now )
689
- @i.enqueue_thread_wait
690
- @i.flush_thread_wakeup
691
- waiting(4){ sleep 0.1 until @i.write_count > prev_write_count }
692
-
693
- assert{ @i.write_count > prev_write_count }
694
- assert{ @i.num_errors > prev_num_errors }
695
-
696
- assert @i.retry
697
-
698
- assert_equal 3, (@i.next_flush_time - Time.now)
699
-
700
- logs = @i.log.out.logs
701
- waiting(4){ sleep 0.1 until logs.any?{|l| l.include?("[warn]: failed to flush the buffer with secondary output.") } }
702
- assert{ logs.any?{|l| l.include?("[warn]: failed to flush the buffer with secondary output.") } }
703
- end
704
- end
705
-
706
- sub_test_case 'secondary plugin feature for buffered output with exponential backoff' do
707
- setup do
708
- Fluent::Plugin.register_output('output_secondary_test', FluentPluginOutputAsBufferedSecondaryTest::DummyFullFeatureOutput)
709
- Fluent::Plugin.register_output('output_secondary_test2', FluentPluginOutputAsBufferedSecondaryTest::DummyFullFeatureOutput2)
710
- end
711
-
712
- test 'primary plugin will emit event streams to secondary after retries for time of retry_timeout * retry_secondary_threshold' do
713
- written = []
714
- priconf = config_element('buffer','tag',{'flush_interval' => 1, 'retry_type' => :exponential_backoff, 'retry_wait' => 1, 'retry_timeout' => 60, 'retry_randomize' => false})
715
- secconf = config_element('secondary','',{'@type' => 'output_secondary_test2'})
716
- @i.configure(config_element('ROOT','',{},[priconf,secconf]))
717
- @i.register(:prefer_buffered_processing){ true }
718
- @i.register(:prefer_delayed_commit){ false }
719
- @i.register(:format){|tag,time,record| [tag,time.to_i,record].to_json + "\n" }
720
- @i.register(:write){|chunk| raise "yay, your #write must fail" }
721
- @i.secondary.register(:prefer_delayed_commit){ false }
722
- @i.secondary.register(:write){|chunk| chunk.read.split("\n").each{|line| written << JSON.parse(line) } }
723
- @i.start
724
- @i.after_start
725
-
726
- @i.interrupt_flushes
727
-
728
- now = Time.parse('2016-04-13 18:33:30 -0700')
729
- Timecop.freeze( now )
730
-
731
- @i.emit_events("test.tag.1", dummy_event_stream())
732
-
733
- now = Time.parse('2016-04-13 18:33:31 -0700')
734
- Timecop.freeze( now )
735
-
736
- @i.emit_events("test.tag.2", dummy_event_stream())
737
-
738
- assert_equal 0, @i.write_count
739
- assert_equal 0, @i.num_errors
740
-
741
- @i.enqueue_thread_wait
742
- @i.flush_thread_wakeup
743
- waiting(4){ sleep 0.1 until @i.write_count > 0 && @i.num_errors > 0 }
744
-
745
- assert{ @i.buffer.queue.size > 0 }
746
- assert{ @i.buffer.queue.first.metadata.tag == 'test.tag.1' }
747
-
748
- assert{ @i.write_count > 0 }
749
- assert{ @i.num_errors > 0 }
750
-
751
- prev_write_count = @i.write_count
752
- first_failure = @i.retry.start
753
-
754
- 20.times do |i| # large enough
755
- now = @i.next_flush_time
756
- Timecop.freeze( now )
757
- @i.enqueue_thread_wait
758
- @i.flush_thread_wakeup
759
- waiting(4){ sleep 0.1 until @i.write_count > prev_write_count }
760
-
761
- assert{ @i.write_count > prev_write_count }
762
-
763
- break if @i.buffer.queue.size == 0
764
-
765
- prev_write_count = @i.write_count
766
- end
767
-
768
- # retry_timeout == 60(sec), retry_secondary_threshold == 0.8
769
-
770
- assert{ now >= first_failure + 60 * 0.8 }
771
-
772
- assert_nil @i.retry
773
-
774
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:00').to_i, {"name" => "moris", "age" => 36, "message" => "data1"} ], written[0]
775
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:13').to_i, {"name" => "moris", "age" => 36, "message" => "data2"} ], written[1]
776
- assert_equal [ 'test.tag.1', event_time('2016-04-13 18:33:32').to_i, {"name" => "moris", "age" => 36, "message" => "data3"} ], written[2]
777
-
778
- assert(@i.log.out.logs.any?{|l| l.include?("[warn]: retry succeeded by secondary.") })
779
- end
780
-
781
- test 'exponential backoff interval will be initialized when switched to secondary' do
782
- priconf = config_element('buffer','tag',{'flush_interval' => 1, 'retry_type' => :exponential_backoff, 'retry_wait' => 1, 'retry_timeout' => 60, 'retry_randomize' => false})
783
- secconf = config_element('secondary','',{'@type' => 'output_secondary_test2'})
784
- @i.configure(config_element('ROOT','',{},[priconf,secconf]))
785
- @i.register(:prefer_buffered_processing){ true }
786
- @i.register(:prefer_delayed_commit){ false }
787
- @i.register(:format){|tag,time,record| [tag,time.to_i,record].to_json + "\n" }
788
- @i.register(:write){|chunk| raise "yay, your #write must fail" }
789
- @i.secondary.register(:prefer_delayed_commit){ false }
790
- @i.secondary.register(:write){|chunk| raise "your secondary is also useless." }
791
- @i.start
792
- @i.after_start
793
-
794
- @i.interrupt_flushes
795
-
796
- now = Time.parse('2016-04-13 18:33:30 -0700')
797
- Timecop.freeze( now )
798
-
799
- @i.emit_events("test.tag.1", dummy_event_stream())
800
-
801
- now = Time.parse('2016-04-13 18:33:31 -0700')
802
- Timecop.freeze( now )
803
-
804
- @i.emit_events("test.tag.2", dummy_event_stream())
805
-
806
- assert_equal 0, @i.write_count
807
- assert_equal 0, @i.num_errors
808
-
809
- @i.enqueue_thread_wait
810
- @i.flush_thread_wakeup
811
- waiting(4){ sleep 0.1 until @i.write_count > 0 && @i.num_errors > 0 }
812
-
813
- assert{ @i.buffer.queue.size > 0 }
814
- assert{ @i.buffer.queue.first.metadata.tag == 'test.tag.1' }
815
-
816
- assert{ @i.write_count > 0 }
817
- assert{ @i.num_errors > 0 }
818
-
819
- prev_write_count = @i.write_count
820
- prev_num_errors = @i.num_errors
821
-
822
- first_failure = @i.retry.start
823
-
824
- 20.times do |i| # large enough
825
- now = @i.next_flush_time
826
- # p({i: i, now: now, diff: (now - Time.now)})
827
- # {:i=>0, :now=>2016-04-13 18:33:32 -0700, :diff=>1.0}
828
- # {:i=>1, :now=>2016-04-13 18:33:34 -0700, :diff=>2.0}
829
- # {:i=>2, :now=>2016-04-13 18:33:38 -0700, :diff=>4.0}
830
- # {:i=>3, :now=>2016-04-13 18:33:46 -0700, :diff=>8.0}
831
- # {:i=>4, :now=>2016-04-13 18:34:02 -0700, :diff=>16.0}
832
- # {:i=>5, :now=>2016-04-13 18:34:19 -0700, :diff=>17.0}
833
- Timecop.freeze( now )
834
- @i.enqueue_thread_wait
835
- @i.flush_thread_wakeup
836
- waiting(4){ sleep 0.1 until @i.write_count > prev_write_count }
837
-
838
- assert{ @i.write_count > prev_write_count }
839
- assert{ @i.num_errors > prev_num_errors }
840
-
841
- prev_write_count = @i.write_count
842
- prev_num_errors = @i.num_errors
843
-
844
- break if @i.retry.secondary?
845
-
846
- assert{ @i.buffer.queue.first.metadata.tag == 'test.tag.1' }
847
- end
848
-
849
- # retry_timeout == 60(sec), retry_secondary_threshold == 0.8
850
-
851
- assert{ now >= first_failure + 60 * 0.8 }
852
- assert @i.retry
853
- logs = @i.log.out.logs
854
- assert{ logs.any?{|l| l.include?("[warn]: failed to flush the buffer with secondary output.") } }
855
-
856
- assert{ (@i.next_flush_time - Time.now) <= 2 } # <= retry_wait (1s) * base (2) ** 1
857
-
858
- 20.times do |i| # large enough again
859
- now = @i.next_flush_time
860
- # p({i: i, now: now, diff: (now - Time.now)})
861
- # {:i=>0, :now=>2016-04-13 18:34:20 -0700, :diff=>1.0}
862
- # {:i=>1, :now=>2016-04-13 18:34:24 -0700, :diff=>4.0}
863
- # {:i=>2, :now=>2016-04-13 18:34:31 -0700, :diff=>7.0}
864
-
865
- Timecop.freeze( now )
866
- @i.enqueue_thread_wait
867
- @i.flush_thread_wakeup
868
- waiting(4){ sleep 0.1 until @i.write_count > prev_write_count }
869
-
870
- assert{ @i.write_count > prev_write_count }
871
- assert{ @i.num_errors > prev_num_errors }
872
-
873
- break if @i.buffer.queue.size == 0
874
- end
875
-
876
- logs = @i.log.out.logs
877
- assert{ logs.any?{|l| l.include?("[error]: Hit limit for retries. dropping all chunks in the buffer queue.") } }
878
-
879
- assert{ now >= first_failure + 60 }
880
- end
881
- end
882
- end