fluentd 1.17.1 → 1.18.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -43,11 +43,16 @@ module Fluent
43
43
  @rpc_endpoint = nil
44
44
  @rpc_server = nil
45
45
  @counter = nil
46
+ @socket_manager_server = nil
47
+ @starting_new_supervisor_with_zero_downtime = false
48
+ @new_supervisor_pid = nil
49
+ start_in_parallel = ENV.key?("FLUENT_RUNNING_IN_PARALLEL_WITH_OLD")
50
+ @zero_downtime_restart_mutex = Mutex.new
46
51
 
47
52
  @fluentd_lock_dir = Dir.mktmpdir("fluentd-lock-")
48
53
  ENV['FLUENTD_LOCK_DIR'] = @fluentd_lock_dir
49
54
 
50
- if config[:rpc_endpoint]
55
+ if config[:rpc_endpoint] and not start_in_parallel
51
56
  @rpc_endpoint = config[:rpc_endpoint]
52
57
  @enable_get_dump = config[:enable_get_dump]
53
58
  run_rpc_server
@@ -59,16 +64,27 @@ module Fluent
59
64
  install_supervisor_signal_handlers
60
65
  end
61
66
 
62
- if counter = config[:counter_server]
67
+ if counter = config[:counter_server] and not start_in_parallel
63
68
  run_counter_server(counter)
64
69
  end
65
70
 
66
71
  if config[:disable_shared_socket]
67
72
  $log.info "shared socket for multiple workers is disabled"
73
+ elsif start_in_parallel
74
+ begin
75
+ raise "[BUG] SERVERENGINE_SOCKETMANAGER_PATH env var must exist when starting in parallel" unless ENV.key?('SERVERENGINE_SOCKETMANAGER_PATH')
76
+ @socket_manager_server = ServerEngine::SocketManager::Server.share_sockets_with_another_server(ENV['SERVERENGINE_SOCKETMANAGER_PATH'])
77
+ $log.info "zero-downtime-restart: took over the shared sockets", path: ENV['SERVERENGINE_SOCKETMANAGER_PATH']
78
+ rescue => e
79
+ $log.error "zero-downtime-restart: cancel sequence because failed to take over the shared sockets", error: e
80
+ raise
81
+ end
68
82
  else
69
- server = ServerEngine::SocketManager::Server.open
70
- ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = server.path.to_s
83
+ @socket_manager_server = ServerEngine::SocketManager::Server.open
84
+ ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = @socket_manager_server.path.to_s
71
85
  end
86
+
87
+ stop_parallel_old_supervisor_after_delay if start_in_parallel
72
88
  end
73
89
 
74
90
  def after_run
@@ -76,7 +92,9 @@ module Fluent
76
92
  stop_rpc_server if @rpc_endpoint
77
93
  stop_counter_server if @counter
78
94
  cleanup_lock_dir
79
- Fluent::Supervisor.cleanup_resources
95
+ Fluent::Supervisor.cleanup_socketmanager_path unless @starting_new_supervisor_with_zero_downtime
96
+ ensure
97
+ notify_new_supervisor_that_old_one_has_stopped if @starting_new_supervisor_with_zero_downtime
80
98
  end
81
99
 
82
100
  def cleanup_lock_dir
@@ -109,6 +127,13 @@ module Fluent
109
127
  end
110
128
  nil
111
129
  }
130
+ unless Fluent.windows?
131
+ @rpc_server.mount_proc('/api/processes.zeroDowntimeRestart') { |req, res|
132
+ $log.debug "fluentd RPC got /api/processes.zeroDowntimeRestart request"
133
+ Process.kill :USR2, Process.pid
134
+ nil
135
+ }
136
+ end
112
137
  @rpc_server.mount_proc('/api/plugins.flushBuffers') { |req, res|
113
138
  $log.debug "fluentd RPC got /api/plugins.flushBuffers request"
114
139
  if Fluent.windows?
@@ -137,27 +162,24 @@ module Fluent
137
162
 
138
163
  @rpc_server.mount_proc('/api/config.gracefulReload') { |req, res|
139
164
  $log.debug "fluentd RPC got /api/config.gracefulReload request"
140
- if Fluent.windows?
141
- supervisor_sigusr2_handler
142
- else
143
- Process.kill :USR2, Process.pid
144
- end
145
-
165
+ graceful_reload
146
166
  nil
147
167
  }
148
168
 
149
- @rpc_server.mount_proc('/api/config.getDump') { |req, res|
150
- $log.debug "fluentd RPC got /api/config.getDump request"
151
- $log.info "get dump in-memory config via HTTP"
152
- res.body = supervisor_get_dump_config_handler
153
- [nil, nil, res]
154
- } if @enable_get_dump
169
+ if @enable_get_dump
170
+ @rpc_server.mount_proc('/api/config.getDump') { |req, res|
171
+ $log.debug "fluentd RPC got /api/config.getDump request"
172
+ $log.info "get dump in-memory config via HTTP"
173
+ res.body = supervisor_get_dump_config_handler
174
+ [nil, nil, res]
175
+ }
176
+ end
155
177
 
156
178
  @rpc_server.start
157
179
  end
158
180
 
159
181
  def stop_rpc_server
160
- @rpc_server.shutdown
182
+ @rpc_server&.shutdown
161
183
  end
162
184
 
163
185
  def run_counter_server(counter_conf)
@@ -172,6 +194,44 @@ module Fluent
172
194
  @counter.stop
173
195
  end
174
196
 
197
+ def stop_parallel_old_supervisor_after_delay
198
+ Thread.new do
199
+ # Delay to wait the new workers to start up.
200
+ # Even if it takes a long time to start the new workers and stop the old Fluentd first,
201
+ # it is no problem because the socket buffer works, as long as the capacity is not exceeded.
202
+ sleep 10
203
+ old_pid = ENV["FLUENT_RUNNING_IN_PARALLEL_WITH_OLD"]&.to_i
204
+ if old_pid
205
+ $log.info "zero-downtime-restart: stop the old supervisor"
206
+ Process.kill :TERM, old_pid
207
+ end
208
+ rescue => e
209
+ $log.warn "zero-downtime-restart: failed to stop the old supervisor." +
210
+ " If the old one does not exist, please send SIGWINCH to this new process to start to work fully." +
211
+ " If it exists, something went wrong. Please kill the old one manually.",
212
+ error: e
213
+ end
214
+ end
215
+
216
+ def notify_new_supervisor_that_old_one_has_stopped
217
+ if config[:pid_path]
218
+ new_pid = File.read(config[:pid_path]).to_i
219
+ else
220
+ raise "[BUG] new_supervisor_pid is not saved" unless @new_supervisor_pid
221
+ new_pid = @new_supervisor_pid
222
+ end
223
+
224
+ $log.info "zero-downtime-restart: notify the new supervisor (pid: #{new_pid}) that old one has stopped"
225
+ Process.kill :WINCH, new_pid
226
+ rescue => e
227
+ $log.error(
228
+ "zero-downtime-restart: failed to notify the new supervisor." +
229
+ " Please send SIGWINCH to the new supervisor process manually" +
230
+ " if it does not start to work fully.",
231
+ error: e
232
+ )
233
+ end
234
+
175
235
  def install_supervisor_signal_handlers
176
236
  return if Fluent.windows?
177
237
 
@@ -187,7 +247,16 @@ module Fluent
187
247
 
188
248
  trap :USR2 do
189
249
  $log.debug 'fluentd supervisor process got SIGUSR2'
190
- supervisor_sigusr2_handler
250
+ if Fluent.windows?
251
+ graceful_reload
252
+ else
253
+ zero_downtime_restart
254
+ end
255
+ end
256
+
257
+ trap :WINCH do
258
+ $log.debug 'fluentd supervisor process got SIGWINCH'
259
+ cancel_source_only
191
260
  end
192
261
  end
193
262
 
@@ -254,7 +323,7 @@ module Fluent
254
323
  when :usr1
255
324
  supervisor_sigusr1_handler
256
325
  when :usr2
257
- supervisor_sigusr2_handler
326
+ graceful_reload
258
327
  when :cont
259
328
  supervisor_dump_handler_for_windows
260
329
  when :stop_event_thread
@@ -284,7 +353,7 @@ module Fluent
284
353
  send_signal_to_workers(:USR1)
285
354
  end
286
355
 
287
- def supervisor_sigusr2_handler
356
+ def graceful_reload
288
357
  conf = nil
289
358
  t = Thread.new do
290
359
  $log.info 'Reloading new config'
@@ -312,6 +381,79 @@ module Fluent
312
381
  $log.error "Failed to reload config file: #{e}"
313
382
  end
314
383
 
384
+ def zero_downtime_restart
385
+ Thread.new do
386
+ @zero_downtime_restart_mutex.synchronize do
387
+ $log.info "start zero-downtime-restart sequence"
388
+
389
+ if @starting_new_supervisor_with_zero_downtime
390
+ $log.warn "zero-downtime-restart: canceled because it is already starting"
391
+ Thread.exit
392
+ end
393
+ if ENV.key?("FLUENT_RUNNING_IN_PARALLEL_WITH_OLD")
394
+ $log.warn "zero-downtime-restart: canceled because the previous sequence is still running"
395
+ Thread.exit
396
+ end
397
+
398
+ @starting_new_supervisor_with_zero_downtime = true
399
+ commands = [ServerEngine.ruby_bin_path, $0] + ARGV
400
+ env_to_add = {
401
+ "SERVERENGINE_SOCKETMANAGER_INTERNAL_TOKEN" => ServerEngine::SocketManager::INTERNAL_TOKEN,
402
+ "FLUENT_RUNNING_IN_PARALLEL_WITH_OLD" => "#{Process.pid}",
403
+ }
404
+ pid = Process.spawn(env_to_add, commands.join(" "))
405
+ @new_supervisor_pid = pid unless config[:daemonize]
406
+
407
+ if config[:daemonize]
408
+ Thread.new(pid) do |pid|
409
+ _, status = Process.wait2(pid)
410
+ # check if `ServerEngine::Daemon#daemonize_with_double_fork` succeeded or not
411
+ unless status.success?
412
+ @starting_new_supervisor_with_zero_downtime = false
413
+ $log.error "zero-downtime-restart: failed because new supervisor exits unexpectedly"
414
+ end
415
+ end
416
+ else
417
+ Thread.new(pid) do |pid|
418
+ _, status = Process.wait2(pid)
419
+ @starting_new_supervisor_with_zero_downtime = false
420
+ $log.error "zero-downtime-restart: failed because new supervisor exits unexpectedly", status: status
421
+ end
422
+ end
423
+ end
424
+ rescue => e
425
+ $log.error "zero-downtime-restart: failed", error: e
426
+ @starting_new_supervisor_with_zero_downtime = false
427
+ end
428
+ end
429
+
430
+ def cancel_source_only
431
+ if ENV.key?("FLUENT_RUNNING_IN_PARALLEL_WITH_OLD")
432
+ if config[:rpc_endpoint]
433
+ begin
434
+ @rpc_endpoint = config[:rpc_endpoint]
435
+ @enable_get_dump = config[:enable_get_dump]
436
+ run_rpc_server
437
+ rescue => e
438
+ $log.error "failed to start RPC server", error: e
439
+ end
440
+ end
441
+
442
+ if counter = config[:counter_server]
443
+ begin
444
+ run_counter_server(counter)
445
+ rescue => e
446
+ $log.error "failed to start counter server", error: e
447
+ end
448
+ end
449
+
450
+ $log.info "zero-downtime-restart: done all sequences, now new processes start to work fully"
451
+ ENV.delete("FLUENT_RUNNING_IN_PARALLEL_WITH_OLD")
452
+ end
453
+
454
+ send_signal_to_workers(:WINCH)
455
+ end
456
+
315
457
  def supervisor_dump_handler_for_windows
316
458
  # As for UNIX-like, SIGCONT signal to each process makes the process output its dump-file,
317
459
  # and it is implemented before the implementation of the function for Windows.
@@ -409,6 +551,7 @@ module Fluent
409
551
  main_cmd = config[:main_cmd]
410
552
  env = {
411
553
  'SERVERENGINE_WORKER_ID' => @worker_id.to_i.to_s,
554
+ 'FLUENT_INSTANCE_ID' => Fluent::INSTANCE_ID,
412
555
  }
413
556
  @pm = process_manager.spawn(env, *main_cmd)
414
557
  end
@@ -440,7 +583,7 @@ module Fluent
440
583
  stop_immediately_at_unrecoverable_exit: true,
441
584
  root_dir: params['root_dir'],
442
585
  logger: $log,
443
- log: $log.out,
586
+ log: $log&.out,
444
587
  log_level: params['log_level'],
445
588
  chuser: params['chuser'],
446
589
  chgroup: params['chgroup'],
@@ -486,6 +629,7 @@ module Fluent
486
629
  suppress_repeated_stacktrace: true,
487
630
  ignore_repeated_log_interval: nil,
488
631
  without_source: nil,
632
+ with_source_only: nil,
489
633
  enable_input_metrics: nil,
490
634
  enable_size_metrics: nil,
491
635
  use_v1_config: true,
@@ -499,12 +643,11 @@ module Fluent
499
643
  }
500
644
  end
501
645
 
502
- def self.cleanup_resources
503
- unless Fluent.windows?
504
- if ENV.has_key?('SERVERENGINE_SOCKETMANAGER_PATH')
505
- FileUtils.rm_f(ENV['SERVERENGINE_SOCKETMANAGER_PATH'])
506
- end
507
- end
646
+ def self.cleanup_socketmanager_path
647
+ return if Fluent.windows?
648
+ return unless ENV.key?('SERVERENGINE_SOCKETMANAGER_PATH')
649
+
650
+ FileUtils.rm_f(ENV['SERVERENGINE_SOCKETMANAGER_PATH'])
508
651
  end
509
652
 
510
653
  def initialize(cl_opt)
@@ -518,7 +661,6 @@ module Fluent
518
661
  @inline_config = opt[:inline_config]
519
662
  @use_v1_config = opt[:use_v1_config]
520
663
  @conf_encoding = opt[:conf_encoding]
521
- @log_path = opt[:log_path]
522
664
  @show_plugin_config = opt[:show_plugin_config]
523
665
  @libs = opt[:libs]
524
666
  @plugin_dirs = opt[:plugin_dirs]
@@ -527,13 +669,15 @@ module Fluent
527
669
  @chumask = opt[:chumask]
528
670
  @signame = opt[:signame]
529
671
 
530
- # TODO: `@log_rotate_age` and `@log_rotate_size` should be removed
672
+ # TODO: `@log_path`, `@log_rotate_age` and `@log_rotate_size` should be removed
531
673
  # since it should be merged with SystemConfig in `build_system_config()`.
532
- # We should always use `system_config.log.rotate_age` and `system_config.log.rotate_size`.
674
+ # We should always use `system_config.log.path`, `system_config.log.rotate_age`
675
+ # and `system_config.log.rotate_size`.
533
676
  # However, currently, there is a bug that `system_config.log` parameters
534
677
  # are not in `Fluent::SystemConfig::SYSTEM_CONFIG_PARAMETERS`, and these
535
678
  # parameters are not merged in `build_system_config()`.
536
679
  # Until we fix the bug of `Fluent::SystemConfig`, we need to use these instance variables.
680
+ @log_path = opt[:log_path]
537
681
  @log_rotate_age = opt[:log_rotate_age]
538
682
  @log_rotate_size = opt[:log_rotate_size]
539
683
 
@@ -549,6 +693,10 @@ module Fluent
549
693
  raise Fluent::ConfigError, "invalid number of workers (must be > 0):#{@system_config.workers}"
550
694
  end
551
695
 
696
+ if Fluent.windows? && @system_config.with_source_only
697
+ raise Fluent::ConfigError, "with-source-only is not supported on Windows"
698
+ end
699
+
552
700
  root_dir = @system_config.root_dir
553
701
  if root_dir
554
702
  if File.exist?(root_dir)
@@ -567,7 +715,7 @@ module Fluent
567
715
  begin
568
716
  ServerEngine::Privilege.change(@chuser, @chgroup)
569
717
  MessagePackFactory.init(enable_time_support: @system_config.enable_msgpack_time_support)
570
- Fluent::Engine.init(@system_config, supervisor_mode: true)
718
+ Fluent::Engine.init(@system_config, supervisor_mode: true, start_in_parallel: ENV.key?("FLUENT_RUNNING_IN_PARALLEL_WITH_OLD"))
571
719
  Fluent::Engine.run_configure(@conf, dry_run: dry_run)
572
720
  rescue Fluent::ConfigError => e
573
721
  $log.error 'config error', file: @config_path, error: e
@@ -600,6 +748,10 @@ module Fluent
600
748
  raise Fluent::ConfigError, "invalid number of workers (must be 1 or unspecified) with --no-supervisor: #{@system_config.workers}"
601
749
  end
602
750
 
751
+ if Fluent.windows? && @system_config.with_source_only
752
+ raise Fluent::ConfigError, "with-source-only is not supported on Windows"
753
+ end
754
+
603
755
  install_main_process_signal_handlers
604
756
 
605
757
  # This is the only log messsage for @standalone_worker
@@ -612,10 +764,10 @@ module Fluent
612
764
  File.umask(@chumask.to_i(8))
613
765
  end
614
766
  MessagePackFactory.init(enable_time_support: @system_config.enable_msgpack_time_support)
615
- Fluent::Engine.init(@system_config)
767
+ Fluent::Engine.init(@system_config, start_in_parallel: ENV.key?("FLUENT_RUNNING_IN_PARALLEL_WITH_OLD"))
616
768
  Fluent::Engine.run_configure(@conf)
617
769
  Fluent::Engine.run
618
- self.class.cleanup_resources if @standalone_worker
770
+ self.class.cleanup_socketmanager_path if @standalone_worker
619
771
  exit 0
620
772
  end
621
773
  end
@@ -690,6 +842,7 @@ module Fluent
690
842
 
691
843
  # TODO: we should remove this logic. This merging process should be done
692
844
  # in `build_system_config()`.
845
+ @log_path ||= system_config.log.path
693
846
  @log_rotate_age ||= system_config.log.rotate_age
694
847
  @log_rotate_size ||= system_config.log.rotate_size
695
848
 
@@ -832,12 +985,20 @@ module Fluent
832
985
  end
833
986
 
834
987
  trap :USR2 do
988
+ # Leave the old GracefulReload feature, just in case.
989
+ # We can send SIGUSR2 to the worker process to use this old GracefulReload feature.
990
+ # (Note: Normally, we can send SIGUSR2 to the supervisor process to use
991
+ # zero-downtime-restart feature as GracefulReload on non-Windows.)
835
992
  reload_config
836
993
  end
837
994
 
838
995
  trap :CONT do
839
996
  dump_non_windows
840
997
  end
998
+
999
+ trap :WINCH do
1000
+ cancel_source_only
1001
+ end
841
1002
  end
842
1003
  end
843
1004
 
@@ -891,6 +1052,18 @@ module Fluent
891
1052
  end
892
1053
  end
893
1054
 
1055
+ def cancel_source_only
1056
+ Thread.new do
1057
+ begin
1058
+ $log.debug "fluentd main process get SIGWINCH"
1059
+ $log.info "try to cancel with-source-only mode"
1060
+ Fluent::Engine.cancel_source_only!
1061
+ rescue Exception => e
1062
+ $log.warn "failed to cancel source only", error: e
1063
+ end
1064
+ end
1065
+ end
1066
+
894
1067
  def reload_config
895
1068
  Thread.new do
896
1069
  $log.debug('worker got SIGUSR2')
@@ -25,10 +25,10 @@ module Fluent
25
25
  :workers, :restart_worker_interval, :root_dir, :log_level,
26
26
  :suppress_repeated_stacktrace, :emit_error_log_interval, :suppress_config_dump,
27
27
  :log_event_verbose, :ignore_repeated_log_interval, :ignore_same_log_interval,
28
- :without_source, :rpc_endpoint, :enable_get_dump, :process_name,
28
+ :without_source, :with_source_only, :rpc_endpoint, :enable_get_dump, :process_name,
29
29
  :file_permission, :dir_permission, :counter_server, :counter_client,
30
30
  :strict_config_value, :enable_msgpack_time_support, :disable_shared_socket,
31
- :metrics, :enable_input_metrics, :enable_size_metrics, :enable_jit
31
+ :metrics, :enable_input_metrics, :enable_size_metrics, :enable_jit, :source_only_buffer
32
32
  ]
33
33
 
34
34
  config_param :workers, :integer, default: 1
@@ -41,7 +41,8 @@ module Fluent
41
41
  config_param :emit_error_log_interval, :time, default: nil
42
42
  config_param :suppress_config_dump, :bool, default: nil
43
43
  config_param :log_event_verbose, :bool, default: nil
44
- config_param :without_source, :bool, default: nil
44
+ config_param :without_source, :bool, default: nil
45
+ config_param :with_source_only, :bool, default: nil
45
46
  config_param :rpc_endpoint, :string, default: nil
46
47
  config_param :enable_get_dump, :bool, default: nil
47
48
  config_param :process_name, :string, default: nil
@@ -58,6 +59,7 @@ module Fluent
58
59
  v.to_i(8)
59
60
  end
60
61
  config_section :log, required: false, init: true, multi: false do
62
+ config_param :path, :string, default: nil
61
63
  config_param :format, :enum, list: [:text, :json], default: :text
62
64
  config_param :time_format, :string, default: '%Y-%m-%d %H:%M:%S %z'
63
65
  config_param :rotate_age, default: nil do |v|
@@ -103,6 +105,16 @@ module Fluent
103
105
  config_param :labels, :hash, default: {}
104
106
  end
105
107
 
108
+ config_section :source_only_buffer, init: true, multi: false do
109
+ config_param :flush_thread_count, :integer, default: 1
110
+ config_param :overflow_action, :enum, list: [:throw_exception, :block, :drop_oldest_chunk], default: :drop_oldest_chunk
111
+ config_param :path, :string, default: nil
112
+ config_param :flush_interval, :time, default: nil
113
+ config_param :chunk_limit_size, :size, default: nil
114
+ config_param :total_limit_size, :size, default: nil
115
+ config_param :compress, :enum, list: [:text, :gzip], default: nil
116
+ end
117
+
106
118
  def self.create(conf, strict_config_value=false)
107
119
  systems = conf.elements(name: 'system')
108
120
  return SystemConfig.new if systems.empty?
@@ -16,6 +16,6 @@
16
16
 
17
17
  module Fluent
18
18
 
19
- VERSION = '1.17.1'
19
+ VERSION = '1.18.0'
20
20
 
21
21
  end
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.17.1
4
+ version: 1.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sadayuki Furuhashi
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-19 00:00:00.000000000 Z
11
+ date: 2024-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -388,20 +388,6 @@ dependencies:
388
388
  - - "<"
389
389
  - !ruby/object:Gem::Version
390
390
  version: '4'
391
- - !ruby/object:Gem::Dependency
392
- name: async
393
- requirement: !ruby/object:Gem::Requirement
394
- requirements:
395
- - - "~>"
396
- - !ruby/object:Gem::Version
397
- version: '1.23'
398
- type: :development
399
- prerelease: false
400
- version_requirements: !ruby/object:Gem::Requirement
401
- requirements:
402
- - - "~>"
403
- - !ruby/object:Gem::Version
404
- version: '1.23'
405
391
  - !ruby/object:Gem::Dependency
406
392
  name: async-http
407
393
  requirement: !ruby/object:Gem::Requirement
@@ -671,6 +657,7 @@ files:
671
657
  - lib/fluent/plugin/metrics.rb
672
658
  - lib/fluent/plugin/metrics_local.rb
673
659
  - lib/fluent/plugin/multi_output.rb
660
+ - lib/fluent/plugin/out_buffer.rb
674
661
  - lib/fluent/plugin/out_copy.rb
675
662
  - lib/fluent/plugin/out_exec.rb
676
663
  - lib/fluent/plugin/out_exec_filter.rb
@@ -752,6 +739,7 @@ files:
752
739
  - lib/fluent/registry.rb
753
740
  - lib/fluent/root_agent.rb
754
741
  - lib/fluent/rpc.rb
742
+ - lib/fluent/source_only_buffer_agent.rb
755
743
  - lib/fluent/static_config_analysis.rb
756
744
  - lib/fluent/supervisor.rb
757
745
  - lib/fluent/system_config.rb
@@ -810,7 +798,7 @@ homepage: https://www.fluentd.org/
810
798
  licenses:
811
799
  - Apache-2.0
812
800
  metadata: {}
813
- post_install_message:
801
+ post_install_message:
814
802
  rdoc_options: []
815
803
  require_paths:
816
804
  - lib
@@ -826,7 +814,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
826
814
  version: '0'
827
815
  requirements: []
828
816
  rubygems_version: 3.4.19
829
- signing_key:
817
+ signing_key:
830
818
  specification_version: 4
831
819
  summary: Fluentd event collector
832
820
  test_files: []