logstash-core 6.0.0.alpha1-java → 6.0.0.alpha2-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.jar +0 -0
- data/lib/logstash-core/version.rb +1 -1
- data/lib/logstash/agent.rb +81 -45
- data/lib/logstash/api/commands/hot_threads_reporter.rb +3 -3
- data/lib/logstash/api/commands/node.rb +13 -6
- data/lib/logstash/api/commands/stats.rb +18 -6
- data/lib/logstash/api/modules/node.rb +7 -0
- data/lib/logstash/api/modules/node_stats.rb +12 -5
- data/lib/logstash/bootstrap_check/default_config.rb +3 -7
- data/lib/logstash/compiler.rb +33 -15
- data/lib/logstash/compiler/lscl.rb +16 -8
- data/lib/logstash/config/mixin.rb +5 -42
- data/lib/logstash/config/pipeline_config.rb +1 -1
- data/lib/logstash/config/source/local.rb +28 -13
- data/lib/logstash/config/source/multi_local.rb +72 -0
- data/lib/logstash/config/source_loader.rb +1 -2
- data/lib/logstash/environment.rb +12 -3
- data/lib/logstash/execution_context.rb +7 -3
- data/lib/logstash/inputs/base.rb +2 -0
- data/lib/logstash/instrument/metric_type.rb +0 -2
- data/lib/logstash/instrument/periodic_poller/jvm.rb +5 -5
- data/lib/logstash/instrument/periodic_poller/pq.rb +1 -1
- data/lib/logstash/outputs/base.rb +2 -0
- data/lib/logstash/pipeline.rb +31 -14
- data/lib/logstash/pipeline_action/create.rb +1 -2
- data/lib/logstash/pipeline_action/reload.rb +2 -1
- data/lib/logstash/pipeline_settings.rb +50 -0
- data/lib/logstash/plugin.rb +1 -0
- data/lib/logstash/runner.rb +7 -5
- data/lib/logstash/settings.rb +11 -3
- data/lib/logstash/shutdown_watcher.rb +26 -0
- data/lib/logstash/state_resolver.rb +1 -3
- data/lib/logstash/util/dead_letter_queue_manager.rb +61 -0
- data/lib/logstash/util/environment_variables.rb +43 -0
- data/lib/logstash/util/thread_dump.rb +3 -1
- data/lib/logstash/version.rb +1 -1
- data/locales/en.yml +4 -0
- data/logstash-core.gemspec +4 -1
- data/spec/logstash/agent/converge_spec.rb +36 -35
- data/spec/logstash/agent_spec.rb +48 -177
- data/spec/{api/lib/commands/stats.rb → logstash/api/commands/stats_spec.rb} +7 -2
- data/spec/{api/lib → logstash/api}/errors_spec.rb +1 -1
- data/spec/{api/lib/api → logstash/api/modules}/logging_spec.rb +1 -10
- data/spec/{api/lib/api → logstash/api/modules}/node_plugins_spec.rb +1 -2
- data/spec/{api/lib/api → logstash/api/modules}/node_spec.rb +9 -8
- data/spec/{api/lib/api → logstash/api/modules}/node_stats_spec.rb +11 -9
- data/spec/{api/lib/api → logstash/api/modules}/plugins_spec.rb +4 -3
- data/spec/{api/lib/api → logstash/api/modules}/root_spec.rb +2 -2
- data/spec/{api/lib → logstash/api}/rack_app_spec.rb +0 -0
- data/spec/logstash/compiler/compiler_spec.rb +72 -9
- data/spec/logstash/config/source/local_spec.rb +20 -4
- data/spec/logstash/config/source/multi_local_spec.rb +113 -0
- data/spec/logstash/execution_context_spec.rb +14 -4
- data/spec/logstash/inputs/base_spec.rb +1 -1
- data/spec/logstash/instrument/wrapped_write_client_spec.rb +34 -19
- data/spec/logstash/output_delegator_spec.rb +1 -1
- data/spec/logstash/outputs/base_spec.rb +1 -1
- data/spec/logstash/pipeline_action/reload_spec.rb +1 -1
- data/spec/logstash/pipeline_action/stop_spec.rb +1 -1
- data/spec/logstash/pipeline_dlq_commit_spec.rb +107 -0
- data/spec/logstash/pipeline_pq_file_spec.rb +3 -1
- data/spec/logstash/pipeline_reporter_spec.rb +2 -1
- data/spec/logstash/pipeline_spec.rb +54 -43
- data/spec/logstash/runner_spec.rb +27 -36
- data/spec/logstash/settings/array_coercible_spec.rb +65 -0
- data/spec/logstash/settings_spec.rb +91 -0
- data/spec/logstash/shutdown_watcher_spec.rb +10 -16
- data/spec/logstash/state_resolver_spec.rb +6 -4
- data/spec/support/helpers.rb +16 -3
- data/spec/support/shared_contexts.rb +26 -2
- metadata +42 -39
- data/lib/logstash/instrument/metric_type/mean.rb +0 -33
- data/spec/api/lib/api/support/resource_dsl_methods.rb +0 -87
- data/spec/api/spec_helper.rb +0 -106
@@ -11,7 +11,7 @@ module LogStash module Instrument module PeriodicPoller
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def collect
|
14
|
-
pipeline_id, pipeline = @agent.
|
14
|
+
pipeline_id, pipeline = @agent.with_running_pipelines {|pipelines| pipelines.first }
|
15
15
|
unless pipeline.nil?
|
16
16
|
pipeline.collect_stats
|
17
17
|
end
|
@@ -109,6 +109,8 @@ class LogStash::Outputs::Base < LogStash::Plugin
|
|
109
109
|
super
|
110
110
|
# There is no easy way to propage an instance variable into the codec, because the codec
|
111
111
|
# are created at the class level
|
112
|
+
# TODO(talevy): Codecs should have their own execution_context, for now they will inherit their
|
113
|
+
# parent plugin's
|
112
114
|
@codec.execution_context = context
|
113
115
|
context
|
114
116
|
end
|
data/lib/logstash/pipeline.rb
CHANGED
@@ -18,22 +18,28 @@ require "logstash/instrument/null_metric"
|
|
18
18
|
require "logstash/instrument/namespaced_null_metric"
|
19
19
|
require "logstash/instrument/collector"
|
20
20
|
require "logstash/instrument/wrapped_write_client"
|
21
|
+
require "logstash/util/dead_letter_queue_manager"
|
21
22
|
require "logstash/output_delegator"
|
22
23
|
require "logstash/filter_delegator"
|
23
24
|
require "logstash/queue_factory"
|
24
25
|
require "logstash/compiler"
|
25
26
|
require "logstash/execution_context"
|
26
27
|
|
28
|
+
java_import org.logstash.common.DeadLetterQueueFactory
|
29
|
+
java_import org.logstash.common.io.DeadLetterQueueWriter
|
30
|
+
|
27
31
|
module LogStash; class BasePipeline
|
28
32
|
include LogStash::Util::Loggable
|
29
33
|
|
30
34
|
attr_reader :settings, :config_str, :config_hash, :inputs, :filters, :outputs, :pipeline_id, :lir, :execution_context
|
35
|
+
attr_reader :pipeline_config
|
31
36
|
|
32
|
-
def initialize(
|
37
|
+
def initialize(pipeline_config, namespaced_metric = nil, agent = nil)
|
33
38
|
@logger = self.logger
|
34
39
|
|
35
|
-
@
|
36
|
-
@
|
40
|
+
@pipeline_config = pipeline_config
|
41
|
+
@config_str = pipeline_config.config_string
|
42
|
+
@settings = pipeline_config.settings
|
37
43
|
@config_hash = Digest::SHA1.hexdigest(@config_str)
|
38
44
|
|
39
45
|
@lir = compile_lir
|
@@ -42,14 +48,20 @@ module LogStash; class BasePipeline
|
|
42
48
|
# a unique id when auto-generating plugin ids
|
43
49
|
@plugin_counter ||= 0
|
44
50
|
|
45
|
-
@pipeline_id = settings.get_value("pipeline.id") || self.object_id
|
51
|
+
@pipeline_id = @settings.get_value("pipeline.id") || self.object_id
|
46
52
|
|
47
53
|
# A list of plugins indexed by id
|
48
54
|
@plugins_by_id = {}
|
49
55
|
@inputs = nil
|
50
56
|
@filters = nil
|
51
57
|
@outputs = nil
|
52
|
-
@
|
58
|
+
@agent = agent
|
59
|
+
|
60
|
+
if settings.get_value("dead_letter_queue.enable")
|
61
|
+
@dlq_writer = DeadLetterQueueFactory.getWriter(pipeline_id, settings.get_value("path.dead_letter_queue"))
|
62
|
+
else
|
63
|
+
@dlq_writer = LogStash::Util::DummyDeadLetterQueueWriter.new
|
64
|
+
end
|
53
65
|
|
54
66
|
grammar = LogStashConfigParser.new
|
55
67
|
parsed_config = grammar.parse(config_str)
|
@@ -73,7 +85,8 @@ module LogStash; class BasePipeline
|
|
73
85
|
end
|
74
86
|
|
75
87
|
def compile_lir
|
76
|
-
|
88
|
+
source_with_metadata = org.logstash.common.SourceWithMetadata.new("str", "pipeline", self.config_str)
|
89
|
+
LogStash::Compiler.compile_sources(source_with_metadata)
|
77
90
|
end
|
78
91
|
|
79
92
|
def plugin(plugin_type, name, *args)
|
@@ -100,16 +113,18 @@ module LogStash; class BasePipeline
|
|
100
113
|
|
101
114
|
klass = Plugin.lookup(plugin_type, name)
|
102
115
|
|
116
|
+
execution_context = ExecutionContext.new(self, @agent, id, klass.config_name, @dlq_writer)
|
117
|
+
|
103
118
|
if plugin_type == "output"
|
104
|
-
OutputDelegator.new(@logger, klass, type_scoped_metric,
|
119
|
+
OutputDelegator.new(@logger, klass, type_scoped_metric, execution_context, OutputDelegatorStrategyRegistry.instance, args)
|
105
120
|
elsif plugin_type == "filter"
|
106
|
-
FilterDelegator.new(@logger, klass, type_scoped_metric,
|
121
|
+
FilterDelegator.new(@logger, klass, type_scoped_metric, execution_context, args)
|
107
122
|
else # input
|
108
123
|
input_plugin = klass.new(args)
|
109
124
|
scoped_metric = type_scoped_metric.namespace(id.to_sym)
|
110
125
|
scoped_metric.gauge(:name, input_plugin.config_name)
|
111
126
|
input_plugin.metric = scoped_metric
|
112
|
-
input_plugin.execution_context =
|
127
|
+
input_plugin.execution_context = execution_context
|
113
128
|
input_plugin
|
114
129
|
end
|
115
130
|
end
|
@@ -147,7 +162,8 @@ module LogStash; class Pipeline < BasePipeline
|
|
147
162
|
|
148
163
|
MAX_INFLIGHT_WARN_THRESHOLD = 10_000
|
149
164
|
|
150
|
-
def initialize(
|
165
|
+
def initialize(pipeline_config, namespaced_metric = nil, agent = nil)
|
166
|
+
@settings = pipeline_config.settings
|
151
167
|
# This needs to be configured before we call super which will evaluate the code to make
|
152
168
|
# sure the metric instance is correctly send to the plugins to make the namespace scoping work
|
153
169
|
@metric = if namespaced_metric
|
@@ -180,6 +196,7 @@ module LogStash; class Pipeline < BasePipeline
|
|
180
196
|
)
|
181
197
|
@drain_queue = @settings.get_value("queue.drain")
|
182
198
|
|
199
|
+
|
183
200
|
@events_filtered = Concurrent::AtomicFixnum.new(0)
|
184
201
|
@events_consumed = Concurrent::AtomicFixnum.new(0)
|
185
202
|
|
@@ -191,8 +208,6 @@ module LogStash; class Pipeline < BasePipeline
|
|
191
208
|
@force_shutdown = Concurrent::AtomicBoolean.new(false)
|
192
209
|
end # def initialize
|
193
210
|
|
194
|
-
|
195
|
-
|
196
211
|
def ready?
|
197
212
|
@ready.value
|
198
213
|
end
|
@@ -230,7 +245,7 @@ module LogStash; class Pipeline < BasePipeline
|
|
230
245
|
# this is useful in the context of pipeline reloading
|
231
246
|
collect_stats
|
232
247
|
|
233
|
-
logger.debug("Starting pipeline", default_logging_keys)
|
248
|
+
@logger.debug("Starting pipeline", default_logging_keys)
|
234
249
|
|
235
250
|
@finished_execution = Concurrent::AtomicBoolean.new(false)
|
236
251
|
|
@@ -279,7 +294,7 @@ module LogStash; class Pipeline < BasePipeline
|
|
279
294
|
|
280
295
|
start_workers
|
281
296
|
|
282
|
-
@logger.info("Pipeline started",
|
297
|
+
@logger.info("Pipeline started", "pipeline.id" => @pipeline_id)
|
283
298
|
|
284
299
|
# Block until all inputs have stopped
|
285
300
|
# Generally this happens if SIGINT is sent and `shutdown` is called from an external thread
|
@@ -305,6 +320,7 @@ module LogStash; class Pipeline < BasePipeline
|
|
305
320
|
def close
|
306
321
|
@filter_queue_client.close
|
307
322
|
@queue.close
|
323
|
+
@dlq_writer.close
|
308
324
|
end
|
309
325
|
|
310
326
|
def transition_to_running
|
@@ -559,6 +575,7 @@ module LogStash; class Pipeline < BasePipeline
|
|
559
575
|
# stopped
|
560
576
|
wait_for_workers
|
561
577
|
clear_pipeline_metrics
|
578
|
+
@logger.info("Pipeline terminated", "pipeline.id" => @pipeline_id)
|
562
579
|
end # def shutdown
|
563
580
|
|
564
581
|
def force_shutdown!
|
@@ -32,7 +32,7 @@ module LogStash module PipelineAction
|
|
32
32
|
# The execute assume that the thread safety access of the pipeline
|
33
33
|
# is managed by the caller.
|
34
34
|
def execute(agent, pipelines)
|
35
|
-
pipeline = LogStash::Pipeline.new(@pipeline_config
|
35
|
+
pipeline = LogStash::Pipeline.new(@pipeline_config, @metric, agent)
|
36
36
|
|
37
37
|
status = pipeline.start # block until the pipeline is correctly started or crashed
|
38
38
|
|
@@ -42,6 +42,5 @@ module LogStash module PipelineAction
|
|
42
42
|
|
43
43
|
LogStash::ConvergeResult::ActionResult.create(self, status)
|
44
44
|
end
|
45
|
-
|
46
45
|
end
|
47
46
|
end end
|
@@ -27,7 +27,7 @@ module LogStash module PipelineAction
|
|
27
27
|
end
|
28
28
|
|
29
29
|
begin
|
30
|
-
pipeline_validator = LogStash::BasePipeline.new(@pipeline_config
|
30
|
+
pipeline_validator = LogStash::BasePipeline.new(@pipeline_config)
|
31
31
|
rescue => e
|
32
32
|
return LogStash::ConvergeResult::FailedAction.from_exception(e)
|
33
33
|
end
|
@@ -36,6 +36,7 @@ module LogStash module PipelineAction
|
|
36
36
|
return LogStash::ConvergeResult::FailedAction.new("Cannot reload pipeline, because the new pipeline is not reloadable")
|
37
37
|
end
|
38
38
|
|
39
|
+
logger.info("Reloading pipeline", "pipeline.id" => pipeline_id)
|
39
40
|
status = Stop.new(pipeline_id).execute(agent, pipelines)
|
40
41
|
|
41
42
|
if status
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "logstash/settings"
|
3
|
+
|
4
|
+
module LogStash
|
5
|
+
class PipelineSettings < Settings
|
6
|
+
|
7
|
+
# there are settings that the pipeline uses and can be changed per pipeline instance
|
8
|
+
SETTINGS_WHITE_LIST = [
|
9
|
+
"config.debug",
|
10
|
+
"config.reload.automatic",
|
11
|
+
"config.reload.interval",
|
12
|
+
"config.string",
|
13
|
+
"dead_letter_queue.enable",
|
14
|
+
"metric.collect",
|
15
|
+
"path.config",
|
16
|
+
"path.queue",
|
17
|
+
"pipeline.batch.delay",
|
18
|
+
"pipeline.batch.size",
|
19
|
+
"pipeline.id",
|
20
|
+
"pipeline.output.workers",
|
21
|
+
"pipeline.reloadable",
|
22
|
+
"pipeline.system",
|
23
|
+
"pipeline.workers",
|
24
|
+
"queue.checkpoint.acks",
|
25
|
+
"queue.checkpoint.interval",
|
26
|
+
"queue.checkpoint.writes",
|
27
|
+
"queue.drain",
|
28
|
+
"queue.max_bytes",
|
29
|
+
"queue.max_events",
|
30
|
+
"queue.page_capacity",
|
31
|
+
"queue.type",
|
32
|
+
]
|
33
|
+
|
34
|
+
# register a set of settings that is used as the default set of pipelines settings
|
35
|
+
def self.from_settings(settings)
|
36
|
+
pipeline_settings = self.new
|
37
|
+
SETTINGS_WHITE_LIST.each do |setting|
|
38
|
+
pipeline_settings.register(settings.get_setting(setting).clone)
|
39
|
+
end
|
40
|
+
pipeline_settings
|
41
|
+
end
|
42
|
+
|
43
|
+
def register(setting)
|
44
|
+
unless SETTINGS_WHITE_LIST.include?(setting.name)
|
45
|
+
raise ArgumentError.new("Only pipeline related settings can be registed in a PipelineSettings object. Received \"#{setting.name}\". Allowed settings: #{SETTINGS_WHITE_LIST}")
|
46
|
+
end
|
47
|
+
super(setting)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/logstash/plugin.rb
CHANGED
data/lib/logstash/runner.rb
CHANGED
@@ -165,7 +165,7 @@ class LogStash::Runner < Clamp::StrictCommand
|
|
165
165
|
I18n.t("logstash.runner.flag.quiet"),
|
166
166
|
:new_flag => "log.level", :new_value => "error"
|
167
167
|
|
168
|
-
attr_reader :agent, :settings
|
168
|
+
attr_reader :agent, :settings, :source_loader
|
169
169
|
attr_accessor :bootstrap_checks
|
170
170
|
|
171
171
|
def initialize(*args)
|
@@ -173,7 +173,9 @@ class LogStash::Runner < Clamp::StrictCommand
|
|
173
173
|
@bootstrap_checks = DEFAULT_BOOTSTRAP_CHECKS.dup
|
174
174
|
|
175
175
|
# Default we check local sources: `-e`, `-f` and the logstash.yml options.
|
176
|
-
LogStash::Config::
|
176
|
+
@source_loader = LogStash::Config::SourceLoader.new(@settings)
|
177
|
+
@source_loader.add_source(LogStash::Config::Source::Local.new(@settings))
|
178
|
+
@source_loader.add_source(LogStash::Config::Source::MultiLocal.new(@settings))
|
177
179
|
|
178
180
|
super(*args)
|
179
181
|
end
|
@@ -266,12 +268,12 @@ class LogStash::Runner < Clamp::StrictCommand
|
|
266
268
|
|
267
269
|
if setting("config.test_and_exit")
|
268
270
|
begin
|
269
|
-
results =
|
271
|
+
results = @source_loader.fetch
|
270
272
|
|
271
273
|
# TODO(ph): make it better for multiple pipeline
|
272
274
|
if results.success?
|
273
275
|
results.response.each do |pipeline_config|
|
274
|
-
LogStash::BasePipeline.new(pipeline_config
|
276
|
+
LogStash::BasePipeline.new(pipeline_config)
|
275
277
|
end
|
276
278
|
puts "Configuration OK"
|
277
279
|
logger.info "Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash"
|
@@ -289,7 +291,7 @@ class LogStash::Runner < Clamp::StrictCommand
|
|
289
291
|
@data_path_lock = FileLockFactory.getDefault().obtainLock(setting("path.data"), ".lock");
|
290
292
|
|
291
293
|
@dispatcher.fire(:before_agent)
|
292
|
-
@agent = create_agent(@settings,
|
294
|
+
@agent = create_agent(@settings, @source_loader)
|
293
295
|
@dispatcher.fire(:after_agent)
|
294
296
|
|
295
297
|
# enable sigint/sigterm before starting the agent
|
data/lib/logstash/settings.rb
CHANGED
@@ -2,11 +2,14 @@
|
|
2
2
|
require "logstash/util/loggable"
|
3
3
|
require "fileutils"
|
4
4
|
require "logstash/util/byte_value"
|
5
|
+
require "logstash/util/environment_variables"
|
5
6
|
require "logstash/util/time_value"
|
6
7
|
|
7
8
|
module LogStash
|
8
9
|
class Settings
|
9
10
|
|
11
|
+
include LogStash::Util::EnvironmentVariables
|
12
|
+
|
10
13
|
def initialize
|
11
14
|
@settings = {}
|
12
15
|
# Theses settings were loaded from the yaml file
|
@@ -106,9 +109,9 @@ module LogStash
|
|
106
109
|
@settings.values.each(&:reset)
|
107
110
|
end
|
108
111
|
|
109
|
-
def from_yaml(yaml_path)
|
110
|
-
settings = read_yaml(::File.join(yaml_path,
|
111
|
-
self.merge(flatten_hash(settings), true)
|
112
|
+
def from_yaml(yaml_path, file_name="logstash.yml")
|
113
|
+
settings = read_yaml(::File.join(yaml_path, file_name))
|
114
|
+
self.merge(deep_replace(flatten_hash(settings)), true)
|
112
115
|
self
|
113
116
|
end
|
114
117
|
|
@@ -134,6 +137,11 @@ module LogStash
|
|
134
137
|
end
|
135
138
|
end
|
136
139
|
|
140
|
+
def ==(other)
|
141
|
+
return false unless other.kind_of?(::LogStash::Settings)
|
142
|
+
self.to_hash == other.to_hash
|
143
|
+
end
|
144
|
+
|
137
145
|
private
|
138
146
|
def read_yaml(path)
|
139
147
|
YAML.safe_load(IO.read(path)) || {}
|
@@ -1,4 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require "concurrent/atomic/atomic_fixnum"
|
3
|
+
require "concurrent/atomic/atomic_boolean"
|
2
4
|
|
3
5
|
module LogStash
|
4
6
|
class ShutdownWatcher
|
@@ -16,6 +18,8 @@ module LogStash
|
|
16
18
|
@report_every = report_every
|
17
19
|
@abort_threshold = abort_threshold
|
18
20
|
@reports = []
|
21
|
+
@attempts_count = Concurrent::AtomicFixnum.new(0)
|
22
|
+
@running = Concurrent::AtomicBoolean.new(false)
|
19
23
|
end
|
20
24
|
|
21
25
|
def self.unsafe_shutdown=(boolean)
|
@@ -35,11 +39,26 @@ module LogStash
|
|
35
39
|
self.class.logger
|
36
40
|
end
|
37
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
|
+
|
38
54
|
def start
|
39
55
|
sleep(@cycle_period)
|
40
56
|
cycle_number = 0
|
41
57
|
stalled_count = 0
|
58
|
+
running!
|
42
59
|
Stud.interval(@cycle_period) do
|
60
|
+
@attempts_count.increment
|
61
|
+
break if stopped?
|
43
62
|
break unless @pipeline.thread.alive?
|
44
63
|
@reports << pipeline_report_snapshot
|
45
64
|
@reports.delete_at(0) if @reports.size > @report_every # expire old report
|
@@ -61,6 +80,8 @@ module LogStash
|
|
61
80
|
end
|
62
81
|
cycle_number = (cycle_number + 1) % @report_every
|
63
82
|
end
|
83
|
+
ensure
|
84
|
+
stop!
|
64
85
|
end
|
65
86
|
|
66
87
|
def pipeline_report_snapshot
|
@@ -90,5 +111,10 @@ module LogStash
|
|
90
111
|
def force_exit
|
91
112
|
exit(-1)
|
92
113
|
end
|
114
|
+
|
115
|
+
private
|
116
|
+
def running!
|
117
|
+
@running.make_true
|
118
|
+
end
|
93
119
|
end
|
94
120
|
end
|
@@ -19,9 +19,7 @@ module LogStash
|
|
19
19
|
if pipeline.nil?
|
20
20
|
actions << LogStash::PipelineAction::Create.new(pipeline_config, @metric)
|
21
21
|
else
|
22
|
-
|
23
|
-
# and we could use straight comparison.
|
24
|
-
if pipeline_config.config_hash != pipeline.config_hash
|
22
|
+
if pipeline_config != pipeline.pipeline_config
|
25
23
|
actions << LogStash::PipelineAction::Reload.new(pipeline_config, @metric)
|
26
24
|
end
|
27
25
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'logstash/environment'
|
2
|
+
|
3
|
+
module LogStash; module Util
|
4
|
+
class PluginDeadLetterQueueWriter
|
5
|
+
|
6
|
+
attr_reader :plugin_id, :plugin_type, :inner_writer
|
7
|
+
|
8
|
+
def initialize(inner_writer, plugin_id, plugin_type)
|
9
|
+
@plugin_id = plugin_id
|
10
|
+
@plugin_type = plugin_type
|
11
|
+
@inner_writer = inner_writer
|
12
|
+
end
|
13
|
+
|
14
|
+
def write(logstash_event, reason)
|
15
|
+
if @inner_writer && @inner_writer.is_open
|
16
|
+
@inner_writer.writeEntry(logstash_event.to_java, @plugin_type, @plugin_id, reason)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def close
|
21
|
+
if @inner_writer && @inner_writer.is_open
|
22
|
+
@inner_writer.close
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class DummyDeadLetterQueueWriter
|
28
|
+
# class uses to represent a writer when dead_letter_queue is disabled
|
29
|
+
def initialize
|
30
|
+
end
|
31
|
+
|
32
|
+
def write(logstash_event, reason)
|
33
|
+
# noop
|
34
|
+
end
|
35
|
+
|
36
|
+
def is_open
|
37
|
+
false
|
38
|
+
end
|
39
|
+
|
40
|
+
def close
|
41
|
+
# noop
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class DeadLetterQueueFactory
|
46
|
+
java_import org.logstash.common.DeadLetterQueueFactory
|
47
|
+
|
48
|
+
def self.get(pipeline_id)
|
49
|
+
if LogStash::SETTINGS.get("dead_letter_queue.enable")
|
50
|
+
return DeadLetterQueueWriter.new(
|
51
|
+
DeadLetterQueueFactory.getWriter(pipeline_id, LogStash::SETTINGS.get("path.dead_letter_queue")))
|
52
|
+
else
|
53
|
+
return DeadLetterQueueWriter.new(nil)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.close(pipeline_id)
|
58
|
+
DeadLetterQueueFactory.close(pipeline_id)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end end
|