diff options
Diffstat (limited to 'csit.infra.dash/app/cdash/trending/graphs.py')
-rw-r--r-- | csit.infra.dash/app/cdash/trending/graphs.py | 143 |
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 |