logstash-core 6.1.4-java → 6.2.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.
- checksums.yaml +4 -4
- data/lib/logstash-core/logstash-core.rb +10 -31
- data/lib/logstash/agent.rb +3 -23
- data/lib/logstash/api/modules/logging.rb +11 -0
- data/lib/logstash/config/source/multi_local.rb +5 -3
- data/lib/logstash/environment.rb +10 -3
- data/lib/logstash/event.rb +0 -1
- data/lib/logstash/filter_delegator.rb +1 -2
- data/lib/logstash/inputs/base.rb +1 -1
- data/lib/logstash/instrument/periodic_poller/base.rb +4 -4
- data/lib/logstash/instrument/periodic_poller/jvm.rb +5 -3
- data/lib/logstash/java_filter_delegator.rb +1 -2
- data/lib/logstash/java_pipeline.rb +6 -2
- data/lib/logstash/modules/kibana_client.rb +1 -1
- data/lib/logstash/output_delegator.rb +2 -3
- data/lib/logstash/output_delegator_strategies/legacy.rb +4 -4
- data/lib/logstash/output_delegator_strategies/shared.rb +4 -4
- data/lib/logstash/output_delegator_strategies/single.rb +2 -2
- data/lib/logstash/pipeline.rb +16 -24
- data/lib/logstash/plugin.rb +1 -1
- data/lib/logstash/plugins/plugin_factory.rb +3 -4
- data/lib/logstash/runner.rb +5 -0
- data/lib/logstash/settings.rb +5 -0
- data/lib/logstash/timestamp.rb +2 -25
- data/lib/logstash/util/secretstore.rb +36 -0
- data/lib/logstash/util/settings_helper.rb +1 -0
- data/lib/logstash/util/substitution_variables.rb +18 -5
- data/lib/logstash/util/wrapped_acked_queue.rb +1 -1
- data/lib/logstash/util/wrapped_synchronous_queue.rb +3 -35
- data/locales/en.yml +4 -4
- data/logstash-core.gemspec +0 -7
- data/spec/conditionals_spec.rb +21 -24
- data/spec/logstash/filter_delegator_spec.rb +3 -4
- data/spec/logstash/java_filter_delegator_spec.rb +3 -4
- data/spec/logstash/java_pipeline_spec.rb +97 -2
- data/spec/logstash/legacy_ruby_timestamp_spec.rb +0 -1
- data/spec/logstash/output_delegator_spec.rb +5 -7
- data/spec/logstash/queue_factory_spec.rb +1 -1
- data/spec/logstash/settings_spec.rb +49 -22
- data/spec/logstash/timestamp_spec.rb +0 -1
- data/spec/logstash/util/secretstore_spec.rb +69 -0
- data/spec/support/mocks_classes.rb +21 -0
- data/versions-gem-copy.yml +2 -2
- metadata +6 -42
- data/gemspec_jars.rb +0 -12
- data/lib/logstash-core/logstash-core.jar +0 -0
- data/lib/logstash-core_jars.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 863042f74fef490f23b6393fd8f2e5e46ed2d41feefa150e3c6b5f32f6502b42
|
4
|
+
data.tar.gz: 33f0feed45740a7104a6e6c0a5f894ceb21a5916545971033288ca7604c65dd0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8969c92ee13601ac5e00ff2a06ee5f9c41d2d47b4739de30852a116f10a58a8bc3c9508bc42d972fcf4da5ecfcb59eddc597b8dcc7c7d5f40a9ed1b35783a8a
|
7
|
+
data.tar.gz: 3b3000cb8f55315c756e6651694313c73a746e92124582173cb23515317a2defcfd869269612f5d115891f41b916827978778ad393a0c1c6b066044211be55dc
|
@@ -2,36 +2,15 @@
|
|
2
2
|
|
3
3
|
require "java"
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
resources_dir = File.expand_path("../../../out/production/resources", __FILE__)
|
15
|
-
else
|
16
|
-
classes_dir = File.expand_path("../../../build/classes/java/main", __FILE__)
|
17
|
-
resources_dir = File.expand_path("../../../build/resources/main", __FILE__)
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
if File.directory?(classes_dir) && File.directory?(resources_dir)
|
23
|
-
# if in local dev setup, add target to classpath
|
24
|
-
$CLASSPATH << classes_dir unless $CLASSPATH.include?(classes_dir)
|
25
|
-
$CLASSPATH << resources_dir unless $CLASSPATH.include?(resources_dir)
|
26
|
-
else
|
27
|
-
# otherwise use included jar
|
28
|
-
begin
|
29
|
-
require "logstash-core/logstash-core.jar"
|
30
|
-
rescue Exception => e
|
31
|
-
raise("Error loading logstash-core/logstash-core.jar file, cause: #{e.message}")
|
5
|
+
# This block is used to load Logstash's Java libraries when using a Ruby entrypoint and
|
6
|
+
# LS_JARS_LOADED is not globally set.
|
7
|
+
# Currently this happens when using the `bin/rspec` executable to invoke specs instead of the JUnit
|
8
|
+
# wrapper.
|
9
|
+
unless $LS_JARS_LOADED
|
10
|
+
jar_path = File.join(File.dirname(File.dirname(__FILE__)), "jars")
|
11
|
+
$:.unshift jar_path
|
12
|
+
Dir.glob(jar_path + '/*.jar') do |jar|
|
13
|
+
require File.basename(jar)
|
32
14
|
end
|
15
|
+
java_import org.logstash.RubyUtil
|
33
16
|
end
|
34
|
-
|
35
|
-
# Load Logstash's Java-defined RubyClasses by classloading RubyUtil which sets them up in its
|
36
|
-
# static constructor
|
37
|
-
java_import org.logstash.RubyUtil
|
data/lib/logstash/agent.rb
CHANGED
@@ -81,7 +81,7 @@ class LogStash::Agent
|
|
81
81
|
|
82
82
|
def execute
|
83
83
|
@thread = Thread.current # this var is implicitly used by Stud.stop?
|
84
|
-
logger.debug("
|
84
|
+
logger.debug("Starting agent")
|
85
85
|
|
86
86
|
start_webserver
|
87
87
|
|
@@ -272,24 +272,6 @@ class LogStash::Agent
|
|
272
272
|
end
|
273
273
|
end
|
274
274
|
|
275
|
-
def close_pipeline(id)
|
276
|
-
with_pipelines do |pipelines|
|
277
|
-
pipeline = pipelines[id]
|
278
|
-
if pipeline
|
279
|
-
@logger.warn("closing pipeline", :id => id)
|
280
|
-
pipeline.close
|
281
|
-
end
|
282
|
-
end
|
283
|
-
end
|
284
|
-
|
285
|
-
def close_pipelines
|
286
|
-
with_pipelines do |pipelines|
|
287
|
-
pipelines.each do |id, _|
|
288
|
-
close_pipeline(id)
|
289
|
-
end
|
290
|
-
end
|
291
|
-
end
|
292
|
-
|
293
275
|
private
|
294
276
|
def transition_to_stopped
|
295
277
|
@running.make_false
|
@@ -310,12 +292,10 @@ class LogStash::Agent
|
|
310
292
|
# for other tasks.
|
311
293
|
#
|
312
294
|
def converge_state(pipeline_actions)
|
313
|
-
logger.debug("Converging pipelines")
|
295
|
+
logger.debug("Converging pipelines state", :actions_count => pipeline_actions.size)
|
314
296
|
|
315
297
|
converge_result = LogStash::ConvergeResult.new(pipeline_actions.size)
|
316
298
|
|
317
|
-
logger.debug("Needed actions to converge", :actions_count => pipeline_actions.size) unless pipeline_actions.empty?
|
318
|
-
|
319
299
|
pipeline_actions.each do |action|
|
320
300
|
# We execute every task we need to converge the current state of pipelines
|
321
301
|
# for every task we will record the action result, that will help us
|
@@ -409,7 +389,7 @@ class LogStash::Agent
|
|
409
389
|
@collector = LogStash::Instrument::Collector.new
|
410
390
|
|
411
391
|
@metric = if collect_metrics?
|
412
|
-
@logger.debug("
|
392
|
+
@logger.debug("Setting up metric collection")
|
413
393
|
LogStash::Instrument::Metric.new(@collector)
|
414
394
|
else
|
415
395
|
LogStash::Instrument::NullMetric.new(@collector)
|
@@ -36,6 +36,17 @@ module LogStash
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
+
put "/reset" do
|
40
|
+
context = LogStash::Logging::Logger::get_logging_context
|
41
|
+
if context.nil?
|
42
|
+
status 500
|
43
|
+
respond_with({"error" => "Logstash loggers were not initialized properly"})
|
44
|
+
else
|
45
|
+
context.reconfigure
|
46
|
+
respond_with({"acknowledged" => true})
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
39
50
|
get "/" do
|
40
51
|
context = LogStash::Logging::Logger::get_logging_context
|
41
52
|
if context.nil?
|
@@ -31,9 +31,11 @@ module LogStash module Config module Source
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def match?
|
34
|
+
if modules_cli? || modules? || config_string? || config_path?
|
35
|
+
return false
|
36
|
+
end
|
34
37
|
detect_pipelines if !@detect_pipelines_called
|
35
|
-
|
36
|
-
return !(invalid_pipelines_detected? || modules_cli? || modules? || config_string? || config_path?)
|
38
|
+
return !(invalid_pipelines_detected?)
|
37
39
|
end
|
38
40
|
|
39
41
|
def invalid_pipelines_detected?
|
@@ -41,10 +43,10 @@ module LogStash module Config module Source
|
|
41
43
|
end
|
42
44
|
|
43
45
|
def config_conflict?
|
44
|
-
detect_pipelines if !@detect_pipelines_called
|
45
46
|
@conflict_messages.clear
|
46
47
|
# are there any auto-reload conflicts?
|
47
48
|
if !(modules_cli? || modules? || config_string? || config_path?)
|
49
|
+
detect_pipelines if !@detect_pipelines_called
|
48
50
|
if @detected_marker.nil?
|
49
51
|
@conflict_messages << I18n.t("logstash.runner.config-pipelines-failed-read", :path => pipelines_yaml_location)
|
50
52
|
elsif @detected_marker == false
|
data/lib/logstash/environment.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require "logstash-core/logstash-core"
|
2
3
|
require "logstash/errors"
|
3
4
|
require "logstash/java_integration"
|
4
5
|
require "logstash/config/cpu_core_strategy"
|
@@ -38,7 +39,7 @@ module LogStash
|
|
38
39
|
Setting::PositiveInteger.new("pipeline.workers", LogStash::Config::CpuCoreStrategy.maximum),
|
39
40
|
Setting::PositiveInteger.new("pipeline.output.workers", 1),
|
40
41
|
Setting::PositiveInteger.new("pipeline.batch.size", 125),
|
41
|
-
Setting::Numeric.new("pipeline.batch.delay",
|
42
|
+
Setting::Numeric.new("pipeline.batch.delay", 50), # in milliseconds
|
42
43
|
Setting::Boolean.new("pipeline.unsafe_shutdown", false),
|
43
44
|
Setting::Boolean.new("pipeline.java_execution", false),
|
44
45
|
Setting::Boolean.new("pipeline.reloadable", true),
|
@@ -54,7 +55,7 @@ module LogStash
|
|
54
55
|
Setting::String.new("http.environment", "production"),
|
55
56
|
Setting::String.new("queue.type", "memory", true, ["persisted", "memory", "memory_acked"]),
|
56
57
|
Setting::Boolean.new("queue.drain", false),
|
57
|
-
Setting::Bytes.new("queue.page_capacity", "
|
58
|
+
Setting::Bytes.new("queue.page_capacity", "64mb"),
|
58
59
|
Setting::Bytes.new("queue.max_bytes", "1024mb"),
|
59
60
|
Setting::Numeric.new("queue.max_events", 0), # 0 is unlimited
|
60
61
|
Setting::Numeric.new("queue.checkpoint.acks", 1024), # 0 is unlimited
|
@@ -65,9 +66,14 @@ module LogStash
|
|
65
66
|
Setting::TimeValue.new("slowlog.threshold.warn", "-1"),
|
66
67
|
Setting::TimeValue.new("slowlog.threshold.info", "-1"),
|
67
68
|
Setting::TimeValue.new("slowlog.threshold.debug", "-1"),
|
68
|
-
Setting::TimeValue.new("slowlog.threshold.trace", "-1")
|
69
|
+
Setting::TimeValue.new("slowlog.threshold.trace", "-1"),
|
70
|
+
Setting::String.new("keystore.classname", "org.logstash.secret.store.backend.JavaKeyStore"),
|
71
|
+
Setting::String.new("keystore.file", ::File.join(::File.join(LogStash::Environment::LOGSTASH_HOME, "config"), "logstash.keystore"), false) # will be populated on
|
72
|
+
# post_process
|
69
73
|
].each {|setting| SETTINGS.register(setting) }
|
70
74
|
|
75
|
+
|
76
|
+
|
71
77
|
# Compute the default queue path based on `path.data`
|
72
78
|
default_queue_file_path = ::File.join(SETTINGS.get("path.data"), "queue")
|
73
79
|
SETTINGS.register Setting::WritableDirectory.new("path.queue", default_queue_file_path)
|
@@ -75,6 +81,7 @@ module LogStash
|
|
75
81
|
default_dlq_file_path = ::File.join(SETTINGS.get("path.data"), "dead_letter_queue")
|
76
82
|
SETTINGS.register Setting::WritableDirectory.new("path.dead_letter_queue", default_dlq_file_path)
|
77
83
|
|
84
|
+
|
78
85
|
SETTINGS.on_post_process do |settings|
|
79
86
|
# If the data path is overridden but the queue path isn't recompute the queue path
|
80
87
|
# We need to do this at this stage because of the weird execution order
|
data/lib/logstash/event.rb
CHANGED
@@ -16,8 +16,7 @@ module LogStash
|
|
16
16
|
|
17
17
|
attr_reader :id
|
18
18
|
|
19
|
-
def initialize(
|
20
|
-
@logger = logger
|
19
|
+
def initialize(klass, metric, execution_context, plugin_args)
|
21
20
|
@klass = klass
|
22
21
|
@id = plugin_args["id"]
|
23
22
|
@filter = klass.new(plugin_args)
|
data/lib/logstash/inputs/base.rb
CHANGED
@@ -27,7 +27,7 @@ module LogStash module Instrument module PeriodicPoller
|
|
27
27
|
if exception.is_a?(Concurrent::TimeoutError)
|
28
28
|
# On a busy system this can happen, we just log it as a debug
|
29
29
|
# event instead of an error, Some of the JVM calls can take a long time or block.
|
30
|
-
logger.debug("
|
30
|
+
logger.debug("Timeout exception",
|
31
31
|
:poller => self,
|
32
32
|
:result => result,
|
33
33
|
:polling_timeout => @options[:polling_timeout],
|
@@ -35,7 +35,7 @@ module LogStash module Instrument module PeriodicPoller
|
|
35
35
|
:exception => exception.class,
|
36
36
|
:executed_at => time)
|
37
37
|
else
|
38
|
-
logger.error("
|
38
|
+
logger.error("Exception",
|
39
39
|
:poller => self,
|
40
40
|
:result => result,
|
41
41
|
:exception => exception.class,
|
@@ -50,7 +50,7 @@ module LogStash module Instrument module PeriodicPoller
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def start
|
53
|
-
logger.debug("
|
53
|
+
logger.debug("Starting",
|
54
54
|
:polling_interval => @options[:polling_interval],
|
55
55
|
:polling_timeout => @options[:polling_timeout]) if logger.debug?
|
56
56
|
|
@@ -59,7 +59,7 @@ module LogStash module Instrument module PeriodicPoller
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def stop
|
62
|
-
logger.debug("
|
62
|
+
logger.debug("Stopping")
|
63
63
|
@task.shutdown
|
64
64
|
end
|
65
65
|
|
@@ -20,8 +20,8 @@ java_import 'org.logstash.instrument.reports.ProcessReport'
|
|
20
20
|
module LogStash module Instrument module PeriodicPoller
|
21
21
|
class JVM < Base
|
22
22
|
class GarbageCollectorName
|
23
|
-
YOUNG_GC_NAMES = Set.new(["Copy", "PS Scavenge", "ParNew", "G1 Young Generation"])
|
24
|
-
OLD_GC_NAMES = Set.new(["MarkSweepCompact", "PS MarkSweep", "ConcurrentMarkSweep", "G1 Old Generation"])
|
23
|
+
YOUNG_GC_NAMES = Set.new(["Copy", "PS Scavenge", "ParNew", "G1 Young Generation", "scavenge"])
|
24
|
+
OLD_GC_NAMES = Set.new(["MarkSweepCompact", "PS MarkSweep", "ConcurrentMarkSweep", "G1 Old Generation", "global"])
|
25
25
|
|
26
26
|
YOUNG = :young
|
27
27
|
OLD = :old
|
@@ -64,7 +64,9 @@ module LogStash module Instrument module PeriodicPoller
|
|
64
64
|
garbage_collectors = ManagementFactory.getGarbageCollectorMXBeans()
|
65
65
|
|
66
66
|
garbage_collectors.each do |collector|
|
67
|
-
|
67
|
+
collector_name = collector.getName()
|
68
|
+
logger.debug("collector name", :name => collector_name)
|
69
|
+
name = GarbageCollectorName.get(collector_name)
|
68
70
|
if name.nil?
|
69
71
|
logger.error("Unknown garbage collector name", :name => name)
|
70
72
|
else
|
@@ -17,8 +17,7 @@ module LogStash
|
|
17
17
|
|
18
18
|
attr_reader :id
|
19
19
|
|
20
|
-
def initialize(
|
21
|
-
@logger = logger
|
20
|
+
def initialize(klass, metric, execution_context, plugin_args)
|
22
21
|
@klass = klass
|
23
22
|
@id = plugin_args["id"]
|
24
23
|
@filter = klass.new(plugin_args)
|
@@ -57,7 +57,7 @@ module LogStash; class JavaBasePipeline
|
|
57
57
|
@plugin_factory = LogStash::Plugins::PluginFactory.new(
|
58
58
|
# use NullMetric if called in the BasePipeline context otherwise use the @metric value
|
59
59
|
@lir, LogStash::Plugins::PluginMetricFactory.new(pipeline_id, @metric || Instrument::NullMetric.new),
|
60
|
-
|
60
|
+
LogStash::Plugins::ExecutionContextFactory.new(@agent, self, @dlq_writer),
|
61
61
|
JavaFilterDelegator
|
62
62
|
)
|
63
63
|
@lir_execution = CompiledPipeline.new(@lir, @plugin_factory)
|
@@ -330,7 +330,10 @@ module LogStash; class JavaPipeline < JavaBasePipeline
|
|
330
330
|
# @param plugins [Array[Plugin]] the list of plugins to register
|
331
331
|
def register_plugins(plugins)
|
332
332
|
registered = []
|
333
|
-
plugins.each
|
333
|
+
plugins.each do |plugin|
|
334
|
+
plugin.register
|
335
|
+
registered << plugin
|
336
|
+
end
|
334
337
|
rescue => e
|
335
338
|
registered.each(&:do_close)
|
336
339
|
raise e
|
@@ -651,6 +654,7 @@ module LogStash; class JavaPipeline < JavaBasePipeline
|
|
651
654
|
filtered_size = batch.filtered_size
|
652
655
|
@filter_queue_client.add_output_metrics(filtered_size)
|
653
656
|
@filter_queue_client.add_filtered_metrics(filtered_size)
|
657
|
+
@flushing.set(false) if flush
|
654
658
|
rescue Exception => e
|
655
659
|
# Plugins authors should manage their own exceptions in the plugin code
|
656
660
|
# but if an exception is raised up to the worker thread they are considered
|
@@ -7,8 +7,7 @@ require "logstash/output_delegator_strategies/legacy"
|
|
7
7
|
module LogStash class OutputDelegator
|
8
8
|
attr_reader :metric, :metric_events, :strategy, :namespaced_metric, :metric_events, :id
|
9
9
|
|
10
|
-
def initialize(
|
11
|
-
@logger = logger
|
10
|
+
def initialize(output_class, metric, execution_context, strategy_registry, plugin_args)
|
12
11
|
@output_class = output_class
|
13
12
|
@metric = metric
|
14
13
|
@id = plugin_args["id"]
|
@@ -24,7 +23,7 @@ module LogStash class OutputDelegator
|
|
24
23
|
@time_metric = @metric_events.counter(:duration_in_millis)
|
25
24
|
@strategy = strategy_registry.
|
26
25
|
class_for(self.concurrency).
|
27
|
-
new(@
|
26
|
+
new(@output_class, @namespaced_metric, execution_context, plugin_args)
|
28
27
|
end
|
29
28
|
|
30
29
|
def config_name
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# Remove this in Logstash 6.0
|
2
2
|
module LogStash module OutputDelegatorStrategies class Legacy
|
3
3
|
attr_reader :worker_count, :workers
|
4
|
-
|
5
|
-
def initialize(
|
4
|
+
|
5
|
+
def initialize(klass, metric, execution_context, plugin_args)
|
6
6
|
@worker_count = (plugin_args["workers"] || 1).to_i
|
7
7
|
@workers = @worker_count.times.map { klass.new(plugin_args) }
|
8
8
|
@workers.each do |w|
|
@@ -12,11 +12,11 @@ module LogStash module OutputDelegatorStrategies class Legacy
|
|
12
12
|
@worker_queue = SizedQueue.new(@worker_count)
|
13
13
|
@workers.each {|w| @worker_queue << w}
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def register
|
17
17
|
@workers.each(&:register)
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
def multi_receive(events)
|
21
21
|
worker = @worker_queue.pop
|
22
22
|
worker.multi_receive(events)
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module LogStash module OutputDelegatorStrategies class Shared
|
2
|
-
def initialize(
|
2
|
+
def initialize(klass, metric, execution_context, plugin_args)
|
3
3
|
@output = klass.new(plugin_args)
|
4
4
|
@output.metric = metric
|
5
5
|
@output.execution_context = execution_context
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
def register
|
9
9
|
@output.register
|
10
10
|
end
|
@@ -13,10 +13,10 @@ module LogStash module OutputDelegatorStrategies class Shared
|
|
13
13
|
@output.multi_receive(events)
|
14
14
|
end
|
15
15
|
|
16
|
-
def do_close
|
16
|
+
def do_close
|
17
17
|
@output.do_close
|
18
18
|
end
|
19
19
|
|
20
|
-
::LogStash::OutputDelegatorStrategyRegistry.instance.register(:shared, self)
|
20
|
+
::LogStash::OutputDelegatorStrategyRegistry.instance.register(:shared, self)
|
21
21
|
end; end; end
|
22
22
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module LogStash module OutputDelegatorStrategies class Single
|
2
|
-
def initialize(
|
2
|
+
def initialize(klass, metric, execution_context, plugin_args)
|
3
3
|
@output = klass.new(plugin_args)
|
4
4
|
@output.metric = metric
|
5
5
|
@output.execution_context = execution_context
|
@@ -9,7 +9,7 @@ module LogStash module OutputDelegatorStrategies class Single
|
|
9
9
|
def register
|
10
10
|
@output.register
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def multi_receive(events)
|
14
14
|
@mutex.synchronize do
|
15
15
|
@output.multi_receive(events)
|
data/lib/logstash/pipeline.rb
CHANGED
@@ -64,7 +64,7 @@ module LogStash; class BasePipeline
|
|
64
64
|
@plugin_factory = LogStash::Plugins::PluginFactory.new(
|
65
65
|
# use NullMetric if called in the BasePipeline context otherwise use the @metric value
|
66
66
|
@lir, LogStash::Plugins::PluginMetricFactory.new(pipeline_id, @metric || Instrument::NullMetric.new),
|
67
|
-
|
67
|
+
LogStash::Plugins::ExecutionContextFactory.new(@agent, self, @dlq_writer),
|
68
68
|
FilterDelegator
|
69
69
|
)
|
70
70
|
grammar = LogStashConfigParser.new
|
@@ -74,9 +74,7 @@ module LogStash; class BasePipeline
|
|
74
74
|
parsed_config.process_escape_sequences = settings.get_value("config.support_escapes")
|
75
75
|
config_code = parsed_config.compile
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
if settings.get_value("config.debug") && @logger.debug?
|
77
|
+
if settings.get_value("config.debug")
|
80
78
|
@logger.debug("Compiled pipeline code", default_logging_keys(:code => config_code))
|
81
79
|
end
|
82
80
|
|
@@ -238,7 +236,10 @@ module LogStash; class Pipeline < BasePipeline
|
|
238
236
|
collect_stats
|
239
237
|
collect_dlq_stats
|
240
238
|
|
241
|
-
@logger.
|
239
|
+
@logger.info("Starting pipeline", default_logging_keys(
|
240
|
+
"pipeline.workers" => @settings.get("pipeline.workers"),
|
241
|
+
"pipeline.batch.size" => @settings.get("pipeline.batch.size"),
|
242
|
+
"pipeline.batch.delay" => @settings.get("pipeline.batch.delay")))
|
242
243
|
|
243
244
|
@finished_execution = Concurrent::AtomicBoolean.new(false)
|
244
245
|
|
@@ -249,14 +250,14 @@ module LogStash; class Pipeline < BasePipeline
|
|
249
250
|
@finished_execution.make_true
|
250
251
|
rescue => e
|
251
252
|
close
|
252
|
-
logger.error("Pipeline aborted due to error", default_logging_keys(:exception => e, :backtrace => e.backtrace))
|
253
|
+
@logger.error("Pipeline aborted due to error", default_logging_keys(:exception => e, :backtrace => e.backtrace))
|
253
254
|
end
|
254
255
|
end
|
255
256
|
|
256
257
|
status = wait_until_started
|
257
258
|
|
258
259
|
if status
|
259
|
-
logger.
|
260
|
+
@logger.info("Pipeline started succesfully", default_logging_keys)
|
260
261
|
end
|
261
262
|
|
262
263
|
status
|
@@ -287,8 +288,6 @@ module LogStash; class Pipeline < BasePipeline
|
|
287
288
|
|
288
289
|
start_workers
|
289
290
|
|
290
|
-
@logger.info("Pipeline started", "pipeline.id" => @pipeline_id)
|
291
|
-
|
292
291
|
# Block until all inputs have stopped
|
293
292
|
# Generally this happens if SIGINT is sent and `shutdown` is called from an external thread
|
294
293
|
|
@@ -297,14 +296,13 @@ module LogStash; class Pipeline < BasePipeline
|
|
297
296
|
wait_inputs
|
298
297
|
transition_to_stopped
|
299
298
|
|
300
|
-
@logger.debug("Input plugins stopped! Will shutdown filter/output workers.", default_logging_keys)
|
301
|
-
|
302
299
|
shutdown_flusher
|
300
|
+
@logger.debug("Shutting down filter/output workers", default_logging_keys)
|
303
301
|
shutdown_workers
|
304
302
|
|
305
303
|
close
|
306
304
|
|
307
|
-
@logger.
|
305
|
+
@logger.info("Pipeline has terminated", default_logging_keys)
|
308
306
|
|
309
307
|
# exit code
|
310
308
|
return 0
|
@@ -378,12 +376,6 @@ module LogStash; class Pipeline < BasePipeline
|
|
378
376
|
config_metric.gauge(:dead_letter_queue_enabled, dlq_enabled?)
|
379
377
|
config_metric.gauge(:dead_letter_queue_path, @dlq_writer.get_path.to_absolute_path.to_s) if dlq_enabled?
|
380
378
|
|
381
|
-
|
382
|
-
@logger.info("Starting pipeline", default_logging_keys(
|
383
|
-
"pipeline.workers" => pipeline_workers,
|
384
|
-
"pipeline.batch.size" => batch_size,
|
385
|
-
"pipeline.batch.delay" => batch_delay,
|
386
|
-
"pipeline.max_inflight" => max_inflight))
|
387
379
|
if max_inflight > MAX_INFLIGHT_WARN_THRESHOLD
|
388
380
|
@logger.warn("CAUTION: Recommended inflight events max exceeded! Logstash will run with up to #{max_inflight} events in memory in your current configuration. If your message sizes are large this may cause instability with the default heap size. Please consider setting a non-standard heap size, changing the batch size (currently #{batch_size}), or changing the number of pipeline workers (currently #{pipeline_workers})", default_logging_keys)
|
389
381
|
end
|
@@ -565,19 +557,19 @@ module LogStash; class Pipeline < BasePipeline
|
|
565
557
|
# stopped
|
566
558
|
wait_for_workers
|
567
559
|
clear_pipeline_metrics
|
568
|
-
@logger.info("Pipeline terminated", "pipeline.id" => @pipeline_id)
|
569
560
|
end # def shutdown
|
570
561
|
|
571
562
|
def wait_for_workers
|
572
|
-
@
|
573
|
-
|
574
|
-
|
563
|
+
@worker_threads.each do |t|
|
564
|
+
t.join
|
565
|
+
@logger.debug("Worker terminated", default_logging_keys(:thread => t.inspect))
|
566
|
+
end
|
575
567
|
end
|
576
568
|
|
577
569
|
def stop_inputs
|
578
|
-
@logger.debug("
|
570
|
+
@logger.debug("Stopping inputs", default_logging_keys)
|
579
571
|
@inputs.each(&:do_stop)
|
580
|
-
@logger.debug("
|
572
|
+
@logger.debug("Stopped inputs", default_logging_keys)
|
581
573
|
end
|
582
574
|
|
583
575
|
# After `shutdown` is called from an external thread this is called from the main thread to
|