fluentd 1.16.10 → 1.16.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aa40bacc9e6549ff2050843ead6a9852e6b3783a29c0e5f73dfbfad282707567
4
- data.tar.gz: b429eb7f1a663524fb99bd89eb48de153ecdd1e85860048a26832be9143db964
3
+ metadata.gz: 255e643927676bb2d1414a29cb709d70b72e562a09d83a1a2532c6be1e0dfa89
4
+ data.tar.gz: 34703e891bc6cf823c88b98fa920fe049d54da981c466be21e63a684966d6988
5
5
  SHA512:
6
- metadata.gz: 0b437ed360b2bc3b65d965a88743b627a6c17efe0d5a328e57787b36c1b86b0749ee004cc84edba90c0a91a57dae98a7484ad5664f54c5fe37a589f36ebc7b02
7
- data.tar.gz: 5711d692a6f2f4f5c9a9cfa7bfc8b6eafe4e588da708c5a09b5d9a386cd1d8c47a9ecb4ff5de6a77bcb8954dec5efa086234e14aeb9fee56abcd92ce91feee6c
6
+ metadata.gz: 3be646bf7c7ce861dcd8e842527d80d49eba0c3fc899f7f972db30e443bd8a749073167f1d8bcb70d24c8ab6a636388c2b0ea19423f58ed0f57687198b7b8dfb
7
+ data.tar.gz: a7740e6e6b8ec714811ce128725964a4108b456e0f12d5ef8a98ea95a151fba151fda0ac54ca49ed42c213b66d45b20f9879948f7b04ea3f00d2808816221646
@@ -26,7 +26,7 @@ jobs:
26
26
  fail-fast: false
27
27
  matrix:
28
28
  os: ['ubuntu-latest', 'macos-latest', 'windows-latest']
29
- ruby-version: ['3.3', '3.2', '3.1', '3.0', '2.7']
29
+ ruby-version: ['3.4', '3.3', '3.2', '3.1', '3.0', '2.7']
30
30
  name: Ruby ${{ matrix.ruby-version }} on ${{ matrix.os }}
31
31
  steps:
32
32
  - uses: actions/checkout@v5
@@ -48,7 +48,7 @@ jobs:
48
48
  strategy:
49
49
  fail-fast: false
50
50
  matrix:
51
- ruby-version: ['3.3', '3.2', '3.1', '3.0', '2.7']
51
+ ruby-version: ['3.4', '3.3', '3.2', '3.1', '3.0', '2.7']
52
52
  name: Windows service (Ruby ${{ matrix.ruby-version }})
53
53
  steps:
54
54
  - uses: actions/checkout@v5
data/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # v1.16
2
2
 
3
+ ## Release v1.16.11 - 2025/12/12
4
+
5
+ ### Bug Fix
6
+
7
+ * out_forward: fix issue where could cause output to stop when using `<security>` and TLS setting together under unstable network environments
8
+ https://github.com/fluent/fluentd/pull/5137
9
+
10
+ ### Misc
11
+
12
+ * Add missing gem dependency on Ruby 3.4.
13
+ https://github.com/fluent/fluentd/pull/5172
14
+
15
+ * CI improvemnts
16
+ https://github.com/fluent/fluentd/pull/5135
17
+ https://github.com/fluent/fluentd/pull/5175
18
+ https://github.com/fluent/fluentd/pull/5182
19
+ https://github.com/fluent/fluentd/pull/5183
20
+ https://github.com/fluent/fluentd/pull/5185
21
+ https://github.com/fluent/fluentd/pull/5187
22
+ https://github.com/fluent/fluentd/pull/5189
23
+
3
24
  ## Release v1.16.10 - 2025/09/12
4
25
 
5
26
  ### Bug Fix
data/fluentd.gemspec CHANGED
@@ -31,6 +31,11 @@ Gem::Specification.new do |gem|
31
31
  gem.add_runtime_dependency("webrick", ["~> 1.4"])
32
32
  gem.add_runtime_dependency("console", ["< 1.24"])
33
33
 
34
+ # gems that aren't default gems as of Ruby 3.4
35
+ gem.add_runtime_dependency("base64", ["~> 0.2"])
36
+ gem.add_runtime_dependency("csv", ["~> 3.2"])
37
+ gem.add_runtime_dependency("drb", ["~> 2.2"])
38
+
34
39
  # gems that aren't default gems as of Ruby 3.5
35
40
  gem.add_runtime_dependency("logger", ["~> 1.6"])
36
41
 
@@ -610,7 +610,17 @@ module Fluent::Plugin
610
610
  end
611
611
 
612
612
  def establish_connection(sock, ri)
613
+ start_time = Fluent::Clock.now
614
+ timeout = @sender.hard_timeout
615
+
613
616
  while ri.state != :established
617
+ # Check for timeout to prevent infinite loop
618
+ if Fluent::Clock.now - start_time > timeout
619
+ @log.warn "handshake timeout after #{timeout}s", host: @host, port: @port
620
+ disable!
621
+ break
622
+ end
623
+
614
624
  begin
615
625
  # TODO: On Ruby 2.2 or earlier, read_nonblock doesn't work expectedly.
616
626
  # We need rewrite around here using new socket/server plugin helper.
@@ -16,6 +16,6 @@
16
16
 
17
17
  module Fluent
18
18
 
19
- VERSION = '1.16.10'
19
+ VERSION = '1.16.11'
20
20
 
21
21
  end
@@ -570,7 +570,7 @@ CONF
570
570
 
571
571
  assert_fluentd_fails_to_start(
572
572
  create_cmdline(conf_path, "-p", File.dirname(plugin_path)),
573
- "in_buggy.rb:5: syntax error, unexpected end-of-input"
573
+ /in_buggy.rb:\d+:.+\(SyntaxError\)/
574
574
  )
575
575
  end
576
576
  end
@@ -1,6 +1,7 @@
1
1
  require_relative '../helper'
2
2
  require 'fluent/config/element'
3
3
  require "fluent/config/dsl"
4
+ require 'tempfile'
4
5
 
5
6
  TMP_DIR = File.dirname(__FILE__) + "/tmp/config_dsl#{ENV['TEST_ENV_NUMBER']}"
6
7
  def write_config(path, data)
@@ -358,9 +359,13 @@ module Fluent::Config
358
359
  sub_test_case '.parse' do
359
360
  test 'can get result of Kernel.open() by ruby.open()' do
360
361
  uname_string = `uname -a`
362
+ tmpfile = Tempfile.create('fluentd-test')
363
+ tmpfile.write(uname_string)
364
+ tmpfile.close
365
+
361
366
  root = Fluent::Config::DSL::Parser.parse(<<DSL)
362
367
  worker {
363
- uname_str = ruby.open('|uname -a'){|out| out.read}
368
+ uname_str = ruby.open("#{tmpfile.path}"){|out| out.read}
364
369
  source {
365
370
  uname uname_str
366
371
  }
@@ -372,6 +377,8 @@ DSL
372
377
  assert_equal('source', source.name)
373
378
  assert_equal(1, source.keys.size)
374
379
  assert_equal(uname_string, source['uname'])
380
+ ensure
381
+ File.delete(tmpfile.path)
375
382
  end
376
383
 
377
384
  test 'accepts ruby keyword with block, which allow to use methods included from ::Kernel' do
@@ -282,8 +282,8 @@ CONF
282
282
  dump = <<-CONF
283
283
  name:ROOT, arg:, {\"k1\"=>\"v1\"}, [name:test, arg:ext, {\"k2\"=>\"v2\"}, []]
284
284
  CONF
285
- assert_not_equal(e.to_s, e.inspect)
286
- assert_equal(dump.chomp, e.inspect)
285
+ assert_not_equal(e.to_s, e.inspect.gsub(' => ', '=>'))
286
+ assert_equal(dump.chomp, e.inspect.gsub(' => ', '=>'))
287
287
  end
288
288
  end
289
289
 
@@ -86,12 +86,12 @@ class StdoutFilterTest < Test::Unit::TestCase
86
86
  d = create_driver(CONFIG + config_element("", "", { "output_type" => "hash" }))
87
87
  etime = event_time("2016-10-07 21:09:31.012345678 UTC")
88
88
  out = capture_log(d) { filter(d, etime, {'test' => 'test'}) }
89
- assert_equal "2016-10-07 21:09:31.012345678 +0000 filter.test: {\"test\"=>\"test\"}\n", out
89
+ assert_equal "2016-10-07 21:09:31.012345678 +0000 filter.test: {\"test\"=>\"test\"}\n", out.gsub(' => ', '=>')
90
90
 
91
91
  # NOTE: Float::NAN is not jsonable, but hash string can output it.
92
92
  d = create_driver(CONFIG + config_element("", "", { "output_type" => "hash" }))
93
93
  out = capture_log(d) { filter(d, etime, {'test' => Float::NAN}) }
94
- assert_equal "2016-10-07 21:09:31.012345678 +0000 filter.test: {\"test\"=>NaN}\n", out
94
+ assert_equal "2016-10-07 21:09:31.012345678 +0000 filter.test: {\"test\"=>NaN}\n", out.gsub(' => ', '=>')
95
95
  end
96
96
 
97
97
  # Use include_time_key to output the message's time
@@ -172,7 +172,7 @@ class StdoutFilterTest < Test::Unit::TestCase
172
172
  d = create_driver(conf)
173
173
  etime = event_time("2016-10-07 21:09:31.012345678 UTC")
174
174
  out = capture_log(d) { filter(d, etime, {'test' => 'test'}) }
175
- assert_equal "2016-10-07 21:09:31.012345678 +0000 filter.test: {\"test\"=>\"test\"}\n", out
175
+ assert_equal "2016-10-07 21:09:31.012345678 +0000 filter.test: {\"test\"=>\"test\"}\n", out.gsub(' => ', '=>')
176
176
  end
177
177
 
178
178
  def test_hash_nan
@@ -182,7 +182,7 @@ class StdoutFilterTest < Test::Unit::TestCase
182
182
  d = create_driver(conf)
183
183
  etime = event_time("2016-10-07 21:09:31.012345678 UTC")
184
184
  out = capture_log(d) { filter(d, etime, {'test' => Float::NAN}) }
185
- assert_equal "2016-10-07 21:09:31.012345678 +0000 filter.test: {\"test\"=>NaN}\n", out
185
+ assert_equal "2016-10-07 21:09:31.012345678 +0000 filter.test: {\"test\"=>NaN}\n", out.gsub(' => ', '=>')
186
186
  end
187
187
 
188
188
  # Use include_time_key to output the message's time
@@ -26,13 +26,13 @@ class HashFormatterTest < ::Test::Unit::TestCase
26
26
  d = create_driver({"newline" => newline_conf})
27
27
  formatted = d.instance.format(tag, @time, record)
28
28
 
29
- assert_equal(%Q!{"message"=>"awesome", "greeting"=>"hello"}#{newline}!, formatted.encode(Encoding::UTF_8))
29
+ assert_equal(%Q!{"message"=>"awesome", "greeting"=>"hello"}#{newline}!, formatted.gsub(' => ', '=>').encode(Encoding::UTF_8))
30
30
  end
31
31
 
32
32
  def test_format_without_newline
33
33
  d = create_driver('add_newline' => false)
34
34
  formatted = d.instance.format(tag, @time, record)
35
35
 
36
- assert_equal(%Q!{"message"=>"awesome", "greeting"=>"hello"}!, formatted.encode(Encoding::UTF_8))
36
+ assert_equal(%Q!{"message"=>"awesome", "greeting"=>"hello"}!, formatted.gsub(' => ', '=>').encode(Encoding::UTF_8))
37
37
  end
38
38
  end
@@ -1347,4 +1347,27 @@ EOL
1347
1347
  end
1348
1348
  end
1349
1349
  end
1350
+
1351
+ test 'establish_connection_timeout' do
1352
+ @d = d = create_driver(%[
1353
+ hard_timeout 1
1354
+ <server>
1355
+ host #{TARGET_HOST}
1356
+ port #{@target_port}
1357
+ </server>
1358
+ ])
1359
+
1360
+ node = d.instance.nodes.first
1361
+ mock_sock = flexmock('socket')
1362
+ mock_sock.should_receive(:read_nonblock).with(512).and_return('').at_least.once
1363
+
1364
+ ri = Fluent::Plugin::ForwardOutput::ConnectionManager::RequestInfo.new(:helo)
1365
+
1366
+ assert_true node.available?
1367
+ node.establish_connection(mock_sock, ri)
1368
+ assert_false node.available?
1369
+
1370
+ logs = d.logs
1371
+ assert{ logs.any?{|log| log.include?('handshake timeout after 1.0s') } }
1372
+ end
1350
1373
  end
@@ -95,11 +95,11 @@ class StdoutOutputTest < Test::Unit::TestCase
95
95
  d.feed(time, {'test' => 'test2'})
96
96
  end
97
97
  end
98
- assert_equal "#{Time.at(time).localtime.strftime(TIME_FORMAT)} test: {\"test\"=>\"test2\"}\n", out
98
+ assert_equal "#{Time.at(time).localtime.strftime(TIME_FORMAT)} test: {\"test\"=>\"test2\"}\n", out.gsub(' => ', '=>')
99
99
 
100
100
  # NOTE: Float::NAN is not jsonable, but hash string can output it.
101
101
  out = capture_log { d.feed('test', time, {'test' => Float::NAN}) }
102
- assert_equal "#{Time.at(time).localtime.strftime(TIME_FORMAT)} test: {\"test\"=>NaN}\n", out
102
+ assert_equal "#{Time.at(time).localtime.strftime(TIME_FORMAT)} test: {\"test\"=>NaN}\n", out.gsub(' => ', '=>')
103
103
  end
104
104
  end
105
105
 
@@ -171,7 +171,7 @@ class StdoutOutputTest < Test::Unit::TestCase
171
171
  end
172
172
  end
173
173
 
174
- assert_equal "#{Time.at(time).localtime.strftime(TIME_FORMAT)} test: {\"test\"=>\"test\"}\n", out
174
+ assert_equal "#{Time.at(time).localtime.strftime(TIME_FORMAT)} test: {\"test\"=>\"test\"}\n", out.gsub(' => ', '=>')
175
175
  end
176
176
  end
177
177
  end
@@ -569,7 +569,7 @@ class ChildProcessTest < Test::Unit::TestCase
569
569
  unless Fluent.windows?
570
570
  test 'can specify subprocess name' do
571
571
  io = IO.popen([["cat", "caaaaaaaaaaat"], '-'])
572
- process_naming_enabled = (open("|ps opid,cmd"){|_io| _io.readlines }.count{|line| line.include?("caaaaaaaaaaat") } > 0)
572
+ process_naming_enabled = (IO.popen(["ps", "opid,cmd"]){|_io| _io.readlines }.count{|line| line.include?("caaaaaaaaaaat") } > 0)
573
573
  Process.kill(:TERM, io.pid) rescue nil
574
574
  io.close rescue nil
575
575
 
@@ -586,7 +586,7 @@ class ChildProcessTest < Test::Unit::TestCase
586
586
  m.lock
587
587
  ran = true
588
588
  pids << @d.child_process_id
589
- proc_lines += open("|ps opid,cmd"){|_io| _io.readlines }
589
+ proc_lines += IO.popen(["ps", "opid,cmd"]){|_io| _io.readlines }
590
590
  m.unlock
591
591
  readio.read
592
592
  end
@@ -645,8 +645,8 @@ class ChildProcessTest < Test::Unit::TestCase
645
645
  unless Fluent.windows?
646
646
  test 'can change working directory' do
647
647
  # check my real /tmp directory (for mac)
648
- cmd = %[|ruby -e 'Dir.chdir("/tmp"); puts Dir.pwd']
649
- mytmpdir = open(cmd){|io| io.read.chomp }
648
+ cmd = ['ruby', '-e', 'Dir.chdir("/tmp"); puts Dir.pwd']
649
+ mytmpdir = IO.popen(cmd){|io| io.read.chomp }
650
650
 
651
651
  m = Mutex.new
652
652
  str = nil
@@ -1,6 +1,7 @@
1
1
  require_relative 'helper'
2
2
  require 'fluent/config/dsl'
3
3
  require 'fluent/test'
4
+ require 'tempfile'
4
5
 
5
6
  class ConfigDSLTest < Test::Unit::TestCase
6
7
  # TEST_CONFIG1 = %[
@@ -107,8 +108,12 @@ match('aa')
107
108
 
108
109
  def test_with_ruby_keyword
109
110
  uname_string = `uname -a`
111
+ tmpfile = Tempfile.create('fluentd-test')
112
+ tmpfile.write(uname_string)
113
+ tmpfile.close
114
+
110
115
  root1 = Fluent::Config::DSL::Parser.parse(<<DSL)
111
- uname_str = ruby.open('|uname -a'){|out| out.read}
116
+ uname_str = ruby.open("#{tmpfile.path}"){|out| out.read}
112
117
  source {
113
118
  uname uname_str
114
119
  }
@@ -144,5 +149,7 @@ source {
144
149
  }
145
150
  DSL
146
151
  assert_raise (NoMethodError) { Fluent::Config::DSL::Parser.parse(conf3) }
152
+ ensure
153
+ File.delete(tmpfile.path)
147
154
  end
148
155
  end
@@ -353,6 +353,7 @@ class SupervisorTest < ::Test::Unit::TestCase
353
353
  event = Win32::Event.open("TestFluentdEvent")
354
354
  event.set
355
355
  event.close
356
+ sleep 1.0 # Wait for dumping
356
357
  ensure
357
358
  server.stop_windows_event_thread
358
359
  end
@@ -379,6 +380,7 @@ class SupervisorTest < ::Test::Unit::TestCase
379
380
  event = Win32::Event.open("TestFluentdEvent_USR1")
380
381
  event.set
381
382
  event.close
383
+ sleep 1.0 # Wait for dumping
382
384
  ensure
383
385
  server.stop_windows_event_thread
384
386
  end
@@ -405,7 +407,7 @@ class SupervisorTest < ::Test::Unit::TestCase
405
407
  # https://github.com/fluent/fluentd/issues/4063
406
408
  GC.start
407
409
 
408
- ENV['SIGDUMP_PATH'] = TMP_DIR + "/sigdump.log"
410
+ ENV['SIGDUMP_PATH'] = @tmp_dir + "/sigdump.log"
409
411
 
410
412
  server = DummyServer.new
411
413
  def server.config
@@ -423,7 +425,7 @@ class SupervisorTest < ::Test::Unit::TestCase
423
425
  server.stop_windows_event_thread
424
426
  end
425
427
 
426
- result_filepaths = Dir.glob("#{TMP_DIR}/*")
428
+ result_filepaths = Dir.glob("#{@tmp_dir}/*")
427
429
  assert {result_filepaths.length > 0}
428
430
  ensure
429
431
  ENV.delete('SIGDUMP_PATH')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluentd
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.16.10
4
+ version: 1.16.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sadayuki Furuhashi
@@ -213,6 +213,48 @@ dependencies:
213
213
  - - "<"
214
214
  - !ruby/object:Gem::Version
215
215
  version: '1.24'
216
+ - !ruby/object:Gem::Dependency
217
+ name: base64
218
+ requirement: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '0.2'
223
+ type: :runtime
224
+ prerelease: false
225
+ version_requirements: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '0.2'
230
+ - !ruby/object:Gem::Dependency
231
+ name: csv
232
+ requirement: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '3.2'
237
+ type: :runtime
238
+ prerelease: false
239
+ version_requirements: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - "~>"
242
+ - !ruby/object:Gem::Version
243
+ version: '3.2'
244
+ - !ruby/object:Gem::Dependency
245
+ name: drb
246
+ requirement: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - "~>"
249
+ - !ruby/object:Gem::Version
250
+ version: '2.2'
251
+ type: :runtime
252
+ prerelease: false
253
+ version_requirements: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - "~>"
256
+ - !ruby/object:Gem::Version
257
+ version: '2.2'
216
258
  - !ruby/object:Gem::Dependency
217
259
  name: logger
218
260
  requirement: !ruby/object:Gem::Requirement
@@ -983,7 +1025,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
983
1025
  - !ruby/object:Gem::Version
984
1026
  version: '0'
985
1027
  requirements: []
986
- rubygems_version: 3.6.8
1028
+ rubygems_version: 3.6.9
987
1029
  specification_version: 4
988
1030
  summary: Fluentd event collector
989
1031
  test_files: