aboutsummaryrefslogtreecommitdiffstats
path: root/csit.infra.dash/app/cdash/trending/graphs.py
diff options
context:
space:
mode:
Diffstat (limited to 'csit.infra.dash/app/cdash/trending/graphs.py')
-rw-r--r--csit.infra.dash/app/cdash/trending/graphs.py143
1 files changed, 125 insertions, 18 deletions
diff --git a/csit.infra.dash/app/cdash/trending/graphs.py b/csit.infra.dash/app/cdash/trending/graphs.py
index 1a507dfeea..512a9d8de9 100644
--- a/csit.infra.dash/app/cdash/trending/graphs.py
+++ b/csit.infra.dash/app/cdash/trending/graphs.py
@@ -18,6 +18,10 @@ import logging
import plotly.graph_objects as go
import pandas as pd
+from numpy import nan
+from datetime import datetime
+from pytz import UTC
+
from ..utils.constants import Constants as C
from ..utils.utils import get_color, get_hdrh_latencies
from ..utils.anomalies import classify_anomalies
@@ -35,9 +39,9 @@ def select_trending_data(data: pd.DataFrame, itm: dict) -> pd.DataFrame:
:rtype: pandas.DataFrame
"""
- phy = itm["phy"].split("-")
- if len(phy) == 4:
- topo, arch, nic, drv = phy
+ phy = itm["phy"].rsplit("-", maxsplit=2)
+ if len(phy) == 3:
+ topo_arch, nic, drv = phy
if drv == "dpdk":
drv = ""
else:
@@ -58,8 +62,8 @@ def select_trending_data(data: pd.DataFrame, itm: dict) -> pd.DataFrame:
(data["test_type"] == test_type) &
(data["passed"] == True)
)]
- df = df[df.job.str.endswith(f"{topo}-{arch}")]
- core = str() if itm["dut"] == "trex" else f"{itm['core']}"
+ df = df[df.job.str.endswith(topo_arch)]
+ core = str() if itm["dut"] == "trex" else itm["core"]
ttype = "ndrpdr" if itm["testtype"] in ("ndr", "pdr") else itm["testtype"]
df = df[df.test_id.str.contains(
f"^.*[.|-]{nic}.*{itm['framesize']}-{core}-{drv}{itm['test']}-{ttype}$",
@@ -73,7 +77,8 @@ def graph_trending(
data: pd.DataFrame,
sel: dict,
layout: dict,
- normalize: bool=False
+ normalize: bool=False,
+ trials: bool=False
) -> tuple:
"""Generate the trending graph(s) - MRR, NDR, PDR and for PDR also Latences
(result_latency_forward_pdr_50_avg).
@@ -83,10 +88,12 @@ def graph_trending(
:param layout: Layout of plot.ly graph.
:param normalize: If True, the data is normalized to CPU frquency
Constants.NORM_FREQUENCY.
+ :param trials: If True, MRR trials are displayed in the trending graph.
:type data: pandas.DataFrame
:type sel: dict
:type layout: dict
:type normalize: bool
+ :type: trials: bool
:returns: Trending graph(s)
:rtype: tuple(plotly.graph_objects.Figure, plotly.graph_objects.Figure)
"""
@@ -128,7 +135,8 @@ def graph_trending(
customdata_samples = list()
name_lst = name.split("-")
for _, row in df.iterrows():
- h_tput, h_band, h_lat = str(), str(), str()
+ h_tput, h_band, h_lat, h_tput_trials, h_band_trials = \
+ str(), str(), str(), str(), str()
if ttype in ("mrr", "mrr-bandwidth"):
h_tput = (
f"tput avg [{row['result_receive_rate_rate_unit']}]: "
@@ -147,6 +155,23 @@ def graph_trending(
f"{row['result_receive_rate_bandwidth_stdev']* nf:,.0f}"
"<br>"
)
+ if trials:
+ h_tput_trials = (
+ f"tput trials "
+ f"[{row['result_receive_rate_rate_unit']}]: "
+ )
+ for itm in row["result_receive_rate_rate_values"]:
+ h_tput_trials += f"{itm * nf:,.0f}; "
+ h_tput_trials = h_tput_trials[:-2] + "<br>"
+ if pd.notna(row["result_receive_rate_bandwidth_avg"]):
+ h_band_trials = (
+ f"bandwidth trials "
+ f"[{row['result_receive_rate_bandwidth_unit']}]: "
+ )
+ for itm in row["result_receive_rate_bandwidth_values"]:
+ h_band_trials += f"{itm * nf:,.0f}; "
+ h_band_trials = h_band_trials[:-2] + "<br>"
+
elif ttype in ("ndr", "ndr-bandwidth"):
h_tput = (
f"tput [{row['result_ndr_lower_rate_unit']}]: "
@@ -214,12 +239,19 @@ def graph_trending(
hosts = f"<br>hosts: {', '.join(row['hosts'])}"
except (KeyError, TypeError):
hosts = str()
+
+ for drv in C.DRIVERS:
+ if drv in name_lst:
+ split_idx = name_lst.index(drv) + 1
+ break
+ else:
+ split_idx = 5
hover_itm = (
f"dut: {name_lst[0]}<br>"
- f"infra: {'-'.join(name_lst[1:5])}<br>"
- f"test: {'-'.join(name_lst[5:])}<br>"
+ f"infra: {'-'.join(name_lst[1:split_idx])}<br>"
+ f"test: {'-'.join(name_lst[split_idx:])}<br>"
f"date: {row['start_time'].strftime('%Y-%m-%d %H:%M:%S')}<br>"
- f"{h_tput}{h_band}{h_lat}"
+ f"{h_tput}{h_tput_trials}{h_band}{h_band_trials}{h_lat}"
f"{row['dut_type']}-ref: {row['dut_version']}<br>"
f"csit-ref: {row['job']}/{row['build']}"
f"{hosts}"
@@ -279,7 +311,7 @@ def graph_trending(
marker={
"size": 5,
"color": color,
- "symbol": "circle",
+ "symbol": "circle"
},
text=hover,
hoverinfo="text",
@@ -369,18 +401,71 @@ def graph_trending(
return traces, units
+ def _add_mrr_trials_traces(
+ ttype: str,
+ name: str,
+ df: pd.DataFrame,
+ color: str,
+ nf: float
+ ) -> list:
+ """Add the traces with mrr trials.
+
+ :param ttype: Test type (mrr, mrr-bandwidth).
+ :param name: The test name to be displayed in hover.
+ :param df: Data frame with test data.
+ :param color: The color of the trace.
+ :param nf: The factor used for normalization of the results to
+ CPU frequency set to Constants.NORM_FREQUENCY.
+ :type ttype: str
+ :type name: str
+ :type df: pandas.DataFrame
+ :type color: str
+ :type nf: float
+ :returns: list of Traces
+ :rtype: list
+ """
+ traces = list()
+ x_axis = df["start_time"].tolist()
+ y_data = df[C.VALUE[ttype].replace("avg", "values")].tolist()
+
+ for idx_trial in range(10):
+ y_axis = list()
+ for idx_run in range(len(x_axis)):
+ try:
+ y_axis.append(y_data[idx_run][idx_trial] * nf)
+ except (IndexError, TypeError, ValueError):
+ y_axis.append(nan)
+ traces.append(go.Scatter(
+ x=x_axis,
+ y=y_axis,
+ name=name,
+ mode="markers",
+ marker={
+ "size": 2,
+ "color": color,
+ "symbol": "circle"
+ },
+ showlegend=True,
+ legendgroup=name,
+ hoverinfo="skip"
+ ))
+ return traces
+
+
fig_tput = None
fig_lat = None
fig_band = None
+ start_times = list()
y_units = set()
for idx, itm in enumerate(sel):
df = select_trending_data(data, itm)
if df is None or df.empty:
continue
+ start_times.append(df["start_time"][0])
if normalize:
- phy = itm["phy"].split("-")
- topo_arch = f"{phy[0]}-{phy[1]}" if len(phy) == 4 else str()
+ phy = itm["phy"].rsplit("-", maxsplit=2)
+ topo_arch = phy[0] if len(phy) == 3 else str()
norm_factor = (C.NORM_FREQUENCY / C.FREQUENCY.get(topo_arch, 1.0)) \
if topo_arch else 1.0
else:
@@ -401,6 +486,14 @@ def graph_trending(
if traces:
if not fig_tput:
fig_tput = go.Figure()
+ if trials and "mrr" in ttype:
+ traces.extend(_add_mrr_trials_traces(
+ ttype,
+ itm["id"],
+ df,
+ get_color(idx),
+ norm_factor
+ ))
fig_tput.add_traces(traces)
if ttype in C.TESTS_WITH_BANDWIDTH:
@@ -414,6 +507,14 @@ def graph_trending(
if traces:
if not fig_band:
fig_band = go.Figure()
+ if trials and "mrr" in ttype:
+ traces.extend(_add_mrr_trials_traces(
+ f"{ttype}-bandwidth",
+ itm["id"],
+ df,
+ get_color(idx),
+ norm_factor
+ ))
fig_band.add_traces(traces)
if ttype in C.TESTS_WITH_LATENCY:
@@ -431,15 +532,21 @@ def graph_trending(
y_units.update(units)
+ x_range = [min(start_times), datetime.now(tz=UTC).strftime("%Y-%m-%d")]
if fig_tput:
- fig_layout = layout.get("plot-trending-tput", dict())
- fig_layout["yaxis"]["title"] = \
+ layout_tput = layout.get("plot-trending-tput", dict())
+ layout_tput["yaxis"]["title"] = \
f"Throughput [{'|'.join(sorted(y_units))}]"
- fig_tput.update_layout(fig_layout)
+ layout_tput["xaxis"]["range"] = x_range
+ fig_tput.update_layout(layout_tput)
if fig_band:
- fig_band.update_layout(layout.get("plot-trending-bandwidth", dict()))
+ layout_band = layout.get("plot-trending-bandwidth", dict())
+ layout_band["xaxis"]["range"] = x_range
+ fig_band.update_layout(layout_band)
if fig_lat:
- fig_lat.update_layout(layout.get("plot-trending-lat", dict()))
+ layout_lat = layout.get("plot-trending-lat", dict())
+ layout_lat["xaxis"]["range"] = x_range
+ fig_lat.update_layout(layout_lat)
return fig_tput, fig_band, fig_lat