diff --git a/lib/logstash/filters/metrics.rb b/lib/logstash/filters/metrics.rb index 8784c82f9..6069c2190 100644 --- a/lib/logstash/filters/metrics.rb +++ b/lib/logstash/filters/metrics.rb @@ -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? diff --git a/spec/filters/metrics.rb b/spec/filters/metrics.rb new file mode 100644 index 000000000..863027c7b --- /dev/null +++ b/spec/filters/metrics.rb @@ -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