logstash-core 5.0.0.alpha6.snapshot5-java → 5.0.0-java
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of logstash-core might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/jars.rb +1 -1
- data/lib/logstash-core/version.rb +1 -1
- data/lib/logstash/agent.rb +45 -11
- data/lib/logstash/api/app_helpers.rb +43 -7
- data/lib/logstash/api/commands/stats.rb +2 -1
- data/lib/logstash/api/errors.rb +28 -0
- data/lib/logstash/api/modules/base.rb +9 -7
- data/lib/logstash/api/modules/logging.rb +52 -0
- data/lib/logstash/api/modules/node.rb +13 -9
- data/lib/logstash/api/modules/root.rb +0 -2
- data/lib/logstash/api/modules/stats.rb +0 -2
- data/lib/logstash/api/rack_app.rb +5 -3
- data/lib/logstash/environment.rb +4 -5
- data/lib/logstash/instrument/collector.rb +4 -0
- data/lib/logstash/instrument/metric_store.rb +27 -2
- data/lib/logstash/logging/logger.rb +15 -4
- data/lib/logstash/patches/puma.rb +44 -0
- data/lib/logstash/pipeline.rb +8 -15
- data/lib/logstash/runner.rb +31 -17
- data/lib/logstash/settings.rb +34 -9
- data/lib/logstash/util/wrapped_synchronous_queue.rb +26 -9
- data/lib/logstash/version.rb +1 -1
- data/lib/logstash/webserver.rb +13 -2
- data/locales/en.yml +7 -2
- data/logstash-core.gemspec +1 -1
- data/spec/api/lib/api/logging_spec.rb +41 -0
- data/spec/api/lib/api/node_plugins_spec.rb +4 -3
- data/spec/api/lib/api/node_spec.rb +2 -0
- data/spec/api/lib/api/node_stats_spec.rb +2 -0
- data/spec/api/lib/api/plugins_spec.rb +3 -1
- data/spec/api/lib/api/root_spec.rb +3 -0
- data/spec/api/lib/errors_spec.rb +27 -0
- data/spec/api/lib/rack_app_spec.rb +4 -4
- data/spec/logstash/agent_spec.rb +112 -26
- data/spec/logstash/instrument/metric_store_spec.rb +37 -0
- data/spec/logstash/pipeline_spec.rb +54 -0
- data/spec/logstash/runner_spec.rb +2 -1
- data/spec/logstash/setting_spec.rb +23 -1
- data/spec/logstash/settings/string_spec.rb +1 -1
- data/spec/logstash/settings_spec.rb +27 -0
- data/spec/logstash/util/wrapped_synchronous_queue_spec.rb +49 -11
- data/spec/logstash/webserver_spec.rb +76 -18
- data/spec/support/helpers.rb +8 -0
- data/spec/support/mocks_classes.rb +22 -0
- data/spec/support/shared_examples.rb +10 -0
- data/vendor/jars/org/logstash/logstash-core/{5.0.0-alpha6/logstash-core-5.0.0-alpha6.jar → 5.0.0/logstash-core-5.0.0.jar} +0 -0
- metadata +16 -7
data/lib/logstash/version.rb
CHANGED
data/lib/logstash/webserver.rb
CHANGED
@@ -2,7 +2,9 @@
|
|
2
2
|
require "logstash/api/rack_app"
|
3
3
|
require "puma"
|
4
4
|
require "puma/server"
|
5
|
+
require "logstash/patches/puma"
|
5
6
|
require "concurrent"
|
7
|
+
require "thread"
|
6
8
|
|
7
9
|
module LogStash
|
8
10
|
class WebServer
|
@@ -71,12 +73,21 @@ module LogStash
|
|
71
73
|
end
|
72
74
|
|
73
75
|
def start_webserver(port)
|
76
|
+
# wrap any output that puma could generate into a wrapped logger
|
77
|
+
# use the puma namespace to override STDERR, STDOUT in that scope.
|
78
|
+
Puma::STDERR.logger = logger
|
79
|
+
Puma::STDOUT.logger = logger
|
80
|
+
|
81
|
+
io_wrapped_logger = LogStash::IOWrappedLogger.new(logger)
|
82
|
+
|
74
83
|
app = LogStash::Api::RackApp.app(logger, agent, http_environment)
|
75
84
|
|
76
|
-
|
85
|
+
events = ::Puma::Events.new(io_wrapped_logger, io_wrapped_logger)
|
86
|
+
|
87
|
+
@server = ::Puma::Server.new(app, events)
|
77
88
|
@server.add_tcp_listener(http_host, port)
|
78
89
|
|
79
|
-
logger.info("
|
90
|
+
logger.info("Successfully started Logstash API endpoint", :port => @port)
|
80
91
|
|
81
92
|
@server.run.join
|
82
93
|
end
|
data/locales/en.yml
CHANGED
@@ -74,15 +74,18 @@ en:
|
|
74
74
|
Logstash is not able to start since configuration auto reloading was enabled but the configuration contains plugins that don't support it. Quitting...
|
75
75
|
web_api:
|
76
76
|
cant_bind_to_port: |-
|
77
|
-
Logstash tried to bind to port %{port}, but the port is already in use. You can specify a new port by launching logtash with the --http
|
77
|
+
Logstash tried to bind to port %{port}, but the port is already in use. You can specify a new port by launching logtash with the --http.port option."
|
78
78
|
cant_bind_to_port_in_range: |-
|
79
|
-
Logstash tried to bind to port range %{http_ports}, but all the ports are already in use. You can specify a new port by launching logtash with the --http
|
79
|
+
Logstash tried to bind to port range %{http_ports}, but all the ports are already in use. You can specify a new port by launching logtash with the --http.port option."
|
80
80
|
hot_threads:
|
81
81
|
title: |-
|
82
82
|
::: {%{hostname}}
|
83
83
|
Hot threads at %{time}, busiestThreads=%{top_count}:
|
84
84
|
thread_title: |-
|
85
85
|
%{percent_of_cpu_time} % of cpu usage, state: %{thread_state}, thread name: '%{thread_name}'
|
86
|
+
logging:
|
87
|
+
unrecognized_option: |-
|
88
|
+
unrecognized option [%{option}]
|
86
89
|
runner:
|
87
90
|
short-help: |-
|
88
91
|
usage:
|
@@ -194,6 +197,8 @@ en:
|
|
194
197
|
path_settings: |+
|
195
198
|
Directory containing logstash.yml file. This can also be
|
196
199
|
set through the LS_SETTINGS_DIR environment variable.
|
200
|
+
path_logs: |+
|
201
|
+
Directory to Write Logstash internal logs to.
|
197
202
|
auto_reload: |+
|
198
203
|
Monitor configuration changes and reload
|
199
204
|
whenever it is changed.
|
data/logstash-core.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.require_paths = ["lib", "vendor/jars"]
|
18
18
|
gem.version = LOGSTASH_CORE_VERSION
|
19
19
|
|
20
|
-
gem.add_runtime_dependency "logstash-core-event-java", "5.0.0
|
20
|
+
gem.add_runtime_dependency "logstash-core-event-java", "5.0.0"
|
21
21
|
|
22
22
|
gem.add_runtime_dependency "pry", "~> 0.10.1" #(Ruby license)
|
23
23
|
gem.add_runtime_dependency "stud", "~> 0.0.19" #(Apache 2.0 license)
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require_relative "../../spec_helper"
|
3
|
+
require "sinatra"
|
4
|
+
require "logstash/api/modules/logging"
|
5
|
+
require "logstash/json"
|
6
|
+
|
7
|
+
describe LogStash::Api::Modules::Logging do
|
8
|
+
include_context "api setup"
|
9
|
+
|
10
|
+
describe "#logging" do
|
11
|
+
|
12
|
+
context "when setting a logger's log level" do
|
13
|
+
before(:all) do
|
14
|
+
@runner = LogStashRunner.new
|
15
|
+
@runner.start
|
16
|
+
end
|
17
|
+
|
18
|
+
after(:all) do
|
19
|
+
@runner.stop
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return a positive acknowledgement on success" do
|
23
|
+
put '/', '{"logger.logstash": "ERROR"}'
|
24
|
+
payload = LogStash::Json.load(last_response.body)
|
25
|
+
expect(payload['acknowledged']).to eq(true)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should throw error when level is invalid" do
|
29
|
+
put '/', '{"logger.logstash": "invalid"}'
|
30
|
+
payload = LogStash::Json.load(last_response.body)
|
31
|
+
expect(payload['error']).to eq("invalid level[invalid] for logger[logstash]")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should throw error when key logger is invalid" do
|
35
|
+
put '/', '{"invalid" : "ERROR"}'
|
36
|
+
payload = LogStash::Json.load(last_response.body)
|
37
|
+
expect(payload['error']).to eq("unrecognized option [invalid]")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require_relative "../../../support/shared_examples"
|
2
3
|
require_relative "../../spec_helper"
|
3
4
|
require "sinatra"
|
4
5
|
require "logstash/api/modules/plugins"
|
@@ -6,10 +7,11 @@ require "logstash/json"
|
|
6
7
|
|
7
8
|
describe LogStash::Api::Modules::Plugins do
|
8
9
|
include_context "api setup"
|
10
|
+
include_examples "not found"
|
9
11
|
|
10
12
|
extend ResourceDSLMethods
|
11
13
|
|
12
|
-
before(:
|
14
|
+
before(:each) do
|
13
15
|
do_request { get "/" }
|
14
16
|
end
|
15
17
|
|
@@ -20,13 +22,12 @@ describe LogStash::Api::Modules::Plugins do
|
|
20
22
|
expect(last_response).to be_ok
|
21
23
|
end
|
22
24
|
|
23
|
-
it "should return a list of plugins" do
|
25
|
+
it "should return a list of plugins" do
|
24
26
|
expect(payload["plugins"]).to be_a(Array)
|
25
27
|
end
|
26
28
|
|
27
29
|
it "should return the total number of plugins" do
|
28
30
|
expect(payload["total"]).to be_a(Numeric)
|
29
31
|
end
|
30
|
-
|
31
32
|
end
|
32
33
|
end
|
@@ -1,11 +1,13 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require_relative "../../spec_helper"
|
3
|
+
require_relative "../../../support/shared_examples"
|
3
4
|
require "sinatra"
|
4
5
|
require "logstash/api/modules/node"
|
5
6
|
require "logstash/json"
|
6
7
|
|
7
8
|
describe LogStash::Api::Modules::Node do
|
8
9
|
include_context "api setup"
|
10
|
+
include_examples "not found"
|
9
11
|
|
10
12
|
describe "#hot threads" do
|
11
13
|
|
@@ -1,11 +1,13 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require_relative "../../spec_helper"
|
3
|
+
require_relative "../../../support/shared_examples"
|
3
4
|
require "sinatra"
|
4
5
|
require "logstash/api/modules/node_stats"
|
5
6
|
require "logstash/json"
|
6
7
|
|
7
8
|
describe LogStash::Api::Modules::NodeStats do
|
8
9
|
include_context "api setup"
|
10
|
+
include_examples "not found"
|
9
11
|
|
10
12
|
extend ResourceDSLMethods
|
11
13
|
|
@@ -1,13 +1,15 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require_relative "../../spec_helper"
|
3
|
+
require_relative "../../../support/shared_examples"
|
3
4
|
require "sinatra"
|
4
5
|
require "logstash/api/modules/plugins"
|
5
6
|
require "logstash/json"
|
6
7
|
|
7
8
|
describe LogStash::Api::Modules::Plugins do
|
8
9
|
include_context "api setup"
|
10
|
+
include_examples "not found"
|
9
11
|
|
10
|
-
before(:
|
12
|
+
before(:each) do
|
11
13
|
get "/"
|
12
14
|
end
|
13
15
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require_relative "../../spec_helper"
|
3
|
+
require_relative "../../../support/shared_examples"
|
3
4
|
require "sinatra"
|
4
5
|
require "logstash/api/modules/root"
|
5
6
|
require "logstash/json"
|
@@ -11,5 +12,7 @@ describe LogStash::Api::Modules::Root do
|
|
11
12
|
do_request { get "/" }
|
12
13
|
expect(last_response).to be_ok
|
13
14
|
end
|
15
|
+
|
16
|
+
include_examples "not found"
|
14
17
|
end
|
15
18
|
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require_relative "../spec_helper"
|
3
|
+
require "logstash/api/errors"
|
4
|
+
|
5
|
+
describe LogStash::Api::ApiError do
|
6
|
+
subject { described_class.new }
|
7
|
+
|
8
|
+
it "#status_code returns 500" do
|
9
|
+
expect(subject.status_code).to eq(500)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "#to_hash return the message of the exception" do
|
13
|
+
expect(subject.to_hash).to include(:message => "Api Error")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe LogStash::Api::NotFoundError do
|
18
|
+
subject { described_class.new }
|
19
|
+
|
20
|
+
it "#status_code returns 404" do
|
21
|
+
expect(subject.status_code).to eq(404)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "#to_hash return the message of the exception" do
|
25
|
+
expect(subject.to_hash).to include(:message => "Not Found")
|
26
|
+
end
|
27
|
+
end
|
@@ -76,14 +76,14 @@ describe LogStash::Api::RackApp do
|
|
76
76
|
end
|
77
77
|
|
78
78
|
it "should log good requests as info" do
|
79
|
-
expect(logger).to receive(:
|
80
|
-
expect(logger).to receive(:
|
79
|
+
expect(logger).to receive(:debug?).and_return(true)
|
80
|
+
expect(logger).to receive(:debug).with(LogStash::Api::RackApp::ApiLogger::LOG_MESSAGE, anything).once
|
81
81
|
get "/good-page"
|
82
82
|
end
|
83
83
|
|
84
84
|
it "should log 5xx requests as warnings" do
|
85
|
-
expect(logger).to receive(:
|
86
|
-
expect(logger).to receive(:
|
85
|
+
expect(logger).to receive(:error?).and_return(true)
|
86
|
+
expect(logger).to receive(:error).with(LogStash::Api::RackApp::ApiLogger::LOG_MESSAGE, anything).once
|
87
87
|
get "/service-unavailable"
|
88
88
|
end
|
89
89
|
end
|
data/spec/logstash/agent_spec.rb
CHANGED
@@ -47,11 +47,11 @@ describe LogStash::Agent do
|
|
47
47
|
let(:pipeline_id) { "main" }
|
48
48
|
let(:config_string) { "input { } filter { } output { }" }
|
49
49
|
let(:agent_args) do
|
50
|
-
{
|
50
|
+
{
|
51
51
|
"config.string" => config_string,
|
52
52
|
"config.reload.automatic" => true,
|
53
53
|
"config.reload.interval" => 0.01,
|
54
|
-
|
54
|
+
"pipeline.workers" => 4,
|
55
55
|
}
|
56
56
|
end
|
57
57
|
|
@@ -331,8 +331,6 @@ describe LogStash::Agent do
|
|
331
331
|
|
332
332
|
context "metrics after config reloading" do
|
333
333
|
let(:config) { "input { generator { } } output { dummyoutput { } }" }
|
334
|
-
let(:new_config_generator_counter) { 500 }
|
335
|
-
let(:new_config) { "input { generator { count => #{new_config_generator_counter} } } output { dummyoutput2 {} }" }
|
336
334
|
let(:config_path) do
|
337
335
|
f = Stud::Temporary.file
|
338
336
|
f.write(config)
|
@@ -351,7 +349,7 @@ describe LogStash::Agent do
|
|
351
349
|
super.merge({ "config.reload.automatic" => true,
|
352
350
|
"config.reload.interval" => interval,
|
353
351
|
"metric.collect" => true })
|
354
|
-
end
|
352
|
+
end
|
355
353
|
|
356
354
|
# We need to create theses dummy classes to know how many
|
357
355
|
# events where actually generated by the pipeline and successfully send to the output.
|
@@ -390,33 +388,121 @@ describe LogStash::Agent do
|
|
390
388
|
end
|
391
389
|
end
|
392
390
|
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
391
|
+
context "when reloading a good config" do
|
392
|
+
let(:new_config_generator_counter) { 500 }
|
393
|
+
let(:new_config) { "input { generator { count => #{new_config_generator_counter} } } output { dummyoutput2 {} }" }
|
394
|
+
before :each do
|
395
|
+
# We know that the store has more events coming in.
|
396
|
+
i = 0
|
397
|
+
while dummy_output.events.size <= new_config_generator_counter
|
398
|
+
i += 1
|
399
|
+
raise "Waiting too long!" if i > 20
|
400
|
+
sleep(0.1)
|
401
|
+
end
|
402
|
+
|
403
|
+
|
404
|
+
# Also force a flush to disk to make sure ruby reload it.
|
405
|
+
File.open(config_path, "w") do |f|
|
406
|
+
f.write(new_config)
|
407
|
+
f.fsync
|
408
|
+
end
|
409
|
+
|
410
|
+
sleep(interval * 3) # Give time to reload the config
|
411
|
+
|
412
|
+
# be eventually consistent.
|
413
|
+
sleep(0.01) while dummy_output2.events.size < new_config_generator_counter
|
400
414
|
end
|
401
415
|
|
402
|
-
|
403
|
-
|
416
|
+
it "resets the pipeline metric collector" do
|
417
|
+
snapshot = subject.metric.collector.snapshot_metric
|
418
|
+
value = snapshot.metric_store.get_with_path("/stats/pipelines")[:stats][:pipelines][:main][:events][:in].value
|
419
|
+
expect(value).to eq(new_config_generator_counter)
|
420
|
+
end
|
404
421
|
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
f.fsync
|
422
|
+
it "does not reset the global event count" do
|
423
|
+
snapshot = subject.metric.collector.snapshot_metric
|
424
|
+
value = snapshot.metric_store.get_with_path("/stats/events")[:stats][:events][:in].value
|
425
|
+
expect(value).to be > new_config_generator_counter
|
410
426
|
end
|
411
427
|
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
428
|
+
it "increases the successful reload count" do
|
429
|
+
snapshot = subject.metric.collector.snapshot_metric
|
430
|
+
value = snapshot.metric_store.get_with_path("/stats/pipelines")[:stats][:pipelines][:main][:reloads][:successes].value
|
431
|
+
expect(value).to be(1)
|
432
|
+
end
|
416
433
|
|
417
|
-
|
418
|
-
|
419
|
-
|
434
|
+
it "does not set the failure reload timestamp" do
|
435
|
+
snapshot = subject.metric.collector.snapshot_metric
|
436
|
+
value = snapshot.metric_store.get_with_path("/stats/pipelines")[:stats][:pipelines][:main][:reloads][:last_failure_timestamp].value
|
437
|
+
expect(value).to be(nil)
|
438
|
+
end
|
439
|
+
|
440
|
+
it "sets the success reload timestamp" do
|
441
|
+
snapshot = subject.metric.collector.snapshot_metric
|
442
|
+
value = snapshot.metric_store.get_with_path("/stats/pipelines")[:stats][:pipelines][:main][:reloads][:last_success_timestamp].value
|
443
|
+
expect(value).to be_a(LogStash::Timestamp)
|
444
|
+
end
|
445
|
+
|
446
|
+
it "does not set the last reload error" do
|
447
|
+
snapshot = subject.metric.collector.snapshot_metric
|
448
|
+
value = snapshot.metric_store.get_with_path("/stats/pipelines")[:stats][:pipelines][:main][:reloads][:last_error].value
|
449
|
+
expect(value).to be(nil)
|
450
|
+
end
|
451
|
+
|
452
|
+
end
|
453
|
+
|
454
|
+
context "when reloading a bad config" do
|
455
|
+
let(:new_config) { "input { generator { count => " }
|
456
|
+
let(:new_config_generator_counter) { 500 }
|
457
|
+
before :each do
|
458
|
+
# We know that the store has more events coming in.
|
459
|
+
i = 0
|
460
|
+
while dummy_output.events.size <= new_config_generator_counter
|
461
|
+
i += 1
|
462
|
+
raise "Waiting too long!" if i > 20
|
463
|
+
sleep(0.1)
|
464
|
+
end
|
465
|
+
|
466
|
+
|
467
|
+
# Also force a flush to disk to make sure ruby reload it.
|
468
|
+
File.open(config_path, "w") do |f|
|
469
|
+
f.write(new_config)
|
470
|
+
f.fsync
|
471
|
+
end
|
472
|
+
|
473
|
+
sleep(interval * 3) # Give time to reload the config
|
474
|
+
end
|
475
|
+
|
476
|
+
it "does not increase the successful reload count" do
|
477
|
+
snapshot = subject.metric.collector.snapshot_metric
|
478
|
+
value = snapshot.metric_store.get_with_path("/stats/pipelines")[:stats][:pipelines][:main][:reloads][:successes].value
|
479
|
+
expect(value).to be(0)
|
480
|
+
end
|
481
|
+
|
482
|
+
it "does not set the successful reload timestamp" do
|
483
|
+
snapshot = subject.metric.collector.snapshot_metric
|
484
|
+
value = snapshot.metric_store.get_with_path("/stats/pipelines")[:stats][:pipelines][:main][:reloads][:last_success_timestamp].value
|
485
|
+
expect(value).to be(nil)
|
486
|
+
end
|
487
|
+
|
488
|
+
it "sets the failure reload timestamp" do
|
489
|
+
snapshot = subject.metric.collector.snapshot_metric
|
490
|
+
value = snapshot.metric_store.get_with_path("/stats/pipelines")[:stats][:pipelines][:main][:reloads][:last_failure_timestamp].value
|
491
|
+
expect(value).to be_a(LogStash::Timestamp)
|
492
|
+
end
|
493
|
+
|
494
|
+
it "sets the last reload error" do
|
495
|
+
snapshot = subject.metric.collector.snapshot_metric
|
496
|
+
value = snapshot.metric_store.get_with_path("/stats/pipelines")[:stats][:pipelines][:main][:reloads][:last_error].value
|
497
|
+
expect(value).to be_a(Hash)
|
498
|
+
expect(value).to include(:message, :backtrace)
|
499
|
+
end
|
500
|
+
|
501
|
+
it "increases the failed reload count" do
|
502
|
+
snapshot = subject.metric.collector.snapshot_metric
|
503
|
+
value = snapshot.metric_store.get_with_path("/stats/pipelines")[:stats][:pipelines][:main][:reloads][:failures].value
|
504
|
+
expect(value).to be > 0
|
505
|
+
end
|
420
506
|
end
|
421
507
|
end
|
422
508
|
end
|
@@ -203,6 +203,12 @@ describe LogStash::Instrument::MetricStore do
|
|
203
203
|
end
|
204
204
|
end
|
205
205
|
|
206
|
+
describe "#size" do
|
207
|
+
it "returns the number of unique metrics" do
|
208
|
+
expect(subject.size).to eq(metric_events.size)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
206
212
|
describe "#each" do
|
207
213
|
it "retrieves all the metric" do
|
208
214
|
expect(subject.each.size).to eq(metric_events.size)
|
@@ -221,4 +227,35 @@ describe LogStash::Instrument::MetricStore do
|
|
221
227
|
end
|
222
228
|
end
|
223
229
|
end
|
230
|
+
|
231
|
+
describe "#prune" do
|
232
|
+
let(:metric_events) {
|
233
|
+
[
|
234
|
+
[[:node, :sashimi, :pipelines, :pipeline01, :plugins, :"logstash-output-elasticsearch"], :event_in, :increment],
|
235
|
+
[[:node, :sashimi, :pipelines, :pipeline01], :processed_events_in, :increment],
|
236
|
+
[[:node, :sashimi, :pipelines, :pipeline01], :processed_events_out, :increment],
|
237
|
+
[[:node, :sashimi, :pipelines, :pipeline02], :processed_events_out, :increment],
|
238
|
+
]
|
239
|
+
}
|
240
|
+
|
241
|
+
before :each do
|
242
|
+
# Lets add a few metrics in the store before trying to find them
|
243
|
+
metric_events.each do |namespaces, metric_key, action|
|
244
|
+
metric = subject.fetch_or_store(namespaces, metric_key, LogStash::Instrument::MetricType::Counter.new(namespaces, metric_key))
|
245
|
+
metric.execute(action)
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
it "should remove all keys with the same starting path as the argument" do
|
250
|
+
expect(subject.get(:node, :sashimi, :pipelines, :pipeline01)).to be_a(Hash)
|
251
|
+
subject.prune("/node/sashimi/pipelines/pipeline01")
|
252
|
+
expect { subject.get(:node, :sashimi, :pipelines, :pipeline01) }.to raise_error LogStash::Instrument::MetricStore::MetricNotFound
|
253
|
+
end
|
254
|
+
|
255
|
+
it "should keep other metrics on different path branches" do
|
256
|
+
expect(subject.get(:node, :sashimi, :pipelines, :pipeline02)).to be_a(Hash)
|
257
|
+
subject.prune("/node/sashimi/pipelines/pipeline01")
|
258
|
+
expect { subject.get(:node, :sashimi, :pipelines, :pipeline02) }.to_not raise_error
|
259
|
+
end
|
260
|
+
end
|
224
261
|
end
|