Skip to content

Commit

Permalink
0.1.0
Browse files Browse the repository at this point in the history
  • Loading branch information
sdogruyol committed Jan 20, 2016
1 parent 343248e commit aafe763
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 48 deletions.
Binary file removed cryload
Binary file not shown.
2 changes: 0 additions & 2 deletions spec/cryload_spec.cr
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
require "./spec_helper"
require "http/client"
require "http/server"

describe Cryload do
# TODO: Write Moar specs!
Expand Down
21 changes: 10 additions & 11 deletions src/cryload.cr
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,9 @@ module Cryload
# the requests and other major stuff.
class LoadGenerator
# LoadGenerator accepts two params.
# @host :: String
# @number :: Int32
def initialize(@host, @number)
@stats = Stats.new @number
def initialize(@host : String, @request_number : Int32)
Cryload.create_stats @request_number
# Cryload.create_execution_handler
channel = generate_request_channel
spawn_receive_loop channel
end
Expand Down Expand Up @@ -42,7 +41,7 @@ module Cryload
# about all the completed requests.
def spawn_receive_loop(channel)
loop do
check_execution
ExecutionHandler.check
channel.receive
end
end
Expand All @@ -60,14 +59,14 @@ module Cryload
# Creates a new request to the given URI
private def create_request(client, uri)
request = Request.new client, uri
@stats.requests << request
end

# Checks the logging
private def check_execution
ExecutionHandler.check_execution @stats
Cryload.stats << request
end
end
end

Signal::INT.trap {
Cryload::Logger.log_final
exit
}

Cryload::Cli.new
22 changes: 7 additions & 15 deletions src/cryload/execution_handler.cr
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,15 @@ module Cryload
# stats and terminates the execution
class ExecutionHandler
# The main check for execution
def self.check_execution(stats)
setup_trap_signal(stats)
if stats.requests.size == stats.request_number
Logger.log_final(stats)
def self.check
if Cryload.stats.requests.size == Cryload.stats.request_number
Logger.log_final
exit
elsif (stats.requests.size % stats.ongoing_check_number == 0) && stats.requests.size != stats.request_number && stats.requests.size != 0
Logger.log_ongoing(stats)
elsif (Cryload.stats.requests.size % Cryload.stats.ongoing_check_number == 0) &&
Cryload.stats.requests.size != Cryload.stats.request_number &&
Cryload.stats.requests.size != 0
Logger.log_ongoing
end
end

# Setups the INT signal trap for logging the ongoing stats
# and exit
private def self.setup_trap_signal(stats)
Signal::INT.trap {
Logger.log_final(stats)
exit
}
end
end
end
26 changes: 13 additions & 13 deletions src/cryload/logger.cr
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,24 @@ module Cryload
# Singleton class which handles all the logging
class Logger
# Logs the ongoing request and prints out total request made up until that time.
def self.log_ongoing(stats)
puts "Total request made: #{stats.requests.size}".colorize.bold
def self.log_ongoing
puts "Total request made: #{Cryload.stats.requests.size}".colorize.bold
end

# Logs the final stats containing all the information.
def self.log_final(stats)
puts "Completed All Requeasts!".colorize(:green)
# Logs the final Cryload.stats containing all the information.
def self.log_final
puts "Completed All Requests!".colorize(:green)
puts "-------------------------------"
puts "\nTime taken per request:".colorize.blue.bold
puts "Min: #{stats.min_request_time.round(3)} ms".colorize.bold
puts "Max: #{stats.max_request_time.round(3)} ms".colorize.bold
puts "Average: #{stats.average_request_time.round(3)} ms\n".colorize.bold
puts "Min: #{Cryload.stats.min_request_time.round(3)} ms".colorize.bold
puts "Max: #{Cryload.stats.max_request_time.round(3)} ms".colorize.bold
puts "Average: #{Cryload.stats.average_request_time.round(3)} ms\n".colorize.bold
puts "Requests Statistics:".colorize.blue.bold
puts "Request p/s: #{stats.request_per_second}".colorize.bold
puts "2xx requests #{stats.ok_requests}".colorize.bold
puts "Non 2xx requests #{stats.not_ok_requests}".colorize.bold
puts "Total request made: #{stats.requests.size}".colorize.bold
puts "Total time taken: #{stats.total_request_time_in_seconds} seconds".colorize.bold
puts "Request p/s: #{Cryload.stats.request_per_second}".colorize.bold
puts "2xx requests #{Cryload.stats.ok_requests}".colorize.bold
puts "Non 2xx requests #{Cryload.stats.not_ok_requests}".colorize.bold
puts "Total request made: #{Cryload.stats.requests.size}".colorize.bold
puts "Total time taken: #{Cryload.stats.total_request_time_in_seconds} seconds".colorize.bold
end
end
end
31 changes: 24 additions & 7 deletions src/cryload/stats.cr
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
module Cryload
# Stats holder for the benchmark
class Stats
REQUESTS = [] of Request

getter :total_request_count
getter :request_number
getter :ongoing_check_number
property :requests

TIME_IN_MILISECONDS = 1000

def initialize(@request_number)
@total_request_count = 0
@ongoing_check_number = @request_number / 10
@requests = [] of Request
end

def min_request_time
@requests.map(&.time_taken).min
REQUESTS.map(&.time_taken as Float64).min
end

def max_request_time
@requests.map(&.time_taken).max
REQUESTS.map(&.time_taken as Float64).max
end

def average_request_time
total_request_time / @requests.size
total_request_time / REQUESTS.size
end

def request_per_second
Expand All @@ -42,12 +42,29 @@ module Cryload
request_statuses.select { |status| status == false }.size
end

def requests
REQUESTS
end

def <<(request)
REQUESTS << request
end

private def total_request_time
@requests.map(&.time_taken).sum
REQUESTS.map(&.time_taken as Float64).sum
end

private def request_statuses
@requests.map(&.is_ok?)
REQUESTS.map(&.is_ok? as Bool)
end
end

def self.create_stats(request_number)
@@stats = Stats.new request_number
end

def self.stats
@@stats.not_nil!
end

end

0 comments on commit aafe763

Please sign in to comment.