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