logstash-core 5.0.2-java → 5.1.1.1-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/gemspec_jars.rb +9 -0
- data/lib/logstash-core/logstash-core.jar +0 -0
- data/lib/logstash-core/logstash-core.rb +22 -0
- data/lib/logstash-core/version.rb +1 -1
- data/lib/logstash-core_jars.rb +20 -0
- data/lib/logstash/agent.rb +65 -14
- data/lib/logstash/api/commands/default_metadata.rb +2 -1
- data/lib/logstash/api/commands/stats.rb +3 -2
- data/lib/logstash/config/file.rb +0 -1
- data/lib/logstash/config/loader.rb +1 -0
- data/lib/logstash/config/mixin.rb +2 -6
- data/lib/logstash/environment.rb +25 -2
- data/lib/logstash/event_dispatcher.rb +40 -0
- data/lib/logstash/filter_delegator.rb +1 -1
- data/lib/logstash/filters/base.rb +10 -2
- data/lib/logstash/instrument/metric_store.rb +0 -1
- data/lib/logstash/instrument/metric_type/base.rb +0 -1
- data/lib/logstash/instrument/namespaced_null_metric.rb +54 -0
- data/lib/logstash/instrument/null_metric.rb +55 -46
- data/lib/logstash/instrument/periodic_poller/jvm.rb +26 -3
- data/lib/logstash/instrument/periodic_poller/load_average.rb +47 -0
- data/lib/logstash/instrument/snapshot.rb +0 -1
- data/lib/logstash/java_integration.rb +0 -1
- data/lib/logstash/logging/logger.rb +37 -4
- data/lib/logstash/outputs/base.rb +1 -1
- data/lib/logstash/patches.rb +1 -0
- data/lib/logstash/patches/exception_to_json.rb +5 -0
- data/lib/logstash/pipeline.rb +50 -17
- data/lib/logstash/plugin.rb +14 -48
- data/lib/logstash/plugins/hooks_registry.rb +57 -0
- data/lib/logstash/plugins/registry.rb +208 -45
- data/lib/logstash/runner.rb +10 -5
- data/lib/logstash/settings.rb +101 -9
- data/lib/logstash/universal_plugin.rb +13 -0
- data/lib/logstash/util/byte_value.rb +60 -0
- data/lib/logstash/util/loggable.rb +14 -2
- data/lib/logstash/util/safe_uri.rb +1 -0
- data/lib/logstash/util/time_value.rb +70 -0
- data/lib/logstash/util/wrapped_acked_queue.rb +347 -0
- data/lib/logstash/util/wrapped_synchronous_queue.rb +17 -33
- data/lib/logstash/version.rb +1 -1
- data/locales/en.yml +1 -1
- data/logstash-core.gemspec +13 -18
- data/spec/api/lib/api/node_stats_spec.rb +3 -1
- data/spec/api/lib/api/support/resource_dsl_methods.rb +14 -6
- data/spec/api/spec_helper.rb +1 -0
- data/spec/conditionals_spec.rb +3 -2
- data/spec/logstash/agent_spec.rb +142 -62
- data/spec/logstash/environment_spec.rb +38 -0
- data/spec/logstash/event_dispatcher_spec.rb +76 -0
- data/spec/logstash/filter_delegator_spec.rb +2 -1
- data/spec/logstash/instrument/namespaced_null_metric_spec.rb +33 -0
- data/spec/logstash/instrument/null_metric_spec.rb +9 -5
- data/spec/logstash/instrument/periodic_poller/jvm_spec.rb +40 -0
- data/spec/logstash/instrument/periodic_poller/load_average_spec.rb +91 -0
- data/spec/logstash/output_delegator_spec.rb +2 -1
- data/spec/logstash/patches_spec.rb +15 -4
- data/spec/logstash/pipeline_pq_file_spec.rb +131 -0
- data/spec/logstash/pipeline_spec.rb +21 -17
- data/spec/logstash/plugin_spec.rb +4 -16
- data/spec/logstash/plugins/hooks_registry_spec.rb +60 -0
- data/spec/logstash/plugins/registry_spec.rb +22 -14
- data/spec/logstash/settings/bytes_spec.rb +53 -0
- data/spec/logstash/settings/time_value_spec.rb +31 -0
- data/spec/logstash/settings/writable_directory_spec.rb +125 -0
- data/spec/logstash/settings_spec.rb +39 -0
- data/spec/logstash/util/byte_value_spec.rb +33 -0
- data/spec/logstash/util/time_value_spec.rb +59 -0
- data/spec/logstash/util/wrapped_synchronous_queue_spec.rb +2 -2
- data/spec/logstash/webserver_spec.rb +4 -7
- data/spec/support/helpers.rb +8 -0
- data/spec/support/mocks_classes.rb +61 -31
- metadata +73 -20
- data/lib/jars.rb +0 -7
- data/lib/logstash/config/registry.rb +0 -13
- data/lib/logstash/inputs/metrics.rb +0 -47
- data/spec/logstash/inputs/metrics_spec.rb +0 -51
- data/vendor/jars/com/fasterxml/jackson/core/jackson-core/2.7.4/jackson-core-2.7.4.jar +0 -0
- data/vendor/jars/com/fasterxml/jackson/core/jackson-databind/2.7.4/jackson-databind-2.7.4.jar +0 -0
- data/vendor/jars/org/apache/logging/log4j/log4j-1.2-api/2.6.2/log4j-1.2-api-2.6.2.jar +0 -0
- data/vendor/jars/org/apache/logging/log4j/log4j-api/2.6.2/log4j-api-2.6.2.jar +0 -0
- data/vendor/jars/org/apache/logging/log4j/log4j-core/2.6.2/log4j-core-2.6.2.jar +0 -0
- data/vendor/jars/org/logstash/logstash-core/5.0.2/logstash-core-5.0.2.jar +0 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/instrument/null_metric"
|
|
3
|
+
|
|
4
|
+
module LogStash module Instrument
|
|
5
|
+
# This class acts a a proxy between the metric library and the user calls.
|
|
6
|
+
#
|
|
7
|
+
# This is the class that plugins authors will use to interact with the `MetricStore`
|
|
8
|
+
# It has the same public interface as `Metric` class but doesnt require to send
|
|
9
|
+
# the namespace on every call.
|
|
10
|
+
#
|
|
11
|
+
# @see Logstash::Instrument::Metric
|
|
12
|
+
class NamespacedNullMetric
|
|
13
|
+
attr_reader :namespace_name
|
|
14
|
+
# Create metric with a specific namespace
|
|
15
|
+
#
|
|
16
|
+
# @param metric [LogStash::Instrument::Metric] The metric instance to proxy
|
|
17
|
+
# @param namespace [Array] The namespace to use
|
|
18
|
+
def initialize(metric = nil, namespace_name = :null)
|
|
19
|
+
@metric = metric
|
|
20
|
+
@namespace_name = Array(namespace_name)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def increment(key, value = 1)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def decrement(key, value = 1)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def gauge(key, value)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def report_time(key, duration)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def time(key, &block)
|
|
36
|
+
if block_given?
|
|
37
|
+
yield
|
|
38
|
+
else
|
|
39
|
+
::LogStash::Instrument::NullMetric::NullTimedExecution
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def collector
|
|
44
|
+
@metric.collector
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def namespace(name)
|
|
48
|
+
NamespacedNullMetric.new(metric, namespace_name + Array(name))
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
attr_reader :metric
|
|
53
|
+
end
|
|
54
|
+
end; end
|
|
@@ -2,50 +2,59 @@
|
|
|
2
2
|
require "logstash/instrument/metric"
|
|
3
3
|
|
|
4
4
|
module LogStash module Instrument
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
5
|
+
# This class is used in the context when we disable the metric collection
|
|
6
|
+
# for specific plugin to replace the `NamespacedMetric` class with this one
|
|
7
|
+
# which doesn't produce any metric to the collector.
|
|
8
|
+
class NullMetric
|
|
9
|
+
attr_reader :namespace_name, :collector
|
|
10
|
+
|
|
11
|
+
def initialize(collector = nil)
|
|
12
|
+
@collector = collector
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def increment(namespace, key, value = 1)
|
|
16
|
+
Metric.validate_key!(key)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def decrement(namespace, key, value = 1)
|
|
20
|
+
Metric.validate_key!(key)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def gauge(namespace, key, value)
|
|
24
|
+
Metric.validate_key!(key)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def report_time(namespace, key, duration)
|
|
28
|
+
Metric.validate_key!(key)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# We have to manually redefine this method since it can return an
|
|
32
|
+
# object this object also has to be implemented as a NullObject
|
|
33
|
+
def time(namespace, key)
|
|
34
|
+
Metric.validate_key!(key)
|
|
35
|
+
if block_given?
|
|
36
|
+
yield
|
|
37
|
+
else
|
|
38
|
+
NullTimedExecution
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def namespace(name)
|
|
43
|
+
raise MetricNoNamespaceProvided if name.nil? || name.empty?
|
|
44
|
+
NamespacedNullMetric.new(self, name)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def self.validate_key!(key)
|
|
48
|
+
raise MetricNoKeyProvided if key.nil? || key.empty?
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
# Null implementation of the internal timer class
|
|
53
|
+
#
|
|
54
|
+
# @see LogStash::Instrument::TimedExecution`
|
|
55
|
+
class NullTimedExecution
|
|
56
|
+
def self.stop
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
51
60
|
end; end
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
|
|
2
1
|
# encoding: utf-8
|
|
3
2
|
require "logstash/instrument/periodic_poller/base"
|
|
3
|
+
require "logstash/instrument/periodic_poller/load_average"
|
|
4
|
+
require "logstash/environment"
|
|
4
5
|
require "jrmonitor"
|
|
5
6
|
require "set"
|
|
6
7
|
|
|
7
8
|
java_import 'java.lang.management.ManagementFactory'
|
|
8
9
|
java_import 'java.lang.management.OperatingSystemMXBean'
|
|
9
10
|
java_import 'java.lang.management.GarbageCollectorMXBean'
|
|
11
|
+
java_import 'java.lang.management.RuntimeMXBean'
|
|
10
12
|
java_import 'com.sun.management.UnixOperatingSystemMXBean'
|
|
11
13
|
java_import 'javax.management.MBeanServer'
|
|
12
14
|
java_import 'javax.management.ObjectName'
|
|
@@ -32,21 +34,23 @@ module LogStash module Instrument module PeriodicPoller
|
|
|
32
34
|
end
|
|
33
35
|
end
|
|
34
36
|
|
|
37
|
+
|
|
35
38
|
attr_reader :metric
|
|
36
39
|
|
|
37
40
|
def initialize(metric, options = {})
|
|
38
41
|
super(metric, options)
|
|
39
42
|
@metric = metric
|
|
43
|
+
@load_average = LoadAverage.create
|
|
40
44
|
end
|
|
41
45
|
|
|
42
46
|
def collect
|
|
43
47
|
raw = JRMonitor.memory.generate
|
|
44
|
-
|
|
45
|
-
collect_non_heap_metrics(raw)
|
|
48
|
+
collect_jvm_metrics(raw)
|
|
46
49
|
collect_pools_metrics(raw)
|
|
47
50
|
collect_threads_metrics
|
|
48
51
|
collect_process_metrics
|
|
49
52
|
collect_gc_stats
|
|
53
|
+
collect_load_average
|
|
50
54
|
end
|
|
51
55
|
|
|
52
56
|
private
|
|
@@ -97,6 +101,25 @@ module LogStash module Instrument module PeriodicPoller
|
|
|
97
101
|
metric.gauge(cpu_path, :total_in_millis, cpu_metrics["total_in_millis"])
|
|
98
102
|
|
|
99
103
|
metric.gauge(path + [:mem], :total_virtual_in_bytes, process_metrics["mem"]["total_virtual_in_bytes"])
|
|
104
|
+
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def collect_load_average
|
|
108
|
+
begin
|
|
109
|
+
load_average = @load_average.get
|
|
110
|
+
rescue => e
|
|
111
|
+
logger.debug("Can't retrieve load average", :exception => e.class.name, :message => e.message)
|
|
112
|
+
load_average = nil
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
metric.gauge([:jvm, :process, :cpu], :load_average, load_average) unless load_average.nil?
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def collect_jvm_metrics(data)
|
|
119
|
+
runtime_mx_bean = ManagementFactory.getRuntimeMXBean()
|
|
120
|
+
metric.gauge([:jvm], :uptime_in_millis, runtime_mx_bean.getUptime())
|
|
121
|
+
collect_heap_metrics(data)
|
|
122
|
+
collect_non_heap_metrics(data)
|
|
100
123
|
end
|
|
101
124
|
|
|
102
125
|
def collect_heap_metrics(data)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module LogStash module Instrument module PeriodicPoller
|
|
3
|
+
class LoadAverage
|
|
4
|
+
class Windows
|
|
5
|
+
def self.get
|
|
6
|
+
nil
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class Linux
|
|
11
|
+
LOAD_AVG_FILE = "/proc/loadavg"
|
|
12
|
+
TOKEN_SEPARATOR = " "
|
|
13
|
+
|
|
14
|
+
def self.get
|
|
15
|
+
load_average = ::File.read(LOAD_AVG_FILE).chomp.split(TOKEN_SEPARATOR)
|
|
16
|
+
|
|
17
|
+
{
|
|
18
|
+
:"1m" => load_average[0].to_f,
|
|
19
|
+
:"5m" => load_average[1].to_f,
|
|
20
|
+
:"15m" => load_average[2].to_f
|
|
21
|
+
}
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class Other
|
|
26
|
+
def self.get()
|
|
27
|
+
load_average_1m = ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage()
|
|
28
|
+
|
|
29
|
+
return nil if load_average_1m.nil?
|
|
30
|
+
|
|
31
|
+
{
|
|
32
|
+
:"1m" => load_average_1m
|
|
33
|
+
}
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.create
|
|
38
|
+
if LogStash::Environment.windows?
|
|
39
|
+
Windows
|
|
40
|
+
elsif LogStash::Environment.linux?
|
|
41
|
+
Linux
|
|
42
|
+
else
|
|
43
|
+
Other
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end end end
|
|
@@ -3,11 +3,12 @@ require "uri"
|
|
|
3
3
|
|
|
4
4
|
module LogStash
|
|
5
5
|
module Logging
|
|
6
|
+
java_import org.apache.logging.log4j.Level
|
|
7
|
+
java_import org.apache.logging.log4j.LogManager
|
|
8
|
+
java_import org.apache.logging.log4j.core.config.Configurator
|
|
9
|
+
java_import org.apache.logging.log4j.core.config.DefaultConfiguration
|
|
10
|
+
|
|
6
11
|
class Logger
|
|
7
|
-
java_import org.apache.logging.log4j.Level
|
|
8
|
-
java_import org.apache.logging.log4j.LogManager
|
|
9
|
-
java_import org.apache.logging.log4j.core.config.Configurator
|
|
10
|
-
java_import org.apache.logging.log4j.core.config.DefaultConfiguration
|
|
11
12
|
@@config_mutex = Mutex.new
|
|
12
13
|
@@logging_context = nil
|
|
13
14
|
|
|
@@ -90,5 +91,37 @@ module LogStash
|
|
|
90
91
|
return @@logging_context
|
|
91
92
|
end
|
|
92
93
|
end
|
|
94
|
+
|
|
95
|
+
class SlowLogger
|
|
96
|
+
def initialize(name, warn_threshold, info_threshold, debug_threshold, trace_threshold)
|
|
97
|
+
slowlog_name = ["slowlog", name].join('.')
|
|
98
|
+
@slowlogger = LogManager.getLogger(slowlog_name)
|
|
99
|
+
@warn_threshold = warn_threshold
|
|
100
|
+
@info_threshold = info_threshold
|
|
101
|
+
@debug_threshold = debug_threshold
|
|
102
|
+
@trace_threshold = trace_threshold
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def as_data(plugin_params, event, took_in_nanos)
|
|
106
|
+
{
|
|
107
|
+
:plugin_params => plugin_params,
|
|
108
|
+
:took_in_nanos => took_in_nanos,
|
|
109
|
+
:took_in_millis => took_in_nanos / 1000,
|
|
110
|
+
:event => event.to_json
|
|
111
|
+
}
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def on_event(message, plugin_params, event, took_in_nanos)
|
|
115
|
+
if @warn_threshold >= 0 and took_in_nanos > @warn_threshold
|
|
116
|
+
@slowlogger.warn(message, as_data(plugin_params, event, took_in_nanos))
|
|
117
|
+
elsif @info_threshold >= 0 and took_in_nanos > @info_threshold
|
|
118
|
+
@slowlogger.info(message, as_data(plugin_params, event, took_in_nanos))
|
|
119
|
+
elsif @debug_threshold >= 0 and took_in_nanos > @debug_threshold
|
|
120
|
+
@slowlogger.debug(message, as_data(plugin_params, event, took_in_nanos))
|
|
121
|
+
elsif @trace_threshold >= 0 and took_in_nanos > @trace_threshold
|
|
122
|
+
@slowlogger.trace(message, as_data(plugin_params, event, took_in_nanos))
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
93
126
|
end
|
|
94
127
|
end
|
|
@@ -84,7 +84,7 @@ class LogStash::Outputs::Base < LogStash::Plugin
|
|
|
84
84
|
end # def receive
|
|
85
85
|
|
|
86
86
|
public
|
|
87
|
-
# To be
|
|
87
|
+
# To be overridden in implementations
|
|
88
88
|
def multi_receive(events)
|
|
89
89
|
if @receives_encoded
|
|
90
90
|
self.multi_receive_encoded(codec.multi_encode(events))
|
data/lib/logstash/patches.rb
CHANGED
data/lib/logstash/pipeline.rb
CHANGED
|
@@ -4,17 +4,20 @@ require "stud/interval"
|
|
|
4
4
|
require "concurrent"
|
|
5
5
|
require "logstash/namespace"
|
|
6
6
|
require "logstash/errors"
|
|
7
|
+
require "logstash-core/logstash-core"
|
|
8
|
+
require "logstash/util/wrapped_acked_queue"
|
|
9
|
+
require "logstash/util/wrapped_synchronous_queue"
|
|
7
10
|
require "logstash/event"
|
|
8
11
|
require "logstash/config/file"
|
|
9
12
|
require "logstash/filters/base"
|
|
10
13
|
require "logstash/inputs/base"
|
|
11
14
|
require "logstash/outputs/base"
|
|
12
15
|
require "logstash/shutdown_watcher"
|
|
13
|
-
require "logstash/util/wrapped_synchronous_queue"
|
|
14
16
|
require "logstash/pipeline_reporter"
|
|
15
17
|
require "logstash/instrument/metric"
|
|
16
18
|
require "logstash/instrument/namespaced_metric"
|
|
17
19
|
require "logstash/instrument/null_metric"
|
|
20
|
+
require "logstash/instrument/namespaced_null_metric"
|
|
18
21
|
require "logstash/instrument/collector"
|
|
19
22
|
require "logstash/output_delegator"
|
|
20
23
|
require "logstash/filter_delegator"
|
|
@@ -91,16 +94,17 @@ module LogStash; class Pipeline
|
|
|
91
94
|
rescue => e
|
|
92
95
|
raise
|
|
93
96
|
end
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
@
|
|
97
|
-
@
|
|
98
|
-
# Note that @
|
|
97
|
+
@queue = build_queue_from_settings
|
|
98
|
+
@input_queue_client = @queue.write_client
|
|
99
|
+
@filter_queue_client = @queue.read_client
|
|
100
|
+
@signal_queue = Queue.new
|
|
101
|
+
# Note that @infilght_batches as a central mechanism for tracking inflight
|
|
99
102
|
# batches will fail if we have multiple read clients here.
|
|
100
103
|
@filter_queue_client.set_events_metric(metric.namespace([:stats, :events]))
|
|
101
104
|
@filter_queue_client.set_pipeline_metric(
|
|
102
105
|
metric.namespace([:stats, :pipelines, pipeline_id.to_s.to_sym, :events])
|
|
103
106
|
)
|
|
107
|
+
|
|
104
108
|
@events_filtered = Concurrent::AtomicFixnum.new(0)
|
|
105
109
|
@events_consumed = Concurrent::AtomicFixnum.new(0)
|
|
106
110
|
|
|
@@ -111,6 +115,32 @@ module LogStash; class Pipeline
|
|
|
111
115
|
@flushing = Concurrent::AtomicReference.new(false)
|
|
112
116
|
end # def initialize
|
|
113
117
|
|
|
118
|
+
def build_queue_from_settings
|
|
119
|
+
queue_type = settings.get("queue.type")
|
|
120
|
+
queue_page_capacity = settings.get("queue.page_capacity")
|
|
121
|
+
queue_max_bytes = settings.get("queue.max_bytes")
|
|
122
|
+
queue_max_events = settings.get("queue.max_events")
|
|
123
|
+
checkpoint_max_acks = settings.get("queue.checkpoint.acks")
|
|
124
|
+
checkpoint_max_writes = settings.get("queue.checkpoint.writes")
|
|
125
|
+
checkpoint_max_interval = settings.get("queue.checkpoint.interval")
|
|
126
|
+
|
|
127
|
+
if queue_type == "memory_acked"
|
|
128
|
+
# memory_acked is used in tests/specs
|
|
129
|
+
LogStash::Util::WrappedAckedQueue.create_memory_based("", queue_page_capacity, queue_max_events, queue_max_bytes)
|
|
130
|
+
elsif queue_type == "memory"
|
|
131
|
+
# memory is the legacy and default setting
|
|
132
|
+
LogStash::Util::WrappedSynchronousQueue.new()
|
|
133
|
+
elsif queue_type == "persisted"
|
|
134
|
+
# persisted is the disk based acked queue
|
|
135
|
+
queue_path = settings.get("path.queue")
|
|
136
|
+
LogStash::Util::WrappedAckedQueue.create_file_based(queue_path, queue_page_capacity, queue_max_events, checkpoint_max_writes, checkpoint_max_acks, checkpoint_max_interval, queue_max_bytes)
|
|
137
|
+
else
|
|
138
|
+
raise(ConfigurationError, "invalid queue.type setting")
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
private :build_queue_from_settings
|
|
143
|
+
|
|
114
144
|
def ready?
|
|
115
145
|
@ready.value
|
|
116
146
|
end
|
|
@@ -167,6 +197,9 @@ module LogStash; class Pipeline
|
|
|
167
197
|
shutdown_flusher
|
|
168
198
|
shutdown_workers
|
|
169
199
|
|
|
200
|
+
@filter_queue_client.close
|
|
201
|
+
@queue.close
|
|
202
|
+
|
|
170
203
|
@logger.debug("Pipeline #{@pipeline_id} has been shutdown")
|
|
171
204
|
|
|
172
205
|
# exit code
|
|
@@ -241,12 +274,15 @@ module LogStash; class Pipeline
|
|
|
241
274
|
|
|
242
275
|
while running
|
|
243
276
|
batch = @filter_queue_client.take_batch
|
|
277
|
+
signal = @signal_queue.empty? ? NO_SIGNAL : @signal_queue.pop
|
|
278
|
+
running = !signal.shutdown?
|
|
279
|
+
|
|
244
280
|
@events_consumed.increment(batch.size)
|
|
245
|
-
|
|
281
|
+
|
|
246
282
|
filter_batch(batch)
|
|
247
283
|
|
|
248
|
-
if
|
|
249
|
-
flush_filters_to_batch(batch)
|
|
284
|
+
if signal.flush? || signal.shutdown?
|
|
285
|
+
flush_filters_to_batch(batch, :final => signal.shutdown?)
|
|
250
286
|
end
|
|
251
287
|
|
|
252
288
|
output_batch(batch)
|
|
@@ -256,11 +292,9 @@ module LogStash; class Pipeline
|
|
|
256
292
|
|
|
257
293
|
def filter_batch(batch)
|
|
258
294
|
batch.each do |event|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
batch.merge(e) unless e.cancelled?
|
|
263
|
-
end
|
|
295
|
+
filter_func(event).each do |e|
|
|
296
|
+
#these are both original and generated events
|
|
297
|
+
batch.merge(e) unless e.cancelled?
|
|
264
298
|
end
|
|
265
299
|
end
|
|
266
300
|
@filter_queue_client.add_filtered_metrics(batch)
|
|
@@ -382,7 +416,7 @@ module LogStash; class Pipeline
|
|
|
382
416
|
# Each worker thread will receive this exactly once!
|
|
383
417
|
@worker_threads.each do |t|
|
|
384
418
|
@logger.debug("Pushing shutdown", :thread => t.inspect)
|
|
385
|
-
@
|
|
419
|
+
@signal_queue.push(SHUTDOWN)
|
|
386
420
|
end
|
|
387
421
|
|
|
388
422
|
@worker_threads.each do |t|
|
|
@@ -467,7 +501,7 @@ module LogStash; class Pipeline
|
|
|
467
501
|
def flush
|
|
468
502
|
if @flushing.compare_and_set(false, true)
|
|
469
503
|
@logger.debug? && @logger.debug("Pushing flush onto pipeline")
|
|
470
|
-
@
|
|
504
|
+
@signal_queue.push(FLUSH)
|
|
471
505
|
end
|
|
472
506
|
end
|
|
473
507
|
|
|
@@ -485,7 +519,6 @@ module LogStash; class Pipeline
|
|
|
485
519
|
# @param batch [ReadClient::ReadBatch]
|
|
486
520
|
# @param options [Hash]
|
|
487
521
|
def flush_filters_to_batch(batch, options = {})
|
|
488
|
-
options[:final] = batch.shutdown_signal_received?
|
|
489
522
|
flush_filters(options) do |event|
|
|
490
523
|
unless event.cancelled?
|
|
491
524
|
@logger.debug? and @logger.debug("Pushing flushed events", :event => event)
|