Files
2026-07-13 12:32:21 +08:00

115 lines
2.8 KiB
Lua

local math = require "math"
local utils = require("spec.helpers.perf.utils")
local logger = require("spec.helpers.perf.logger")
local cjson = require "cjson"
local cycle_aware_deep_copy = require("kong.tools.table").cycle_aware_deep_copy
local fmt = string.format
local my_logger = logger.new_logger("[charts]")
math.randomseed(ngx.now())
local options
local current_test_element
local enabled = true
local unsaved_results_lookup = {}
local unsaved_results = {}
local function gen_plots(results, fname, opts)
local shell = require "resty.shell"
opts = opts or options
if not results or not next(results) then
my_logger.warn("no result found, skipping plot generation")
return
end
shell.run("mkdir -p output", nil, 0)
local output_data = {
options = opts,
data = results,
}
local f = io.open(fmt("output/%s.data.json", fname), "w")
f:write(cjson.encode(output_data))
f:close()
my_logger.info(fmt("parsed result saved to output/%s.json", fname))
return true
end
local function on_test_start(element, parent, status, debug)
if not enabled then
return true
end
current_test_element = element
end
local function on_test_end(element, parent, status, debug)
if not enabled then
return true
end
end
local function on_file_end(file)
if not enabled then
return true
end
local results = unsaved_results
unsaved_results = {}
local fname = file.name:gsub("[:/]", "#"):gsub("[ ,]", "_"):gsub("__", "_")
return gen_plots(results, fname, options)
end
local function ingest_combined_results(ver, results, suite_name)
if not suite_name then
local desc = utils.get_test_descriptor(false, current_test_element)
-- escape lua patterns
local pattern = ver:gsub([=[[%[%(%)%.%%%+%-%*%?%[%^%$%]]]=], "%%%1")
-- remove version and surround string from title
suite_name = desc:gsub("%s?"..pattern, ""):gsub(pattern.."%s?", "")
end
if not unsaved_results_lookup[suite_name] then
unsaved_results_lookup[suite_name] = {}
elseif unsaved_results_lookup[suite_name][ver] then
my_logger.warn(fmt("version %s for \"%s\" already has results, current result will be discarded",
ver, suite_name))
return false
end
local row = cycle_aware_deep_copy(results)
row.version = ver
row.suite = suite_name
-- save as ordered-array
table.insert(unsaved_results, row)
return true
end
local function register_busted_hook(opts)
local busted = require("busted")
busted.subscribe({'file', 'end' }, on_file_end)
busted.subscribe({'test', 'start'}, on_test_start)
busted.subscribe({'test', 'end'}, on_test_end)
end
return {
gen_plots = gen_plots,
register_busted_hook = register_busted_hook,
ingest_combined_results = ingest_combined_results,
on = function() enabled = true end,
off = function() enabled = false end,
options = function(opts)
options = opts
end,
}