logstash-core 6.3.2-java → 6.4.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/agent.rb +10 -6
- data/lib/logstash/api/modules/logging.rb +4 -0
- data/lib/logstash/api/service.rb +0 -1
- data/lib/logstash/bootstrap_check/default_config.rb +0 -2
- data/lib/logstash/bootstrap_check/persisted_queue_config.rb +0 -1
- data/lib/logstash/codecs/base.rb +2 -4
- data/lib/logstash/compiler.rb +2 -3
- data/lib/logstash/compiler/lscl.rb +0 -1
- data/lib/logstash/config/config_ast.rb +0 -1
- data/lib/logstash/config/cpu_core_strategy.rb +0 -1
- data/lib/logstash/config/defaults.rb +0 -1
- data/lib/logstash/config/file.rb +0 -2
- data/lib/logstash/config/mixin.rb +4 -7
- data/lib/logstash/config/modules_common.rb +0 -2
- data/lib/logstash/config/source/local.rb +1 -3
- data/lib/logstash/config/source/modules.rb +0 -2
- data/lib/logstash/config/source/multi_local.rb +0 -1
- data/lib/logstash/config/source_loader.rb +1 -2
- data/lib/logstash/dependency_report.rb +19 -6
- data/lib/logstash/elasticsearch_client.rb +0 -2
- data/lib/logstash/environment.rb +3 -2
- data/lib/logstash/errors.rb +1 -15
- data/lib/logstash/event.rb +0 -1
- data/lib/logstash/event_dispatcher.rb +1 -40
- data/lib/logstash/execution_context.rb +2 -19
- data/lib/logstash/filters/base.rb +0 -2
- data/lib/logstash/inputs/base.rb +2 -4
- data/lib/logstash/inputs/threadable.rb +2 -3
- data/lib/logstash/instrument/collector.rb +0 -2
- data/lib/logstash/instrument/metric.rb +1 -105
- data/lib/logstash/instrument/namespaced_metric.rb +1 -58
- data/lib/logstash/instrument/namespaced_null_metric.rb +1 -58
- data/lib/logstash/instrument/null_metric.rb +2 -71
- data/lib/logstash/instrument/periodic_poller/base.rb +0 -1
- data/lib/logstash/instrument/periodic_poller/cgroup.rb +0 -1
- data/lib/logstash/java_pipeline.rb +33 -222
- data/lib/logstash/json.rb +0 -1
- data/lib/logstash/logging.rb +0 -2
- data/lib/logstash/logging/logger.rb +1 -159
- data/lib/logstash/modules/cli_parser.rb +0 -4
- data/lib/logstash/modules/elasticsearch_config.rb +0 -3
- data/lib/logstash/modules/elasticsearch_importer.rb +0 -3
- data/lib/logstash/modules/elasticsearch_resource.rb +0 -1
- data/lib/logstash/modules/file_reader.rb +0 -2
- data/lib/logstash/modules/kibana_base.rb +0 -1
- data/lib/logstash/modules/kibana_client.rb +0 -2
- data/lib/logstash/modules/kibana_config.rb +0 -3
- data/lib/logstash/modules/kibana_dashboards.rb +0 -2
- data/lib/logstash/modules/kibana_importer.rb +0 -3
- data/lib/logstash/modules/kibana_resource.rb +0 -1
- data/lib/logstash/modules/kibana_settings.rb +0 -2
- data/lib/logstash/modules/logstash_config.rb +0 -1
- data/lib/logstash/modules/resource_base.rb +0 -1
- data/lib/logstash/modules/scaffold.rb +0 -3
- data/lib/logstash/modules/settings_merger.rb +0 -2
- data/lib/logstash/namespace.rb +2 -15
- data/lib/logstash/outputs/base.rb +3 -5
- data/lib/logstash/patches/clamp.rb +6 -0
- data/lib/logstash/pipeline.rb +38 -180
- data/lib/logstash/pipeline_action/create.rb +0 -2
- data/lib/logstash/pipeline_action/reload.rb +1 -4
- data/lib/logstash/pipeline_action/stop.rb +0 -2
- data/lib/logstash/pipeline_reporter.rb +2 -108
- data/lib/logstash/plugin.rb +4 -7
- data/lib/logstash/plugins/hooks_registry.rb +1 -63
- data/lib/logstash/plugins/registry.rb +3 -2
- data/lib/logstash/runner.rb +6 -7
- data/lib/logstash/settings.rb +4 -5
- data/lib/logstash/shutdown_watcher.rb +0 -119
- data/lib/logstash/universal_plugin.rb +1 -13
- data/lib/logstash/util.rb +0 -1
- data/lib/logstash/util/buftok.rb +1 -139
- data/lib/logstash/util/byte_value.rb +2 -3
- data/lib/logstash/util/charset.rb +0 -1
- data/lib/logstash/util/cloud_setting_auth.rb +0 -1
- data/lib/logstash/util/cloud_setting_id.rb +20 -8
- data/lib/logstash/util/dead_letter_queue_manager.rb +2 -61
- data/lib/logstash/util/decorators.rb +0 -1
- data/lib/logstash/util/loggable.rb +1 -31
- data/lib/logstash/util/modules_setting_array.rb +2 -2
- data/lib/logstash/util/password.rb +0 -1
- data/lib/logstash/util/plugin_version.rb +0 -1
- data/lib/logstash/util/safe_uri.rb +7 -8
- data/lib/logstash/util/secretstore.rb +1 -38
- data/lib/logstash/util/substitution_variables.rb +4 -5
- data/lib/logstash/util/worker_threads_default_printer.rb +0 -1
- data/locales/en.yml +28 -1
- data/spec/logstash/config/mixin_spec.rb +4 -4
- data/spec/logstash/converge_result_spec.rb +0 -1
- data/spec/logstash/event_dispatcher_spec.rb +0 -2
- data/spec/logstash/event_spec.rb +22 -26
- data/spec/logstash/execution_context_spec.rb +0 -2
- data/spec/logstash/filter_delegator_spec.rb +12 -28
- data/spec/logstash/inputs/base_spec.rb +4 -5
- data/spec/logstash/instrument/metric_spec.rb +0 -1
- data/spec/logstash/instrument/namespaced_metric_spec.rb +0 -2
- data/spec/logstash/instrument/namespaced_null_metric_spec.rb +1 -3
- data/spec/logstash/instrument/null_metric_spec.rb +1 -4
- data/spec/logstash/instrument/periodic_poller/base_spec.rb +0 -1
- data/spec/logstash/instrument/periodic_poller/os_spec.rb +0 -1
- data/spec/logstash/instrument/wrapped_write_client_spec.rb +0 -1
- data/spec/logstash/java_filter_delegator_spec.rb +0 -3
- data/spec/logstash/java_integration_spec.rb +0 -1
- data/spec/logstash/java_pipeline_spec.rb +1 -4
- data/spec/logstash/modules/cli_parser_spec.rb +1 -3
- data/spec/logstash/modules/scaffold_spec.rb +0 -1
- data/spec/logstash/outputs/base_spec.rb +9 -10
- data/spec/logstash/pipeline_action/create_spec.rb +2 -3
- data/spec/logstash/pipeline_action/reload_spec.rb +1 -2
- data/spec/logstash/pipeline_action/stop_spec.rb +0 -1
- data/spec/logstash/pipeline_dlq_commit_spec.rb +0 -6
- data/spec/logstash/pipeline_reporter_spec.rb +18 -4
- data/spec/logstash/pipeline_spec.rb +2 -6
- data/spec/logstash/plugin_spec.rb +1 -2
- data/spec/logstash/plugins/hooks_registry_spec.rb +0 -2
- data/spec/logstash/queue_factory_spec.rb +0 -1
- data/spec/logstash/runner_spec.rb +16 -9
- data/spec/logstash/settings/modules_spec.rb +3 -3
- data/spec/logstash/shutdown_watcher_spec.rb +0 -27
- data/spec/logstash/state_resolver_spec.rb +0 -1
- data/spec/logstash/util/buftok_spec.rb +0 -1
- data/spec/logstash/util/cloud_setting_id_spec.rb +55 -2
- data/spec/logstash/util/secretstore_spec.rb +10 -10
- data/spec/logstash/util/wrapped_synchronous_queue_spec.rb +2 -2
- data/versions-gem-copy.yml +2 -2
- metadata +2 -16
- data/lib/logstash/bootstrap_check/bad_java.rb +0 -16
- data/lib/logstash/bootstrap_check/bad_ruby.rb +0 -12
- data/lib/logstash/converge_result.rb +0 -103
- data/lib/logstash/instrument/global_metrics.rb +0 -13
- data/lib/logstash/instrument/snapshot.rb +0 -15
- data/lib/logstash/java_integration.rb +0 -116
- data/lib/logstash/logging/json.rb +0 -21
- data/lib/logstash/plugins/plugin_factory.rb +0 -107
- data/lib/logstash/queue_factory.rb +0 -34
- data/lib/logstash/util/retryable.rb +0 -40
- data/spec/logstash/output_delegator_spec.rb +0 -201
- data/spec/logstash/timestamp_spec.rb +0 -45
|
@@ -2,9 +2,6 @@
|
|
|
2
2
|
require "logstash/pipeline_action/base"
|
|
3
3
|
require "logstash/pipeline_action/create"
|
|
4
4
|
require "logstash/pipeline_action/stop"
|
|
5
|
-
require "logstash/errors"
|
|
6
|
-
require "logstash/util/loggable"
|
|
7
|
-
require "logstash/converge_result"
|
|
8
5
|
|
|
9
6
|
module LogStash module PipelineAction
|
|
10
7
|
class Reload < Base
|
|
@@ -33,7 +30,7 @@ module LogStash module PipelineAction
|
|
|
33
30
|
begin
|
|
34
31
|
pipeline_validator =
|
|
35
32
|
if @pipeline_config.settings.get_value("pipeline.java_execution")
|
|
36
|
-
LogStash::JavaBasePipeline.new(@pipeline_config)
|
|
33
|
+
LogStash::JavaBasePipeline.new(@pipeline_config, nil, logger, nil)
|
|
37
34
|
else
|
|
38
35
|
LogStash::BasePipeline.new(@pipeline_config)
|
|
39
36
|
end
|
|
@@ -1,108 +1,2 @@
|
|
|
1
|
-
#
|
|
2
|
-
require
|
|
3
|
-
|
|
4
|
-
module LogStash; class PipelineReporter
|
|
5
|
-
attr_reader :logger, :pipeline
|
|
6
|
-
|
|
7
|
-
# This is an immutable copy of the pipeline state,
|
|
8
|
-
# It is a proxy to a hash to allow us to add methods dynamically to the hash
|
|
9
|
-
class Snapshot
|
|
10
|
-
def initialize(data)
|
|
11
|
-
@data = data
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def to_hash
|
|
15
|
-
@data
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def to_simple_hash
|
|
19
|
-
{"inflight_count" => inflight_count, "stalling_thread_info" => format_threads_by_plugin}
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def to_str
|
|
23
|
-
to_simple_hash.to_s
|
|
24
|
-
end
|
|
25
|
-
alias_method :to_s, :to_str
|
|
26
|
-
|
|
27
|
-
def method_missing(meth)
|
|
28
|
-
@data[meth]
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def format_threads_by_plugin
|
|
32
|
-
stalled_plugins = {}
|
|
33
|
-
stalling_threads_info.each do |thr|
|
|
34
|
-
key = (thr.delete("plugin") || "other")
|
|
35
|
-
stalled_plugins[key] ||= []
|
|
36
|
-
stalled_plugins[key] << thr
|
|
37
|
-
end
|
|
38
|
-
stalled_plugins
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def initialize(logger, pipeline)
|
|
43
|
-
@logger = logger
|
|
44
|
-
@pipeline = pipeline
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
# The main way of accessing data from the reporter,,
|
|
48
|
-
# this provides a (more or less) consistent snapshot of what's going on in the
|
|
49
|
-
# pipeline with some extra decoration
|
|
50
|
-
def snapshot
|
|
51
|
-
Snapshot.new(self.to_hash)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def to_hash
|
|
55
|
-
# pipeline.filter_queue_client.inflight_batches is synchronized
|
|
56
|
-
batch_map = pipeline.filter_queue_client.inflight_batches
|
|
57
|
-
worker_states_snap = worker_states(batch_map) # We only want to run this once
|
|
58
|
-
inflight_count = worker_states_snap.map {|s| s[:inflight_count]}.reduce(0, :+)
|
|
59
|
-
{
|
|
60
|
-
:events_filtered => events_filtered,
|
|
61
|
-
:events_consumed => events_consumed,
|
|
62
|
-
:inflight_count => inflight_count,
|
|
63
|
-
:worker_states => worker_states_snap,
|
|
64
|
-
:output_info => output_info,
|
|
65
|
-
:thread_info => pipeline.plugin_threads_info,
|
|
66
|
-
:stalling_threads_info => pipeline.stalling_threads_info
|
|
67
|
-
}
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
private
|
|
71
|
-
|
|
72
|
-
def events_filtered
|
|
73
|
-
pipeline.events_filtered.sum
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def events_consumed
|
|
77
|
-
pipeline.events_consumed.sum
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def plugin_threads
|
|
81
|
-
pipeline.plugin_threads
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
# Not threadsafe! ensure synchronization
|
|
85
|
-
def worker_states(batch_map)
|
|
86
|
-
pipeline.worker_threads.map.with_index do |thread, idx|
|
|
87
|
-
status = thread.status || "dead"
|
|
88
|
-
batch = batch_map[thread]
|
|
89
|
-
inflight_count = batch ? batch.size : 0
|
|
90
|
-
{
|
|
91
|
-
:status => status,
|
|
92
|
-
:alive => thread.alive?,
|
|
93
|
-
:index => idx,
|
|
94
|
-
:inflight_count => inflight_count
|
|
95
|
-
}
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
def output_info
|
|
100
|
-
pipeline.outputs.map do |output_delegator|
|
|
101
|
-
{
|
|
102
|
-
:type => output_delegator.config_name,
|
|
103
|
-
:id => output_delegator.id,
|
|
104
|
-
:concurrency => output_delegator.concurrency,
|
|
105
|
-
}
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
end end
|
|
1
|
+
# The contents of this file have been ported to Java. It is included for for compatibility
|
|
2
|
+
# with plugins that directly require it.
|
data/lib/logstash/plugin.rb
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
require "logstash/namespace"
|
|
3
|
-
require "logstash/logging"
|
|
4
2
|
require "logstash/config/mixin"
|
|
5
|
-
require "logstash/instrument/null_metric"
|
|
6
|
-
require "logstash/util/dead_letter_queue_manager"
|
|
7
3
|
require "concurrent"
|
|
8
4
|
require "securerandom"
|
|
9
5
|
|
|
@@ -21,9 +17,9 @@ class LogStash::Plugin
|
|
|
21
17
|
# for a specific plugin.
|
|
22
18
|
config :enable_metric, :validate => :boolean, :default => true
|
|
23
19
|
|
|
24
|
-
# Add a unique `ID` to the plugin configuration. If no ID is specified, Logstash will generate one.
|
|
25
|
-
# It is strongly recommended to set this ID in your configuration. This is particularly useful
|
|
26
|
-
# when you have two or more plugins of the same type, for example, if you have 2 grok filters.
|
|
20
|
+
# Add a unique `ID` to the plugin configuration. If no ID is specified, Logstash will generate one.
|
|
21
|
+
# It is strongly recommended to set this ID in your configuration. This is particularly useful
|
|
22
|
+
# when you have two or more plugins of the same type, for example, if you have 2 grok filters.
|
|
27
23
|
# Adding a named ID in this case will help in monitoring Logstash when using the monitoring APIs.
|
|
28
24
|
#
|
|
29
25
|
# [source,ruby]
|
|
@@ -137,6 +133,7 @@ class LogStash::Plugin
|
|
|
137
133
|
# Should I remove this now and make sure the pipeline invoke the Registry or I should wait for 6.0
|
|
138
134
|
# Its not really part of the public api but its used by the tests a lot to mock the plugins.
|
|
139
135
|
def self.lookup(type, name)
|
|
136
|
+
require "logstash/plugins/registry"
|
|
140
137
|
LogStash::PLUGIN_REGISTRY.lookup_pipeline_plugin(type, name)
|
|
141
138
|
end
|
|
142
139
|
end # class LogStash::Plugin
|
|
@@ -1,63 +1 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module LogStash module Plugins
|
|
3
|
-
# This calls allow logstash to expose the endpoints for listeners
|
|
4
|
-
class HooksRegistry
|
|
5
|
-
java_import "java.util.concurrent.ConcurrentHashMap"
|
|
6
|
-
java_import "java.util.concurrent.CopyOnWriteArrayList"
|
|
7
|
-
|
|
8
|
-
def initialize
|
|
9
|
-
@registered_emitters = ConcurrentHashMap.new
|
|
10
|
-
@registered_hooks = ConcurrentHashMap.new
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def register_emitter(emitter_scope, dispatcher)
|
|
14
|
-
@registered_emitters.put(emitter_scope, dispatcher)
|
|
15
|
-
sync_hooks
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def remove_emitter(emitter_scope)
|
|
19
|
-
@registered_emitters.remove(emitter_scope)
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def register_hooks(emitter_scope, callback)
|
|
23
|
-
callbacks = @registered_hooks.computeIfAbsent(emitter_scope) do
|
|
24
|
-
CopyOnWriteArrayList.new
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
callbacks.add(callback)
|
|
28
|
-
sync_hooks
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def emitters_count
|
|
32
|
-
@registered_emitters.size
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def hooks_count(emitter_scope = nil)
|
|
36
|
-
if emitter_scope.nil?
|
|
37
|
-
@registered_hooks.elements().collect(&:size).reduce(0, :+)
|
|
38
|
-
else
|
|
39
|
-
callbacks = @registered_hooks.get(emitter_scope)
|
|
40
|
-
callbacks.nil? ? 0 : @registered_hooks.get(emitter_scope).size
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def registered_hook?(emitter_scope, klass)
|
|
45
|
-
callbacks = @registered_hooks[emitter_scope]
|
|
46
|
-
return false if callbacks.nil?
|
|
47
|
-
callbacks.collect(&:class).include?(klass)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
private
|
|
51
|
-
def sync_hooks
|
|
52
|
-
@registered_emitters.each do |emitter, dispatcher|
|
|
53
|
-
listeners = @registered_hooks.get(emitter)
|
|
54
|
-
|
|
55
|
-
unless listeners.nil?
|
|
56
|
-
listeners.each do |listener|
|
|
57
|
-
dispatcher.add_listener(listener)
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end end
|
|
1
|
+
# encoding: utf-8
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
require "rubygems/package"
|
|
3
|
-
require "logstash/util/loggable"
|
|
4
3
|
require "logstash/plugin"
|
|
5
|
-
require "logstash/plugins/hooks_registry"
|
|
6
4
|
require "logstash/modules/scaffold"
|
|
5
|
+
require "logstash/codecs/base"
|
|
6
|
+
require "logstash/filters/base"
|
|
7
|
+
require "logstash/outputs/base"
|
|
7
8
|
|
|
8
9
|
module LogStash module Plugins
|
|
9
10
|
class Registry
|
data/lib/logstash/runner.rb
CHANGED
|
@@ -18,7 +18,6 @@ end
|
|
|
18
18
|
require "clamp"
|
|
19
19
|
require "net/http"
|
|
20
20
|
|
|
21
|
-
require "logstash/namespace"
|
|
22
21
|
require "logstash-core/logstash-core"
|
|
23
22
|
require "logstash/environment"
|
|
24
23
|
require "logstash/modules/cli_parser"
|
|
@@ -28,15 +27,12 @@ LogStash::Environment.load_locale!
|
|
|
28
27
|
|
|
29
28
|
require "logstash/agent"
|
|
30
29
|
require "logstash/config/defaults"
|
|
31
|
-
require "logstash/shutdown_watcher"
|
|
32
30
|
require "logstash/patches/clamp"
|
|
33
31
|
require "logstash/settings"
|
|
34
32
|
require "logstash/version"
|
|
35
33
|
require 'logstash/plugins'
|
|
36
34
|
require "logstash/modules/util"
|
|
37
35
|
require "logstash/bootstrap_check/default_config"
|
|
38
|
-
require "logstash/bootstrap_check/bad_java"
|
|
39
|
-
require "logstash/bootstrap_check/bad_ruby"
|
|
40
36
|
require "logstash/bootstrap_check/persisted_queue_config"
|
|
41
37
|
require "set"
|
|
42
38
|
|
|
@@ -50,8 +46,6 @@ class LogStash::Runner < Clamp::StrictCommand
|
|
|
50
46
|
# Ordered list of check to run before starting logstash
|
|
51
47
|
# theses checks can be changed by a plugin loaded into memory.
|
|
52
48
|
DEFAULT_BOOTSTRAP_CHECKS = [
|
|
53
|
-
LogStash::BootstrapCheck::BadRuby,
|
|
54
|
-
LogStash::BootstrapCheck::BadJava,
|
|
55
49
|
LogStash::BootstrapCheck::DefaultConfig,
|
|
56
50
|
LogStash::BootstrapCheck::PersistedQueueConfig
|
|
57
51
|
]
|
|
@@ -74,6 +68,11 @@ class LogStash::Runner < Clamp::StrictCommand
|
|
|
74
68
|
:default => LogStash::SETTINGS.get_default("config.string"),
|
|
75
69
|
:attribute_name => "config.string"
|
|
76
70
|
|
|
71
|
+
option ["--field-reference-parser"], "MODE",
|
|
72
|
+
I18n.t("logstash.runner.flag.field-reference-parser"),
|
|
73
|
+
:attribute_name => "config.field_reference.parser",
|
|
74
|
+
:default => LogStash::SETTINGS.get_default("config.field_reference.parser")
|
|
75
|
+
|
|
77
76
|
# Module settings
|
|
78
77
|
option ["--modules"], "MODULES",
|
|
79
78
|
I18n.t("logstash.runner.flag.modules"),
|
|
@@ -281,7 +280,7 @@ class LogStash::Runner < Clamp::StrictCommand
|
|
|
281
280
|
|
|
282
281
|
return start_shell(setting("interactive"), binding) if setting("interactive")
|
|
283
282
|
|
|
284
|
-
module_parser = LogStash::Modules::CLIParser.new(
|
|
283
|
+
module_parser = LogStash::Modules::CLIParser.new(setting("modules_list"), setting("modules_variable_list"))
|
|
285
284
|
# Now populate Setting for modules.list with our parsed array.
|
|
286
285
|
@settings.set("modules.cli", module_parser.output)
|
|
287
286
|
|
data/lib/logstash/settings.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
require "logstash/util/loggable"
|
|
3
2
|
require "fileutils"
|
|
4
3
|
require "logstash/util/byte_value"
|
|
5
4
|
require "logstash/util/substitution_variables"
|
|
@@ -10,7 +9,7 @@ module LogStash
|
|
|
10
9
|
|
|
11
10
|
include LogStash::Util::SubstitutionVariables
|
|
12
11
|
include LogStash::Util::Loggable
|
|
13
|
-
|
|
12
|
+
|
|
14
13
|
def initialize
|
|
15
14
|
@settings = {}
|
|
16
15
|
# Theses settings were loaded from the yaml file
|
|
@@ -119,7 +118,7 @@ module LogStash
|
|
|
119
118
|
self.merge(deep_replace(flatten_hash(settings)), true)
|
|
120
119
|
self
|
|
121
120
|
end
|
|
122
|
-
|
|
121
|
+
|
|
123
122
|
def post_process
|
|
124
123
|
if @post_process_callbacks
|
|
125
124
|
@post_process_callbacks.each do |callback|
|
|
@@ -127,7 +126,7 @@ module LogStash
|
|
|
127
126
|
end
|
|
128
127
|
end
|
|
129
128
|
end
|
|
130
|
-
|
|
129
|
+
|
|
131
130
|
def on_post_process(&block)
|
|
132
131
|
@post_process_callbacks ||= []
|
|
133
132
|
@post_process_callbacks << block
|
|
@@ -439,7 +438,7 @@ module LogStash
|
|
|
439
438
|
def initialize(name, default=nil, strict=false)
|
|
440
439
|
super(name, ::String, default, strict)
|
|
441
440
|
end
|
|
442
|
-
|
|
441
|
+
|
|
443
442
|
def validate(path)
|
|
444
443
|
super(path)
|
|
445
444
|
|
|
@@ -1,120 +1 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
require "concurrent/atomic/atomic_fixnum"
|
|
3
|
-
require "concurrent/atomic/atomic_boolean"
|
|
4
|
-
|
|
5
|
-
module LogStash
|
|
6
|
-
class ShutdownWatcher
|
|
7
|
-
include LogStash::Util::Loggable
|
|
8
|
-
|
|
9
|
-
CHECK_EVERY = 1 # second
|
|
10
|
-
REPORT_EVERY = 5 # checks
|
|
11
|
-
ABORT_AFTER = 3 # stalled reports
|
|
12
|
-
|
|
13
|
-
attr_reader :cycle_period, :report_every, :abort_threshold
|
|
14
|
-
|
|
15
|
-
def initialize(pipeline, cycle_period=CHECK_EVERY, report_every=REPORT_EVERY, abort_threshold=ABORT_AFTER)
|
|
16
|
-
@pipeline = pipeline
|
|
17
|
-
@cycle_period = cycle_period
|
|
18
|
-
@report_every = report_every
|
|
19
|
-
@abort_threshold = abort_threshold
|
|
20
|
-
@reports = []
|
|
21
|
-
@attempts_count = Concurrent::AtomicFixnum.new(0)
|
|
22
|
-
@running = Concurrent::AtomicBoolean.new(false)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def self.unsafe_shutdown=(boolean)
|
|
26
|
-
@unsafe_shutdown = boolean
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def self.unsafe_shutdown?
|
|
30
|
-
@unsafe_shutdown
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def self.start(pipeline, cycle_period=CHECK_EVERY, report_every=REPORT_EVERY, abort_threshold=ABORT_AFTER)
|
|
34
|
-
controller = self.new(pipeline, cycle_period, report_every, abort_threshold)
|
|
35
|
-
Thread.new(controller) { |controller| controller.start }
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def logger
|
|
39
|
-
self.class.logger
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def attempts_count
|
|
43
|
-
@attempts_count.value
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def stop!
|
|
47
|
-
@running.make_false
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def stopped?
|
|
51
|
-
@running.false?
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def start
|
|
55
|
-
sleep(@cycle_period)
|
|
56
|
-
cycle_number = 0
|
|
57
|
-
stalled_count = 0
|
|
58
|
-
running!
|
|
59
|
-
Stud.interval(@cycle_period) do
|
|
60
|
-
@attempts_count.increment
|
|
61
|
-
break if stopped?
|
|
62
|
-
break unless @pipeline.thread.alive?
|
|
63
|
-
@reports << pipeline_report_snapshot
|
|
64
|
-
@reports.delete_at(0) if @reports.size > @report_every # expire old report
|
|
65
|
-
if cycle_number == (@report_every - 1) # it's report time!
|
|
66
|
-
logger.warn(@reports.last.to_s)
|
|
67
|
-
|
|
68
|
-
if shutdown_stalled?
|
|
69
|
-
logger.error("The shutdown process appears to be stalled due to busy or blocked plugins. Check the logs for more information.") if stalled_count == 0
|
|
70
|
-
stalled_count += 1
|
|
71
|
-
|
|
72
|
-
if self.class.unsafe_shutdown? && @abort_threshold == stalled_count
|
|
73
|
-
logger.fatal("Forcefully quitting logstash..")
|
|
74
|
-
force_exit()
|
|
75
|
-
break
|
|
76
|
-
end
|
|
77
|
-
else
|
|
78
|
-
stalled_count = 0
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
cycle_number = (cycle_number + 1) % @report_every
|
|
82
|
-
end
|
|
83
|
-
ensure
|
|
84
|
-
stop!
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def pipeline_report_snapshot
|
|
88
|
-
@pipeline.reporter.snapshot
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
# A pipeline shutdown is stalled if
|
|
92
|
-
# * at least REPORT_EVERY reports have been created
|
|
93
|
-
# * the inflight event count is in monotonically increasing
|
|
94
|
-
# * there are worker threads running which aren't blocked on SizedQueue pop/push
|
|
95
|
-
# * the stalled thread list is constant in the previous REPORT_EVERY reports
|
|
96
|
-
def shutdown_stalled?
|
|
97
|
-
return false unless @reports.size == @report_every #
|
|
98
|
-
# is stalled if inflight count is either constant or increasing
|
|
99
|
-
stalled_event_count = @reports.each_cons(2).all? do |prev_report, next_report|
|
|
100
|
-
prev_report.inflight_count <= next_report.inflight_count
|
|
101
|
-
end
|
|
102
|
-
if stalled_event_count
|
|
103
|
-
@reports.each_cons(2).all? do |prev_report, next_report|
|
|
104
|
-
prev_report.stalling_threads == next_report.stalling_threads
|
|
105
|
-
end
|
|
106
|
-
else
|
|
107
|
-
false
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
def force_exit
|
|
112
|
-
exit(-1)
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
private
|
|
116
|
-
def running!
|
|
117
|
-
@running.make_true
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
end
|