Module: LogStats::Requests::KPI

Defined in:
lib/log_stats/requests/kpi.rb

Constant Summary collapse

PRECISION =
5

Class Method Summary collapse

Class Method Details

.avg(metric, requests) ⇒ Object



25
26
27
28
29
30
31
# 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) ⇒ Object



6
7
8
9
10
11
12
13
14
15
# 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) ⇒ Object



21
22
23
# File 'lib/log_stats/requests/kpi.rb', line 21

def self.count(predicate, requests)
  requests.select(&predicate).size
end

.error?(request) ⇒ Boolean

Returns:

  • (Boolean)


39
40
41
# File 'lib/log_stats/requests/kpi.rb', line 39

def self.error?(request)
  Stats.error_status?(request[:status])
end

.percentile(field, percentile, requests) ⇒ Object



33
34
35
36
37
# 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) ⇒ Object



17
18
19
# 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) ⇒ Boolean

Returns:

  • (Boolean)


43
44
45
# File 'lib/log_stats/requests/kpi.rb', line 43

def self.timeout?(request)
  request[:code] == "H12"
end