logstash-core 6.1.4-java → 6.2.0-java
Sign up to get free protection for your applications and to get access to all the features.
- 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
|