Make metric filter's rate and percentiles configurable

This commit is contained in:
Juarez Bochi 2013-12-02 19:16:10 -02:00
parent d4e909f911
commit acc8247acc
2 changed files with 86 additions and 16 deletions

View file

@ -129,6 +129,13 @@ class LogStash::Filters::Metrics < LogStash::Filters::Base
# Otherwise, should be a multiple of 5s.
config :clear_interval, :validate => :number, :default => -1
# The rates that should be measured, in minutes.
# Possible values are 1, 5, and 15.
config :rates, :validate => :array, :default => [1, 5, 15]
# The percentiles that should be measured
config :percentiles, :validate => :array, :default => [1, 5, 10, 90, 95, 99, 100]
def register
require "metriks"
require "socket"
@ -177,9 +184,9 @@ class LogStash::Filters::Metrics < LogStash::Filters::Base
@metric_timers.each do |name, metric|
event["#{name}.count"] = metric.count
event["#{name}.rate_1m"] = metric.one_minute_rate
event["#{name}.rate_5m"] = metric.five_minute_rate
event["#{name}.rate_15m"] = metric.fifteen_minute_rate
event["#{name}.rate_1m"] = metric.one_minute_rate if @rates.include? 1
event["#{name}.rate_5m"] = metric.five_minute_rate if @rates.include? 5
event["#{name}.rate_15m"] = metric.fifteen_minute_rate if @rates.include? 15
# These 4 values are not sliding, so they probably are not useful.
event["#{name}.min"] = metric.min
@ -188,14 +195,9 @@ class LogStash::Filters::Metrics < LogStash::Filters::Base
event["#{name}.stddev"] = metric.stddev ** 0.5
event["#{name}.mean"] = metric.mean
# TODO(sissel): Maybe make this configurable?
# percentiles => [ 0, 1, 5, 95 99 100 ]
event["#{name}.p1"] = metric.snapshot.value(0.01)
event["#{name}.p5"] = metric.snapshot.value(0.05)
event["#{name}.p10"] = metric.snapshot.value(0.10)
event["#{name}.p90"] = metric.snapshot.value(0.90)
event["#{name}.p95"] = metric.snapshot.value(0.95)
event["#{name}.p99"] = metric.snapshot.value(0.99)
@percentiles.each do |percentile|
event["#{name}.p#{percentile}"] = metric.snapshot.value(percentile / 100)
end
metric.clear if should_clear?
end

View file

@ -16,18 +16,28 @@ describe LogStash::Filters::Metrics do
context "when events are received" do
context "on the first flush" do
it "should flush counts" do
subject {
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})
filter.flush
}
events = filter.flush
insist { events.length } == 1
insist { events.first["http.200.count"] } == 2
insist { events.first["http.404.count"] } == 1
it "should flush counts" do
insist { subject.length } == 1
insist { subject.first["http.200.count"] } == 2
insist { subject.first["http.404.count"] } == 1
end
it "should include rates and percentiles" do
metrics = ["http.200.rate_1m", "http.200.rate_5m", "http.200.rate_15m",
"http.404.rate_1m", "http.404.rate_5m", "http.404.rate_15m"]
metrics.each do |metric|
insist { subject.first }.include? metric
end
end
end
@ -75,6 +85,64 @@ describe LogStash::Filters::Metrics do
end
end
context "when metrics are received" do
context "on the first flush" do
subject {
config = {"timer" => ["http.request_time", "request_time"]}
filter = LogStash::Filters::Metrics.new config
filter.register
filter.filter LogStash::Event.new({"request_time" => 1})
filter.filter LogStash::Event.new({"request_time" => 2})
filter.filter LogStash::Event.new({"request_time" => 3})
filter.flush
}
it "should flush counts" do
insist { subject.length } == 1
insist { subject.first["http.request_time.count"] } == 3
end
it "should include rates and percentiles" do
metrics = ["rate_1m", "rate_5m", "rate_15m", "p1", "p5", "p10", "p90", "p95", "p99"]
metrics.each do |metric|
insist { subject.first }.include? "http.request_time.#{metric}"
end
end
end
end
context "when custom rates and metrics are selected" do
context "on the first flush" do
subject {
config = {
"timer" => ["http.request_time", "request_time"],
"rates" => [1],
"percentiles" => [1]
}
filter = LogStash::Filters::Metrics.new config
filter.register
filter.filter LogStash::Event.new({"request_time" => 1})
filter.flush
}
it "should flush counts" do
insist { subject.length } == 1
insist { subject.first["http.request_time.count"] } == 1
end
it "should include only the requested rates and percentiles" do
fields = subject.first.to_hash.keys
rate_fields = fields.select {|field| field.start_with?("http.request_time.rate") }
insist { rate_fields } == ["http.request_time.rate_1m"]
percentile_fields = fields.select {|field| field.start_with?("http.request_time.p") }
insist { percentile_fields } == ["http.request_time.p1"]
end
end
end
context "when a custom flush_interval is set" do
it "should flush only when required" do
config = {"meter" => ["http.%{response}"], "flush_interval" => 15}