module LogStats::Requests::KPI
Constants
- PRECISION
Public Class Methods
avg(metric, requests)
click to toggle source
# File lib/log_stats/requests/kpi.rb, line 25 def self.avg(metric, requests) sum = requests.reduce(0) do |acc, request| value = metric.respond_to?(:call) ? metric.call(request) : request[metric] acc + value end (sum/requests.size.to_f).round(PRECISION) end
calculate(requests, stats)
click to toggle source
# File lib/log_stats/requests/kpi.rb, line 6 def self.calculate(requests, stats) { request_count: requests.size, response_time_avg: avg(:service, requests), response_time_95p: percentile(:service, 0.95, requests), apdex: avg(Stats.method(:apdex_metric), stats), error_rate: rate(method(:error?), requests), timeout_rate: rate(method(:timeout?), requests) } end
count(predicate, requests)
click to toggle source
# File lib/log_stats/requests/kpi.rb, line 21 def self.count(predicate, requests) requests.select(&predicate).size end
error?(request)
click to toggle source
# File lib/log_stats/requests/kpi.rb, line 39 def self.error?(request) Stats.error_status?(request[:status]) end
percentile(field, percentile, requests)
click to toggle source
# File lib/log_stats/requests/kpi.rb, line 33 def self.percentile(field, percentile, requests) index = (requests.size*percentile).round - 1 request = requests.sort_by { |request| request[field] }[index] request && request[field] end
rate(predicate, requests)
click to toggle source
# File lib/log_stats/requests/kpi.rb, line 17 def self.rate(predicate, requests) (count(predicate, requests).to_f/requests.size).round(PRECISION) end
timeout?(request)
click to toggle source
# File lib/log_stats/requests/kpi.rb, line 43 def self.timeout?(request) request[:code] == "H12" end