logstash-core 6.0.1-java → 6.1.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 +1 -1
- data/lib/logstash-core/logstash-core.jar +0 -0
- data/lib/logstash-core/logstash-core.rb +14 -2
- data/lib/logstash-core_jars.rb +4 -2
- data/lib/logstash/agent.rb +8 -2
- data/lib/logstash/api/modules/node.rb +11 -5
- data/lib/logstash/api/modules/stats.rb +13 -7
- data/lib/logstash/compiler.rb +6 -10
- data/lib/logstash/compiler/lscl.rb +10 -1
- data/lib/logstash/compiler/lscl/helpers.rb +3 -1
- data/lib/logstash/config/mixin.rb +2 -2
- data/lib/logstash/environment.rb +1 -6
- data/lib/logstash/errors.rb +1 -1
- data/lib/logstash/event.rb +0 -2
- data/lib/logstash/filter_delegator.rb +1 -2
- data/lib/logstash/instrument/metric_type/counter.rb +1 -1
- data/lib/logstash/instrument/metric_type/gauge.rb +1 -1
- data/lib/logstash/instrument/wrapped_write_client.rb +1 -1
- data/lib/logstash/java_filter_delegator.rb +79 -0
- data/lib/logstash/java_pipeline.rb +690 -0
- data/lib/logstash/json.rb +4 -29
- data/lib/logstash/output_delegator.rb +3 -2
- data/lib/logstash/patches/bugfix_jruby_2558.rb +1 -1
- data/lib/logstash/pipeline.rb +32 -89
- data/lib/logstash/pipeline_action/create.rb +8 -2
- data/lib/logstash/pipeline_action/reload.rb +6 -1
- data/lib/logstash/pipeline_reporter.rb +2 -1
- data/lib/logstash/pipeline_settings.rb +1 -0
- data/lib/logstash/plugins/plugin_factory.rb +100 -0
- data/lib/logstash/plugins/registry.rb +18 -7
- data/lib/logstash/queue_factory.rb +3 -1
- data/lib/logstash/runner.rb +13 -56
- data/lib/logstash/settings.rb +2 -2
- data/lib/logstash/timestamp.rb +0 -1
- data/lib/logstash/util.rb +13 -21
- data/lib/logstash/util/java_version.rb +0 -1
- data/lib/logstash/util/settings_helper.rb +79 -0
- data/lib/logstash/util/{environment_variables.rb → substitution_variables.rb} +10 -8
- data/lib/logstash/util/wrapped_acked_queue.rb +17 -108
- data/lib/logstash/util/wrapped_synchronous_queue.rb +38 -178
- data/locales/en.yml +2 -0
- data/spec/conditionals_spec.rb +235 -80
- data/spec/logstash/api/modules/node_spec.rb +11 -0
- data/spec/logstash/compiler/compiler_spec.rb +28 -2
- data/spec/logstash/environment_spec.rb +0 -5
- data/spec/logstash/event_spec.rb +7 -2
- data/spec/logstash/filter_delegator_spec.rb +1 -1
- data/spec/logstash/filters/base_spec.rb +30 -28
- data/spec/logstash/instrument/wrapped_write_client_spec.rb +2 -2
- data/spec/logstash/java_filter_delegator_spec.rb +176 -0
- data/spec/logstash/java_pipeline_spec.rb +933 -0
- data/spec/logstash/json_spec.rb +27 -45
- data/spec/logstash/plugins/registry_spec.rb +7 -0
- data/spec/logstash/queue_factory_spec.rb +5 -2
- data/spec/logstash/settings_spec.rb +1 -1
- data/spec/logstash/util/java_version_spec.rb +1 -3
- data/spec/logstash/util/wrapped_synchronous_queue_spec.rb +27 -24
- data/spec/logstash/webserver_spec.rb +3 -6
- data/spec/support/helpers.rb +5 -0
- data/spec/support/pipeline/pipeline_helpers.rb +97 -0
- data/versions-gem-copy.yml +5 -2
- metadata +14 -5
- data/lib/logstash/patches/rubygems.rb +0 -38
@@ -46,6 +46,17 @@ describe LogStash::Api::Modules::Node do
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
+
context "broken params in URL" do
|
50
|
+
|
51
|
+
before(:all) do
|
52
|
+
get "/hot_threads?human=?threads=5"
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should return http status 400" do
|
56
|
+
expect(last_response.status).to eq(400)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
49
60
|
context "when asking for human output" do
|
50
61
|
[
|
51
62
|
"/hot_threads?human",
|
@@ -47,7 +47,7 @@ describe LogStash::Compiler do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
subject(:pipeline) { described_class.compile_sources(sources_with_metadata,
|
50
|
+
subject(:pipeline) { described_class.compile_sources(sources_with_metadata, false) }
|
51
51
|
|
52
52
|
it "should generate a hash" do
|
53
53
|
expect(pipeline.unique_hash).to be_a(String)
|
@@ -100,7 +100,7 @@ describe LogStash::Compiler do
|
|
100
100
|
describe "compiling imperative" do
|
101
101
|
let(:source_id) { "fake_sourcefile" }
|
102
102
|
let(:source_with_metadata) { org.logstash.common.SourceWithMetadata.new(source_protocol, source_id, 0, 0, source) }
|
103
|
-
subject(:compiled) { described_class.compile_imperative(source_with_metadata, settings) }
|
103
|
+
subject(:compiled) { described_class.compile_imperative(source_with_metadata, settings.get_value("config.support_escapes")) }
|
104
104
|
|
105
105
|
context "when config.support_escapes" do
|
106
106
|
let(:parser) { LogStashCompilerLSCLGrammarParser.new }
|
@@ -194,6 +194,32 @@ describe LogStash::Compiler do
|
|
194
194
|
end
|
195
195
|
end
|
196
196
|
|
197
|
+
describe "a plugin with multiple array parameter types" do
|
198
|
+
let(:plugin_source) { "generator { aarg => [1] aarg => [2] aarg => [3]}" }
|
199
|
+
let(:expected_plugin_args) do
|
200
|
+
{
|
201
|
+
"aarg" => [1, 2, 3]
|
202
|
+
}
|
203
|
+
end
|
204
|
+
|
205
|
+
it "should contain the plugin" do
|
206
|
+
expect(c_plugin).to ir_eql(j.iPlugin(INPUT, "generator", expected_plugin_args))
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
describe "a plugin with multiple parameter types that converge to an array" do
|
211
|
+
let(:plugin_source) { "generator { aarg => [1] aarg => 2 aarg => '3' aarg => [4] }"}
|
212
|
+
let(:expected_plugin_args) do
|
213
|
+
{
|
214
|
+
"aarg" => [1, 2, "3", 4]
|
215
|
+
}
|
216
|
+
end
|
217
|
+
|
218
|
+
it "should contain the plugin" do
|
219
|
+
expect(c_plugin).to ir_eql(j.iPlugin(INPUT, "generator", expected_plugin_args))
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
197
223
|
describe "a filter plugin that repeats a Hash directive" do
|
198
224
|
let(:source) { "input { } filter { #{plugin_source} } output { } " }
|
199
225
|
subject(:c_plugin) { compiled[:filter] }
|
@@ -10,11 +10,6 @@ describe LogStash::Environment do
|
|
10
10
|
let(:default_runtime_location) { File.join(default_jars_location,"runtime-jars","*.jar") }
|
11
11
|
let(:default_test_location) { File.join(default_jars_location,"test-jars","*.jar") }
|
12
12
|
|
13
|
-
it "raises an exception if jruby is not available" do
|
14
|
-
expect(subject).to receive(:jruby?).and_return(false)
|
15
|
-
expect { subject.load_runtime_jars! }.to raise_error
|
16
|
-
end
|
17
|
-
|
18
13
|
it "find runtime jars in the default location" do
|
19
14
|
expect(subject).to receive(:find_jars).with(default_runtime_location).and_return([])
|
20
15
|
subject.load_runtime_jars!
|
data/spec/logstash/event_spec.rb
CHANGED
@@ -10,6 +10,11 @@ TIMESTAMP = "@timestamp"
|
|
10
10
|
|
11
11
|
describe LogStash::Event do
|
12
12
|
context "to_json" do
|
13
|
+
it "should correctly serialize RubyNil values a Null values" do
|
14
|
+
e = LogStash::Event.new({ "null_value" => nil, TIMESTAMP => "2015-05-28T23:02:05.350Z"})
|
15
|
+
expect(JSON.parse(e.to_json)).to eq(JSON.parse("{\"null_value\":null,\"@timestamp\":\"2015-05-28T23:02:05.350Z\",\"@version\":\"1\"}"))
|
16
|
+
end
|
17
|
+
|
13
18
|
it "should serialize simple values" do
|
14
19
|
e = LogStash::Event.new({"foo" => "bar", "bar" => 1, "baz" => 1.0, TIMESTAMP => "2015-05-28T23:02:05.350Z"})
|
15
20
|
expect(JSON.parse(e.to_json)).to eq(JSON.parse("{\"foo\":\"bar\",\"bar\":1,\"baz\":1.0,\"@timestamp\":\"2015-05-28T23:02:05.350Z\",\"@version\":\"1\"}"))
|
@@ -141,7 +146,7 @@ describe LogStash::Event do
|
|
141
146
|
end
|
142
147
|
|
143
148
|
it "should set XXJavaProxy Jackson crafted" do
|
144
|
-
proxy = org.logstash.
|
149
|
+
proxy = org.logstash.RspecTestUtils.getMapFixtureJackson()
|
145
150
|
# proxy is {"string": "foo", "int": 42, "float": 42.42, "array": ["bar","baz"], "hash": {"string":"quux"} }
|
146
151
|
e = LogStash::Event.new()
|
147
152
|
e.set("[proxy]", proxy)
|
@@ -154,7 +159,7 @@ describe LogStash::Event do
|
|
154
159
|
end
|
155
160
|
|
156
161
|
it "should set XXJavaProxy hand crafted" do
|
157
|
-
proxy = org.logstash.
|
162
|
+
proxy = org.logstash.RspecTestUtils.getMapFixtureHandcrafted()
|
158
163
|
# proxy is {"string": "foo", "int": 42, "float": 42.42, "array": ["bar","baz"], "hash": {"string":"quux"} }
|
159
164
|
e = LogStash::Event.new()
|
160
165
|
e.set("[proxy]", proxy)
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "spec_helper"
|
3
3
|
require "logstash/json"
|
4
|
+
require 'support/pipeline/pipeline_helpers'
|
4
5
|
|
5
6
|
# use a dummy NOOP filter to test Filters::Base
|
6
7
|
class LogStash::Filters::NOOP < LogStash::Filters::Base
|
@@ -50,6 +51,7 @@ describe LogStash::Filters::Base do
|
|
50
51
|
end
|
51
52
|
|
52
53
|
describe LogStash::Filters::NOOP do
|
54
|
+
extend PipelineHelpers
|
53
55
|
|
54
56
|
describe "adding multiple values to one field" do
|
55
57
|
config <<-CONFIG
|
@@ -61,7 +63,7 @@ describe LogStash::Filters::NOOP do
|
|
61
63
|
}
|
62
64
|
CONFIG
|
63
65
|
|
64
|
-
|
66
|
+
sample_one("example") do
|
65
67
|
insist { subject.get("new_field") } == ["new_value", "new_value_2"]
|
66
68
|
end
|
67
69
|
end
|
@@ -75,7 +77,7 @@ describe LogStash::Filters::NOOP do
|
|
75
77
|
}
|
76
78
|
CONFIG
|
77
79
|
|
78
|
-
|
80
|
+
sample_one("type" => "noop") do
|
79
81
|
insist { subject.get("tags") } == ["test"]
|
80
82
|
end
|
81
83
|
end
|
@@ -89,11 +91,11 @@ describe LogStash::Filters::NOOP do
|
|
89
91
|
}
|
90
92
|
CONFIG
|
91
93
|
|
92
|
-
|
94
|
+
sample_one("type" => "noop") do
|
93
95
|
insist { subject.get("tags") } == ["test"]
|
94
96
|
end
|
95
97
|
|
96
|
-
|
98
|
+
sample_one("type" => "noop", "tags" => ["t1", "t2"]) do
|
97
99
|
insist { subject.get("tags") } == ["t1", "t2", "test"]
|
98
100
|
end
|
99
101
|
end
|
@@ -107,11 +109,11 @@ describe LogStash::Filters::NOOP do
|
|
107
109
|
}
|
108
110
|
CONFIG
|
109
111
|
|
110
|
-
|
112
|
+
sample_one("type" => "noop") do
|
111
113
|
insist { subject.get("tags") } == ["bar"]
|
112
114
|
end
|
113
115
|
|
114
|
-
|
116
|
+
sample_one("type" => "noop", "tags" => "foo") do
|
115
117
|
insist { subject.get("tags") } == ["foo", "bar"]
|
116
118
|
end
|
117
119
|
end
|
@@ -125,7 +127,7 @@ describe LogStash::Filters::NOOP do
|
|
125
127
|
}
|
126
128
|
CONFIG
|
127
129
|
|
128
|
-
|
130
|
+
sample_one("type" => "noop", "tags" => "foo") do
|
129
131
|
# this is completely weird but seems to be already expected in other specs
|
130
132
|
insist { subject.get("tags") } == ["foo", "foo"]
|
131
133
|
end
|
@@ -140,19 +142,19 @@ describe LogStash::Filters::NOOP do
|
|
140
142
|
}
|
141
143
|
CONFIG
|
142
144
|
|
143
|
-
|
145
|
+
sample_one("type" => "noop") do
|
144
146
|
insist { subject.get("tags") } == ["test"]
|
145
147
|
end
|
146
148
|
|
147
|
-
|
149
|
+
sample_one("type" => "noop", "tags" => ["t1"]) do
|
148
150
|
insist { subject.get("tags") } == ["t1", "test"]
|
149
151
|
end
|
150
152
|
|
151
|
-
|
153
|
+
sample_one("type" => "noop", "tags" => ["t1", "t2"]) do
|
152
154
|
insist { subject.get("tags") } == ["t1", "t2", "test"]
|
153
155
|
end
|
154
156
|
|
155
|
-
|
157
|
+
sample_one("type" => "noop", "tags" => ["t1", "t2", "t3"]) do
|
156
158
|
insist { subject.get("tags") } == ["t1", "t2", "t3", "test"]
|
157
159
|
end
|
158
160
|
end
|
@@ -166,39 +168,39 @@ describe LogStash::Filters::NOOP do
|
|
166
168
|
}
|
167
169
|
CONFIG
|
168
170
|
|
169
|
-
|
171
|
+
sample_one("type" => "noop", "tags" => "foo") do
|
170
172
|
insist { subject.get("tags") } == ["foo"]
|
171
173
|
end
|
172
174
|
|
173
|
-
|
175
|
+
sample_one("type" => "noop", "tags" => "t2") do
|
174
176
|
insist { subject.get("tags") } == []
|
175
177
|
end
|
176
178
|
|
177
|
-
|
179
|
+
sample_one("type" => "noop", "tags" => ["t2"]) do
|
178
180
|
insist { subject.get("tags") } == []
|
179
181
|
end
|
180
182
|
|
181
|
-
|
183
|
+
sample_one("type" => "noop", "tags" => ["t4"]) do
|
182
184
|
insist { subject.get("tags") } == ["t4"]
|
183
185
|
end
|
184
186
|
|
185
|
-
|
187
|
+
sample_one("type" => "noop", "tags" => ["t1", "t2", "t3"]) do
|
186
188
|
insist { subject.get("tags") } == ["t1"]
|
187
189
|
end
|
188
190
|
|
189
191
|
# also test from Json deserialized data to test the handling of native Java collections by JrJackson
|
190
192
|
# see https://github.com/elastic/logstash/issues/2261
|
191
|
-
|
193
|
+
sample_one(LogStash::Json.load("{\"type\":\"noop\", \"tags\":[\"t1\", \"t2\", \"t3\"]}")) do
|
192
194
|
insist { subject.get("tags") } == ["t1"]
|
193
195
|
end
|
194
196
|
|
195
|
-
|
197
|
+
sample_one("type" => "noop", "tags" => ["t1", "t2"]) do
|
196
198
|
insist { subject.get("tags") } == ["t1"]
|
197
199
|
end
|
198
200
|
|
199
201
|
# also test from Json deserialized data to test the handling of native Java collections by JrJackson
|
200
202
|
# see https://github.com/elastic/logstash/issues/2261
|
201
|
-
|
203
|
+
sample_one(LogStash::Json.load("{\"type\":\"noop\", \"tags\":[\"t1\", \"t2\"]}")) do
|
202
204
|
insist { subject.get("tags") } == ["t1"]
|
203
205
|
end
|
204
206
|
end
|
@@ -212,13 +214,13 @@ describe LogStash::Filters::NOOP do
|
|
212
214
|
}
|
213
215
|
CONFIG
|
214
216
|
|
215
|
-
|
217
|
+
sample_one("type" => "noop", "tags" => ["t1", "goaway", "t3"], "blackhole" => "goaway") do
|
216
218
|
insist { subject.get("tags") } == ["t1", "t3"]
|
217
219
|
end
|
218
220
|
|
219
221
|
# also test from Json deserialized data to test the handling of native Java collections by JrJackson
|
220
222
|
# see https://github.com/elastic/logstash/issues/2261
|
221
|
-
|
223
|
+
sample_one(LogStash::Json.load("{\"type\":\"noop\", \"tags\":[\"t1\", \"goaway\", \"t3\"], \"blackhole\":\"goaway\"}")) do
|
222
224
|
insist { subject.get("tags") } == ["t1", "t3"]
|
223
225
|
end
|
224
226
|
end
|
@@ -232,17 +234,17 @@ describe LogStash::Filters::NOOP do
|
|
232
234
|
}
|
233
235
|
CONFIG
|
234
236
|
|
235
|
-
|
237
|
+
sample_one("type" => "noop", "t4" => "four") do
|
236
238
|
insist { subject }.include?("t4")
|
237
239
|
end
|
238
240
|
|
239
|
-
|
241
|
+
sample_one("type" => "noop", "t1" => "one", "t2" => "two", "t3" => "three") do
|
240
242
|
insist { subject }.include?("t1")
|
241
243
|
reject { subject }.include?("t2")
|
242
244
|
reject { subject }.include?("t3")
|
243
245
|
end
|
244
246
|
|
245
|
-
|
247
|
+
sample_one("type" => "noop", "t1" => "one", "t2" => "two") do
|
246
248
|
insist { subject }.include?("t1")
|
247
249
|
reject { subject }.include?("t2")
|
248
250
|
end
|
@@ -257,7 +259,7 @@ describe LogStash::Filters::NOOP do
|
|
257
259
|
}
|
258
260
|
CONFIG
|
259
261
|
|
260
|
-
|
262
|
+
sample_one("tags" => "foo") do
|
261
263
|
reject { subject }.include?("tags")
|
262
264
|
end
|
263
265
|
end
|
@@ -271,7 +273,7 @@ describe LogStash::Filters::NOOP do
|
|
271
273
|
}
|
272
274
|
CONFIG
|
273
275
|
|
274
|
-
|
276
|
+
sample_one("type" => "noop", "t1" => {"t2" => "two", "t3" => "three"}) do
|
275
277
|
insist { subject }.include?("t1")
|
276
278
|
reject { subject }.include?("[t1][t2]")
|
277
279
|
insist { subject }.include?("[t1][t3]")
|
@@ -287,7 +289,7 @@ describe LogStash::Filters::NOOP do
|
|
287
289
|
}
|
288
290
|
CONFIG
|
289
291
|
|
290
|
-
|
292
|
+
sample_one("type" => "noop", "t1" => ["t2", "t3"]) do
|
291
293
|
insist { subject }.include?("t1")
|
292
294
|
insist { subject.get("[t1][0]") } == "t3"
|
293
295
|
end
|
@@ -302,7 +304,7 @@ describe LogStash::Filters::NOOP do
|
|
302
304
|
}
|
303
305
|
CONFIG
|
304
306
|
|
305
|
-
|
307
|
+
sample_one("type" => "noop", "blackhole" => "go", "go" => "away") do
|
306
308
|
insist { subject }.include?("blackhole")
|
307
309
|
reject { subject }.include?("go")
|
308
310
|
end
|
@@ -47,7 +47,7 @@ describe LogStash::Instrument::WrappedWriteClient do
|
|
47
47
|
end
|
48
48
|
|
49
49
|
it "pushes batch to the `WriteClient`" do
|
50
|
-
batch =
|
50
|
+
batch = []
|
51
51
|
batch << event
|
52
52
|
|
53
53
|
pusher_thread = Thread.new(subject, batch) do |_subject, _batch|
|
@@ -101,7 +101,7 @@ describe LogStash::Instrument::WrappedWriteClient do
|
|
101
101
|
end
|
102
102
|
|
103
103
|
context "WrappedSynchronousQueue" do
|
104
|
-
let(:queue) { LogStash::Util::WrappedSynchronousQueue.new }
|
104
|
+
let(:queue) { LogStash::Util::WrappedSynchronousQueue.new(1024) }
|
105
105
|
|
106
106
|
before do
|
107
107
|
read_client.set_events_metric(metric.namespace([:stats, :events]))
|
@@ -0,0 +1,176 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
require "logstash/java_filter_delegator"
|
4
|
+
require "logstash/instrument/null_metric"
|
5
|
+
require "logstash/event"
|
6
|
+
require "logstash/execution_context"
|
7
|
+
require "support/shared_contexts"
|
8
|
+
|
9
|
+
describe LogStash::JavaFilterDelegator do
|
10
|
+
|
11
|
+
class MockGauge
|
12
|
+
def increment(_)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
include_context "execution_context"
|
17
|
+
|
18
|
+
let(:logger) { double(:logger) }
|
19
|
+
let(:filter_id) { "my-filter" }
|
20
|
+
let(:config) do
|
21
|
+
{ "host" => "127.0.0.1", "id" => filter_id }
|
22
|
+
end
|
23
|
+
let(:collector) { [] }
|
24
|
+
let(:counter_in) { MockGauge.new }
|
25
|
+
let(:counter_out) { MockGauge.new }
|
26
|
+
let(:counter_time) { MockGauge.new }
|
27
|
+
let(:metric) { LogStash::Instrument::NamespacedNullMetric.new(collector, :null) }
|
28
|
+
let(:events) { [LogStash::Event.new, LogStash::Event.new] }
|
29
|
+
|
30
|
+
before :each do
|
31
|
+
allow(pipeline).to receive(:id).and_return(pipeline_id)
|
32
|
+
allow(metric).to receive(:namespace).with(anything).and_return(metric)
|
33
|
+
allow(metric).to receive(:counter).with(:in).and_return(counter_in)
|
34
|
+
allow(metric).to receive(:counter).with(:out).and_return(counter_out)
|
35
|
+
allow(metric).to receive(:counter).with(:duration_in_millis).and_return(counter_time)
|
36
|
+
end
|
37
|
+
|
38
|
+
let(:plugin_klass) do
|
39
|
+
Class.new(LogStash::Filters::Base) do
|
40
|
+
config_name "super_plugin"
|
41
|
+
config :host, :validate => :string
|
42
|
+
def register; end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
subject { described_class.new(logger, plugin_klass, metric, execution_context, config) }
|
47
|
+
|
48
|
+
it "create a plugin with the passed options" do
|
49
|
+
expect(plugin_klass).to receive(:new).with(config).and_return(plugin_klass.new(config))
|
50
|
+
described_class.new(logger, plugin_klass, metric, execution_context, config)
|
51
|
+
end
|
52
|
+
|
53
|
+
context "when the plugin support flush" do
|
54
|
+
let(:plugin_klass) do
|
55
|
+
Class.new(LogStash::Filters::Base) do
|
56
|
+
config_name "super_plugin"
|
57
|
+
config :host, :validate => :string
|
58
|
+
def register; end
|
59
|
+
def flush(options = {}); @events ; end
|
60
|
+
def filter(event)
|
61
|
+
@events ||= []
|
62
|
+
@events << event
|
63
|
+
event.cancel
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
it "defines a flush method" do
|
69
|
+
expect(subject.respond_to?(:flush)).to be_truthy
|
70
|
+
end
|
71
|
+
|
72
|
+
context "when the flush return events" do
|
73
|
+
it "increments the out" do
|
74
|
+
subject.multi_filter([LogStash::Event.new])
|
75
|
+
expect(counter_out).to receive(:increment).with(1)
|
76
|
+
subject.flush({})
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "when the flush doesn't return anything" do
|
81
|
+
it "doesnt increment the out" do
|
82
|
+
expect(metric).not_to receive(:increment)
|
83
|
+
subject.flush({})
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context "when the filter buffer events" do
|
88
|
+
before do
|
89
|
+
allow(metric).to receive(:increment).with(anything, anything)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "has incremented :in" do
|
93
|
+
expect(counter_in).to receive(:increment).with(events.size)
|
94
|
+
subject.multi_filter(events)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "has not incremented :out" do
|
98
|
+
expect(counter_out).not_to receive(:increment).with(anything)
|
99
|
+
subject.multi_filter(events)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context "when the filter create more events" do
|
104
|
+
let(:plugin_klass) do
|
105
|
+
Class.new(LogStash::Filters::Base) do
|
106
|
+
config_name "super_plugin"
|
107
|
+
config :host, :validate => :string
|
108
|
+
def register; end
|
109
|
+
def flush(options = {}); @events ; end
|
110
|
+
|
111
|
+
# naive split filter implementation
|
112
|
+
def filter(event)
|
113
|
+
event.cancel
|
114
|
+
2.times { yield LogStash::Event.new }
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
before do
|
120
|
+
allow(metric).to receive(:increment).with(anything, anything)
|
121
|
+
end
|
122
|
+
|
123
|
+
it "increments the in/out of the metric" do
|
124
|
+
expect(counter_in).to receive(:increment).with(events.size)
|
125
|
+
expect(counter_out).to receive(:increment).with(events.size * 2)
|
126
|
+
|
127
|
+
subject.multi_filter(events)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context "when the plugin doesnt support flush" do
|
133
|
+
let(:plugin_klass) do
|
134
|
+
Class.new(LogStash::Filters::Base) do
|
135
|
+
config_name "super_plugin"
|
136
|
+
config :host, :validate => :string
|
137
|
+
def register; end
|
138
|
+
def filter(event)
|
139
|
+
event
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
before do
|
145
|
+
allow(metric).to receive(:increment).with(anything, anything)
|
146
|
+
end
|
147
|
+
|
148
|
+
it "doesnt define a flush method" do
|
149
|
+
expect(subject.has_flush).to be_falsey
|
150
|
+
end
|
151
|
+
|
152
|
+
it "increments the in/out of the metric" do
|
153
|
+
expect(counter_in).to receive(:increment).with(events.size)
|
154
|
+
expect(counter_out).to receive(:increment).with(events.size)
|
155
|
+
|
156
|
+
subject.multi_filter(events)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
context "#config_name" do
|
161
|
+
it "proxy the config_name to the class method" do
|
162
|
+
expect(subject.config_name).to eq("super_plugin")
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
context "delegate methods to the original plugin" do
|
167
|
+
# I am not testing the behavior of these methods
|
168
|
+
# this is done in the plugin tests. I just want to make sure
|
169
|
+
# the proxy delegates the methods.
|
170
|
+
LogStash::JavaFilterDelegator::DELEGATED_METHODS.each do |method|
|
171
|
+
it "delegate method: `#{method}` to the filter" do
|
172
|
+
expect(subject.respond_to?(method))
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|