mirror of
https://github.com/elastic/logstash.git
synced 2025-04-24 06:37:19 -04:00
Make metric filter's rate and percentiles configurable
This commit is contained in:
parent
d4e909f911
commit
acc8247acc
2 changed files with 86 additions and 16 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue