mirror of
https://github.com/elastic/logstash.git
synced 2025-04-24 14:47:19 -04:00
Adds tests for metrics filter and fixes key collision
When using multiple instances of the metrics filter, the keys collided, making the counters interfere with each other.
This commit is contained in:
parent
c211a47314
commit
de0bdacbf7
2 changed files with 85 additions and 2 deletions
|
@ -1,3 +1,4 @@
|
|||
require "securerandom"
|
||||
require "logstash/filters/base"
|
||||
require "logstash/namespace"
|
||||
|
||||
|
@ -132,6 +133,7 @@ class LogStash::Filters::Metrics < LogStash::Filters::Base
|
|||
require "socket"
|
||||
@last_flush = 0 # how many seconds ago the metrics where flushed.
|
||||
@last_clear = 0 # how many seconds ago the metrics where cleared.
|
||||
@random_key_preffix = SecureRandom.hex
|
||||
initialize_metrics
|
||||
end # def register
|
||||
|
||||
|
@ -211,8 +213,12 @@ class LogStash::Filters::Metrics < LogStash::Filters::Base
|
|||
|
||||
private
|
||||
def initialize_metrics
|
||||
@metric_meters = Hash.new { |h,k| h[k] = Metriks.meter(k) }
|
||||
@metric_timers = Hash.new { |h,k| h[k] = Metriks.timer(k) }
|
||||
@metric_meters = Hash.new { |h,k| h[k] = Metriks.meter metric_key(k) }
|
||||
@metric_timers = Hash.new { |h,k| h[k] = Metriks.timer metric_key(k) }
|
||||
end
|
||||
|
||||
def metric_key(key)
|
||||
"#{@random_key_preffix}_#{key}"
|
||||
end
|
||||
|
||||
def should_flush?
|
||||
|
|
77
spec/filters/metrics.rb
Normal file
77
spec/filters/metrics.rb
Normal file
|
@ -0,0 +1,77 @@
|
|||
require "logstash/filters/metrics"
|
||||
|
||||
describe LogStash::Filters::Metrics do
|
||||
|
||||
context "with basic config" do
|
||||
context "when no events were received" do
|
||||
it "should not flush" do
|
||||
config = {"meter" => ["http.%{response}"]}
|
||||
filter = LogStash::Filters::Metrics.new config
|
||||
filter.register
|
||||
|
||||
events = filter.flush
|
||||
insist { events }.nil?
|
||||
end
|
||||
end
|
||||
|
||||
context "when events are received" do
|
||||
context "on the first flush" do
|
||||
it "should flush counts" do
|
||||
config = {"meter" => ["http.%{response}"]}
|
||||
filter = LogStash::Filters::Metrics.new config
|
||||
filter.register
|
||||
filter.filter LogStash::Event.new({"response" => 200})
|
||||
filter.filter LogStash::Event.new({"response" => 200})
|
||||
filter.filter LogStash::Event.new({"response" => 404})
|
||||
|
||||
events = filter.flush
|
||||
insist { events.length } == 1
|
||||
insist { events.first["http.200.count"] } == 2
|
||||
insist { events.first["http.404.count"] } == 1
|
||||
end
|
||||
end
|
||||
|
||||
context "on the second flush" do
|
||||
it "should not reset counts" do
|
||||
config = {"meter" => ["http.%{response}"]}
|
||||
filter = LogStash::Filters::Metrics.new config
|
||||
filter.register
|
||||
filter.filter LogStash::Event.new({"response" => 200})
|
||||
filter.filter LogStash::Event.new({"response" => 200})
|
||||
filter.filter LogStash::Event.new({"response" => 404})
|
||||
|
||||
events = filter.flush
|
||||
events = filter.flush
|
||||
insist { events.length } == 1
|
||||
insist { events.first["http.200.count"] } == 2
|
||||
insist { events.first["http.404.count"] } == 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "with multiple instances" do
|
||||
it "counts should be independent" do
|
||||
config_tag1 = {"meter" => ["http.%{response}"], "tags" => ["tag1"]}
|
||||
config_tag2 = {"meter" => ["http.%{response}"], "tags" => ["tag2"]}
|
||||
filter_tag1 = LogStash::Filters::Metrics.new config_tag1
|
||||
filter_tag2 = LogStash::Filters::Metrics.new config_tag2
|
||||
event_tag1 = LogStash::Event.new({"response" => 200, "tags" => [ "tag1" ]})
|
||||
event_tag2 = LogStash::Event.new({"response" => 200, "tags" => [ "tag2" ]})
|
||||
event2_tag2 = LogStash::Event.new({"response" => 200, "tags" => [ "tag2" ]})
|
||||
filter_tag1.register
|
||||
filter_tag2.register
|
||||
|
||||
[event_tag1, event_tag2, event2_tag2].each do |event|
|
||||
filter_tag1.filter event
|
||||
filter_tag2.filter event
|
||||
end
|
||||
|
||||
events_tag1 = filter_tag1.flush
|
||||
events_tag2 = filter_tag2.flush
|
||||
|
||||
insist { events_tag1.first["http.200.count"] } == 1
|
||||
insist { events_tag2.first["http.200.count"] } == 2
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue