logstash-core 5.3.3-java → 5.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/gemspec_jars.rb +2 -0
- data/lib/logstash-core/logstash-core.jar +0 -0
- data/lib/logstash-core/version.rb +1 -1
- data/lib/logstash-core_jars.rb +4 -0
- data/lib/logstash/agent.rb +15 -6
- data/lib/logstash/api/modules/base.rb +1 -1
- data/lib/logstash/api/rack_app.rb +1 -1
- data/lib/logstash/config/config_ast.rb +13 -13
- data/lib/logstash/config/mixin.rb +33 -28
- data/lib/logstash/environment.rb +11 -0
- data/lib/logstash/event.rb +56 -0
- data/lib/logstash/event_dispatcher.rb +2 -2
- data/lib/logstash/execution_context.rb +10 -0
- data/lib/logstash/filter_delegator.rb +3 -2
- data/lib/logstash/inputs/base.rb +15 -1
- data/lib/logstash/instrument/collector.rb +1 -1
- data/lib/logstash/instrument/metric.rb +4 -2
- data/lib/logstash/instrument/metric_store.rb +9 -5
- data/lib/logstash/instrument/null_metric.rb +1 -0
- data/lib/logstash/instrument/periodic_poller/cgroup.rb +3 -3
- data/lib/logstash/instrument/periodic_poller/jvm.rb +11 -8
- data/lib/logstash/instrument/periodic_poller/load_average.rb +4 -2
- data/lib/logstash/instrument/wrapped_write_client.rb +59 -0
- data/lib/logstash/java_integration.rb +2 -2
- data/lib/logstash/output_delegator.rb +2 -2
- data/lib/logstash/output_delegator_strategies/legacy.rb +5 -2
- data/lib/logstash/output_delegator_strategies/shared.rb +2 -1
- data/lib/logstash/output_delegator_strategies/single.rb +2 -1
- data/lib/logstash/outputs/base.rb +8 -0
- data/lib/logstash/patches/cabin.rb +1 -1
- data/lib/logstash/patches/stronger_openssl_defaults.rb +1 -1
- data/lib/logstash/pipeline.rb +47 -19
- data/lib/logstash/plugin.rb +3 -1
- data/lib/logstash/plugins/hooks_registry.rb +6 -6
- data/lib/logstash/plugins/registry.rb +2 -2
- data/lib/logstash/queue_factory.rb +7 -5
- data/lib/logstash/runner.rb +15 -1
- data/lib/logstash/settings.rb +14 -2
- data/lib/logstash/string_interpolation.rb +18 -0
- data/lib/logstash/timestamp.rb +27 -0
- data/lib/logstash/util.rb +1 -1
- data/lib/logstash/util/prctl.rb +1 -1
- data/lib/logstash/util/retryable.rb +1 -1
- data/lib/logstash/util/wrapped_acked_queue.rb +53 -22
- data/lib/logstash/util/wrapped_synchronous_queue.rb +51 -33
- data/lib/logstash/version.rb +1 -1
- data/locales/en.yml +4 -2
- data/logstash-core.gemspec +0 -3
- data/spec/api/lib/api/node_stats_spec.rb +2 -1
- data/spec/api/spec_helper.rb +1 -1
- data/spec/logstash/acked_queue_concurrent_stress_spec.rb +291 -0
- data/spec/logstash/agent_spec.rb +24 -0
- data/spec/logstash/config/mixin_spec.rb +11 -2
- data/spec/logstash/event_dispatcher_spec.rb +8 -1
- data/spec/logstash/event_spec.rb +346 -0
- data/spec/logstash/execution_context_spec.rb +13 -0
- data/spec/logstash/filter_delegator_spec.rb +4 -2
- data/spec/logstash/inputs/base_spec.rb +41 -0
- data/spec/logstash/instrument/metric_spec.rb +2 -1
- data/spec/logstash/instrument/metric_store_spec.rb +14 -0
- data/spec/logstash/instrument/namespaced_metric_spec.rb +2 -1
- data/spec/logstash/instrument/periodic_poller/cgroup_spec.rb +1 -1
- data/spec/logstash/instrument/periodic_poller/jvm_spec.rb +35 -0
- data/spec/logstash/instrument/periodic_poller/load_average_spec.rb +1 -5
- data/spec/logstash/instrument/wrapped_write_client_spec.rb +113 -0
- data/spec/logstash/json_spec.rb +1 -1
- data/spec/logstash/legacy_ruby_event_spec.rb +636 -0
- data/spec/logstash/legacy_ruby_timestamp_spec.rb +170 -0
- data/spec/logstash/output_delegator_spec.rb +6 -3
- data/spec/logstash/outputs/base_spec.rb +23 -0
- data/spec/logstash/pipeline_pq_file_spec.rb +18 -8
- data/spec/logstash/pipeline_spec.rb +41 -5
- data/spec/logstash/plugin_spec.rb +15 -3
- data/spec/logstash/plugins/hooks_registry_spec.rb +2 -2
- data/spec/logstash/runner_spec.rb +33 -2
- data/spec/logstash/settings/port_range_spec.rb +1 -1
- data/spec/logstash/settings_spec.rb +21 -0
- data/spec/logstash/timestamp_spec.rb +29 -0
- data/spec/logstash/util/accessors_spec.rb +179 -0
- data/spec/logstash/util/wrapped_synchronous_queue_spec.rb +4 -11
- data/spec/logstash/util_spec.rb +1 -1
- data/spec/logstash/webserver_spec.rb +1 -1
- data/spec/support/mocks_classes.rb +65 -53
- metadata +25 -30
@@ -0,0 +1,170 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
require "logstash/timestamp"
|
4
|
+
require "bigdecimal"
|
5
|
+
|
6
|
+
describe LogStash::Timestamp do
|
7
|
+
|
8
|
+
it "should parse its own iso8601 output" do
|
9
|
+
t = Time.now
|
10
|
+
ts = LogStash::Timestamp.new(t)
|
11
|
+
expect(LogStash::Timestamp.parse_iso8601(ts.to_iso8601).to_i).to eq(t.to_i)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should coerce iso8601 string" do
|
15
|
+
t = Time.now
|
16
|
+
ts = LogStash::Timestamp.new(t)
|
17
|
+
expect(LogStash::Timestamp.coerce(ts.to_iso8601).to_i).to eq(t.to_i)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should coerce Time" do
|
21
|
+
t = Time.now
|
22
|
+
expect(LogStash::Timestamp.coerce(t).to_i).to eq(t.to_i)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should coerce Timestamp" do
|
26
|
+
t = LogStash::Timestamp.now
|
27
|
+
expect(LogStash::Timestamp.coerce(t).to_i).to eq(t.to_i)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should raise on invalid string coerce" do
|
31
|
+
expect{LogStash::Timestamp.coerce("foobar")}.to raise_error LogStash::TimestampParserError
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should return nil on invalid object coerce" do
|
35
|
+
expect(LogStash::Timestamp.coerce(:foobar)).to be_nil
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should support to_json" do
|
39
|
+
expect(LogStash::Timestamp.parse_iso8601("2014-09-23T00:00:00-0800").to_json).to eq("\"2014-09-23T08:00:00.000Z\"")
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should support to_json and ignore arguments" do
|
43
|
+
expect(LogStash::Timestamp.parse_iso8601("2014-09-23T00:00:00-0800").to_json(:some => 1, :arguments => "test")).to eq("\"2014-09-23T08:00:00.000Z\"")
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should support timestamp comparison" do
|
47
|
+
current = LogStash::Timestamp.new(Time.now)
|
48
|
+
future = LogStash::Timestamp.new(Time.now + 100)
|
49
|
+
|
50
|
+
expect(future > current).to eq(true)
|
51
|
+
expect(future < current).to eq(false)
|
52
|
+
expect(current == current).to eq(true)
|
53
|
+
|
54
|
+
expect(current <=> current).to eq(0)
|
55
|
+
expect(current <=> future).to eq(-1)
|
56
|
+
expect(future <=> current).to eq(1)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should allow unary operation +" do
|
60
|
+
current = Time.now
|
61
|
+
t = LogStash::Timestamp.new(current) + 10
|
62
|
+
expect(t).to eq(current + 10)
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "subtraction" do
|
66
|
+
it "should work on a timestamp object" do
|
67
|
+
t = Time.now
|
68
|
+
current = LogStash::Timestamp.new(t)
|
69
|
+
future = LogStash::Timestamp.new(t + 10)
|
70
|
+
expect(future - current).to eq(10)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should work on with time object" do
|
74
|
+
current = Time.now
|
75
|
+
t = LogStash::Timestamp.new(current + 10)
|
76
|
+
expect(t - current).to eq(10)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should work with numeric value" do
|
80
|
+
current = Time.now
|
81
|
+
t = LogStash::Timestamp.new(current + 10)
|
82
|
+
expect(t - 10).to eq(current)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context "identity methods" do
|
87
|
+
subject { LogStash::Timestamp.new }
|
88
|
+
|
89
|
+
it "should support utc" do
|
90
|
+
expect(subject.utc).to eq(subject)
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should support gmtime" do
|
94
|
+
expect(subject.gmtime).to eq(subject)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context "numeric casting methods" do
|
99
|
+
let (:now) {Time.now}
|
100
|
+
subject { LogStash::Timestamp.new(now) }
|
101
|
+
|
102
|
+
it "should support to_i" do
|
103
|
+
expect(subject.to_i).to eq(now.to_i)
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should support to_f" do
|
107
|
+
expect(subject.to_f).to eq(now.to_f)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "at" do
|
112
|
+
context "with integer epoch" do
|
113
|
+
it "should convert to correct date" do
|
114
|
+
expect(LogStash::Timestamp.at(946702800).to_iso8601).to eq("2000-01-01T05:00:00.000Z")
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should return zero usec" do
|
118
|
+
expect(LogStash::Timestamp.at(946702800).usec).to eq(0)
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should return prior to epoch date on negative input" do
|
122
|
+
expect(LogStash::Timestamp.at(-1).to_iso8601).to eq("1969-12-31T23:59:59.000Z")
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
context "with float epoch" do
|
127
|
+
it "should convert to correct date" do
|
128
|
+
expect(LogStash::Timestamp.at(946702800.123456.to_f).to_iso8601).to eq("2000-01-01T05:00:00.123Z")
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should return usec with a minimum of millisec precision" do
|
132
|
+
expect(LogStash::Timestamp.at(946702800.123456.to_f).usec).to be_within(1000).of(123456)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
context "with BigDecimal epoch" do
|
137
|
+
it "should convert to correct date" do
|
138
|
+
expect(LogStash::Timestamp.at(BigDecimal.new("946702800.123456")).to_iso8601).to eq("2000-01-01T05:00:00.123Z")
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should return usec with a minimum of millisec precision" do
|
142
|
+
# since Java Timestamp relies on JodaTime which supports only milliseconds precision
|
143
|
+
# the usec method will only be precise up to milliseconds.
|
144
|
+
expect(LogStash::Timestamp.at(BigDecimal.new("946702800.123456")).usec).to be_within(1000).of(123456)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
context "with illegal parameters" do
|
149
|
+
it "should raise exception on nil input" do
|
150
|
+
expect{LogStash::Timestamp.at(nil)}.to raise_error
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should raise exception on invalid input type" do
|
154
|
+
expect{LogStash::Timestamp.at(:foo)}.to raise_error
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
context "usec" do
|
160
|
+
it "should support millisecond precision" do
|
161
|
+
expect(LogStash::Timestamp.at(946702800.123).usec).to eq(123000)
|
162
|
+
end
|
163
|
+
|
164
|
+
it "should try to preserve and report microseconds precision if possible" do
|
165
|
+
# since Java Timestamp relies on JodaTime which supports only milliseconds precision
|
166
|
+
# the usec method will only be precise up to milliseconds.
|
167
|
+
expect(LogStash::Timestamp.at(946702800.123456).usec).to be_within(1000).of(123456)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "logstash/output_delegator"
|
3
|
-
require
|
3
|
+
require "logstash/execution_context"
|
4
|
+
require "spec_helper"
|
4
5
|
|
5
6
|
describe LogStash::OutputDelegator do
|
6
7
|
let(:logger) { double("logger") }
|
@@ -8,8 +9,9 @@ describe LogStash::OutputDelegator do
|
|
8
9
|
let(:plugin_args) { {"id" => "foo", "arg1" => "val1"} }
|
9
10
|
let(:collector) { [] }
|
10
11
|
let(:metric) { LogStash::Instrument::NamespacedNullMetric.new(collector, :null) }
|
12
|
+
let(:default_execution_context) { LogStash::ExecutionContext.new(:main) }
|
11
13
|
|
12
|
-
subject { described_class.new(logger, out_klass, metric, ::LogStash::OutputDelegatorStrategyRegistry.instance, plugin_args) }
|
14
|
+
subject { described_class.new(logger, out_klass, metric, default_execution_context, ::LogStash::OutputDelegatorStrategyRegistry.instance, plugin_args) }
|
13
15
|
|
14
16
|
context "with a plain output plugin" do
|
15
17
|
let(:out_klass) { double("output klass") }
|
@@ -27,6 +29,7 @@ describe LogStash::OutputDelegator do
|
|
27
29
|
allow(out_inst).to receive(:register)
|
28
30
|
allow(out_inst).to receive(:multi_receive)
|
29
31
|
allow(out_inst).to receive(:metric=).with(any_args)
|
32
|
+
allow(out_inst).to receive(:execution_context=).with(default_execution_context)
|
30
33
|
allow(out_inst).to receive(:id).and_return("a-simple-plugin")
|
31
34
|
|
32
35
|
allow(subject.metric_events).to receive(:increment).with(any_args)
|
@@ -39,7 +42,7 @@ describe LogStash::OutputDelegator do
|
|
39
42
|
|
40
43
|
it "should push the name of the plugin to the metric" do
|
41
44
|
expect(metric).to receive(:gauge).with(:name, out_klass.config_name)
|
42
|
-
described_class.new(logger, out_klass, metric, ::LogStash::OutputDelegatorStrategyRegistry.instance, plugin_args)
|
45
|
+
described_class.new(logger, out_klass, metric, default_execution_context, ::LogStash::OutputDelegatorStrategyRegistry.instance, plugin_args)
|
43
46
|
end
|
44
47
|
|
45
48
|
context "after having received a batch of events" do
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "spec_helper"
|
3
|
+
require "logstash/outputs/base"
|
4
|
+
require "logstash/execution_context"
|
3
5
|
|
4
6
|
# use a dummy NOOP output to test Outputs::Base
|
5
7
|
class LogStash::Outputs::NOOPSingle < LogStash::Outputs::Base
|
@@ -77,6 +79,27 @@ describe "LogStash::Outputs::Base#new" do
|
|
77
79
|
end
|
78
80
|
end
|
79
81
|
|
82
|
+
context "execution context" do
|
83
|
+
let(:default_execution_context) { LogStash::ExecutionContext.new(:main) }
|
84
|
+
let(:klass) { LogStash::Outputs::NOOPSingle }
|
85
|
+
|
86
|
+
subject(:instance) { klass.new(params.dup) }
|
87
|
+
|
88
|
+
it "allow to set the context" do
|
89
|
+
expect(instance.execution_context).to be_nil
|
90
|
+
instance.execution_context = default_execution_context
|
91
|
+
|
92
|
+
expect(instance.execution_context).to eq(default_execution_context)
|
93
|
+
end
|
94
|
+
|
95
|
+
it "propagate the context to the codec" do
|
96
|
+
expect(instance.codec.execution_context).to be_nil
|
97
|
+
instance.execution_context = default_execution_context
|
98
|
+
|
99
|
+
expect(instance.codec.execution_context).to eq(default_execution_context)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
80
103
|
describe "dispatching multi_receive" do
|
81
104
|
let(:event) { double("event") }
|
82
105
|
let(:events) { [event] }
|
@@ -82,6 +82,13 @@ describe LogStash::Pipeline do
|
|
82
82
|
let(:queue_type) { "persisted" } # "memory" "memory_acked"
|
83
83
|
let(:times) { [] }
|
84
84
|
|
85
|
+
let(:pipeline_thread) do
|
86
|
+
# subject has to be called for the first time outside the thread because it will create a race condition
|
87
|
+
# with the subject.ready? call since subject is lazily initialized
|
88
|
+
s = subject
|
89
|
+
Thread.new { s.run }
|
90
|
+
end
|
91
|
+
|
85
92
|
before :each do
|
86
93
|
FileUtils.mkdir_p(this_queue_folder)
|
87
94
|
|
@@ -97,19 +104,22 @@ describe LogStash::Pipeline do
|
|
97
104
|
pipeline_settings.each {|k, v| pipeline_settings_obj.set(k, v) }
|
98
105
|
pipeline_settings_obj.set("queue.page_capacity", page_capacity)
|
99
106
|
pipeline_settings_obj.set("queue.max_bytes", max_bytes)
|
100
|
-
Thread.new do
|
101
|
-
# make sure we have received all the generated events
|
102
|
-
while counting_output.event_count < number_of_events do
|
103
|
-
sleep 1
|
104
|
-
end
|
105
|
-
subject.shutdown
|
106
|
-
end
|
107
107
|
times.push(Time.now.to_f)
|
108
|
-
|
108
|
+
|
109
|
+
pipeline_thread
|
110
|
+
sleep(0.1) until subject.ready?
|
111
|
+
|
112
|
+
# make sure we have received all the generated events
|
113
|
+
while counting_output.event_count < number_of_events do
|
114
|
+
sleep(0.5)
|
115
|
+
end
|
116
|
+
|
109
117
|
times.unshift(Time.now.to_f - times.first)
|
110
118
|
end
|
111
119
|
|
112
120
|
after :each do
|
121
|
+
subject.shutdown
|
122
|
+
pipeline_thread.join
|
113
123
|
# Dir.rm_rf(this_queue_folder)
|
114
124
|
end
|
115
125
|
|
@@ -3,6 +3,7 @@ require "spec_helper"
|
|
3
3
|
require "logstash/inputs/generator"
|
4
4
|
require "logstash/filters/multiline"
|
5
5
|
require_relative "../support/mocks_classes"
|
6
|
+
require_relative "../logstash/pipeline_reporter_spec" # for DummyOutput class
|
6
7
|
|
7
8
|
class DummyInput < LogStash::Inputs::Base
|
8
9
|
config_name "dummyinput"
|
@@ -133,7 +134,7 @@ describe LogStash::Pipeline do
|
|
133
134
|
CONFIG
|
134
135
|
end
|
135
136
|
|
136
|
-
it "should not
|
137
|
+
it "should not propagate cancelled events from filter to output" do
|
137
138
|
abort_on_exception_state = Thread.abort_on_exception
|
138
139
|
Thread.abort_on_exception = true
|
139
140
|
|
@@ -249,7 +250,6 @@ describe LogStash::Pipeline do
|
|
249
250
|
}
|
250
251
|
|
251
252
|
it "starts multiple filter threads" do
|
252
|
-
skip("This test has been failing periodically since November 2016. Tracked as https://github.com/elastic/logstash/issues/6245")
|
253
253
|
pipeline = TestPipeline.new(test_config_with_filters)
|
254
254
|
pipeline.run
|
255
255
|
expect(pipeline.worker_threads.size).to eq(worker_thread_count)
|
@@ -389,7 +389,7 @@ describe LogStash::Pipeline do
|
|
389
389
|
allow(LogStash::Plugin).to receive(:lookup).with("output", "dummyoutput").and_return(::LogStash::Outputs::DummyOutput)
|
390
390
|
allow(logger).to receive(:warn)
|
391
391
|
|
392
|
-
# pipeline must be first called outside the thread context because it
|
392
|
+
# pipeline must be first called outside the thread context because it lazily initialize and will create a
|
393
393
|
# race condition if called in the thread
|
394
394
|
p = pipeline
|
395
395
|
t = Thread.new { p.run }
|
@@ -411,7 +411,7 @@ describe LogStash::Pipeline do
|
|
411
411
|
end
|
412
412
|
end
|
413
413
|
|
414
|
-
context "compiled filter
|
414
|
+
context "compiled filter functions" do
|
415
415
|
context "new events should propagate down the filters" do
|
416
416
|
config <<-CONFIG
|
417
417
|
filter {
|
@@ -630,7 +630,7 @@ describe LogStash::Pipeline do
|
|
630
630
|
|
631
631
|
it "should handle evaluating different config" do
|
632
632
|
# When the functions are compiled from the AST it will generate instance
|
633
|
-
# variables that are unique to the actual config, the
|
633
|
+
# variables that are unique to the actual config, the instances are pointing
|
634
634
|
# to conditionals and/or plugins.
|
635
635
|
#
|
636
636
|
# Before the `defined_singleton_method`, the definition of the method was
|
@@ -854,4 +854,40 @@ describe LogStash::Pipeline do
|
|
854
854
|
expect(pipeline1.instance_variables).to eq(pipeline2.instance_variables)
|
855
855
|
end
|
856
856
|
end
|
857
|
+
|
858
|
+
describe "#system?" do
|
859
|
+
after do
|
860
|
+
pipeline.close # close the queue
|
861
|
+
end
|
862
|
+
|
863
|
+
let(:pipeline) { LogStash::Pipeline.new(config_string, settings) }
|
864
|
+
let(:config_string) { "input { generator {} } output { null {} }" }
|
865
|
+
|
866
|
+
context "when the pipeline is a system pipeline" do
|
867
|
+
let(:settings) do
|
868
|
+
s = LogStash::SETTINGS.clone
|
869
|
+
s.set("pipeline.system", true)
|
870
|
+
s.set("config.string", config_string)
|
871
|
+
s
|
872
|
+
end
|
873
|
+
|
874
|
+
|
875
|
+
it "returns true" do
|
876
|
+
expect(pipeline.system?).to be_truthy
|
877
|
+
end
|
878
|
+
end
|
879
|
+
|
880
|
+
context "when the pipeline is not a system pipeline" do
|
881
|
+
let(:settings) do
|
882
|
+
s = LogStash::SETTINGS.clone
|
883
|
+
s.set("pipeline.system", false)
|
884
|
+
s.set("config.string", config_string)
|
885
|
+
s
|
886
|
+
end
|
887
|
+
|
888
|
+
it "returns true" do
|
889
|
+
expect(pipeline.system?).to be_falsey
|
890
|
+
end
|
891
|
+
end
|
892
|
+
end
|
857
893
|
end
|
@@ -5,6 +5,7 @@ require "logstash/outputs/base"
|
|
5
5
|
require "logstash/codecs/base"
|
6
6
|
require "logstash/inputs/base"
|
7
7
|
require "logstash/filters/base"
|
8
|
+
require "logstash/execution_context"
|
8
9
|
|
9
10
|
describe LogStash::Plugin do
|
10
11
|
context "reloadable" do
|
@@ -42,12 +43,23 @@ describe LogStash::Plugin do
|
|
42
43
|
end
|
43
44
|
end
|
44
45
|
|
45
|
-
|
46
|
+
context "#execution_context" do
|
47
|
+
subject { Class.new(LogStash::Plugin).new({}) }
|
48
|
+
|
49
|
+
it "can be set and get" do
|
50
|
+
expect(subject.execution_context).to be_nil
|
51
|
+
execution_context = LogStash::ExecutionContext.new(:main)
|
52
|
+
subject.execution_context = execution_context
|
53
|
+
expect(subject.execution_context).to eq(execution_context)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should fail lookup on nonexistent type" do
|
46
58
|
#expect_any_instance_of(Cabin::Channel).to receive(:debug).once
|
47
59
|
expect { LogStash::Plugin.lookup("badbadtype", "badname") }.to raise_error(LogStash::PluginLoadingError)
|
48
60
|
end
|
49
61
|
|
50
|
-
it "should fail lookup on
|
62
|
+
it "should fail lookup on nonexistent name" do
|
51
63
|
#expect_any_instance_of(Cabin::Channel).to receive(:debug).once
|
52
64
|
expect { LogStash::Plugin.lookup("filter", "badname") }.to raise_error(LogStash::PluginLoadingError)
|
53
65
|
end
|
@@ -217,7 +229,7 @@ describe LogStash::Plugin do
|
|
217
229
|
config_name "simple_plugin"
|
218
230
|
|
219
231
|
config :host, :validate => :string
|
220
|
-
config :export, :
|
232
|
+
config :export, :validate => :boolean
|
221
233
|
|
222
234
|
def register; end
|
223
235
|
end
|
@@ -35,12 +35,12 @@ describe LogStash::Plugins::HooksRegistry do
|
|
35
35
|
let(:listener) { DummyListener.new }
|
36
36
|
|
37
37
|
it "allow to register an emitter" do
|
38
|
-
expect { subject.register_emitter(emitter.class, emitter.dispatcher) }.to change { subject.
|
38
|
+
expect { subject.register_emitter(emitter.class, emitter.dispatcher) }.to change { subject.emitters_count }.by(1)
|
39
39
|
end
|
40
40
|
|
41
41
|
it "allow to remove an emitter" do
|
42
42
|
subject.register_emitter(emitter.class, emitter.dispatcher)
|
43
|
-
expect { subject.remove_emitter(emitter.class)}.to change { subject.
|
43
|
+
expect { subject.remove_emitter(emitter.class)}.to change { subject.emitters_count }.by(-1)
|
44
44
|
end
|
45
45
|
|
46
46
|
it "allow to register hooks to emitters" do
|
@@ -141,7 +141,7 @@ describe LogStash::Runner do
|
|
141
141
|
|
142
142
|
context "with a good configuration" do
|
143
143
|
let(:pipeline_string) { "input { } filter { } output { }" }
|
144
|
-
it "should exit
|
144
|
+
it "should exit successfully" do
|
145
145
|
expect(subject.run(args)).to eq(0)
|
146
146
|
end
|
147
147
|
end
|
@@ -165,7 +165,38 @@ describe LogStash::Runner do
|
|
165
165
|
allow(pipeline).to receive(:run).and_return(task)
|
166
166
|
allow(pipeline).to receive(:shutdown)
|
167
167
|
end
|
168
|
-
|
168
|
+
|
169
|
+
context "when :path.data is defined by the user" do
|
170
|
+
let(:test_data_path) { "/tmp/ls-test-data" }
|
171
|
+
let(:test_queue_path) { test_data_path + "/" + "queue" }
|
172
|
+
|
173
|
+
it "should set data paths" do
|
174
|
+
expect(LogStash::Agent).to receive(:new) do |settings|
|
175
|
+
expect(settings.get("path.data")).to eq(test_data_path)
|
176
|
+
expect(settings.get("path.queue")).to eq(test_queue_path)
|
177
|
+
end
|
178
|
+
|
179
|
+
args = ["--path.data", test_data_path, "-e", pipeline_string]
|
180
|
+
subject.run("bin/logstash", args)
|
181
|
+
end
|
182
|
+
|
183
|
+
context "and path.queue is manually set" do
|
184
|
+
let(:queue_override_path) { "/tmp/queue-override_path" }
|
185
|
+
|
186
|
+
it "should set data paths" do
|
187
|
+
expect(LogStash::Agent).to receive(:new) do |settings|
|
188
|
+
expect(settings.get("path.data")).to eq(test_data_path)
|
189
|
+
expect(settings.get("path.queue")).to eq(queue_override_path)
|
190
|
+
end
|
191
|
+
|
192
|
+
LogStash::SETTINGS.set("path.queue", queue_override_path)
|
193
|
+
|
194
|
+
args = ["--path.data", test_data_path, "-e", pipeline_string]
|
195
|
+
subject.run("bin/logstash", args)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
169
200
|
context "when :http.host is defined by the user" do
|
170
201
|
it "should pass the value to the webserver" do
|
171
202
|
expect(LogStash::Agent).to receive(:new) do |settings|
|