class Drnbench::RequestResponse::Result

Attributes

duration[RW]
n_clients[R]
n_fast_requests[R]
n_slow_requests[R]
statuses[R]

Public Class Methods

keys() click to toggle source
# File lib/drnbench/request-response/result.rb, line 23
def keys
  [
    :n_clients,
    :total_n_requests,
    :queries_per_second,
    :min_elapsed_time,
    :max_elapsed_time,
    :average_elapsed_time,
  ]
end
new(params) click to toggle source
# File lib/drnbench/request-response/result.rb, line 35
def initialize(params)
  @n_clients = params[:n_clients]
  @duration = params[:duration]
  @n_slow_requests = params[:n_slow_requests] || 5
  @n_fast_requests = params[:n_fast_requests] || 5

  @results = []
  @total_elapsed_time = 0.0
  @elapsed_times = []
  @statuses = {}
end

Public Instance Methods

<<(result) click to toggle source
# File lib/drnbench/request-response/result.rb, line 47
def <<(result)
  push(result)
end
average_elapsed_time() click to toggle source
# File lib/drnbench/request-response/result.rb, line 87
def average_elapsed_time
  @average_elapsed_time ||= @total_elapsed_time / @elapsed_times.size
end
empty?() click to toggle source
# File lib/drnbench/request-response/result.rb, line 63
def empty?
  @results.empty?
end
fast_requests() click to toggle source
# File lib/drnbench/request-response/result.rb, line 126
def fast_requests
  @results.sort do |a, b|
    a[:elapsed_time] <=> b[:elapsed_time]
  end
end
format_result_for_request_line(result) click to toggle source
# File lib/drnbench/request-response/result.rb, line 103
def format_result_for_request_line(result)
  request = result[:request]
  status = result[:status].to_i
  if status.zero?
    status = "#{status}(aborted)"
  end
  index = result[:index]
  index = "#{index}(last)" if result[:last]
  [
    "#{result[:elapsed_time]} sec:",
    request["method"],
    status,
    "<#{result[:client]}>#{index}",
    "http://#{request["host"]}:#{request["port"]}#{request["path"]}",
  ].join(" ")
end
max_elapsed_time() click to toggle source
# File lib/drnbench/request-response/result.rb, line 83
def max_elapsed_time
  @max_elapsed_time ||= @elapsed_times.max
end
min_elapsed_time() click to toggle source
# File lib/drnbench/request-response/result.rb, line 79
def min_elapsed_time
  @min_elapsed_time ||= @elapsed_times.min
end
push(result) click to toggle source
# File lib/drnbench/request-response/result.rb, line 51
def push(result)
  clear_cached_statistics

  @results << result

  @statuses[result[:status]] ||= 0
  @statuses[result[:status]] += 1

  @elapsed_times << result[:elapsed_time]
  @total_elapsed_time += result[:elapsed_time]
end
queries_per_second() click to toggle source
# File lib/drnbench/request-response/result.rb, line 71
def queries_per_second
  @queries_per_second ||= total_n_requests.to_f / @duration
end
slow_requests() click to toggle source
# File lib/drnbench/request-response/result.rb, line 120
def slow_requests
  @results.sort do |a, b|
    b[:elapsed_time] <=> a[:elapsed_time]
  end
end
status_percentages() click to toggle source
# File lib/drnbench/request-response/result.rb, line 75
def status_percentages
  @status_percentages ||= prepare_status_percentages
end
to_s() click to toggle source
# File lib/drnbench/request-response/result.rb, line 132
def to_s
  "Total requests: #{total_n_requests} " +
    "(#{queries_per_second} queries per second)\n" +
  "Status:\n" +
  status_percentages.collect do |status, percentage|
    "  #{status}: #{percentage} %"
  end.join("\n") + "\n" +
  "Elapsed time:\n" +
  "  min:     #{min_elapsed_time} sec\n" +
  "  max:     #{max_elapsed_time} sec\n" +
  "  average: #{average_elapsed_time} sec\n" +
  "Top #{@n_fast_requests} fast requests:\n" +
  " [time: method status <client>index url]\n" +
  top_fast_requests.collect do |request|
    "  #{request}"
  end.join("\n") + "\n" +
  "Top #{@n_slow_requests} slow requests:\n" +
  " [time: method status <client>index url]\n" +
  top_slow_requests.collect do |request|
    "  #{request}"
  end.join("\n")
end
top_fast_requests() click to toggle source
# File lib/drnbench/request-response/result.rb, line 97
def top_fast_requests
  fast_requests[0..@n_fast_requests-1].collect do |result|
    format_result_for_request_line(result)
  end
end
top_slow_requests() click to toggle source
# File lib/drnbench/request-response/result.rb, line 91
def top_slow_requests
  slow_requests[0..@n_slow_requests-1].collect do |result|
    format_result_for_request_line(result)
  end
end
total_n_requests() click to toggle source
# File lib/drnbench/request-response/result.rb, line 67
def total_n_requests
  @total_n_requests ||= @results.size
end
values() click to toggle source
# File lib/drnbench/request-response/result.rb, line 155
def values
  self.class.keys.collect do |column|
    send(column)
  end
end

Private Instance Methods

clear_cached_statistics() click to toggle source
# File lib/drnbench/request-response/result.rb, line 162
def clear_cached_statistics
  @total_n_requests = nil
  @queries_per_second = nil
  @status_percentages = nil
  @min_elapsed_time = nil
  @max_elapsed_time = nil
  @average_elapsed_time = nil
end
prepare_status_percentages() click to toggle source
# File lib/drnbench/request-response/result.rb, line 171
def prepare_status_percentages
  status_percentages = []
  @statuses.each do |status, n_results|
    percentage = n_results.to_f / total_n_requests * 100
    status_percentages << {:percentage => percentage,
                           :status => status}
  end
  status_percentages.sort! do |a, b|
    (-1) * (a[:percentage] <=> b[:percentage])
  end
  final_status_percentages = {}
  status_percentages.each do |status|
    final_status_percentages[status[:status]] = status[:percentage]
  end
  final_status_percentages
end