logstash-core 6.0.0.beta1-java → 6.0.0.beta2-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 +0 -16
- data/lib/logstash/compiler/lscl.rb +2 -53
- data/lib/logstash/compiler/lscl/helpers.rb +55 -0
- data/lib/logstash/config/config_ast.rb +6 -3
- data/lib/logstash/config/modules_common.rb +4 -1
- data/lib/logstash/elasticsearch_client.rb +4 -1
- data/lib/logstash/environment.rb +8 -2
- data/lib/logstash/filter_delegator.rb +11 -6
- data/lib/logstash/instrument/collector.rb +7 -5
- data/lib/logstash/instrument/metric_store.rb +6 -9
- data/lib/logstash/instrument/namespaced_metric.rb +4 -0
- data/lib/logstash/instrument/namespaced_null_metric.rb +4 -0
- data/lib/logstash/instrument/null_metric.rb +10 -0
- data/lib/logstash/instrument/wrapped_write_client.rb +33 -24
- data/lib/logstash/modules/kibana_client.rb +5 -3
- data/lib/logstash/modules/kibana_config.rb +1 -4
- data/lib/logstash/modules/scaffold.rb +2 -0
- data/lib/logstash/modules/settings_merger.rb +52 -4
- data/lib/logstash/output_delegator.rb +7 -5
- data/lib/logstash/pipeline.rb +37 -14
- data/lib/logstash/pipeline_settings.rb +2 -0
- data/lib/logstash/runner.rb +14 -2
- data/lib/logstash/settings.rb +26 -0
- data/lib/logstash/util/cloud_setting_auth.rb +29 -0
- data/lib/logstash/util/cloud_setting_id.rb +41 -0
- data/lib/logstash/util/modules_setting_array.rb +28 -0
- data/lib/logstash/util/wrapped_acked_queue.rb +5 -6
- data/lib/logstash/util/wrapped_synchronous_queue.rb +14 -9
- data/lib/logstash/version.rb +1 -1
- data/locales/en.yml +16 -0
- data/spec/logstash/agent/converge_spec.rb +6 -7
- data/spec/logstash/config/source/multi_local_spec.rb +11 -0
- data/spec/logstash/filter_delegator_spec.rb +20 -8
- data/spec/logstash/legacy_ruby_event_spec.rb +4 -4
- data/spec/logstash/modules/scaffold_spec.rb +2 -7
- data/spec/logstash/modules/settings_merger_spec.rb +111 -0
- data/spec/logstash/output_delegator_spec.rb +15 -5
- data/spec/logstash/pipeline_spec.rb +39 -7
- data/spec/logstash/runner_spec.rb +4 -1
- data/spec/logstash/settings/modules_spec.rb +115 -0
- metadata +10 -2
@@ -205,19 +205,18 @@ module LogStash; module Util
|
|
205
205
|
end
|
206
206
|
|
207
207
|
def start_clock
|
208
|
-
@inflight_clocks[Thread.current] =
|
209
|
-
@event_metric.time(:duration_in_millis),
|
210
|
-
@pipeline_metric.time(:duration_in_millis)
|
211
|
-
]
|
208
|
+
@inflight_clocks[Thread.current] = java.lang.System.current_time_millis
|
212
209
|
end
|
213
210
|
|
214
211
|
def stop_clock(batch)
|
215
212
|
unless @inflight_clocks[Thread.current].nil?
|
216
213
|
if batch.size > 0
|
217
|
-
#
|
214
|
+
# only stop (which also records) the metrics if the batch is non-empty.
|
218
215
|
# start_clock is now called at empty batch creation and an empty batch could
|
219
216
|
# stay empty all the way down to the close_batch call.
|
220
|
-
@inflight_clocks[Thread.current]
|
217
|
+
time_taken = java.lang.System.current_time_millis - @inflight_clocks[Thread.current]
|
218
|
+
@event_metric.report_time(:duration_in_millis, time_taken)
|
219
|
+
@pipeline_metric.report_time(:duration_in_millis, time_taken)
|
221
220
|
end
|
222
221
|
@inflight_clocks.delete(Thread.current)
|
223
222
|
end
|
@@ -68,11 +68,17 @@ module LogStash; module Util
|
|
68
68
|
|
69
69
|
def set_events_metric(metric)
|
70
70
|
@event_metric = metric
|
71
|
+
@event_metric_out = @event_metric.counter(:out)
|
72
|
+
@event_metric_filtered = @event_metric.counter(:filtered)
|
73
|
+
@event_metric_time = @event_metric.counter(:duration_in_millis)
|
71
74
|
define_initial_metrics_values(@event_metric)
|
72
75
|
end
|
73
76
|
|
74
77
|
def set_pipeline_metric(metric)
|
75
78
|
@pipeline_metric = metric
|
79
|
+
@pipeline_metric_out = @pipeline_metric.counter(:out)
|
80
|
+
@pipeline_metric_filtered = @pipeline_metric.counter(:filtered)
|
81
|
+
@pipeline_metric_time = @pipeline_metric.counter(:duration_in_millis)
|
76
82
|
define_initial_metrics_values(@pipeline_metric)
|
77
83
|
end
|
78
84
|
|
@@ -140,10 +146,7 @@ module LogStash; module Util
|
|
140
146
|
end
|
141
147
|
|
142
148
|
def start_clock
|
143
|
-
@inflight_clocks[Thread.current] =
|
144
|
-
@event_metric.time(:duration_in_millis),
|
145
|
-
@pipeline_metric.time(:duration_in_millis)
|
146
|
-
]
|
149
|
+
@inflight_clocks[Thread.current] = java.lang.System.current_time_millis
|
147
150
|
end
|
148
151
|
|
149
152
|
def stop_clock(batch)
|
@@ -152,20 +155,22 @@ module LogStash; module Util
|
|
152
155
|
# only stop (which also records) the metrics if the batch is non-empty.
|
153
156
|
# start_clock is now called at empty batch creation and an empty batch could
|
154
157
|
# stay empty all the way down to the close_batch call.
|
155
|
-
@inflight_clocks[Thread.current]
|
158
|
+
time_taken = java.lang.System.current_time_millis - @inflight_clocks[Thread.current]
|
159
|
+
@event_metric_time.increment(time_taken)
|
160
|
+
@pipeline_metric_time.increment(time_taken)
|
156
161
|
end
|
157
162
|
@inflight_clocks.delete(Thread.current)
|
158
163
|
end
|
159
164
|
end
|
160
165
|
|
161
166
|
def add_filtered_metrics(batch)
|
162
|
-
@
|
163
|
-
@
|
167
|
+
@event_metric_filtered.increment(batch.filtered_size)
|
168
|
+
@pipeline_metric_filtered.increment(batch.filtered_size)
|
164
169
|
end
|
165
170
|
|
166
171
|
def add_output_metrics(batch)
|
167
|
-
@
|
168
|
-
@
|
172
|
+
@event_metric_out.increment(batch.filtered_size)
|
173
|
+
@pipeline_metric_out.increment(batch.filtered_size)
|
169
174
|
end
|
170
175
|
end
|
171
176
|
|
data/lib/logstash/version.rb
CHANGED
data/locales/en.yml
CHANGED
@@ -242,6 +242,22 @@ en:
|
|
242
242
|
'-M "MODULE_NAME.var.PLUGIN_TYPE.PLUGIN_NAME.VARIABLE_NAME=VALUE"'
|
243
243
|
as in
|
244
244
|
'-M "example.var.filter.mutate.fieldname=fieldvalue"'
|
245
|
+
modules_setup: |+
|
246
|
+
Load index template into Elasticsearch, and saved searches,
|
247
|
+
index-pattern, visualizations, and dashboards into Kibana when
|
248
|
+
running modules.
|
249
|
+
cloud_id: |+
|
250
|
+
Sets the elasticsearch and kibana host settings for
|
251
|
+
module connections in Elastic Cloud.
|
252
|
+
Your Elastic Cloud User interface or the Cloud support
|
253
|
+
team should provide this.
|
254
|
+
Add an optional label prefix '<label>:' to help you
|
255
|
+
identify multiple cloud.ids.
|
256
|
+
e.g. 'staging:dXMtZWFzdC0xLmF3cy5mb3VuZC5pbyRub3RhcmVhbCRpZGVudGlmaWVy'
|
257
|
+
cloud_auth: |+
|
258
|
+
Sets the elasticsearch and kibana username and password
|
259
|
+
for module connections in Elastic Cloud
|
260
|
+
e.g. 'username:<password>'
|
245
261
|
configtest: |+
|
246
262
|
Check configuration for valid syntax and then exit.
|
247
263
|
http_host: Web API binding host
|
@@ -74,19 +74,18 @@ describe LogStash::Agent do
|
|
74
74
|
describe "#running_user_defined_pipelines" do
|
75
75
|
it "returns the user defined pipelines" do
|
76
76
|
start_agent(subject)
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
end
|
81
|
-
subject.shutdown
|
77
|
+
wait_for do
|
78
|
+
subject.with_running_user_defined_pipelines {|pipelines| pipelines.keys }
|
79
|
+
end.to eq([:main])
|
82
80
|
end
|
83
81
|
end
|
84
82
|
|
85
83
|
describe "#running_user_defined_pipelines?" do
|
86
84
|
it "returns true" do
|
87
85
|
start_agent(subject)
|
88
|
-
|
89
|
-
|
86
|
+
wait_for do
|
87
|
+
subject.running_user_defined_pipelines?
|
88
|
+
end.to be_truthy
|
90
89
|
end
|
91
90
|
end
|
92
91
|
end
|
@@ -155,5 +155,16 @@ describe LogStash::Config::Source::MultiLocal do
|
|
155
155
|
expect { subject.pipeline_configs }.to raise_error(ArgumentError)
|
156
156
|
end
|
157
157
|
end
|
158
|
+
|
159
|
+
context 'using dead letter queue settings' do
|
160
|
+
let(:retrieved_pipelines) do [
|
161
|
+
{ "pipeline.id" => "main", "path.dead_letter_queue" => "/tmp", "dead_letter_queue.max_bytes" => 10000 },
|
162
|
+
]
|
163
|
+
end
|
164
|
+
it "should not raise an error" do
|
165
|
+
expect { subject.pipeline_configs }.not_to raise_error(ArgumentError)
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|
158
169
|
end
|
159
170
|
end
|
@@ -7,20 +7,32 @@ require "logstash/execution_context"
|
|
7
7
|
require "support/shared_contexts"
|
8
8
|
|
9
9
|
describe LogStash::FilterDelegator do
|
10
|
+
|
11
|
+
class MockGauge
|
12
|
+
def increment(_)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
10
16
|
include_context "execution_context"
|
11
|
-
|
17
|
+
|
12
18
|
let(:logger) { double(:logger) }
|
13
19
|
let(:filter_id) { "my-filter" }
|
14
20
|
let(:config) do
|
15
21
|
{ "host" => "127.0.0.1", "id" => filter_id }
|
16
22
|
end
|
17
23
|
let(:collector) { [] }
|
24
|
+
let(:counter_in) { MockGauge.new }
|
25
|
+
let(:counter_out) { MockGauge.new }
|
26
|
+
let(:counter_time) { MockGauge.new }
|
18
27
|
let(:metric) { LogStash::Instrument::NamespacedNullMetric.new(collector, :null) }
|
19
28
|
let(:events) { [LogStash::Event.new, LogStash::Event.new] }
|
20
29
|
|
21
30
|
before :each do
|
22
31
|
allow(pipeline).to receive(:id).and_return(pipeline_id)
|
23
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)
|
24
36
|
end
|
25
37
|
|
26
38
|
let(:plugin_klass) do
|
@@ -60,7 +72,7 @@ describe LogStash::FilterDelegator do
|
|
60
72
|
context "when the flush return events" do
|
61
73
|
it "increments the out" do
|
62
74
|
subject.multi_filter([LogStash::Event.new])
|
63
|
-
expect(
|
75
|
+
expect(counter_out).to receive(:increment).with(1)
|
64
76
|
subject.flush({})
|
65
77
|
end
|
66
78
|
end
|
@@ -78,12 +90,12 @@ describe LogStash::FilterDelegator do
|
|
78
90
|
end
|
79
91
|
|
80
92
|
it "has incremented :in" do
|
81
|
-
expect(
|
93
|
+
expect(counter_in).to receive(:increment).with(events.size)
|
82
94
|
subject.multi_filter(events)
|
83
95
|
end
|
84
96
|
|
85
97
|
it "has not incremented :out" do
|
86
|
-
expect(
|
98
|
+
expect(counter_out).not_to receive(:increment).with(anything)
|
87
99
|
subject.multi_filter(events)
|
88
100
|
end
|
89
101
|
end
|
@@ -109,8 +121,8 @@ describe LogStash::FilterDelegator do
|
|
109
121
|
end
|
110
122
|
|
111
123
|
it "increments the in/out of the metric" do
|
112
|
-
expect(
|
113
|
-
expect(
|
124
|
+
expect(counter_in).to receive(:increment).with(events.size)
|
125
|
+
expect(counter_out).to receive(:increment).with(events.size * 2)
|
114
126
|
|
115
127
|
subject.multi_filter(events)
|
116
128
|
end
|
@@ -138,8 +150,8 @@ describe LogStash::FilterDelegator do
|
|
138
150
|
end
|
139
151
|
|
140
152
|
it "increments the in/out of the metric" do
|
141
|
-
expect(
|
142
|
-
expect(
|
153
|
+
expect(counter_in).to receive(:increment).with(events.size)
|
154
|
+
expect(counter_out).to receive(:increment).with(events.size)
|
143
155
|
|
144
156
|
subject.multi_filter(events)
|
145
157
|
end
|
@@ -399,17 +399,17 @@ describe LogStash::Event do
|
|
399
399
|
end
|
400
400
|
|
401
401
|
it "should assign current time when no timestamp" do
|
402
|
-
expect(LogStash::Event.new({}).timestamp.to_i).to be_within(
|
402
|
+
expect(LogStash::Event.new({}).timestamp.to_i).to be_within(2).of (Time.now.to_i)
|
403
403
|
end
|
404
404
|
|
405
405
|
it "should tag for invalid value" do
|
406
406
|
event = LogStash::Event.new("@timestamp" => "foo")
|
407
|
-
expect(event.timestamp.to_i).to be_within(
|
407
|
+
expect(event.timestamp.to_i).to be_within(2).of Time.now.to_i
|
408
408
|
expect(event.get("tags")).to eq([LogStash::Event::TIMESTAMP_FAILURE_TAG])
|
409
409
|
expect(event.get(LogStash::Event::TIMESTAMP_FAILURE_FIELD)).to eq("foo")
|
410
410
|
|
411
411
|
event = LogStash::Event.new("@timestamp" => 666)
|
412
|
-
expect(event.timestamp.to_i).to be_within(
|
412
|
+
expect(event.timestamp.to_i).to be_within(2).of Time.now.to_i
|
413
413
|
expect(event.get("tags")).to eq([LogStash::Event::TIMESTAMP_FAILURE_TAG])
|
414
414
|
expect(event.get(LogStash::Event::TIMESTAMP_FAILURE_FIELD)).to eq(666)
|
415
415
|
end
|
@@ -421,7 +421,7 @@ describe LogStash::Event do
|
|
421
421
|
|
422
422
|
it "should tag for invalid string format" do
|
423
423
|
event = LogStash::Event.new("@timestamp" => "foo")
|
424
|
-
expect(event.timestamp.to_i).to be_within(
|
424
|
+
expect(event.timestamp.to_i).to be_within(2).of Time.now.to_i
|
425
425
|
expect(event.get("tags")).to eq([LogStash::Event::TIMESTAMP_FAILURE_TAG])
|
426
426
|
expect(event.get(LogStash::Event::TIMESTAMP_FAILURE_FIELD)).to eq("foo")
|
427
427
|
end
|
@@ -124,18 +124,13 @@ ERB
|
|
124
124
|
expect(resource2).to be_a(LogStash::Modules::KibanaDashboards)
|
125
125
|
expect(resource1.import_path).to eq("api/kibana/settings")
|
126
126
|
expect(resource1.content).to be_a(Array)
|
127
|
-
expect(resource1.content.size).to eq(
|
127
|
+
expect(resource1.content.size).to eq(1)
|
128
128
|
|
129
129
|
test_object = resource1.content[0]
|
130
130
|
expect(test_object).to be_a(LogStash::Modules::KibanaSettings::Setting)
|
131
131
|
expect(test_object.name).to eq("defaultIndex")
|
132
132
|
expect(test_object.value).to eq("foo-*")
|
133
133
|
|
134
|
-
test_object = resource1.content[1]
|
135
|
-
expect(test_object).to be_a(LogStash::Modules::KibanaSettings::Setting)
|
136
|
-
expect(test_object.name).to eq("metrics:max_buckets")
|
137
|
-
expect(test_object.value).to eq(86400)
|
138
|
-
|
139
134
|
expect(resource2.import_path).to eq("api/kibana/dashboards/import")
|
140
135
|
expect(resource2.content).to be_a(Array)
|
141
136
|
expect(resource2.content.size).to eq(5)
|
@@ -207,7 +202,7 @@ ERB
|
|
207
202
|
test_module.with_settings(module_settings)
|
208
203
|
test_module.import(LogStash::Modules::ElasticsearchImporter.new(client), LogStash::Modules::KibanaImporter.new(kbnclient))
|
209
204
|
expect(paths).to eq(expected_paths)
|
210
|
-
expect(contents[0]).to eq({"changes"=>{"defaultIndex"=>"tester-*"
|
205
|
+
expect(contents[0]).to eq({"changes"=>{"defaultIndex"=>"tester-*"}})
|
211
206
|
second_kbn_post = contents[1]
|
212
207
|
expect(second_kbn_post[:version]).to eq("9.8.7-6")
|
213
208
|
expect(second_kbn_post[:objects]).to be_a(Array)
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
require "logstash/util/cloud_setting_id"
|
4
|
+
require "logstash/util/cloud_setting_auth"
|
5
|
+
require "logstash/modules/settings_merger"
|
6
|
+
require "logstash/util/password"
|
7
|
+
|
8
|
+
class SubstituteSettingsForRSpec
|
9
|
+
def initialize(hash = {}) @hash = hash; end
|
10
|
+
def put(key, value) @hash[key] = value; end
|
11
|
+
def get(key) @hash[key]; end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe LogStash::Modules::SettingsMerger do
|
15
|
+
describe "#merge" do
|
16
|
+
let(:cli) {[{"name"=>"mod1", "var.input.tcp.port"=>"3333"}, {"name"=>"mod2"}]}
|
17
|
+
let(:yml) {[{"name"=>"mod1", "var.input.tcp.port"=>2222, "var.kibana.username"=>"rupert", "var.kibana.password"=>"fotherington"}, {"name"=>"mod3", "var.input.tcp.port"=>4445}]}
|
18
|
+
subject(:results) { described_class.merge(cli, yml) }
|
19
|
+
it "merges cli overwriting any common fields in yml" do
|
20
|
+
expect(results).to be_a(Array)
|
21
|
+
expect(results.size).to eq(3)
|
22
|
+
expect(results[0]["name"]).to eq("mod1")
|
23
|
+
expect(results[0]["var.input.tcp.port"]).to eq("3333")
|
24
|
+
expect(results[0]["var.kibana.username"]).to eq("rupert")
|
25
|
+
expect(results[1]["name"]).to eq("mod2")
|
26
|
+
expect(results[2]["name"]).to eq("mod3")
|
27
|
+
expect(results[2]["var.input.tcp.port"]).to eq(4445)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#merge_cloud_settings" do
|
32
|
+
let(:cloud_id) { LogStash::Util::CloudSettingId.new("label:dXMtZWFzdC0xLmF3cy5mb3VuZC5pbyRub3RhcmVhbCRpZGVudGlmaWVy") }
|
33
|
+
let(:cloud_auth) { LogStash::Util::CloudSettingAuth.new("elastix:bigwhoppingfairytail") }
|
34
|
+
let(:mod_settings) { {} }
|
35
|
+
|
36
|
+
context "when both are supplied" do
|
37
|
+
let(:expected_table) do
|
38
|
+
{
|
39
|
+
"var.kibana.scheme" => "https",
|
40
|
+
"var.kibana.host" => "identifier.us-east-1.aws.found.io:443",
|
41
|
+
"var.elasticsearch.hosts" => "notareal.us-east-1.aws.found.io:443",
|
42
|
+
"var.elasticsearch.username" => "elastix",
|
43
|
+
"var.kibana.username" => "elastix"
|
44
|
+
}
|
45
|
+
end
|
46
|
+
let(:ls_settings) { SubstituteSettingsForRSpec.new({"cloud.id" => cloud_id, "cloud.auth" => cloud_auth}) }
|
47
|
+
|
48
|
+
before do
|
49
|
+
described_class.merge_cloud_settings(mod_settings, ls_settings)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "adds entries to module settings" do
|
53
|
+
expected_table.each do |key, expected|
|
54
|
+
expect(mod_settings[key]).to eq(expected)
|
55
|
+
end
|
56
|
+
expect(mod_settings["var.elasticsearch.password"].value).to eq("bigwhoppingfairytail")
|
57
|
+
expect(mod_settings["var.kibana.password"].value).to eq("bigwhoppingfairytail")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "when cloud.id is supplied" do
|
62
|
+
let(:expected_table) do
|
63
|
+
{
|
64
|
+
"var.kibana.scheme" => "https",
|
65
|
+
"var.kibana.host" => "identifier.us-east-1.aws.found.io:443",
|
66
|
+
"var.elasticsearch.hosts" => "notareal.us-east-1.aws.found.io:443",
|
67
|
+
}
|
68
|
+
end
|
69
|
+
let(:ls_settings) { SubstituteSettingsForRSpec.new({"cloud.id" => cloud_id}) }
|
70
|
+
|
71
|
+
before do
|
72
|
+
described_class.merge_cloud_settings(mod_settings, ls_settings)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "adds entries to module settings" do
|
76
|
+
expected_table.each do |key, expected|
|
77
|
+
expect(mod_settings[key]).to eq(expected)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "when only cloud.auth is supplied" do
|
83
|
+
let(:ls_settings) { SubstituteSettingsForRSpec.new({"cloud.auth" => cloud_auth}) }
|
84
|
+
it "should raise an error" do
|
85
|
+
expect{ described_class.merge_cloud_settings(mod_settings, ls_settings) }.to raise_exception(ArgumentError)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context "when neither cloud.id nor cloud.auth is supplied" do
|
90
|
+
let(:ls_settings) { SubstituteSettingsForRSpec.new() }
|
91
|
+
it "should do nothing" do
|
92
|
+
expect(mod_settings).to be_empty
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#format_module_settings" do
|
98
|
+
let(:before_hash) { {"foo" => "red", "bar" => "blue", "qux" => "pink"} }
|
99
|
+
let(:after_hash) { {"foo" => "red", "bar" => "steel-blue", "baz" => LogStash::Util::Password.new("cyan"), "qux" => nil} }
|
100
|
+
subject(:results) { described_class.format_module_settings(before_hash, after_hash) }
|
101
|
+
it "yields an array of formatted lines for ease of logging" do
|
102
|
+
expect(results.size).to eq(after_hash.size + 2)
|
103
|
+
expect(results.first).to eq("-------- Module Settings ---------")
|
104
|
+
expect(results.last).to eq("-------- Module Settings ---------")
|
105
|
+
expect(results[1]).to eq("foo: 'red'")
|
106
|
+
expect(results[2]).to eq("bar: 'steel-blue', was: 'blue'")
|
107
|
+
expect(results[3]).to eq("baz: '<password>', was: ''")
|
108
|
+
expect(results[4]).to eq("qux: '', was: 'pink'")
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -5,10 +5,19 @@ require "spec_helper"
|
|
5
5
|
require "support/shared_contexts"
|
6
6
|
|
7
7
|
describe LogStash::OutputDelegator do
|
8
|
+
|
9
|
+
class MockGauge
|
10
|
+
def increment(_)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
8
14
|
let(:logger) { double("logger") }
|
9
15
|
let(:events) { 7.times.map { LogStash::Event.new }}
|
10
16
|
let(:plugin_args) { {"id" => "foo", "arg1" => "val1"} }
|
11
17
|
let(:collector) { [] }
|
18
|
+
let(:counter_in) { MockGauge.new }
|
19
|
+
let(:counter_out) { MockGauge.new }
|
20
|
+
let(:counter_time) { MockGauge.new }
|
12
21
|
let(:metric) { LogStash::Instrument::NamespacedNullMetric.new(collector, :null) }
|
13
22
|
|
14
23
|
include_context "execution_context"
|
@@ -23,6 +32,9 @@ describe LogStash::OutputDelegator do
|
|
23
32
|
before(:each) do
|
24
33
|
# use the same metric instance
|
25
34
|
allow(metric).to receive(:namespace).with(any_args).and_return(metric)
|
35
|
+
allow(metric).to receive(:counter).with(:in).and_return(counter_in)
|
36
|
+
allow(metric).to receive(:counter).with(:out).and_return(counter_out)
|
37
|
+
allow(metric).to receive(:counter).with(:duration_in_millis).and_return(counter_time)
|
26
38
|
|
27
39
|
allow(out_klass).to receive(:new).with(any_args).and_return(out_inst)
|
28
40
|
allow(out_klass).to receive(:name).and_return("example")
|
@@ -58,15 +70,13 @@ describe LogStash::OutputDelegator do
|
|
58
70
|
end
|
59
71
|
|
60
72
|
it "should increment the number of events received" do
|
61
|
-
expect(
|
62
|
-
expect(
|
73
|
+
expect(counter_in).to receive(:increment).with(events.length)
|
74
|
+
expect(counter_out).to receive(:increment).with(events.length)
|
63
75
|
subject.multi_receive(events)
|
64
76
|
end
|
65
77
|
|
66
78
|
it "should record the `duration_in_millis`" do
|
67
|
-
|
68
|
-
expect(subject.metric_events).to receive(:time).with(:duration_in_millis).and_return(clock)
|
69
|
-
expect(clock).to receive(:stop)
|
79
|
+
expect(counter_time).to receive(:increment).with(Integer)
|
70
80
|
subject.multi_receive(events)
|
71
81
|
end
|
72
82
|
end
|