from datetime import datetime as dt
from datetime import timedelta
from copy import deepcopy
+from json import loads
import plotly.graph_objects as go
import plotly.offline as ploff
)
data = input_data.filter_data(
table,
- params=[u"name", u"parent", u"show-run", u"type"],
+ params=[u"name", u"parent", u"telemetry-show-run", u"type"],
continue_on_error=True
)
if data.empty:
)
thead.text = u"\t"
- if tst_data.get(u"show-run", u"No Data") == u"No Data":
+ if tst_data.get(u"telemetry-show-run", None) is None or \
+ isinstance(tst_data[u"telemetry-show-run"], str):
trow = ET.SubElement(
tbl, u"tr", attrib=dict(bgcolor=colors[u"header"])
)
u"Average Vector Size"
)
- for dut_data in tst_data[u"show-run"].values():
+ for dut_data in tst_data[u"telemetry-show-run"].values():
trow = ET.SubElement(
tbl, u"tr", attrib=dict(bgcolor=colors[u"header"])
)
tcol.text = u"No Data"
continue
- try:
- threads_nr = len(dut_data[u"runtime"][0][u"clocks"])
- except (IndexError, KeyError):
- tcol.text = u"No Data"
- continue
-
- threads = OrderedDict({idx: list() for idx in range(threads_nr)})
- for item in dut_data[u"runtime"]:
- for idx in range(threads_nr):
- if item[u"vectors"][idx] > 0:
- clocks = item[u"clocks"][idx] / item[u"vectors"][idx]
- elif item[u"calls"][idx] > 0:
- clocks = item[u"clocks"][idx] / item[u"calls"][idx]
- elif item[u"suspends"][idx] > 0:
- clocks = item[u"clocks"][idx] / item[u"suspends"][idx]
+ runtime = dict()
+ for item in dut_data[u"runtime"].get(u"data", tuple()):
+ tid = int(item[u"labels"][u"thread_id"])
+ if runtime.get(tid, None) is None:
+ runtime[tid] = dict()
+ gnode = item[u"labels"][u"graph_node"]
+ if runtime[tid].get(gnode, None) is None:
+ runtime[tid][gnode] = dict()
+ try:
+ runtime[tid][gnode][item[u"name"]] = float(item[u"value"])
+ except ValueError:
+ runtime[tid][gnode][item[u"name"]] = item[u"value"]
+
+ threads = dict({idx: list() for idx in range(len(runtime))})
+ for idx, run_data in runtime.items():
+ for gnode, gdata in run_data.items():
+ if gdata[u"vectors"] > 0:
+ clocks = gdata[u"clocks"] / gdata[u"vectors"]
+ elif gdata[u"calls"] > 0:
+ clocks = gdata[u"clocks"] / gdata[u"calls"]
+ elif gdata[u"suspends"] > 0:
+ clocks = gdata[u"clocks"] / gdata[u"suspends"]
else:
clocks = 0.0
-
- if item[u"calls"][idx] > 0:
- vectors_call = item[u"vectors"][idx] / item[u"calls"][
- idx]
+ if gdata[u"calls"] > 0:
+ vectors_call = gdata[u"vectors"] / gdata[u"calls"]
else:
vectors_call = 0.0
-
- if int(item[u"calls"][idx]) + int(item[u"vectors"][idx]) + \
- int(item[u"suspends"][idx]):
+ if int(gdata[u"calls"]) + int(gdata[u"vectors"]) + \
+ int(gdata[u"suspends"]):
threads[idx].append([
- item[u"name"],
- item[u"calls"][idx],
- item[u"vectors"][idx],
- item[u"suspends"][idx],
+ gnode,
+ int(gdata[u"calls"]),
+ int(gdata[u"vectors"]),
+ int(gdata[u"suspends"]),
clocks,
vectors_call
])
# Temporary solution: remove NDR results from message:
if bool(table.get(u'remove-ndr', False)):
try:
- col_data = col_data.split(u" |br| ", 1)[1]
+ col_data = col_data.split(u"\n", 1)[1]
except IndexError:
pass
col_data = col_data.replace(u'\n', u' |br| ').\
replace(u'\r', u'').replace(u'"', u"'")
col_data = f" |prein| {col_data} |preout| "
- elif column[u"data"].split(u" ")[1] in \
- (u"conf-history", u"show-run"):
+ elif column[u"data"].split(u" ")[1] in (u"conf-history", ):
col_data = col_data.replace(u'\n', u' |br| ')
col_data = f" |prein| {col_data[:-5]} |preout| "
row_lst.append(f'"{col_data}"')
target[u"data"].append(src[u"throughput"][u"PDR"][u"LOWER"])
elif include_tests == u"NDR":
target[u"data"].append(src[u"throughput"][u"NDR"][u"LOWER"])
+ elif u"latency" in include_tests:
+ keys = include_tests.split(u"-")
+ if len(keys) == 4:
+ lat = src[keys[0]][keys[1]][keys[2]][keys[3]]
+ target[u"data"].append(
+ float(u"nan") if lat == -1 else lat * 1e6
+ )
except (KeyError, TypeError):
pass
if len(data_t) < 2:
continue
- classification_lst, avgs, _ = classify_anomalies(data_t)
+ try:
+ classification_lst, avgs, _ = classify_anomalies(data_t)
+ except ValueError as err:
+ logging.info(f"{err} Skipping")
+ return
win_size = min(len(data_t), table[u"window"])
long_win_size = min(len(data_t), table[u"long-trend-window"])
try:
with open(table[u"input-file"], u'rt') as csv_file:
csv_lst = list(csv.reader(csv_file, delimiter=u',', quotechar=u'"'))
+ except FileNotFoundError as err:
+ logging.warning(f"{err}")
+ return
except KeyError:
logging.warning(u"The input file is not defined.")
return
build = str(build)
try:
version = input_data.metadata(job, build).get(u"version", u"")
+ duration = \
+ input_data.metadata(job, build).get(u"elapsedtime", u"")
except KeyError:
logging.error(f"Data for {job}: {build} is not present.")
return
continue
nic = groups.group(0)
failed_tests.append(f"{nic}-{tst_data[u'name']}")
- tbl_list.append(str(passed))
- tbl_list.append(str(failed))
+ tbl_list.append(passed)
+ tbl_list.append(failed)
+ tbl_list.append(duration)
tbl_list.extend(failed_tests)
file_name = f"{table[u'output-file']}{table[u'output-file-ext']}"
logging.info(f" Writing file: {file_name}")
with open(file_name, u"wt") as file_handler:
for test in tbl_list:
- file_handler.write(test + u'\n')
+ file_handler.write(f"{test}\n")
def table_failed_tests(table, input_data):
tag = col.get(u"tag", None)
data = input_data.filter_data(
table,
- params=[u"throughput", u"result", u"name", u"parent", u"tags"],
+ params=[
+ u"throughput",
+ u"result",
+ u"latency",
+ u"name",
+ u"parent",
+ u"tags"
+ ],
data=col[u"data-set"],
continue_on_error=True
)
if replacement:
rpl_data = input_data.filter_data(
table,
- params=[u"throughput", u"result", u"name", u"parent", u"tags"],
+ params=[
+ u"throughput",
+ u"result",
+ u"latency",
+ u"name",
+ u"parent",
+ u"tags"
+ ],
data=replacement,
continue_on_error=True
)
include_tests=table[u"include-tests"]
)
- if table[u"include-tests"] in (u"NDR", u"PDR"):
+ if table[u"include-tests"] in (u"NDR", u"PDR") or \
+ u"latency" in table[u"include-tests"]:
for tst_name, tst_data in col_data[u"data"].items():
if tst_data[u"data"]:
tst_data[u"mean"] = mean(tst_data[u"data"])
cmp_itm[u"mean"] is not None and \
ref_itm[u"stdev"] is not None and \
cmp_itm[u"stdev"] is not None:
- delta, d_stdev = relative_change_stdev(
- ref_itm[u"mean"], cmp_itm[u"mean"],
- ref_itm[u"stdev"], cmp_itm[u"stdev"]
- )
- if delta is None:
+ try:
+ delta, d_stdev = relative_change_stdev(
+ ref_itm[u"mean"], cmp_itm[u"mean"],
+ ref_itm[u"stdev"], cmp_itm[u"stdev"]
+ )
+ except ZeroDivisionError:
+ break
+ if delta in (None, float(u"nan"), u"nan", u"NaN"):
break
new_row.append({
u"mean": delta * 1e6,