index : static-web-server.git

ascending towards madness

-- Script that runs at wrk's "done" stage collecting the stats in JSON and CSV formats.
-- https://github.com/wg/wrk/blob/master/SCRIPTING
done = function(summary, latency, requests)
    local json = string.format("{\n")
    json = json .. string.format('\t"requests": %d,\n', summary.requests)
    json = json .. string.format('\t"duration_ms": %0.2f,\n', summary.duration / 1000)
    json = json .. string.format('\t"requests_per_sec": %0.2f,\n', (summary.requests / summary.duration) * 1e6)
    json = json .. string.format('\t"bytes": %d,\n', summary.bytes)
    json = json .. string.format('\t"bytes_transfer_per_sec": %0.2f,\n', (summary.bytes / summary.duration) * 1e6)
    json = json .. string.format('\t"connect_errors": %d,\n', summary.errors.connect)
    json = json .. string.format('\t"read_errors": %d,\n', summary.errors.read)
    json = json .. string.format('\t"write_errors": %d,\n', summary.errors.write)
    json = json .. string.format('\t"http_errors": %d,\n', summary.errors.status)
    json = json .. string.format('\t"timeouts": %d,\n', summary.errors.timeout)
    json = json .. string.format('\t"latency_min": %0.2f,\n', latency.min)
    json = json .. string.format('\t"latency_max": %0.2f,\n', latency.max)
    json = json .. string.format('\t"latency_mean_ms": %0.2f,\n', latency.mean / 1000)
    json = json .. string.format('\t"latency_stdev": %0.2f,\n', latency.stdev)

    json = json .. string.format('\t"latency_distribution": [\n')
    for _, pair in pairs({50, 75, 90, 99}) do
        json = json .. string.format("\t\t{\n")

        local percent = latency:percentile(pair)
        json = json .. string.format('\t\t\t"percentile": %g,\n\t\t\t"latency_ms": %0.2f\n', pair, percent / 1000)
        json = json .. string.format("\t\t}%s\n", pair > 90 and "" or ",")
    end

    json = json .. string.format("\t]\n}\n")

    local file, err = io.open("benchmark/wrk_results.json", "w")
    if file then
        file:write(json)
        file:close()
    else
        print("error saving json results file:", err)
    end

    local csv = ''
    csv = csv .. string.format('requests,')
    csv = csv .. string.format('duration_ms,')
    csv = csv .. string.format('requests_per_sec,')
    csv = csv .. string.format('bytes,')
    csv = csv .. string.format('bytes_transfer_per_sec,')
    csv = csv .. string.format('connect_errors,')
    csv = csv .. string.format('read_errors,')
    csv = csv .. string.format('write_errors,')
    csv = csv .. string.format('http_errors,')
    csv = csv .. string.format('timeouts,')
    csv = csv .. string.format('latency_min,')
    csv = csv .. string.format('latency_max,')
    csv = csv .. string.format('latency_mean_ms,')
    csv = csv .. string.format('latency_stdev\n')

    csv = csv .. string.format('%d,', summary.requests)
    csv = csv .. string.format('%0.2f,', summary.duration / 1000)
    csv = csv .. string.format('%0.2f,', (summary.requests / summary.duration) * 1e6)
    csv = csv .. string.format('%d,', summary.bytes)
    csv = csv .. string.format('%0.2f,', (summary.bytes / summary.duration) * 1e6)
    csv = csv .. string.format('%d,', summary.errors.connect)
    csv = csv .. string.format('%d,', summary.errors.read)
    csv = csv .. string.format('%d,', summary.errors.write)
    csv = csv .. string.format('%d,', summary.errors.status)
    csv = csv .. string.format('%d,', summary.errors.timeout)
    csv = csv .. string.format('%0.2f,', latency.min)
    csv = csv .. string.format('%0.2f,', latency.max)
    csv = csv .. string.format('%0.2f,', latency.mean / 1000)
    csv = csv .. string.format('%0.2f\n', latency.stdev)

    local file, err = io.open("benchmark/wrk_results.csv", "w")
    if file then
        file:write(csv)
        file:close()
    else
        print("error saving csv results file:", err)
    end
end