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:
Juarez Bochi 2013-07-12 15:37:51 -03:00
parent c211a47314
commit de0bdacbf7
2 changed files with 85 additions and 2 deletions

View file

@ -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
View 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