-- Cribbed from http://czerasz.com/2015/07/19/wrk-http-benchmarking-tool-example
-- Module instantiation
local cjson = require "cjson"
local cjson2 = cjson.new()
local cjson_safe = require "cjson.safe"
-- Initialize the pseudo random number generator
-- Resource: http://lua-users.org/wiki/MathLibraryTutorial
math.randomseed(os.time())
math.random(); math.random(); math.random()
-- Shuffle array
-- Returns a randomly shuffled array
function shuffle(paths)
local j, k
local n = #paths
for i = 1, n do
j, k = math.random(n), math.random(n)
paths[j], paths[k] = paths[k], paths[j]
end
return paths
end
-- Load URL paths from the file
function load_request_objects_from_file(file)
local data = {}
local content
-- Check if the file exists
-- Resource: http://stackoverflow.com/a/4991602/325852
local f=io.open(file,"r")
if f~=nil then
content = f:read("*all")
io.close(f)
else
-- Return the empty array
return lines
end
-- Translate Lua value to/from JSON
data = cjson.decode(content)
return shuffle(data)
end
-- Load URL requests from file
requests = load_request_objects_from_file("requests.json")
-- Check if at least one path was found in the file
if #requests <= 0 then
print("multiplerequests: No requests found.")
os.exit()
end
print("multiplerequests: Found " .. #requests .. " requests")
-- Initialize the requests array iterator
counter = 1
request = function()
-- Get the next requests array element
local request_object = requests[counter]
-- Increment the counter
counter = counter + 1
-- If the counter is longer than the requests array length then reset it
if counter > #requests then
counter = 1
end
-- Return the request object with the current URL path
return wrk.format(request_object.method, request_object.path, request_object.headers, request_object.body)
end
done = function(summary, latency, requests)
io.write("------------------------------\n")
for _, p in pairs({ 10, 20, 30, 40, 50, 60, 70, 80, 90, 99 }) do
n = latency:percentile(p)
io.write(string.format("%g%%,%d\n", p, n))
end
io.write(string.format("duration (micros),%d\n", summary.duration))
io.write(string.format("requests,%d\n", summary.requests))
io.write(string.format("bytes,%d\n", summary.bytes))
io.write(string.format("connect errors,%d\n", summary.errors.connect))
io.write(string.format("read errors,%d\n", summary.errors.read))
io.write(string.format("write errors,%d\n", summary.errors.write))
io.write(string.format("status errors,%d\n", summary.errors.status))
io.write(string.format("timeout errors,%d\n", summary.errors.timeout))
io.write("------------------------------\n")
end