fluentd 1.14.6 → 1.15.0

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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/linux-test.yaml +1 -1
  3. data/.github/workflows/windows-test.yaml +4 -1
  4. data/CHANGELOG.md +53 -1
  5. data/fluentd.gemspec +2 -1
  6. data/lib/fluent/command/ctl.rb +4 -1
  7. data/lib/fluent/command/fluentd.rb +10 -0
  8. data/lib/fluent/config/literal_parser.rb +2 -2
  9. data/lib/fluent/config/yaml_parser/fluent_value.rb +47 -0
  10. data/lib/fluent/config/yaml_parser/loader.rb +91 -0
  11. data/lib/fluent/config/yaml_parser/parser.rb +166 -0
  12. data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
  13. data/lib/fluent/config/yaml_parser.rb +56 -0
  14. data/lib/fluent/config.rb +14 -1
  15. data/lib/fluent/plugin/file_wrapper.rb +52 -107
  16. data/lib/fluent/plugin/in_tail/group_watch.rb +204 -0
  17. data/lib/fluent/plugin/in_tail/position_file.rb +1 -15
  18. data/lib/fluent/plugin/in_tail.rb +66 -47
  19. data/lib/fluent/plugin/out_forward/socket_cache.rb +2 -0
  20. data/lib/fluent/plugin/output.rb +2 -1
  21. data/lib/fluent/plugin/parser_syslog.rb +1 -1
  22. data/lib/fluent/plugin_helper/server.rb +3 -1
  23. data/lib/fluent/plugin_helper/service_discovery.rb +2 -2
  24. data/lib/fluent/supervisor.rb +109 -25
  25. data/lib/fluent/system_config.rb +2 -1
  26. data/lib/fluent/version.rb +1 -1
  27. data/lib/fluent/winsvc.rb +2 -0
  28. data/test/command/test_ctl.rb +0 -1
  29. data/test/command/test_fluentd.rb +33 -0
  30. data/test/config/test_system_config.rb +3 -1
  31. data/test/config/test_types.rb +1 -1
  32. data/test/plugin/in_tail/test_io_handler.rb +14 -4
  33. data/test/plugin/in_tail/test_position_file.rb +0 -63
  34. data/test/plugin/out_forward/test_socket_cache.rb +26 -1
  35. data/test/plugin/test_file_wrapper.rb +0 -68
  36. data/test/plugin/test_in_object_space.rb +9 -3
  37. data/test/plugin/test_in_syslog.rb +1 -1
  38. data/test/plugin/test_in_tail.rb +629 -353
  39. data/test/plugin/test_out_forward.rb +30 -20
  40. data/test/plugin/test_parser_syslog.rb +1 -1
  41. data/test/plugin_helper/test_cert_option.rb +1 -1
  42. data/test/plugin_helper/test_child_process.rb +16 -4
  43. data/test/test_config.rb +135 -4
  44. data/test/test_supervisor.rb +155 -0
  45. metadata +11 -5
@@ -431,10 +431,12 @@ EOL
431
431
  ]
432
432
 
433
433
  stub(d.instance.ack_handler).read_ack_from_sock(anything).never
434
- target_input_driver.run(expect_records: 2) do
435
- d.run do
436
- emit_events.each do |tag, t, record|
437
- d.feed(tag, t, record)
434
+ assert_rr do
435
+ target_input_driver.run(expect_records: 2) do
436
+ d.run do
437
+ emit_events.each do |tag, t, record|
438
+ d.feed(tag, t, record)
439
+ end
438
440
  end
439
441
  end
440
442
  end
@@ -461,10 +463,12 @@ EOL
461
463
  ]
462
464
 
463
465
  stub(d.instance.ack_handler).read_ack_from_sock(anything).never
464
- target_input_driver.run(expect_records: 2) do
465
- d.run(default_tag: 'test') do
466
- records.each do |record|
467
- d.feed(time, record)
466
+ assert_rr do
467
+ target_input_driver.run(expect_records: 2) do
468
+ d.run(default_tag: 'test') do
469
+ records.each do |record|
470
+ d.feed(time, record)
471
+ end
468
472
  end
469
473
  end
470
474
  end
@@ -491,10 +495,12 @@ EOL
491
495
  {"a" => 2}
492
496
  ]
493
497
  stub(d.instance.ack_handler).read_ack_from_sock(anything).never
494
- target_input_driver.run(expect_records: 2) do
495
- d.run(default_tag: 'test') do
496
- records.each do |record|
497
- d.feed(time, record)
498
+ assert_rr do
499
+ target_input_driver.run(expect_records: 2) do
500
+ d.run(default_tag: 'test') do
501
+ records.each do |record|
502
+ d.feed(time, record)
503
+ end
498
504
  end
499
505
  end
500
506
  end
@@ -549,10 +555,12 @@ EOL
549
555
  ]
550
556
  # not attempt to receive responses
551
557
  stub(d.instance.ack_handler).read_ack_from_sock(anything).never
552
- target_input_driver.run(expect_records: 2) do
553
- d.run(default_tag: 'test') do
554
- records.each do |record|
555
- d.feed(time, record)
558
+ assert_rr do
559
+ target_input_driver.run(expect_records: 2) do
560
+ d.run(default_tag: 'test') do
561
+ records.each do |record|
562
+ d.feed(time, record)
563
+ end
556
564
  end
557
565
  end
558
566
  end
@@ -575,10 +583,12 @@ EOL
575
583
  ]
576
584
  # not attempt to receive responses
577
585
  stub(d.instance.ack_handler).read_ack_from_sock(anything).never
578
- target_input_driver.run(expect_records: 2) do
579
- d.run(default_tag: 'test') do
580
- records.each do |record|
581
- d.feed(time, record)
586
+ assert_rr do
587
+ target_input_driver.run(expect_records: 2) do
588
+ d.run(default_tag: 'test') do
589
+ records.each do |record|
590
+ d.feed(time, record)
591
+ end
582
592
  end
583
593
  end
584
594
  end
@@ -644,7 +644,7 @@ class SyslogParserTest < ::Test::Unit::TestCase
644
644
 
645
645
  data('regexp' => :regexp, 'string' => :string)
646
646
  def test_parser_engine(engine)
647
- d = @parser.configure({'parser_engine' => engine.to_s})
647
+ @parser.configure({'parser_engine' => engine.to_s})
648
648
  assert_equal(engine, @parser.instance.parser_engine)
649
649
  end
650
650
  end
@@ -19,7 +19,7 @@ class CertOptionPluginHelperTest < Test::Unit::TestCase
19
19
  test 'raise an error for broken certificates_from_file file' do
20
20
  d = Dummy.new
21
21
  assert_raise Fluent::ConfigError do
22
- certs = d.cert_option_certificates_from_file("test/plugin_helper/data/cert/empty.pem")
22
+ d.cert_option_certificates_from_file("test/plugin_helper/data/cert/empty.pem")
23
23
  end
24
24
  end
25
25
  end
@@ -321,15 +321,21 @@ class ChildProcessTest < Test::Unit::TestCase
321
321
  ary = []
322
322
  arguments = ["okay"]
323
323
  Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
324
+ start_time = Fluent::Clock.now
324
325
  @d.child_process_execute(:t5, "echo", arguments: arguments, interval: 1, mode: [:read]) do |io|
325
326
  ary << io.read.split("\n").map(&:chomp).join
326
327
  end
327
- sleep 2.9 # 2sec(second invocation) + 0.9sec
328
+ 1.upto(2) do |i|
329
+ sleep 0.1 while ary.size < i
330
+ elapsed = Fluent::Clock.now - start_time
331
+ assert_equal(i, ary.size)
332
+ assert_true(elapsed > i && elapsed < i + 0.5,
333
+ "actual elapsed: #{elapsed}")
334
+ end
328
335
  assert_equal [], @d.log.out.logs
329
336
  @d.stop
330
337
  assert_equal [], @d.log.out.logs
331
338
  @d.shutdown; @d.close; @d.terminate
332
- assert_equal 2, ary.size
333
339
  end
334
340
  end
335
341
 
@@ -337,12 +343,18 @@ class ChildProcessTest < Test::Unit::TestCase
337
343
  ary = []
338
344
  arguments = ["okay"]
339
345
  Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
346
+ start_time = Fluent::Clock.now
340
347
  @d.child_process_execute(:t6, "echo", arguments: arguments, interval: 1, immediate: true, mode: [:read]) do |io|
341
348
  ary << io.read.split("\n").map(&:chomp).join
342
349
  end
343
- sleep 1.9 # 1sec(second invocation) + 0.9sec
350
+ 0.upto(1) do |i|
351
+ sleep 0.1 while ary.size < i + 1
352
+ elapsed = Fluent::Clock.now - start_time
353
+ assert_equal(i + 1, ary.size)
354
+ assert_true(elapsed > i && elapsed < i + 0.5,
355
+ "actual elapsed: #{elapsed}")
356
+ end
344
357
  @d.stop; @d.shutdown; @d.close; @d.terminate
345
- assert_equal 2, ary.size
346
358
  assert_equal [], @d.log.out.logs
347
359
  end
348
360
  end
data/test/test_config.rb CHANGED
@@ -10,11 +10,18 @@ class ConfigTest < Test::Unit::TestCase
10
10
 
11
11
  TMP_DIR = File.dirname(__FILE__) + "/tmp/config#{ENV['TEST_ENV_NUMBER']}"
12
12
 
13
- def read_config(path)
13
+ def read_config(path, use_yaml: false)
14
14
  path = File.expand_path(path)
15
- File.open(path) { |io|
16
- Fluent::Config::Parser.parse(io, File.basename(path), File.dirname(path))
17
- }
15
+ if use_yaml
16
+ context = Kernel.binding
17
+
18
+ s = Fluent::Config::YamlParser::Loader.new(context).load(Pathname.new(path))
19
+ Fluent::Config::YamlParser::Parser.new(s).build.to_element
20
+ else
21
+ File.open(path) { |io|
22
+ Fluent::Config::Parser.parse(io, File.basename(path), File.dirname(path))
23
+ }
24
+ end
18
25
  end
19
26
 
20
27
  def prepare_config
@@ -151,6 +158,130 @@ class ConfigTest < Test::Unit::TestCase
151
158
  assert_equal before_size, match_conf.unused.size
152
159
  end
153
160
 
161
+ sub_test_case "yaml config" do
162
+ def test_included
163
+ write_config "#{TMP_DIR}/config_test_not_fetched.yaml", <<-EOS
164
+ config:
165
+ - source:
166
+ $type: dummy
167
+ tag: tag.dummy
168
+ - source:
169
+ $type: tcp
170
+ tag: tag.tcp
171
+ parse:
172
+ $arg:
173
+ - why.parse.section.doesnot.have.arg
174
+ - huh
175
+ $type: none
176
+ - match:
177
+ $tag: tag.*
178
+ $type: stdout
179
+ buffer:
180
+ $type: memory
181
+ flush_interval: 1s
182
+ - !include fluent-included.yaml
183
+ EOS
184
+ write_config "#{TMP_DIR}/fluent-included.yaml", <<-EOS
185
+ - label:
186
+ $name: '@FLUENT_LOG'
187
+ config:
188
+ - match:
189
+ $type: "null"
190
+ $tag: "**"
191
+ buffer:
192
+ $type: memory
193
+ flush_mode: interval
194
+ flush_interval: 1s
195
+ EOS
196
+ root_conf = read_config("#{TMP_DIR}/config_test_not_fetched.yaml", use_yaml: true)
197
+ dummy_source_conf = root_conf.elements.first
198
+ tcp_source_conf = root_conf.elements[1]
199
+ parse_tcp_conf = tcp_source_conf.elements.first
200
+ match_conf = root_conf.elements[2]
201
+ label_conf = root_conf.elements[3]
202
+ fluent_log_conf = label_conf.elements.first
203
+ fluent_log_buffer_conf = fluent_log_conf.elements.first
204
+
205
+ assert_equal(
206
+ [
207
+ 'dummy',
208
+ 'tag.dummy',
209
+ 'tcp',
210
+ 'tag.tcp',
211
+ 'none',
212
+ 'why.parse.section.doesnot.have.arg,huh',
213
+ 'stdout',
214
+ 'tag.*',
215
+ 'null',
216
+ '**',
217
+ '@FLUENT_LOG',
218
+ 'memory',
219
+ 'interval',
220
+ '1s',
221
+ ],
222
+ [
223
+ dummy_source_conf['@type'],
224
+ dummy_source_conf['tag'],
225
+ tcp_source_conf['@type'],
226
+ tcp_source_conf['tag'],
227
+ parse_tcp_conf['@type'],
228
+ parse_tcp_conf.arg,
229
+ match_conf['@type'],
230
+ match_conf.arg,
231
+ fluent_log_conf['@type'],
232
+ fluent_log_conf.arg,
233
+ label_conf.arg,
234
+ fluent_log_buffer_conf['@type'],
235
+ fluent_log_buffer_conf['flush_mode'],
236
+ fluent_log_buffer_conf['flush_interval'],
237
+ ])
238
+ end
239
+
240
+ def test_check_not_fetchd
241
+ write_config "#{TMP_DIR}/config_test_not_fetched.yaml", <<-EOS
242
+ config:
243
+ - match:
244
+ $arg: dummy
245
+ $type: rewrite
246
+ add_prefix: filtered
247
+ rule:
248
+ key: path
249
+ pattern: "^[A-Z]+"
250
+ replace: true
251
+ EOS
252
+ root_conf = read_config("#{TMP_DIR}/config_test_not_fetched.yaml", use_yaml: true)
253
+ match_conf = root_conf.elements.first
254
+ rule_conf = match_conf.elements.first
255
+
256
+ not_fetched = []; root_conf.check_not_fetched {|key, e| not_fetched << key }
257
+ assert_equal %w[@type $arg add_prefix key pattern replace], not_fetched
258
+
259
+ not_fetched = []; match_conf.check_not_fetched {|key, e| not_fetched << key }
260
+ assert_equal %w[@type $arg add_prefix key pattern replace], not_fetched
261
+
262
+ not_fetched = []; rule_conf.check_not_fetched {|key, e| not_fetched << key }
263
+ assert_equal %w[key pattern replace], not_fetched
264
+
265
+ # accessing should delete
266
+ match_conf['type']
267
+ rule_conf['key']
268
+
269
+ not_fetched = []; root_conf.check_not_fetched {|key, e| not_fetched << key }
270
+ assert_equal %w[@type $arg add_prefix pattern replace], not_fetched
271
+
272
+ not_fetched = []; match_conf.check_not_fetched {|key, e| not_fetched << key }
273
+ assert_equal %w[@type $arg add_prefix pattern replace], not_fetched
274
+
275
+ not_fetched = []; rule_conf.check_not_fetched {|key, e| not_fetched << key }
276
+ assert_equal %w[pattern replace], not_fetched
277
+
278
+ # repeatedly accessing should not grow memory usage
279
+ before_size = match_conf.unused.size
280
+ 10.times { match_conf['type'] }
281
+ assert_equal before_size, match_conf.unused.size
282
+ end
283
+ end
284
+
154
285
  def write_config(path, data, encoding: 'utf-8')
155
286
  FileUtils.mkdir_p(File.dirname(path))
156
287
  File.open(path, "w:#{encoding}:utf-8") {|f| f.write data }
@@ -90,6 +90,93 @@ class SupervisorTest < ::Test::Unit::TestCase
90
90
  assert_equal 2, counter_client.timeout
91
91
  end
92
92
 
93
+ sub_test_case "yaml config" do
94
+ def parse_yaml(yaml)
95
+ context = Kernel.binding
96
+
97
+ config = nil
98
+ Tempfile.open do |file|
99
+ file.puts(yaml)
100
+ file.flush
101
+ s = Fluent::Config::YamlParser::Loader.new(context).load(Pathname.new(file))
102
+ config = Fluent::Config::YamlParser::Parser.new(s).build.to_element
103
+ end
104
+ config
105
+ end
106
+
107
+ def test_system_config
108
+ opts = Fluent::Supervisor.default_options
109
+ sv = Fluent::Supervisor.new(opts)
110
+ conf_data = <<-EOC
111
+ system:
112
+ rpc_endpoint: 127.0.0.1:24445
113
+ suppress_repeated_stacktrace: true
114
+ suppress_config_dump: true
115
+ without_source: true
116
+ enable_get_dump: true
117
+ process_name: "process_name"
118
+ log_level: info
119
+ root_dir: !fluent/s "#{TMP_ROOT_DIR}"
120
+ log:
121
+ format: json
122
+ time_format: "%Y"
123
+ counter_server:
124
+ bind: 127.0.0.1
125
+ port: 24321
126
+ scope: server1
127
+ backup_path: /tmp/backup
128
+ counter_client:
129
+ host: 127.0.0.1
130
+ port: 24321
131
+ timeout: 2
132
+ EOC
133
+ conf = parse_yaml(conf_data)
134
+ sys_conf = sv.__send__(:build_system_config, conf)
135
+
136
+ counter_client = sys_conf.counter_client
137
+ counter_server = sys_conf.counter_server
138
+ assert_equal(
139
+ [
140
+ '127.0.0.1:24445',
141
+ true,
142
+ true,
143
+ true,
144
+ true,
145
+ "process_name",
146
+ 2,
147
+ TMP_ROOT_DIR,
148
+ :json,
149
+ '%Y',
150
+ '127.0.0.1',
151
+ 24321,
152
+ 'server1',
153
+ '/tmp/backup',
154
+ '127.0.0.1',
155
+ 24321,
156
+ 2,
157
+ ],
158
+ [
159
+ sys_conf.rpc_endpoint,
160
+ sys_conf.suppress_repeated_stacktrace,
161
+ sys_conf.suppress_config_dump,
162
+ sys_conf.without_source,
163
+ sys_conf.enable_get_dump,
164
+ sys_conf.process_name,
165
+ sys_conf.log_level,
166
+ sys_conf.root_dir,
167
+ sys_conf.log.format,
168
+ sys_conf.log.time_format,
169
+ counter_server.bind,
170
+ counter_server.port,
171
+ counter_server.scope,
172
+ counter_server.backup_path,
173
+ counter_client.host,
174
+ counter_client.port,
175
+ counter_client.timeout,
176
+ ])
177
+ end
178
+ end
179
+
93
180
  def test_main_process_signal_handlers
94
181
  omit "Windows cannot handle signals" if Fluent.windows?
95
182
 
@@ -213,6 +300,49 @@ class SupervisorTest < ::Test::Unit::TestCase
213
300
  $log.out.reset if $log && $log.out && $log.out.respond_to?(:reset)
214
301
  end
215
302
 
303
+ data("Normal", {raw_path: "C:\\Windows\\Temp\\sigdump.log", expected: "C:\\Windows\\Temp\\sigdump-#{$$}.log"})
304
+ data("UNIX style", {raw_path: "/Windows/Temp/sigdump.log", expected: "/Windows/Temp/sigdump-#{$$}.log"})
305
+ data("No extension", {raw_path: "C:\\Windows\\Temp\\sigdump", expected: "C:\\Windows\\Temp\\sigdump-#{$$}"})
306
+ data("Multi-extension", {raw_path: "C:\\Windows\\Temp\\sig.dump.bk", expected: "C:\\Windows\\Temp\\sig.dump-#{$$}.bk"})
307
+ def test_fluentsigdump_get_path_with_pid(data)
308
+ p data
309
+ path = Fluent::FluentSigdump.get_path_with_pid(data[:raw_path])
310
+ assert_equal(data[:expected], path)
311
+ end
312
+
313
+ def test_supervisor_event_dump_windows
314
+ omit "Only for Windows, alternative to UNIX signals" unless Fluent.windows?
315
+
316
+ server = DummyServer.new
317
+ def server.config
318
+ {:signame => "TestFluentdEvent"}
319
+ end
320
+ server.install_windows_event_handler
321
+
322
+ assert_rr do
323
+ # Have to use mock because `Sigdump.dump` seems to be somehow incompatible with RR.
324
+ # The `mock(server).restart(true) { nil }` line in `test_rpc_server_windows` cause the next error.
325
+ # Failure: test_supervisor_event_dump_windows(SupervisorTest):
326
+ # class()
327
+ # Called 0 times.
328
+ # Expected 1 times.
329
+ # .../Ruby26-x64/lib/ruby/gems/2.6.0/gems/sigdump-0.2.4/lib/sigdump.rb:74:in `block in dump_object_count'
330
+ # 73: ObjectSpace.each_object {|o|
331
+ # 74: c = o.class <-- HERE!
332
+ mock(Sigdump).dump(anything)
333
+
334
+ begin
335
+ sleep 0.1 # Wait for starting windows event thread
336
+ event = Win32::Event.open("TestFluentdEvent_CONT")
337
+ event.set
338
+ event.close
339
+ sleep 1.0 # Wait for dumping
340
+ ensure
341
+ server.stop_windows_event_thread
342
+ end
343
+ end
344
+ end
345
+
216
346
  data(:ipv4 => ["0.0.0.0", "127.0.0.1", false],
217
347
  :ipv6 => ["[::]", "[::1]", true],
218
348
  :localhost_ipv4 => ["localhost", "127.0.0.1", false])
@@ -557,6 +687,31 @@ class SupervisorTest < ::Test::Unit::TestCase
557
687
  logger.instance_variable_get(:@rotate_size)])
558
688
  end
559
689
  end
690
+
691
+ def test_override_default_log_rotate_with_yaml_config
692
+ Tempfile.open do |file|
693
+ config = <<-EOS
694
+ system:
695
+ log:
696
+ rotate_age: 3
697
+ rotate_size: 300
698
+ EOS
699
+ file.puts(config)
700
+ file.flush
701
+ opts = Fluent::Supervisor.default_options.merge(
702
+ log_path: "#{TMP_DIR}/test.log", config_path: file.path, config_file_type: :yaml,
703
+ )
704
+ sv = Fluent::Supervisor.new(opts)
705
+
706
+ log = sv.instance_variable_get(:@log)
707
+ log.init(:standalone, 0)
708
+ logger = $log.instance_variable_get(:@logger)
709
+
710
+ assert_equal([3, 300],
711
+ [logger.instance_variable_get(:@rotate_age),
712
+ logger.instance_variable_get(:@rotate_size)])
713
+ end
714
+ end
560
715
  end
561
716
 
562
717
  def test_inline_config
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluentd
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.14.6
4
+ version: 1.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sadayuki Furuhashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-31 00:00:00.000000000 Z
11
+ date: 2022-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -84,7 +84,7 @@ dependencies:
84
84
  requirements:
85
85
  - - ">="
86
86
  - !ruby/object:Gem::Version
87
- version: 2.2.5
87
+ version: 2.3.0
88
88
  - - "<"
89
89
  - !ruby/object:Gem::Version
90
90
  version: 3.0.0
@@ -94,7 +94,7 @@ dependencies:
94
94
  requirements:
95
95
  - - ">="
96
96
  - !ruby/object:Gem::Version
97
- version: 2.2.5
97
+ version: 2.3.0
98
98
  - - "<"
99
99
  - !ruby/object:Gem::Version
100
100
  version: 3.0.0
@@ -507,6 +507,11 @@ files:
507
507
  - lib/fluent/config/section.rb
508
508
  - lib/fluent/config/types.rb
509
509
  - lib/fluent/config/v1_parser.rb
510
+ - lib/fluent/config/yaml_parser.rb
511
+ - lib/fluent/config/yaml_parser/fluent_value.rb
512
+ - lib/fluent/config/yaml_parser/loader.rb
513
+ - lib/fluent/config/yaml_parser/parser.rb
514
+ - lib/fluent/config/yaml_parser/section_builder.rb
510
515
  - lib/fluent/configurable.rb
511
516
  - lib/fluent/counter.rb
512
517
  - lib/fluent/counter/base_socket.rb
@@ -579,6 +584,7 @@ files:
579
584
  - lib/fluent/plugin/in_sample.rb
580
585
  - lib/fluent/plugin/in_syslog.rb
581
586
  - lib/fluent/plugin/in_tail.rb
587
+ - lib/fluent/plugin/in_tail/group_watch.rb
582
588
  - lib/fluent/plugin/in_tail/position_file.rb
583
589
  - lib/fluent/plugin/in_tcp.rb
584
590
  - lib/fluent/plugin/in_udp.rb
@@ -959,7 +965,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
959
965
  - !ruby/object:Gem::Version
960
966
  version: '0'
961
967
  requirements: []
962
- rubygems_version: 3.3.7
968
+ rubygems_version: 3.3.5
963
969
  signing_key:
964
970
  specification_version: 4
965
971
  summary: Fluentd event collector