logstash-core 5.0.0.alpha6.snapshot5-java → 5.0.0-java
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.
Potentially problematic release.
This version of logstash-core might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/jars.rb +1 -1
- data/lib/logstash-core/version.rb +1 -1
- data/lib/logstash/agent.rb +45 -11
- data/lib/logstash/api/app_helpers.rb +43 -7
- data/lib/logstash/api/commands/stats.rb +2 -1
- data/lib/logstash/api/errors.rb +28 -0
- data/lib/logstash/api/modules/base.rb +9 -7
- data/lib/logstash/api/modules/logging.rb +52 -0
- data/lib/logstash/api/modules/node.rb +13 -9
- data/lib/logstash/api/modules/root.rb +0 -2
- data/lib/logstash/api/modules/stats.rb +0 -2
- data/lib/logstash/api/rack_app.rb +5 -3
- data/lib/logstash/environment.rb +4 -5
- data/lib/logstash/instrument/collector.rb +4 -0
- data/lib/logstash/instrument/metric_store.rb +27 -2
- data/lib/logstash/logging/logger.rb +15 -4
- data/lib/logstash/patches/puma.rb +44 -0
- data/lib/logstash/pipeline.rb +8 -15
- data/lib/logstash/runner.rb +31 -17
- data/lib/logstash/settings.rb +34 -9
- data/lib/logstash/util/wrapped_synchronous_queue.rb +26 -9
- data/lib/logstash/version.rb +1 -1
- data/lib/logstash/webserver.rb +13 -2
- data/locales/en.yml +7 -2
- data/logstash-core.gemspec +1 -1
- data/spec/api/lib/api/logging_spec.rb +41 -0
- data/spec/api/lib/api/node_plugins_spec.rb +4 -3
- data/spec/api/lib/api/node_spec.rb +2 -0
- data/spec/api/lib/api/node_stats_spec.rb +2 -0
- data/spec/api/lib/api/plugins_spec.rb +3 -1
- data/spec/api/lib/api/root_spec.rb +3 -0
- data/spec/api/lib/errors_spec.rb +27 -0
- data/spec/api/lib/rack_app_spec.rb +4 -4
- data/spec/logstash/agent_spec.rb +112 -26
- data/spec/logstash/instrument/metric_store_spec.rb +37 -0
- data/spec/logstash/pipeline_spec.rb +54 -0
- data/spec/logstash/runner_spec.rb +2 -1
- data/spec/logstash/setting_spec.rb +23 -1
- data/spec/logstash/settings/string_spec.rb +1 -1
- data/spec/logstash/settings_spec.rb +27 -0
- data/spec/logstash/util/wrapped_synchronous_queue_spec.rb +49 -11
- data/spec/logstash/webserver_spec.rb +76 -18
- data/spec/support/helpers.rb +8 -0
- data/spec/support/mocks_classes.rb +22 -0
- data/spec/support/shared_examples.rb +10 -0
- data/vendor/jars/org/logstash/logstash-core/{5.0.0-alpha6/logstash-core-5.0.0-alpha6.jar → 5.0.0/logstash-core-5.0.0.jar} +0 -0
- metadata +16 -7
data/lib/logstash/environment.rb
CHANGED
@@ -17,9 +17,9 @@ module LogStash
|
|
17
17
|
|
18
18
|
[
|
19
19
|
Setting::String.new("node.name", Socket.gethostname),
|
20
|
-
|
20
|
+
Setting::NullableString.new("path.config", nil, false),
|
21
21
|
Setting::WritableDirectory.new("path.data", ::File.join(LogStash::Environment::LOGSTASH_HOME, "data")),
|
22
|
-
|
22
|
+
Setting::NullableString.new("config.string", nil, false),
|
23
23
|
Setting::Boolean.new("config.test_and_exit", false),
|
24
24
|
Setting::Boolean.new("config.reload.automatic", false),
|
25
25
|
Setting::Numeric.new("config.reload.interval", 3), # in seconds
|
@@ -31,12 +31,11 @@ module LogStash
|
|
31
31
|
Setting::Numeric.new("pipeline.batch.delay", 5), # in milliseconds
|
32
32
|
Setting::Boolean.new("pipeline.unsafe_shutdown", false),
|
33
33
|
Setting.new("path.plugins", Array, []),
|
34
|
-
|
34
|
+
Setting::NullableString.new("interactive", nil, false),
|
35
35
|
Setting::Boolean.new("config.debug", false),
|
36
|
-
Setting::String.new("log.level", "
|
36
|
+
Setting::String.new("log.level", "info", true, ["fatal", "error", "warn", "debug", "info", "trace"]),
|
37
37
|
Setting::Boolean.new("version", false),
|
38
38
|
Setting::Boolean.new("help", false),
|
39
|
-
Setting::String.new("path.log", nil, false),
|
40
39
|
Setting::String.new("log.format", "plain", true, ["json", "plain"]),
|
41
40
|
Setting::String.new("http.host", "127.0.0.1"),
|
42
41
|
Setting::PortRange.new("http.port", 9600..9700),
|
@@ -104,5 +104,9 @@ module LogStash module Instrument
|
|
104
104
|
logger.debug("Collector: Sending snapshot to observers", :created_at => created_at) if logger.debug?
|
105
105
|
notify_observers(snapshot_metric)
|
106
106
|
end
|
107
|
+
|
108
|
+
def clear(keypath)
|
109
|
+
@metric_store.prune(keypath)
|
110
|
+
end
|
107
111
|
end
|
108
112
|
end; end
|
@@ -80,8 +80,7 @@ module LogStash module Instrument
|
|
80
80
|
# @param [Array] The path where values should be located
|
81
81
|
# @return [Hash]
|
82
82
|
def get_with_path(path)
|
83
|
-
key_paths
|
84
|
-
get(*key_paths)
|
83
|
+
get(*key_paths(path))
|
85
84
|
end
|
86
85
|
|
87
86
|
# Similar to `get_with_path` but use symbols instead of string
|
@@ -180,11 +179,28 @@ module LogStash module Instrument
|
|
180
179
|
end
|
181
180
|
alias_method :all, :each
|
182
181
|
|
182
|
+
def prune(path)
|
183
|
+
key_paths = key_paths(path).map {|k| k.to_sym }
|
184
|
+
@structured_lookup_mutex.synchronize do
|
185
|
+
keys_to_delete = @fast_lookup.keys.select {|namespace, _| (key_paths - namespace).empty? }
|
186
|
+
keys_to_delete.each {|k| @fast_lookup.delete(k) }
|
187
|
+
delete_from_map(@store, key_paths)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def size
|
192
|
+
@fast_lookup.size
|
193
|
+
end
|
194
|
+
|
183
195
|
private
|
184
196
|
def get_all
|
185
197
|
@fast_lookup.values
|
186
198
|
end
|
187
199
|
|
200
|
+
def key_paths(path)
|
201
|
+
path.gsub(/^#{KEY_PATH_SEPARATOR}+/, "").split(KEY_PATH_SEPARATOR)
|
202
|
+
end
|
203
|
+
|
188
204
|
# This method take an array of keys and recursively search the metric store structure
|
189
205
|
# and return a filtered hash of the structure. This method also take into consideration
|
190
206
|
# getting two different branchs.
|
@@ -294,5 +310,14 @@ module LogStash module Instrument
|
|
294
310
|
new_map = map.fetch_or_store(current) { Concurrent::Map.new }
|
295
311
|
return fetch_or_store_namespace_recursively(new_map, namespaces_path, idx + 1)
|
296
312
|
end
|
313
|
+
|
314
|
+
def delete_from_map(map, keys)
|
315
|
+
key = keys.first
|
316
|
+
if keys.size == 1
|
317
|
+
map.delete(key)
|
318
|
+
else
|
319
|
+
delete_from_map(map[key], keys[1..-1]) unless map[key].nil?
|
320
|
+
end
|
321
|
+
end
|
297
322
|
end
|
298
323
|
end; end
|
@@ -6,6 +6,8 @@ module LogStash
|
|
6
6
|
java_import org.apache.logging.log4j.Level
|
7
7
|
java_import org.apache.logging.log4j.LogManager
|
8
8
|
java_import org.apache.logging.log4j.core.config.Configurator
|
9
|
+
@@config_mutex = Mutex.new
|
10
|
+
@@logging_context = nil
|
9
11
|
|
10
12
|
def initialize(name)
|
11
13
|
@logger = LogManager.getLogger(name)
|
@@ -59,13 +61,22 @@ module LogStash
|
|
59
61
|
@logger.trace(message, data)
|
60
62
|
end
|
61
63
|
|
62
|
-
# Point logging at a specific path.
|
63
64
|
def self.configure_logging(level, path = LogManager::ROOT_LOGGER_NAME)
|
64
|
-
Configurator.setLevel(path, Level.
|
65
|
-
|
65
|
+
@@config_mutex.synchronize { Configurator.setLevel(path, Level.valueOf(level)) }
|
66
|
+
rescue Exception => e
|
67
|
+
raise ArgumentError, "invalid level[#{level}] for logger[#{path}]"
|
68
|
+
end
|
66
69
|
|
67
70
|
def self.initialize(config_location)
|
68
|
-
|
71
|
+
@@config_mutex.synchronize do
|
72
|
+
if @@logging_context.nil?
|
73
|
+
@@logging_context = Configurator.initialize(nil, config_location)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.get_logging_context
|
79
|
+
return @@logging_context
|
69
80
|
end
|
70
81
|
end
|
71
82
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Patch to replace the usage of STDERR and STDOUT
|
4
|
+
# see: https://github.com/elastic/logstash/issues/5912
|
5
|
+
module LogStash
|
6
|
+
class NullLogger
|
7
|
+
def self.debug(message)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
# Puma uses by default the STDERR an the STDOUT for all his error
|
12
|
+
# handling, the server class accept custom a events object that can accept custom io object,
|
13
|
+
# so I just wrap the logger into an IO like object.
|
14
|
+
class IOWrappedLogger
|
15
|
+
def initialize(new_logger)
|
16
|
+
@logger_lock = Mutex.new
|
17
|
+
@logger = new_logger
|
18
|
+
end
|
19
|
+
|
20
|
+
def sync=(v)
|
21
|
+
# noop
|
22
|
+
end
|
23
|
+
|
24
|
+
def logger=(logger)
|
25
|
+
@logger_lock.synchronize { @logger = logger }
|
26
|
+
end
|
27
|
+
|
28
|
+
def puts(str)
|
29
|
+
# The logger only accept a str as the first argument
|
30
|
+
@logger_lock.synchronize { @logger.debug(str.to_s) }
|
31
|
+
end
|
32
|
+
alias_method :write, :puts
|
33
|
+
alias_method :<<, :puts
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
# Reopen the puma class to create a scoped STDERR and STDOUT
|
39
|
+
# This operation is thread safe since its done at the class level
|
40
|
+
# and force JRUBY to flush his classes cache.
|
41
|
+
module Puma
|
42
|
+
STDERR = LogStash::IOWrappedLogger.new(LogStash::NullLogger)
|
43
|
+
STDOUT = LogStash::IOWrappedLogger.new(LogStash::NullLogger)
|
44
|
+
end
|
data/lib/logstash/pipeline.rb
CHANGED
@@ -162,12 +162,12 @@ module LogStash; class Pipeline
|
|
162
162
|
wait_inputs
|
163
163
|
transition_to_stopped
|
164
164
|
|
165
|
-
@logger.
|
165
|
+
@logger.debug("Input plugins stopped! Will shutdown filter/output workers.")
|
166
166
|
|
167
167
|
shutdown_flusher
|
168
168
|
shutdown_workers
|
169
169
|
|
170
|
-
@logger.
|
170
|
+
@logger.debug("Pipeline #{@pipeline_id} has been shutdown")
|
171
171
|
|
172
172
|
# exit code
|
173
173
|
return 0
|
@@ -257,14 +257,9 @@ module LogStash; class Pipeline
|
|
257
257
|
def filter_batch(batch)
|
258
258
|
batch.each do |event|
|
259
259
|
if event.is_a?(Event)
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
if e.cancelled?
|
264
|
-
batch.cancel(e)
|
265
|
-
else
|
266
|
-
batch.merge(e)
|
267
|
-
end
|
260
|
+
filter_func(event).each do |e|
|
261
|
+
# these are both original and generated events
|
262
|
+
batch.merge(e) unless e.cancelled?
|
268
263
|
end
|
269
264
|
end
|
270
265
|
end
|
@@ -375,9 +370,9 @@ module LogStash; class Pipeline
|
|
375
370
|
|
376
371
|
before_stop.call if block_given?
|
377
372
|
|
378
|
-
@logger.
|
373
|
+
@logger.debug "Closing inputs"
|
379
374
|
@inputs.each(&:do_stop)
|
380
|
-
@logger.
|
375
|
+
@logger.debug "Closed inputs"
|
381
376
|
end # def shutdown
|
382
377
|
|
383
378
|
# After `shutdown` is called from an external thread this is called from the main thread to
|
@@ -492,9 +487,7 @@ module LogStash; class Pipeline
|
|
492
487
|
def flush_filters_to_batch(batch, options = {})
|
493
488
|
options[:final] = batch.shutdown_signal_received?
|
494
489
|
flush_filters(options) do |event|
|
495
|
-
|
496
|
-
batch.cancel(event)
|
497
|
-
else
|
490
|
+
unless event.cancelled?
|
498
491
|
@logger.debug? and @logger.debug("Pushing flushed events", :event => event)
|
499
492
|
batch.merge(event)
|
500
493
|
end
|
data/lib/logstash/runner.rb
CHANGED
@@ -19,11 +19,12 @@ require "logstash/version"
|
|
19
19
|
|
20
20
|
class LogStash::Runner < Clamp::StrictCommand
|
21
21
|
include LogStash::Util::Loggable
|
22
|
-
# The `path.settings` need to be defined in the runner instead of the `logstash-core/lib/logstash/environment.rb`
|
22
|
+
# The `path.settings` and `path.logs` need to be defined in the runner instead of the `logstash-core/lib/logstash/environment.rb`
|
23
23
|
# because the `Environment::LOGSTASH_HOME` doesn't exist in the context of the `logstash-core` gem.
|
24
24
|
#
|
25
25
|
# See issue https://github.com/elastic/logstash/issues/5361
|
26
26
|
LogStash::SETTINGS.register(LogStash::Setting::String.new("path.settings", ::File.join(LogStash::Environment::LOGSTASH_HOME, "config")))
|
27
|
+
LogStash::SETTINGS.register(LogStash::Setting::String.new("path.logs", ::File.join(LogStash::Environment::LOGSTASH_HOME, "logs")))
|
27
28
|
|
28
29
|
# Node Settings
|
29
30
|
option ["-n", "--node.name"], "NAME",
|
@@ -77,9 +78,10 @@ class LogStash::Runner < Clamp::StrictCommand
|
|
77
78
|
:default => LogStash::SETTINGS.get_default("path.plugins")
|
78
79
|
|
79
80
|
# Logging Settings
|
80
|
-
option ["-l", "--path.
|
81
|
+
option ["-l", "--path.logs"], "PATH",
|
81
82
|
I18n.t("logstash.runner.flag.log"),
|
82
|
-
:attribute_name => "path.
|
83
|
+
:attribute_name => "path.logs",
|
84
|
+
:default => LogStash::SETTINGS.get_default("path.logs")
|
83
85
|
|
84
86
|
option "--log.level", "LEVEL", I18n.t("logstash.runner.flag.log_level"),
|
85
87
|
:default => LogStash::SETTINGS.get_default("log.level"),
|
@@ -163,20 +165,12 @@ class LogStash::Runner < Clamp::StrictCommand
|
|
163
165
|
rescue => e
|
164
166
|
# abort unless we're just looking for the help
|
165
167
|
if (["--help", "-h"] & args).empty?
|
166
|
-
$stderr.puts "INFO: Logstash
|
168
|
+
$stderr.puts "INFO: Logstash requires a setting file which is typically located in $LS_HOME/config or /etc/logstash. If you installed Logstash through a package and are starting it manually please specify the location to this settings file by passing in \"--path.settings=/path/..\""
|
167
169
|
$stderr.puts "ERROR: Failed to load settings file from \"path.settings\". Aborting... path.setting=#{LogStash::SETTINGS.get("path.settings")}, exception=#{e.class}, message=>#{e.message}"
|
168
170
|
return 1
|
169
171
|
end
|
170
172
|
end
|
171
173
|
|
172
|
-
# Configure Logstash logging facility, this need to be done before everything else to
|
173
|
-
# make sure the logger has the correct settings and the log level is correctly defined.
|
174
|
-
# TODO(talevy): cleanly support `path.logs` setting in log4j
|
175
|
-
unless java.lang.System.getProperty("log4j.configurationFile")
|
176
|
-
log4j_config_location = setting("path.settings") + "/log4j2.properties"
|
177
|
-
LogStash::Logging::Logger::initialize(log4j_config_location)
|
178
|
-
end
|
179
|
-
|
180
174
|
super(*[args])
|
181
175
|
end
|
182
176
|
|
@@ -185,7 +179,23 @@ class LogStash::Runner < Clamp::StrictCommand
|
|
185
179
|
require "logstash/util/java_version"
|
186
180
|
require "stud/task"
|
187
181
|
|
182
|
+
# Configure Logstash logging facility, this need to be done before everything else to
|
183
|
+
# make sure the logger has the correct settings and the log level is correctly defined.
|
184
|
+
java.lang.System.setProperty("ls.logs", setting("path.logs"))
|
185
|
+
java.lang.System.setProperty("ls.log.format", setting("log.format"))
|
186
|
+
java.lang.System.setProperty("ls.log.level", setting("log.level"))
|
187
|
+
unless java.lang.System.getProperty("log4j.configurationFile")
|
188
|
+
log4j_config_location = ::File.join(setting("path.settings"), "log4j2.properties")
|
189
|
+
LogStash::Logging::Logger::initialize("file://" + log4j_config_location)
|
190
|
+
end
|
191
|
+
# override log level that may have been introduced from a custom log4j config file
|
188
192
|
LogStash::Logging::Logger::configure_logging(setting("log.level"))
|
193
|
+
|
194
|
+
# Adding this here because a ton of LS users install LS via packages and try to manually
|
195
|
+
# start Logstash using bin/logstash. See #5986. I think not logging to console is good for
|
196
|
+
# services, but until LS users re-learn that logs end up in path.logs, we should keep this
|
197
|
+
# message. Otherwise we'll be answering the same question again and again.
|
198
|
+
puts "Sending Logstash logs to #{setting("path.logs")} which is now configured via log4j2.properties."
|
189
199
|
|
190
200
|
if setting("config.debug") && logger.debug?
|
191
201
|
logger.warn("--config.debug was specified, but log.level was not set to \'debug\'! No config info will be logged.")
|
@@ -194,14 +204,14 @@ class LogStash::Runner < Clamp::StrictCommand
|
|
194
204
|
LogStash::Util::set_thread_name(self.class.name)
|
195
205
|
|
196
206
|
if RUBY_VERSION < "1.9.2"
|
197
|
-
|
207
|
+
logger.fatal "Ruby 1.9.2 or later is required. (You are running: " + RUBY_VERSION + ")"
|
198
208
|
return 1
|
199
209
|
end
|
200
210
|
|
201
211
|
# Exit on bad java versions
|
202
212
|
java_version = LogStash::Util::JavaVersion.version
|
203
213
|
if LogStash::Util::JavaVersion.bad_java_version?(java_version)
|
204
|
-
|
214
|
+
logger.fatal "Java version 1.8.0 or later is required. (You are running: #{java_version})"
|
205
215
|
return 1
|
206
216
|
end
|
207
217
|
|
@@ -216,7 +226,9 @@ class LogStash::Runner < Clamp::StrictCommand
|
|
216
226
|
|
217
227
|
return start_shell(setting("interactive"), binding) if setting("interactive")
|
218
228
|
|
219
|
-
@settings.
|
229
|
+
@settings.validate_all
|
230
|
+
|
231
|
+
@settings.format_settings.each {|line| logger.debug(line) }
|
220
232
|
|
221
233
|
if setting("config.string").nil? && setting("path.config").nil?
|
222
234
|
fail(I18n.t("logstash.runner.missing-configuration"))
|
@@ -233,6 +245,7 @@ class LogStash::Runner < Clamp::StrictCommand
|
|
233
245
|
begin
|
234
246
|
LogStash::Pipeline.new(config_str)
|
235
247
|
puts "Configuration OK"
|
248
|
+
logger.info "Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash"
|
236
249
|
return 0
|
237
250
|
rescue => e
|
238
251
|
logger.fatal I18n.t("logstash.runner.invalid-configuration", :error => e.message)
|
@@ -252,7 +265,8 @@ class LogStash::Runner < Clamp::StrictCommand
|
|
252
265
|
@agent_task = Stud::Task.new { @agent.execute }
|
253
266
|
|
254
267
|
# no point in enabling config reloading before the agent starts
|
255
|
-
|
268
|
+
# also windows doesn't have SIGHUP. we can skip it
|
269
|
+
sighup_id = LogStash::Environment.windows? ? nil : trap_sighup()
|
256
270
|
|
257
271
|
agent_return = @agent_task.wait
|
258
272
|
|
@@ -280,7 +294,7 @@ class LogStash::Runner < Clamp::StrictCommand
|
|
280
294
|
def show_version
|
281
295
|
show_version_logstash
|
282
296
|
|
283
|
-
if logger.
|
297
|
+
if logger.info?
|
284
298
|
show_version_ruby
|
285
299
|
show_version_java if LogStash::Environment.jruby?
|
286
300
|
show_gems if logger.debug?
|
data/lib/logstash/settings.rb
CHANGED
@@ -95,6 +95,12 @@ module LogStash
|
|
95
95
|
self.merge(flatten_hash(settings))
|
96
96
|
end
|
97
97
|
|
98
|
+
def validate_all
|
99
|
+
@settings.each do |name, setting|
|
100
|
+
setting.validate_value
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
98
104
|
private
|
99
105
|
def read_yaml(path)
|
100
106
|
YAML.safe_load(IO.read(path)) || {}
|
@@ -123,8 +129,9 @@ module LogStash
|
|
123
129
|
@validator_proc = validator_proc
|
124
130
|
@value = nil
|
125
131
|
@value_is_set = false
|
132
|
+
@strict = strict
|
126
133
|
|
127
|
-
validate(default) if strict
|
134
|
+
validate(default) if @strict
|
128
135
|
@default = default
|
129
136
|
end
|
130
137
|
|
@@ -136,8 +143,12 @@ module LogStash
|
|
136
143
|
@value_is_set
|
137
144
|
end
|
138
145
|
|
146
|
+
def strict?
|
147
|
+
@strict
|
148
|
+
end
|
149
|
+
|
139
150
|
def set(value)
|
140
|
-
validate(value)
|
151
|
+
validate(value) if @strict
|
141
152
|
@value = value
|
142
153
|
@value_is_set = true
|
143
154
|
@value
|
@@ -167,12 +178,18 @@ module LogStash
|
|
167
178
|
self.to_hash == other.to_hash
|
168
179
|
end
|
169
180
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
181
|
+
def validate_value
|
182
|
+
validate(value)
|
183
|
+
end
|
184
|
+
|
185
|
+
protected
|
186
|
+
def validate(input)
|
187
|
+
if !input.is_a?(@klass)
|
188
|
+
raise ArgumentError.new("Setting \"#{@name}\" must be a #{@klass}. Received: #{input} (#{input.class})")
|
189
|
+
end
|
190
|
+
|
191
|
+
if @validator_proc && !@validator_proc.call(input)
|
192
|
+
raise ArgumentError.new("Failed to validate setting \"#{@name}\" with value: #{input}")
|
176
193
|
end
|
177
194
|
end
|
178
195
|
|
@@ -351,6 +368,13 @@ module LogStash
|
|
351
368
|
end
|
352
369
|
end
|
353
370
|
|
371
|
+
class NullableString < String
|
372
|
+
def validate(value)
|
373
|
+
return if value.nil?
|
374
|
+
super(value)
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
354
378
|
class ExistingFilePath < Setting
|
355
379
|
def initialize(name, default=nil, strict=true)
|
356
380
|
super(name, ::String, default, strict) do |file_path|
|
@@ -364,7 +388,7 @@ module LogStash
|
|
364
388
|
end
|
365
389
|
|
366
390
|
class WritableDirectory < Setting
|
367
|
-
def initialize(name, default=nil, strict=
|
391
|
+
def initialize(name, default=nil, strict=false)
|
368
392
|
super(name, ::String, default, strict) do |path|
|
369
393
|
if ::File.directory?(path) && ::File.writable?(path)
|
370
394
|
true
|
@@ -378,3 +402,4 @@ module LogStash
|
|
378
402
|
|
379
403
|
SETTINGS = Settings.new
|
380
404
|
end
|
405
|
+
|
@@ -90,9 +90,14 @@ module LogStash; module Util
|
|
90
90
|
def take_batch
|
91
91
|
@mutex.synchronize do
|
92
92
|
batch = ReadBatch.new(@queue, @batch_size, @wait_for)
|
93
|
-
add_starting_metrics(batch)
|
94
93
|
set_current_thread_inflight_batch(batch)
|
95
|
-
|
94
|
+
|
95
|
+
# We dont actually have any events to work on so lets
|
96
|
+
# not bother with recording metrics for them
|
97
|
+
if batch.size > 0
|
98
|
+
add_starting_metrics(batch)
|
99
|
+
start_clock
|
100
|
+
end
|
96
101
|
batch
|
97
102
|
end
|
98
103
|
end
|
@@ -116,8 +121,10 @@ module LogStash; module Util
|
|
116
121
|
end
|
117
122
|
|
118
123
|
def stop_clock
|
119
|
-
@inflight_clocks[Thread.current].
|
120
|
-
|
124
|
+
unless @inflight_clocks[Thread.current].nil?
|
125
|
+
@inflight_clocks[Thread.current].each(&:stop)
|
126
|
+
@inflight_clocks.delete(Thread.current)
|
127
|
+
end
|
121
128
|
end
|
122
129
|
|
123
130
|
def add_starting_metrics(batch)
|
@@ -141,7 +148,10 @@ module LogStash; module Util
|
|
141
148
|
@shutdown_signal_received = false
|
142
149
|
@flush_signal_received = false
|
143
150
|
@originals = Hash.new
|
144
|
-
|
151
|
+
|
152
|
+
# TODO: disabled for https://github.com/elastic/logstash/issues/6055 - will have to properly refactor
|
153
|
+
# @cancelled = Hash.new
|
154
|
+
|
145
155
|
@generated = Hash.new
|
146
156
|
@iterating_temp = Hash.new
|
147
157
|
@iterating = false # Atomic Boolean maybe? Although batches are not shared across threads
|
@@ -161,17 +171,22 @@ module LogStash; module Util
|
|
161
171
|
end
|
162
172
|
|
163
173
|
def cancel(event)
|
164
|
-
|
174
|
+
# TODO: disabled for https://github.com/elastic/logstash/issues/6055 - will have to properly refactor
|
175
|
+
raise("cancel is unsupported")
|
176
|
+
# @cancelled[event] = true
|
165
177
|
end
|
166
178
|
|
167
179
|
def each(&blk)
|
168
180
|
# take care not to cause @originals or @generated to change during iteration
|
169
181
|
@iterating = true
|
182
|
+
|
183
|
+
# below the checks for @cancelled.include?(e) have been replaced by e.cancelled?
|
184
|
+
# TODO: for https://github.com/elastic/logstash/issues/6055 = will have to properly refactor
|
170
185
|
@originals.each do |e, _|
|
171
|
-
blk.call(e) unless
|
186
|
+
blk.call(e) unless e.cancelled?
|
172
187
|
end
|
173
188
|
@generated.each do |e, _|
|
174
|
-
blk.call(e) unless
|
189
|
+
blk.call(e) unless e.cancelled?
|
175
190
|
end
|
176
191
|
@iterating = false
|
177
192
|
update_generated
|
@@ -190,7 +205,9 @@ module LogStash; module Util
|
|
190
205
|
end
|
191
206
|
|
192
207
|
def cancelled_size
|
193
|
-
|
208
|
+
# TODO: disabled for https://github.com/elastic/logstash/issues/6055 = will have to properly refactor
|
209
|
+
raise("cancelled_size is unsupported ")
|
210
|
+
# @cancelled.size
|
194
211
|
end
|
195
212
|
|
196
213
|
def shutdown_signal_received?
|