fluentd 1.13.3 → 1.16.5

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.
Files changed (179) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/{bug_report.yaml → bug_report.yml} +2 -0
  3. data/.github/ISSUE_TEMPLATE/config.yml +2 -2
  4. data/.github/ISSUE_TEMPLATE/{feature_request.yaml → feature_request.yml} +1 -0
  5. data/.github/workflows/stale-actions.yml +11 -9
  6. data/.github/workflows/test.yml +32 -0
  7. data/CHANGELOG.md +490 -10
  8. data/CONTRIBUTING.md +2 -2
  9. data/MAINTAINERS.md +7 -5
  10. data/README.md +3 -23
  11. data/Rakefile +1 -1
  12. data/SECURITY.md +14 -0
  13. data/fluentd.gemspec +7 -8
  14. data/lib/fluent/command/cat.rb +13 -3
  15. data/lib/fluent/command/ctl.rb +6 -3
  16. data/lib/fluent/command/fluentd.rb +73 -65
  17. data/lib/fluent/command/plugin_config_formatter.rb +1 -1
  18. data/lib/fluent/compat/output.rb +9 -6
  19. data/lib/fluent/config/dsl.rb +1 -1
  20. data/lib/fluent/config/error.rb +12 -0
  21. data/lib/fluent/config/literal_parser.rb +2 -2
  22. data/lib/fluent/config/parser.rb +1 -1
  23. data/lib/fluent/config/v1_parser.rb +3 -3
  24. data/lib/fluent/config/yaml_parser/fluent_value.rb +47 -0
  25. data/lib/fluent/config/yaml_parser/loader.rb +108 -0
  26. data/lib/fluent/config/yaml_parser/parser.rb +166 -0
  27. data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
  28. data/lib/fluent/config/yaml_parser.rb +56 -0
  29. data/lib/fluent/config.rb +14 -1
  30. data/lib/fluent/counter/server.rb +1 -1
  31. data/lib/fluent/counter/validator.rb +3 -3
  32. data/lib/fluent/daemon.rb +2 -4
  33. data/lib/fluent/engine.rb +1 -1
  34. data/lib/fluent/env.rb +4 -0
  35. data/lib/fluent/error.rb +3 -0
  36. data/lib/fluent/event.rb +8 -4
  37. data/lib/fluent/event_router.rb +47 -2
  38. data/lib/fluent/file_wrapper.rb +137 -0
  39. data/lib/fluent/log/console_adapter.rb +66 -0
  40. data/lib/fluent/log.rb +44 -5
  41. data/lib/fluent/match.rb +1 -1
  42. data/lib/fluent/msgpack_factory.rb +6 -1
  43. data/lib/fluent/oj_options.rb +1 -2
  44. data/lib/fluent/plugin/bare_output.rb +49 -8
  45. data/lib/fluent/plugin/base.rb +26 -9
  46. data/lib/fluent/plugin/buf_file.rb +34 -5
  47. data/lib/fluent/plugin/buf_file_single.rb +32 -3
  48. data/lib/fluent/plugin/buffer/file_chunk.rb +1 -1
  49. data/lib/fluent/plugin/buffer.rb +216 -70
  50. data/lib/fluent/plugin/filter.rb +35 -1
  51. data/lib/fluent/plugin/filter_record_transformer.rb +1 -1
  52. data/lib/fluent/plugin/in_forward.rb +2 -2
  53. data/lib/fluent/plugin/in_http.rb +39 -10
  54. data/lib/fluent/plugin/in_monitor_agent.rb +4 -2
  55. data/lib/fluent/plugin/in_sample.rb +1 -1
  56. data/lib/fluent/plugin/in_syslog.rb +13 -1
  57. data/lib/fluent/plugin/in_tail/group_watch.rb +204 -0
  58. data/lib/fluent/plugin/in_tail/position_file.rb +33 -33
  59. data/lib/fluent/plugin/in_tail.rb +216 -84
  60. data/lib/fluent/plugin/in_tcp.rb +47 -2
  61. data/lib/fluent/plugin/input.rb +39 -1
  62. data/lib/fluent/plugin/metrics.rb +119 -0
  63. data/lib/fluent/plugin/metrics_local.rb +96 -0
  64. data/lib/fluent/plugin/multi_output.rb +43 -6
  65. data/lib/fluent/plugin/out_copy.rb +1 -1
  66. data/lib/fluent/plugin/out_exec_filter.rb +2 -2
  67. data/lib/fluent/plugin/out_file.rb +20 -2
  68. data/lib/fluent/plugin/out_forward/ack_handler.rb +19 -4
  69. data/lib/fluent/plugin/out_forward/socket_cache.rb +2 -0
  70. data/lib/fluent/plugin/out_forward.rb +17 -9
  71. data/lib/fluent/plugin/out_secondary_file.rb +39 -22
  72. data/lib/fluent/plugin/output.rb +167 -78
  73. data/lib/fluent/plugin/parser.rb +3 -4
  74. data/lib/fluent/plugin/parser_apache2.rb +1 -1
  75. data/lib/fluent/plugin/parser_json.rb +1 -1
  76. data/lib/fluent/plugin/parser_syslog.rb +1 -1
  77. data/lib/fluent/plugin/storage_local.rb +3 -5
  78. data/lib/fluent/plugin.rb +10 -1
  79. data/lib/fluent/plugin_helper/child_process.rb +3 -0
  80. data/lib/fluent/plugin_helper/event_emitter.rb +8 -1
  81. data/lib/fluent/plugin_helper/event_loop.rb +2 -2
  82. data/lib/fluent/plugin_helper/http_server/server.rb +2 -1
  83. data/lib/fluent/plugin_helper/metrics.rb +129 -0
  84. data/lib/fluent/plugin_helper/record_accessor.rb +1 -1
  85. data/lib/fluent/plugin_helper/retry_state.rb +14 -4
  86. data/lib/fluent/plugin_helper/server.rb +35 -6
  87. data/lib/fluent/plugin_helper/service_discovery.rb +2 -2
  88. data/lib/fluent/plugin_helper/socket.rb +13 -2
  89. data/lib/fluent/plugin_helper/thread.rb +3 -3
  90. data/lib/fluent/plugin_helper.rb +1 -0
  91. data/lib/fluent/plugin_id.rb +3 -2
  92. data/lib/fluent/registry.rb +2 -1
  93. data/lib/fluent/root_agent.rb +6 -0
  94. data/lib/fluent/rpc.rb +4 -3
  95. data/lib/fluent/supervisor.rb +283 -259
  96. data/lib/fluent/system_config.rb +13 -3
  97. data/lib/fluent/test/driver/base.rb +11 -5
  98. data/lib/fluent/test/driver/filter.rb +4 -0
  99. data/lib/fluent/test/startup_shutdown.rb +6 -8
  100. data/lib/fluent/time.rb +21 -20
  101. data/lib/fluent/version.rb +1 -1
  102. data/lib/fluent/win32api.rb +38 -0
  103. data/lib/fluent/winsvc.rb +5 -8
  104. data/templates/new_gem/test/helper.rb.erb +0 -1
  105. data/test/command/test_cat.rb +31 -2
  106. data/test/command/test_ctl.rb +1 -2
  107. data/test/command/test_fluentd.rb +209 -24
  108. data/test/command/test_plugin_config_formatter.rb +0 -1
  109. data/test/compat/test_parser.rb +6 -6
  110. data/test/config/test_system_config.rb +13 -11
  111. data/test/config/test_types.rb +1 -1
  112. data/test/log/test_console_adapter.rb +110 -0
  113. data/test/plugin/in_tail/test_io_handler.rb +26 -8
  114. data/test/plugin/in_tail/test_position_file.rb +48 -59
  115. data/test/plugin/out_forward/test_ack_handler.rb +39 -0
  116. data/test/plugin/out_forward/test_socket_cache.rb +26 -1
  117. data/test/plugin/test_bare_output.rb +14 -1
  118. data/test/plugin/test_base.rb +133 -1
  119. data/test/plugin/test_buf_file.rb +62 -23
  120. data/test/plugin/test_buf_file_single.rb +65 -0
  121. data/test/plugin/test_buffer.rb +267 -3
  122. data/test/plugin/test_buffer_chunk.rb +11 -0
  123. data/test/plugin/test_filter.rb +12 -1
  124. data/test/plugin/test_filter_parser.rb +1 -1
  125. data/test/plugin/test_filter_stdout.rb +2 -2
  126. data/test/plugin/test_in_forward.rb +9 -11
  127. data/test/plugin/test_in_http.rb +65 -3
  128. data/test/plugin/test_in_monitor_agent.rb +216 -11
  129. data/test/plugin/test_in_object_space.rb +9 -3
  130. data/test/plugin/test_in_syslog.rb +35 -0
  131. data/test/plugin/test_in_tail.rb +1393 -385
  132. data/test/plugin/test_in_tcp.rb +87 -2
  133. data/test/plugin/test_in_udp.rb +28 -0
  134. data/test/plugin/test_in_unix.rb +2 -2
  135. data/test/plugin/test_input.rb +12 -1
  136. data/test/plugin/test_metrics.rb +294 -0
  137. data/test/plugin/test_metrics_local.rb +96 -0
  138. data/test/plugin/test_multi_output.rb +25 -1
  139. data/test/plugin/test_out_exec.rb +6 -4
  140. data/test/plugin/test_out_exec_filter.rb +6 -2
  141. data/test/plugin/test_out_file.rb +34 -17
  142. data/test/plugin/test_out_forward.rb +78 -77
  143. data/test/plugin/test_out_http.rb +1 -0
  144. data/test/plugin/test_out_stdout.rb +2 -2
  145. data/test/plugin/test_output.rb +297 -12
  146. data/test/plugin/test_output_as_buffered.rb +44 -44
  147. data/test/plugin/test_output_as_buffered_compress.rb +32 -18
  148. data/test/plugin/test_output_as_buffered_retries.rb +54 -7
  149. data/test/plugin/test_output_as_buffered_secondary.rb +4 -4
  150. data/test/plugin/test_parser_regexp.rb +1 -6
  151. data/test/plugin/test_parser_syslog.rb +1 -1
  152. data/test/plugin_helper/test_cert_option.rb +1 -1
  153. data/test/plugin_helper/test_child_process.rb +38 -16
  154. data/test/plugin_helper/test_event_emitter.rb +29 -0
  155. data/test/plugin_helper/test_http_server_helper.rb +1 -1
  156. data/test/plugin_helper/test_metrics.rb +137 -0
  157. data/test/plugin_helper/test_retry_state.rb +602 -38
  158. data/test/plugin_helper/test_server.rb +78 -6
  159. data/test/plugin_helper/test_timer.rb +2 -2
  160. data/test/test_config.rb +191 -24
  161. data/test/test_event_router.rb +17 -0
  162. data/test/test_file_wrapper.rb +53 -0
  163. data/test/test_formatter.rb +24 -21
  164. data/test/test_log.rb +122 -40
  165. data/test/test_msgpack_factory.rb +32 -0
  166. data/test/test_plugin_classes.rb +102 -0
  167. data/test/test_root_agent.rb +30 -1
  168. data/test/test_supervisor.rb +477 -257
  169. data/test/test_time_parser.rb +22 -0
  170. metadata +55 -34
  171. data/.drone.yml +0 -35
  172. data/.github/workflows/issue-auto-closer.yml +0 -12
  173. data/.github/workflows/linux-test.yaml +0 -36
  174. data/.github/workflows/macos-test.yaml +0 -30
  175. data/.github/workflows/windows-test.yaml +0 -46
  176. data/.gitlab-ci.yml +0 -103
  177. data/lib/fluent/plugin/file_wrapper.rb +0 -187
  178. data/test/plugin/test_file_wrapper.rb +0 -126
  179. data/test/test_logger_initializer.rb +0 -46
@@ -22,15 +22,17 @@ module Fluent
22
22
  include Configurable
23
23
 
24
24
  SYSTEM_CONFIG_PARAMETERS = [
25
- :workers, :root_dir, :log_level,
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
28
  :without_source, :rpc_endpoint, :enable_get_dump, :process_name,
29
29
  :file_permission, :dir_permission, :counter_server, :counter_client,
30
- :strict_config_value, :enable_msgpack_time_support, :disable_shared_socket
30
+ :strict_config_value, :enable_msgpack_time_support, :disable_shared_socket,
31
+ :metrics, :enable_input_metrics, :enable_size_metrics, :enable_jit
31
32
  ]
32
33
 
33
34
  config_param :workers, :integer, default: 1
35
+ config_param :restart_worker_interval, :time, default: 0
34
36
  config_param :root_dir, :string, default: nil
35
37
  config_param :log_level, :enum, list: [:trace, :debug, :info, :warn, :error, :fatal], default: 'info'
36
38
  config_param :suppress_repeated_stacktrace, :bool, default: nil
@@ -46,6 +48,9 @@ module Fluent
46
48
  config_param :strict_config_value, :bool, default: nil
47
49
  config_param :enable_msgpack_time_support, :bool, default: nil
48
50
  config_param :disable_shared_socket, :bool, default: nil
51
+ config_param :enable_input_metrics, :bool, default: nil
52
+ config_param :enable_size_metrics, :bool, default: nil
53
+ config_param :enable_jit, :bool, default: false
49
54
  config_param :file_permission, default: nil do |v|
50
55
  v.to_i(8)
51
56
  end
@@ -57,7 +62,7 @@ module Fluent
57
62
  config_param :time_format, :string, default: '%Y-%m-%d %H:%M:%S %z'
58
63
  config_param :rotate_age, default: nil do |v|
59
64
  if Fluent::Log::LOG_ROTATE_AGE.include?(v)
60
- v.to_sym
65
+ v
61
66
  else
62
67
  begin
63
68
  Integer(v)
@@ -93,6 +98,11 @@ module Fluent
93
98
  config_param :timeout, :time, default: nil
94
99
  end
95
100
 
101
+ config_section :metrics, multi: false do
102
+ config_param :@type, :string, default: "local"
103
+ config_param :labels, :hash, default: {}
104
+ end
105
+
96
106
  def self.create(conf, strict_config_value=false)
97
107
  systems = conf.elements(name: 'system')
98
108
  return SystemConfig.new if systems.empty?
@@ -16,6 +16,7 @@
16
16
 
17
17
  require 'fluent/config'
18
18
  require 'fluent/config/element'
19
+ require 'fluent/env'
19
20
  require 'fluent/log'
20
21
  require 'fluent/clock'
21
22
 
@@ -102,11 +103,16 @@ module Fluent
102
103
 
103
104
  def instance_start
104
105
  if @instance.respond_to?(:server_wait_until_start)
105
- @socket_manager_path = ServerEngine::SocketManager::Server.generate_path
106
- if @socket_manager_path.is_a?(String) && File.exist?(@socket_manager_path)
107
- FileUtils.rm_f @socket_manager_path
106
+ if Fluent.windows?
107
+ @socket_manager_server = ServerEngine::SocketManager::Server.open
108
+ @socket_manager_path = @socket_manager_server.path
109
+ else
110
+ @socket_manager_path = ServerEngine::SocketManager::Server.generate_path
111
+ if @socket_manager_path.is_a?(String) && File.exist?(@socket_manager_path)
112
+ FileUtils.rm_f @socket_manager_path
113
+ end
114
+ @socket_manager_server = ServerEngine::SocketManager::Server.open(@socket_manager_path)
108
115
  end
109
- @socket_manager_server = ServerEngine::SocketManager::Server.open(@socket_manager_path)
110
116
  ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = @socket_manager_path.to_s
111
117
  end
112
118
 
@@ -173,7 +179,7 @@ module Fluent
173
179
 
174
180
  if @socket_manager_server
175
181
  @socket_manager_server.close
176
- if @socket_manager_server.is_a?(String) && File.exist?(@socket_manager_path)
182
+ if @socket_manager_path.is_a?(String) && File.exist?(@socket_manager_path)
177
183
  FileUtils.rm_f @socket_manager_path
178
184
  end
179
185
  end
@@ -37,6 +37,10 @@ module Fluent
37
37
  @filtered.map {|_time, record| record }
38
38
  end
39
39
 
40
+ def filtered_time
41
+ @filtered.map {|time, _record| time }
42
+ end
43
+
40
44
  def instance_hook_after_started
41
45
  super
42
46
  filter_hook = ->(time, record) { @filtered << [time, record] }
@@ -21,9 +21,8 @@ module Fluent
21
21
  module Test
22
22
  module StartupShutdown
23
23
  def startup
24
- socket_manager_path = ServerEngine::SocketManager::Server.generate_path
25
- @server = ServerEngine::SocketManager::Server.open(socket_manager_path)
26
- ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = socket_manager_path.to_s
24
+ @server = ServerEngine::SocketManager::Server.open
25
+ ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = @server.path.to_s
27
26
  end
28
27
 
29
28
  def shutdown
@@ -31,15 +30,14 @@ module Fluent
31
30
  end
32
31
 
33
32
  def self.setup
34
- @socket_manager_path = ServerEngine::SocketManager::Server.generate_path
35
- @server = ServerEngine::SocketManager::Server.open(@socket_manager_path)
36
- ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = @socket_manager_path.to_s
33
+ @server = ServerEngine::SocketManager::Server.open
34
+ ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = @server.path.to_s
37
35
  end
38
36
 
39
37
  def self.teardown
40
38
  @server.close
41
- # on Windows, socket_manager_path is a TCP port number
42
- FileUtils.rm_f @socket_manager_path unless Fluent.windows?
39
+ # on Windows, the path is a TCP port number
40
+ FileUtils.rm_f @server.path unless Fluent.windows?
43
41
  end
44
42
  end
45
43
  end
data/lib/fluent/time.rb CHANGED
@@ -226,19 +226,16 @@ module Fluent
226
226
 
227
227
  format_with_timezone = format && (format.include?("%z") || format.include?("%Z"))
228
228
 
229
- # unixtime_in_expected_tz = unixtime_in_localtime + offset_diff
230
- offset_diff = case
231
- when format_with_timezone then nil
232
- when timezone then
233
- offset = Fluent::Timezone.utc_offset(timezone)
234
- if offset.respond_to?(:call)
235
- ->(t) { Time.now.localtime.utc_offset - offset.call(t) }
236
- else
237
- Time.now.localtime.utc_offset - offset
238
- end
239
- when localtime then 0
240
- else Time.now.localtime.utc_offset # utc
241
- end
229
+ utc_offset = case
230
+ when format_with_timezone then
231
+ nil
232
+ when timezone then
233
+ Fluent::Timezone.utc_offset(timezone)
234
+ when localtime then
235
+ nil
236
+ else
237
+ 0 # utc
238
+ end
242
239
 
243
240
  strptime = format && (Strptime.new(format) rescue nil)
244
241
 
@@ -247,16 +244,20 @@ module Fluent
247
244
  when format_with_timezone then ->(v){ Fluent::EventTime.from_time(Time.strptime(v, format)) }
248
245
  when format == '%iso8601' then ->(v){ Fluent::EventTime.from_time(Time.iso8601(v)) }
249
246
  when strptime then
250
- if offset_diff.respond_to?(:call)
251
- ->(v) { t = strptime.exec(v); Fluent::EventTime.new(t.to_i + offset_diff.call(t), t.nsec) }
247
+ if utc_offset.nil?
248
+ ->(v){ t = strptime.exec(v); Fluent::EventTime.new(t.to_i, t.nsec) }
249
+ elsif utc_offset.respond_to?(:call)
250
+ ->(v) { t = strptime.exec(v); Fluent::EventTime.new(t.to_i + t.utc_offset - utc_offset.call(t), t.nsec) }
252
251
  else
253
- ->(v) { t = strptime.exec(v); Fluent::EventTime.new(t.to_i + offset_diff, t.nsec) }
252
+ ->(v) { t = strptime.exec(v); Fluent::EventTime.new(t.to_i + t.utc_offset - utc_offset, t.nsec) }
254
253
  end
255
- when format then
256
- if offset_diff.respond_to?(:call)
257
- ->(v){ t = Time.strptime(v, format); Fluent::EventTime.new(t.to_i + offset_diff.call(t), t.nsec) }
254
+ when format then
255
+ if utc_offset.nil?
256
+ ->(v){ t = Time.strptime(v, format); Fluent::EventTime.new(t.to_i, t.nsec) }
257
+ elsif utc_offset.respond_to?(:call)
258
+ ->(v){ t = Time.strptime(v, format); Fluent::EventTime.new(t.to_i + t.utc_offset - utc_offset.call(t), t.nsec) }
258
259
  else
259
- ->(v){ t = Time.strptime(v, format); Fluent::EventTime.new(t.to_i + offset_diff, t.nsec) }
260
+ ->(v){ t = Time.strptime(v, format); Fluent::EventTime.new(t.to_i + t.utc_offset - utc_offset, t.nsec) }
260
261
  end
261
262
  else ->(v){ Fluent::EventTime.parse(v) }
262
263
  end
@@ -16,6 +16,6 @@
16
16
 
17
17
  module Fluent
18
18
 
19
- VERSION = '1.13.3'
19
+ VERSION = '1.16.5'
20
20
 
21
21
  end
@@ -0,0 +1,38 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'fluent/env'
18
+
19
+ module Fluent
20
+ module Win32API
21
+ require 'fiddle/import'
22
+ require 'fiddle/types'
23
+ extend Fiddle::Importer
24
+
25
+ if RUBY_PLATFORM.split('-')[-1] == "ucrt"
26
+ MSVCRT_DLL = 'ucrtbase.dll'
27
+ else
28
+ MSVCRT_DLL = 'msvcrt.dll'
29
+ end
30
+
31
+ dlload MSVCRT_DLL, "kernel32.dll"
32
+ include Fiddle::Win32Types
33
+
34
+ extern "intptr_t _get_osfhandle(int)"
35
+ extern "BOOL GetFileInformationByHandle(HANDLE, void *)"
36
+ extern "BOOL GetFileInformationByHandleEx(HANDLE, int, void *, DWORD)"
37
+ end if Fluent.windows?
38
+ end
data/lib/fluent/winsvc.rb CHANGED
@@ -17,14 +17,12 @@
17
17
  begin
18
18
 
19
19
  require 'optparse'
20
- require 'windows/debug'
21
- require 'Windows/Library'
22
20
  require 'win32/daemon'
23
21
  require 'win32/event'
22
+ require 'win32/registry'
23
+ require 'serverengine'
24
24
 
25
25
  include Win32
26
- include Windows::Library
27
- include Windows::Debug
28
26
 
29
27
  op = OptionParser.new
30
28
  opts = {service_name: nil}
@@ -37,16 +35,13 @@ begin
37
35
  end
38
36
 
39
37
  def read_fluentdopt(service_name)
40
- require 'win32/Registry'
41
38
  Win32::Registry::HKEY_LOCAL_MACHINE.open("SYSTEM\\CurrentControlSet\\Services\\#{service_name}") do |reg|
42
39
  reg.read("fluentdopt")[1] rescue ""
43
40
  end
44
41
  end
45
42
 
46
43
  def service_main_start(service_name)
47
- ruby_path = 0.chr * 260
48
- GetModuleFileName.call(0, ruby_path,260)
49
- ruby_path = ruby_path.rstrip.gsub(/\\/, '/')
44
+ ruby_path = ServerEngine.ruby_bin_path
50
45
  rubybin_dir = ruby_path[0, ruby_path.rindex("/")]
51
46
  opt = read_fluentdopt(service_name)
52
47
  Process.spawn("\"#{rubybin_dir}/ruby.exe\" \"#{rubybin_dir}/fluentd\" #{opt} -x #{service_name}")
@@ -84,6 +79,8 @@ begin
84
79
  set_event("#{@service_name}_HUP")
85
80
  when 129
86
81
  set_event("#{@service_name}_USR1")
82
+ when 130
83
+ set_event("#{@service_name}_CONT")
87
84
  end
88
85
  end
89
86
 
@@ -1,4 +1,3 @@
1
- $LOAD_PATH.unshift(File.expand_path("../../", __FILE__))
2
1
  require "test-unit"
3
2
  require "fluent/test"
4
3
  require "fluent/test/driver/<%= type %>"
@@ -69,7 +69,7 @@ class TestFluentCat < ::Test::Unit::TestCase
69
69
  def test_cat_json
70
70
  d = create_driver
71
71
  d.run(expect_records: 1) do
72
- Open3.pipeline_w("ruby #{FLUENT_CAT_COMMAND} --port #{@port} json") do |stdin|
72
+ Open3.pipeline_w("#{ServerEngine.ruby_bin_path} #{FLUENT_CAT_COMMAND} --port #{@port} json") do |stdin|
73
73
  stdin.puts('{"key":"value"}')
74
74
  stdin.close
75
75
  end
@@ -86,7 +86,7 @@ class TestFluentCat < ::Test::Unit::TestCase
86
86
  path = d.instance.write(@chunk)
87
87
  d = create_driver
88
88
  d.run(expect_records: 1) do
89
- Open3.pipeline_w("ruby #{FLUENT_CAT_COMMAND} --port #{@port} --format msgpack secondary") do |stdin|
89
+ Open3.pipeline_w("#{ServerEngine.ruby_bin_path} #{FLUENT_CAT_COMMAND} --port #{@port} --format msgpack secondary") do |stdin|
90
90
  stdin.write(File.read(path))
91
91
  stdin.close
92
92
  end
@@ -96,4 +96,33 @@ class TestFluentCat < ::Test::Unit::TestCase
96
96
  [d.events.size, event.first, event.last])
97
97
  end
98
98
  end
99
+
100
+ sub_test_case "send specific event time" do
101
+ def test_without_event_time
102
+ event_time = Fluent::EventTime.now
103
+ d = create_driver
104
+ d.run(expect_records: 1) do
105
+ Open3.pipeline_w("#{ServerEngine.ruby_bin_path} #{FLUENT_CAT_COMMAND} --port #{@port} tag") do |stdin|
106
+ stdin.puts('{"key":"value"}')
107
+ stdin.close
108
+ end
109
+ end
110
+ event = d.events.first
111
+ assert_in_delta(event_time.to_f, event[1].to_f, 3.0) # expect command to be finished in 3 seconds
112
+ assert_equal([1, "tag", true, @record],
113
+ [d.events.size, event.first, event_time.to_f < event[1].to_f, event.last])
114
+ end
115
+
116
+ def test_with_event_time
117
+ event_time = "2021-01-02 13:14:15.0+00:00"
118
+ d = create_driver
119
+ d.run(expect_records: 1) do
120
+ Open3.pipeline_w("#{ServerEngine.ruby_bin_path} #{FLUENT_CAT_COMMAND} --port #{@port} --event-time '#{event_time}' tag") do |stdin|
121
+ stdin.puts('{"key":"value"}')
122
+ stdin.close
123
+ end
124
+ end
125
+ assert_equal([["tag", Fluent::EventTime.parse(event_time), @record]], d.events)
126
+ end
127
+ end
99
128
  end
@@ -7,7 +7,6 @@ require 'fluent/command/ctl'
7
7
 
8
8
  class TestFluentdCtl < ::Test::Unit::TestCase
9
9
  def assert_win32_event(event_name, command, pid_or_svcname)
10
- command, event_suffix = data
11
10
  event = Win32::Event.new(event_name)
12
11
  ipc = Win32::Ipc.new(event.handle)
13
12
  ret = Win32::Ipc::TIMEOUT
@@ -36,7 +35,7 @@ class TestFluentdCtl < ::Test::Unit::TestCase
36
35
  Signal.trap(signal) do
37
36
  got_signal = true
38
37
  end
39
- Fluent::Ctl.new([command, "#{$$}"]).call
38
+ Fluent::Ctl.new([command, Process.pid.to_s]).call
40
39
  assert_true(got_signal)
41
40
  end
42
41
  end