fluentd 1.11.5-x64-mingw32 → 1.12.0-x64-mingw32

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  3. data/.github/ISSUE_TEMPLATE/config.yml +5 -0
  4. data/.github/workflows/stale-actions.yml +22 -0
  5. data/.travis.yml +22 -2
  6. data/CHANGELOG.md +38 -0
  7. data/README.md +1 -1
  8. data/appveyor.yml +3 -0
  9. data/bin/fluent-cap-ctl +7 -0
  10. data/bin/fluent-ctl +7 -0
  11. data/fluentd.gemspec +1 -0
  12. data/lib/fluent/capability.rb +87 -0
  13. data/lib/fluent/command/cap_ctl.rb +174 -0
  14. data/lib/fluent/command/ctl.rb +177 -0
  15. data/lib/fluent/command/plugin_config_formatter.rb +2 -1
  16. data/lib/fluent/env.rb +4 -0
  17. data/lib/fluent/plugin.rb +5 -0
  18. data/lib/fluent/plugin/buffer.rb +2 -21
  19. data/lib/fluent/plugin/formatter.rb +2 -2
  20. data/lib/fluent/plugin/formatter_csv.rb +1 -1
  21. data/lib/fluent/plugin/formatter_hash.rb +1 -1
  22. data/lib/fluent/plugin/formatter_ltsv.rb +3 -3
  23. data/lib/fluent/plugin/formatter_out_file.rb +3 -3
  24. data/lib/fluent/plugin/formatter_single_value.rb +2 -2
  25. data/lib/fluent/plugin/formatter_tsv.rb +2 -2
  26. data/lib/fluent/plugin/in_http.rb +23 -2
  27. data/lib/fluent/plugin/in_tail.rb +109 -41
  28. data/lib/fluent/plugin/in_tail/position_file.rb +39 -14
  29. data/lib/fluent/plugin/in_tcp.rb +1 -0
  30. data/lib/fluent/plugin/output.rb +7 -1
  31. data/lib/fluent/plugin_helper/http_server/compat/server.rb +1 -1
  32. data/lib/fluent/plugin_helper/inject.rb +4 -2
  33. data/lib/fluent/plugin_helper/retry_state.rb +4 -0
  34. data/lib/fluent/supervisor.rb +140 -42
  35. data/lib/fluent/time.rb +1 -0
  36. data/lib/fluent/version.rb +1 -1
  37. data/lib/fluent/winsvc.rb +22 -4
  38. data/test/command/test_cap_ctl.rb +100 -0
  39. data/test/command/test_ctl.rb +57 -0
  40. data/test/command/test_plugin_config_formatter.rb +57 -2
  41. data/test/plugin/in_tail/test_position_file.rb +45 -25
  42. data/test/plugin/test_in_http.rb +25 -0
  43. data/test/plugin/test_in_tail.rb +430 -30
  44. data/test/plugin/test_parser_syslog.rb +2 -2
  45. data/test/plugin_helper/test_inject.rb +29 -0
  46. data/test/test_capability.rb +74 -0
  47. data/test/test_supervisor.rb +102 -10
  48. metadata +31 -2
@@ -38,7 +38,7 @@ class SyslogParserTest < ::Test::Unit::TestCase
38
38
  data('regexp' => 'regexp', 'string' => 'string')
39
39
  def test_parse_with_time_format2(param)
40
40
  @parser.configure('time_format' => '%Y-%m-%dT%H:%M:%SZ', 'parser_type' => param)
41
- @parser.instance.parse('2020-03-03T10:14:29Z 192.168.0.1 fluentd[11111]: [error] Syslog test') { |time, record|
41
+ @parser.instance.parse("#{Time.now.year}-03-03T10:14:29Z 192.168.0.1 fluentd[11111]: [error] Syslog test") { |time, record|
42
42
  assert_equal(event_time('Mar 03 10:14:29', format: '%b %d %H:%M:%S'), time)
43
43
  assert_equal(@expected, record)
44
44
  }
@@ -47,7 +47,7 @@ class SyslogParserTest < ::Test::Unit::TestCase
47
47
 
48
48
  def test_parse_with_time_format_rfc5424
49
49
  @parser.configure('time_format' => '%Y-%m-%dT%H:%M:%SZ', 'message_format' => 'rfc5424')
50
- @parser.instance.parse('2020-03-03T10:14:29Z 192.168.0.1 fluentd 11111 - - [error] Syslog test') { |time, record|
50
+ @parser.instance.parse("#{Time.now.year}-03-03T10:14:29Z 192.168.0.1 fluentd 11111 - - [error] Syslog test") { |time, record|
51
51
  assert_equal(event_time('Mar 03 10:14:29', format: '%b %d %H:%M:%S'), time)
52
52
  assert_equal(@expected.merge('host' => '192.168.0.1', 'msgid' => '-', 'extradata' => '-'), record)
53
53
  }
@@ -187,6 +187,35 @@ class InjectHelperTest < Test::Unit::TestCase
187
187
 
188
188
  record = {"key1" => "value1", "key2" => 2}
189
189
  assert_equal record.merge({"timedata" => unixtime_millis}), @d.inject_values_to_record('tag', time, record)
190
+ assert_equal record.merge({"timedata" => time_in_unix * 1_000}), @d.inject_values_to_record('tag', time_in_unix, record)
191
+ end
192
+
193
+ test 'injects time as unix time micros into specified key' do
194
+ time_in_unix = Time.parse("2016-06-21 08:10:11 +0900").to_i
195
+ time_subsecond = 320_101_224
196
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
197
+ unixtime_micros = 1466464211320101
198
+
199
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "unixtime_micros"))
200
+ @d.start
201
+
202
+ record = {"key1" => "value1", "key2" => 2}
203
+ assert_equal record.merge({"timedata" => unixtime_micros}), @d.inject_values_to_record('tag', time, record)
204
+ assert_equal record.merge({"timedata" => time_in_unix * 1_000_000}), @d.inject_values_to_record('tag', time_in_unix, record)
205
+ end
206
+
207
+ test 'injects time as unix time nanos into specified key' do
208
+ time_in_unix = Time.parse("2016-06-21 08:10:11 +0900").to_i
209
+ time_subsecond = 320_101_224
210
+ time = Fluent::EventTime.new(time_in_unix, time_subsecond)
211
+ unixtime_nanos = 1466464211320101224
212
+
213
+ @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "unixtime_nanos"))
214
+ @d.start
215
+
216
+ record = {"key1" => "value1", "key2" => 2}
217
+ assert_equal record.merge({"timedata" => unixtime_nanos}), @d.inject_values_to_record('tag', time, record)
218
+ assert_equal record.merge({"timedata" => time_in_unix * 1_000_000_000}), @d.inject_values_to_record('tag', time_in_unix, record)
190
219
  end
191
220
 
192
221
  test 'injects time as unix time into specified key' do
@@ -0,0 +1,74 @@
1
+ require_relative 'helper'
2
+ require 'fluent/test'
3
+ require 'fluent/capability'
4
+
5
+ class FluentCapabilityTest < ::Test::Unit::TestCase
6
+ setup do
7
+ @capability = Fluent::Capability.new(:current_process)
8
+ omit "Fluent::Capability class is not usable on this environment" unless @capability.usable?
9
+ end
10
+
11
+ sub_test_case "check capability" do
12
+ test "effective" do
13
+ @capability.clear(:both)
14
+ assert_true @capability.update(:add, :effective, :dac_read_search)
15
+ assert_equal CapNG::Result::PARTIAL, @capability.have_capabilities?(:caps)
16
+ assert_nothing_raised do
17
+ @capability.apply(:caps)
18
+ end
19
+ assert_equal CapNG::Result::NONE, @capability.have_capabilities?(:bounds)
20
+ assert_true @capability.have_capability?(:effective, :dac_read_search)
21
+ assert_false @capability.have_capability?(:inheritable, :dac_read_search)
22
+ assert_false @capability.have_capability?(:permitted, :dac_read_search)
23
+ end
24
+
25
+ test "inheritable" do
26
+ @capability.clear(:both)
27
+ capabilities = [:chown, :dac_override]
28
+ assert_equal [true, true], @capability.update(:add, :inheritable, capabilities)
29
+ assert_equal CapNG::Result::NONE, @capability.have_capabilities?(:caps)
30
+ assert_nothing_raised do
31
+ @capability.apply(:caps)
32
+ end
33
+ assert_equal CapNG::Result::NONE, @capability.have_capabilities?(:bounds)
34
+ capabilities.each do |capability|
35
+ assert_false @capability.have_capability?(:effective, capability)
36
+ assert_true @capability.have_capability?(:inheritable, capability)
37
+ assert_false @capability.have_capability?(:permitted, capability)
38
+ end
39
+ end
40
+
41
+ test "permitted" do
42
+ @capability.clear(:both)
43
+ capabilities = [:fowner, :fsetid, :kill]
44
+ assert_equal [true, true, true], @capability.update(:add, :permitted, capabilities)
45
+ assert_equal CapNG::Result::NONE, @capability.have_capabilities?(:caps)
46
+ assert_nothing_raised do
47
+ @capability.apply(:caps)
48
+ end
49
+ assert_equal CapNG::Result::NONE, @capability.have_capabilities?(:bounds)
50
+ capabilities.each do |capability|
51
+ assert_false @capability.have_capability?(:effective, capability)
52
+ assert_false @capability.have_capability?(:inheritable, capability)
53
+ assert_true @capability.have_capability?(:permitted, capability)
54
+ end
55
+ end
56
+
57
+ test "effective/inheritable/permitted" do
58
+ @capability.clear(:both)
59
+ capabilities = [:setpcap, :net_admin, :net_raw, :sys_boot, :sys_time]
60
+ update_type = CapNG::Type::EFFECTIVE | CapNG::Type::INHERITABLE | CapNG::Type::PERMITTED
61
+ assert_equal [true, true, true, true, true], @capability.update(:add, update_type, capabilities)
62
+ assert_equal CapNG::Result::PARTIAL, @capability.have_capabilities?(:caps)
63
+ assert_nothing_raised do
64
+ @capability.apply(:caps)
65
+ end
66
+ assert_equal CapNG::Result::NONE, @capability.have_capabilities?(:bounds)
67
+ capabilities.each do |capability|
68
+ assert_true @capability.have_capability?(:effective, capability)
69
+ assert_true @capability.have_capability?(:inheritable, capability)
70
+ assert_true @capability.have_capability?(:permitted, capability)
71
+ end
72
+ end
73
+ end
74
+ end
@@ -111,6 +111,32 @@ class SupervisorTest < ::Test::Unit::TestCase
111
111
  $log.out.reset if $log && $log.out && $log.out.respond_to?(:reset)
112
112
  end
113
113
 
114
+ def test_main_process_command_handlers
115
+ omit "Only for Windows, alternative to UNIX signals" unless Fluent.windows?
116
+
117
+ create_info_dummy_logger
118
+
119
+ opts = Fluent::Supervisor.default_options
120
+ sv = Fluent::Supervisor.new(opts)
121
+ r, w = IO.pipe
122
+ $stdin = r
123
+ sv.send(:install_main_process_signal_handlers)
124
+
125
+ begin
126
+ w.write("GRACEFUL_RESTART\n")
127
+ w.flush
128
+ ensure
129
+ $stdin = STDIN
130
+ end
131
+
132
+ sleep 1
133
+
134
+ info_msg = '[info]: force flushing buffered events' + "\n"
135
+ assert{ $log.out.logs.first.end_with?(info_msg) }
136
+ ensure
137
+ $log.out.reset if $log && $log.out && $log.out.respond_to?(:reset)
138
+ end
139
+
114
140
  def test_supervisor_signal_handler
115
141
  omit "Windows cannot handle signals" if Fluent.windows?
116
142
 
@@ -137,21 +163,53 @@ class SupervisorTest < ::Test::Unit::TestCase
137
163
 
138
164
  server = DummyServer.new
139
165
  def server.config
140
- {:signame => "TestFluentdEvent", :worker_pid => {0 => 1234}}
166
+ {:signame => "TestFluentdEvent"}
141
167
  end
142
168
 
143
169
  mock(server).stop(true)
144
170
  stub(Process).kill.times(0)
145
171
 
146
- server.before_run
147
172
  server.install_windows_event_handler
148
- sleep 0.1 # Wait for starting windows event thread
149
- event = Win32::Event.open("TestFluentdEvent")
150
- event.set
151
- event.close
152
- # Wait for stopping windows event thread. Should larger than 1 sec
153
- # because the thread is awaked every 1 sec.
154
- sleep 1.1
173
+ begin
174
+ sleep 0.1 # Wait for starting windows event thread
175
+ event = Win32::Event.open("TestFluentdEvent")
176
+ event.set
177
+ event.close
178
+ ensure
179
+ server.stop_windows_event_thread
180
+ end
181
+
182
+ debug_msg = '[debug]: Got Win32 event "TestFluentdEvent"'
183
+ logs = $log.out.logs
184
+ assert{ logs.any?{|log| log.include?(debug_msg) } }
185
+ ensure
186
+ $log.out.reset if $log && $log.out && $log.out.respond_to?(:reset)
187
+ end
188
+
189
+ def test_supervisor_event_handler
190
+ omit "Only for Windows, alternative to UNIX signals" unless Fluent.windows?
191
+
192
+ create_debug_dummy_logger
193
+
194
+ server = DummyServer.new
195
+ def server.config
196
+ {:signame => "TestFluentdEvent"}
197
+ end
198
+ server.install_windows_event_handler
199
+ begin
200
+ sleep 0.1 # Wait for starting windows event thread
201
+ event = Win32::Event.open("TestFluentdEvent_USR1")
202
+ event.set
203
+ event.close
204
+ ensure
205
+ server.stop_windows_event_thread
206
+ end
207
+
208
+ debug_msg = '[debug]: Got Win32 event "TestFluentdEvent_USR1"'
209
+ logs = $log.out.logs
210
+ assert{ logs.any?{|log| log.include?(debug_msg) } }
211
+ ensure
212
+ $log.out.reset if $log && $log.out && $log.out.respond_to?(:reset)
155
213
  end
156
214
 
157
215
  def test_rpc_server
@@ -176,7 +234,7 @@ class SupervisorTest < ::Test::Unit::TestCase
176
234
  server.run_rpc_server
177
235
 
178
236
  sv.send(:install_main_process_signal_handlers)
179
- Net::HTTP.get URI.parse('http://0.0.0.0:24447/api/plugins.flushBuffers')
237
+ response = Net::HTTP.get(URI.parse('http://127.0.0.1:24447/api/plugins.flushBuffers'))
180
238
  info_msg = '[info]: force flushing buffered events' + "\n"
181
239
 
182
240
  server.stop_rpc_server
@@ -185,11 +243,45 @@ class SupervisorTest < ::Test::Unit::TestCase
185
243
  # This test will be passed in such environment.
186
244
  pend unless $log.out.logs.first
187
245
 
246
+ assert_equal('{"ok":true}', response)
188
247
  assert{ $log.out.logs.first.end_with?(info_msg) }
189
248
  ensure
190
249
  $log.out.reset if $log.out.is_a?(Fluent::Test::DummyLogDevice)
191
250
  end
192
251
 
252
+ def test_rpc_server_windows
253
+ omit "Only for windows platform" unless Fluent.windows?
254
+
255
+ create_info_dummy_logger
256
+
257
+ opts = Fluent::Supervisor.default_options
258
+ sv = Fluent::Supervisor.new(opts)
259
+ conf_data = <<-EOC
260
+ <system>
261
+ rpc_endpoint 0.0.0.0:24447
262
+ </system>
263
+ EOC
264
+ conf = Fluent::Config.parse(conf_data, "(test)", "(test_dir)", true)
265
+ sys_conf = sv.__send__(:build_system_config, conf)
266
+
267
+ server = DummyServer.new
268
+ def server.config
269
+ {
270
+ :signame => "TestFluentdEvent",
271
+ :worker_pid => 5963,
272
+ }
273
+ end
274
+ server.rpc_endpoint = sys_conf.rpc_endpoint
275
+
276
+ server.run_rpc_server
277
+
278
+ mock(server).restart(true) { nil }
279
+ response = Net::HTTP.get(URI.parse('http://127.0.0.1:24447/api/plugins.flushBuffers'))
280
+
281
+ server.stop_rpc_server
282
+ assert_equal('{"ok":true}', response)
283
+ end
284
+
193
285
  def test_load_config
194
286
  tmp_dir = "#{TMP_DIR}/dir/test_load_config.conf"
195
287
  conf_info_str = %[
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluentd
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.5
4
+ version: 1.12.0
5
5
  platform: x64-mingw32
6
6
  authors:
7
7
  - Sadayuki Furuhashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-06 00:00:00.000000000 Z
11
+ date: 2021-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: msgpack
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -415,7 +429,9 @@ email:
415
429
  executables:
416
430
  - fluent-binlog-reader
417
431
  - fluent-ca-generate
432
+ - fluent-cap-ctl
418
433
  - fluent-cat
434
+ - fluent-ctl
419
435
  - fluent-debug
420
436
  - fluent-gem
421
437
  - fluent-plugin-config-format
@@ -427,9 +443,11 @@ files:
427
443
  - ".drone.yml"
428
444
  - ".github/ISSUE_TEMPLATE.md"
429
445
  - ".github/ISSUE_TEMPLATE/bug_report.md"
446
+ - ".github/ISSUE_TEMPLATE/config.yml"
430
447
  - ".github/ISSUE_TEMPLATE/feature_request.md"
431
448
  - ".github/PULL_REQUEST_TEMPLATE.md"
432
449
  - ".github/workflows/issue-auto-closer.yml"
450
+ - ".github/workflows/stale-actions.yml"
433
451
  - ".gitignore"
434
452
  - ".gitlab-ci.yml"
435
453
  - ".travis.yml"
@@ -447,7 +465,9 @@ files:
447
465
  - appveyor.yml
448
466
  - bin/fluent-binlog-reader
449
467
  - bin/fluent-ca-generate
468
+ - bin/fluent-cap-ctl
450
469
  - bin/fluent-cat
470
+ - bin/fluent-ctl
451
471
  - bin/fluent-debug
452
472
  - bin/fluent-gem
453
473
  - bin/fluent-plugin-config-format
@@ -495,11 +515,14 @@ files:
495
515
  - fluent.conf
496
516
  - fluentd.gemspec
497
517
  - lib/fluent/agent.rb
518
+ - lib/fluent/capability.rb
498
519
  - lib/fluent/clock.rb
499
520
  - lib/fluent/command/binlog_reader.rb
500
521
  - lib/fluent/command/bundler_injection.rb
501
522
  - lib/fluent/command/ca_generate.rb
523
+ - lib/fluent/command/cap_ctl.rb
502
524
  - lib/fluent/command/cat.rb
525
+ - lib/fluent/command/ctl.rb
503
526
  - lib/fluent/command/debug.rb
504
527
  - lib/fluent/command/fluentd.rb
505
528
  - lib/fluent/command/plugin_config_formatter.rb
@@ -745,6 +768,8 @@ files:
745
768
  - templates/plugin_config_formatter/section.md.erb
746
769
  - test/command/test_binlog_reader.rb
747
770
  - test/command/test_ca_generate.rb
771
+ - test/command/test_cap_ctl.rb
772
+ - test/command/test_ctl.rb
748
773
  - test/command/test_fluentd.rb
749
774
  - test/command/test_plugin_config_formatter.rb
750
775
  - test/command/test_plugin_generator.rb
@@ -921,6 +946,7 @@ files:
921
946
  - test/scripts/fluent/plugin/out_test.rb
922
947
  - test/scripts/fluent/plugin/out_test2.rb
923
948
  - test/scripts/fluent/plugin/parser_known.rb
949
+ - test/test_capability.rb
924
950
  - test/test_clock.rb
925
951
  - test/test_config.rb
926
952
  - test/test_configdsl.rb
@@ -979,6 +1005,8 @@ summary: Fluentd event collector
979
1005
  test_files:
980
1006
  - test/command/test_binlog_reader.rb
981
1007
  - test/command/test_ca_generate.rb
1008
+ - test/command/test_cap_ctl.rb
1009
+ - test/command/test_ctl.rb
982
1010
  - test/command/test_fluentd.rb
983
1011
  - test/command/test_plugin_config_formatter.rb
984
1012
  - test/command/test_plugin_generator.rb
@@ -1155,6 +1183,7 @@ test_files:
1155
1183
  - test/scripts/fluent/plugin/out_test.rb
1156
1184
  - test/scripts/fluent/plugin/out_test2.rb
1157
1185
  - test/scripts/fluent/plugin/parser_known.rb
1186
+ - test/test_capability.rb
1158
1187
  - test/test_clock.rb
1159
1188
  - test/test_config.rb
1160
1189
  - test/test_configdsl.rb