From 607fa0c71af07ba02785b8990a256725efccb983 Mon Sep 17 00:00:00 2001 From: Tibor Frank Date: Mon, 27 Nov 2023 13:28:49 +0000 Subject: [PATCH] C-Dash: Add bandwidth to iterative graphs - ndr and pdr only for now Change-Id: I8b1992cfd38db4a1bea64d9579b3c8dc583556ec Signed-off-by: Tibor Frank --- .../cdash/data/_metadata/iterative_rls2310_ndrpdr | Bin 13081 -> 15173 bytes csit.infra.dash/app/cdash/data/data.py | 2 +- csit.infra.dash/app/cdash/data/data.yaml | 8 ++ csit.infra.dash/app/cdash/report/graphs.py | 155 ++++++++++++++------- csit.infra.dash/app/cdash/report/layout.py | 63 ++++++--- csit.infra.dash/app/cdash/report/layout.yaml | 54 +++++-- csit.infra.dash/app/cdash/utils/constants.py | 3 + 7 files changed, 205 insertions(+), 80 deletions(-) diff --git a/csit.infra.dash/app/cdash/data/_metadata/iterative_rls2310_ndrpdr b/csit.infra.dash/app/cdash/data/_metadata/iterative_rls2310_ndrpdr index 2291bb8349bd9acfb9801ae45e8cc516f98e225f..e76e6ab8e5035cf7bea523042869434a5ef43ffd 100644 GIT binary patch delta 1836 zcma)7O>7%g5O$IZY~v<})FrkHX;THY-6YT6{8|)QZ-2aY{<^zOVmlH9+iR~AuYd4g zVoMOg6$uVc9H_X#g;RubMx2m1wc^N)11CU&14o3I*~IBON)a3Rd1v1DzM1*njPrT% z`;K3wdc=P%@b~1RYvQG5zEr4W{SUwKuM8beHVVzQ)!M5YjXkS&SZM6!vQ^`7-)NQg z+SUEmv}^sA%jNQWr-vtQ{|B~{wb})j-v_WhW%YkhhWeaWfKTbr%<%Bn(_hv`US?0- z-qFF#*oVFVx;+W@dQRMvgPzkd@5dhR?+U?( zGqdcgap9U|$|n1Dd}_2UBq^mDe8jqJo(6BEJggfW_3dX;i)Dki%7#*6zlH9xSn#?p zQ;D~C6GnYEq1V`-ci%_k4JWc_RN_q|wavx?6O6m#xt&+^Zkj*p82k==ua297Rz}n+RV)x7JNG?A^76uz#rUsA^cJXUiMSSH~!+l`%EQ) z)6ZTT_8o%+8Tbf?Sa~MB0j~=vOH(+cG!K7NrU`IpXh#scW-0($5ll+A(H1D!(uM$P z9)O3+W*qP`+HI6Lp~+y^1Xva*@UNN@9MUN8iIn|w|C5nr^?-f);O&u3waWf@P#TfB zBHQIYaxbY>LXLV%>=*8_yUBG3$*2t$o6$W9X$fw%%yrn48QtAd8(YIo%VN zRsbgxl?92;S!xf64#0(MvV=8J2|EY`>OUgB2<%zt=IRyV@7icFMT&#~PNaeqJ*SJG z(b+uD=>!aA)5QkqBDsncra}*nN40Z0fgah%!?>c@=MP*HrK}!&HR!7BX>9YyCy@g&UTM=z!iw&}+7V8ET%Xpes=g-)*4ZGlVJYvt9{X!MwOt2@n?(&*g zARs^3AjSbVAckm%c8E~}7>Y6V3cMs$NI9~_u@;%RH!yDVt0hC(xu{RU>piP&oBcp$ zVR(brp$U5sjc6F1S$yawwm3B^JKa2Qb#kU8;||BZ4No8IR(@VDW>Xqn#-LpZ4%$7S z*va7>ID4Q!PU+3wE}Wsl7T}{vSg=k(EFqkhadF(z8rl%2l&|VVL$O+C%>tu!Oicw4a3L*N zNbI9)SOLl4f?8#9ylJMoQ_m^LB5mLfXaTctrwXigO4{=RQC#Z=NFx5VEyC;%jZa}~7$AcFz0 znM(r1(kg-E`8!S(5brW@i;+`Zd>wr6651igLXTX!*22?J)nx=aI3m6D1hkeA&#hH_ zBW(@J0U~K)DU!yu@HKBbzA8i@7!a5Z>za$Ebx%_Z z3!&5$l;t~kL-t=kNVfNO3^?o%mo9e>1$-s1U}13tKhF79sQEb2Rt!P(D6c|~EI^x$ zEiXHyFB@#mFG-+M%NKMT+68RRu&1!eRp$e-y%fm|>-c?P0*~f=UV6;rcY-*sEKe63 z=3%zED@CBkFrr30ScOCqHD%(3Nv;|!=Ci@P)TqM)i_;aVvuUbT`vIEhe>DFL-ZG`_ zI;9M*-y*H;=5tSMmKpo1?b=?htT%T_FwhyeLL;HA;cc-`HwFyIDU}Oo z$=F=d$yT7azD+>?`rBs$cP;#)+^R8@THnj-<-PSrw`jA7)frX#OY>YzyO&F1@{U3( z6DsZWxHYi2o~A_$d(N^8_c@-pm;nBeXZ&%Fln#`~93-BUq&a?CTOOFkpKBYwS%"]), + pd.api.types.is_string_dtype(itm["column_name"]), pd.api.types.is_string_dtype(itm["telemetry"][0]) )): schema = pa.Schema.from_pandas(itm) diff --git a/csit.infra.dash/app/cdash/data/data.yaml b/csit.infra.dash/app/cdash/data/data.yaml index 0f66197ec3..e10aa97424 100644 --- a/csit.infra.dash/app/cdash/data/data.yaml +++ b/csit.infra.dash/app/cdash/data/data.yaml @@ -324,6 +324,10 @@ - result_receive_rate_rate_stdev - result_receive_rate_rate_unit - result_receive_rate_rate_values + # - result_receive_rate_bandwidth_avg + # - result_receive_rate_bandwidth_stdev + # - result_receive_rate_bandwidth_unit + # - result_receive_rate_bandwidth_values - data_type: iterative partition: test_type partition_name: ndrpdr @@ -343,6 +347,10 @@ - result_pdr_lower_rate_value - result_ndr_lower_rate_unit - result_ndr_lower_rate_value + - result_pdr_lower_bandwidth_unit + - result_pdr_lower_bandwidth_value + - result_ndr_lower_bandwidth_unit + - result_ndr_lower_bandwidth_value - result_latency_reverse_pdr_90_hdrh - result_latency_reverse_pdr_50_hdrh - result_latency_reverse_pdr_10_hdrh diff --git a/csit.infra.dash/app/cdash/report/graphs.py b/csit.infra.dash/app/cdash/report/graphs.py index d1cd1427a1..ff1428eef1 100644 --- a/csit.infra.dash/app/cdash/report/graphs.py +++ b/csit.infra.dash/app/cdash/report/graphs.py @@ -91,17 +91,35 @@ def graph_iterative(data: pd.DataFrame, sel:dict, layout: dict, :rtype: tuple(plotly.graph_objects.Figure, plotly.graph_objects.Figure) """ + def get_y_values(data, y_data_max, param, norm_factor): + if "receive_rate" in param: + y_vals_raw = data[param].to_list()[0] + else: + y_vals_raw = data[param].to_list() + y_data = [(y * norm_factor) for y in y_vals_raw] + try: + y_data_max = max(max(y_data), y_data_max) + except TypeError: + y_data_max = 0 + return y_data, y_data_max + fig_tput = None + fig_band = None fig_lat = None tput_traces = list() y_tput_max = 0 + y_units = set() + lat_traces = list() y_lat_max = 0 x_lat = list() - y_units = set() - show_latency = False - show_tput = False + + band_traces = list() + y_band_max = 0 + y_band_units = set() + x_band = list() + for idx, itm in enumerate(sel): itm_data = select_iterative_data(data, itm) @@ -120,13 +138,8 @@ def graph_iterative(data: pd.DataFrame, sel:dict, layout: dict, y_units.update(itm_data[C.UNIT[ttype]].unique().tolist()) - if itm["testtype"] == "mrr": - y_data_raw = itm_data[C.VALUE_ITER[ttype]].to_list()[0] - else: - y_data_raw = itm_data[C.VALUE_ITER[ttype]].to_list() - y_data = [(y * norm_factor) for y in y_data_raw] - if y_data: - y_tput_max = max(max(y_data), y_tput_max) + y_data, y_tput_max = \ + get_y_values(itm_data, y_tput_max, C.VALUE_ITER[ttype], norm_factor) nr_of_samples = len(y_data) @@ -167,64 +180,98 @@ def graph_iterative(data: pd.DataFrame, sel:dict, layout: dict, customdata=customdata ) tput_traces.append(go.Box(**tput_kwargs)) - show_tput = True - if ttype == "pdr": - customdata = list() - for _, row in itm_data.iterrows(): - hdrh = get_hdrh_latencies( - row, - f"{metadata['infra']}-{metadata['test']}" + if ttype in ("ndr", "pdr"): + y_band, y_band_max = get_y_values( + itm_data, + y_band_max, + C.VALUE_ITER[f"{ttype}-bandwidth"], + norm_factor + ) + if not all(pd.isna(y_band)): + y_band_units.update( + itm_data[C.UNIT[f"{ttype}-bandwidth"]].unique().\ + dropna().tolist() ) - metadata["csit-ref"] = f"{row['job']}/{row['build']}" - customdata.append({ - "metadata": deepcopy(metadata), - "hdrh": hdrh - }) - - y_lat_row = itm_data[C.VALUE_ITER["latency"]].to_list() - y_lat = [(y / norm_factor) for y in y_lat_row] - if y_lat: - try: - y_lat_max = max(max(y_lat), y_lat_max) - except TypeError: - continue - nr_of_samples = len(y_lat) - lat_kwargs = dict( - y=y_lat, - name=( - f"{idx + 1}. " - f"({nr_of_samples:02d} " - f"run{u's' if nr_of_samples > 1 else u''}) " - f"{itm['id']}" - ), - hoverinfo="all", - boxpoints="all", - jitter=0.3, - marker=dict(color=get_color(idx)), - customdata=customdata + band_kwargs = dict( + y=y_band, + name=( + f"{idx + 1}. " + f"({nr_of_samples:02d} " + f"run{'s' if nr_of_samples > 1 else ''}) " + f"{itm['id']}" + ), + hoverinfo=u"y+name", + boxpoints="all", + jitter=0.3, + marker=dict(color=get_color(idx)), + customdata=customdata + ) + x_band.append(idx + 1) + band_traces.append(go.Box(**band_kwargs)) + + if ttype == "pdr": + y_lat, y_lat_max = get_y_values( + itm_data, + y_lat_max, + C.VALUE_ITER["latency"], + 1 / norm_factor ) - x_lat.append(idx + 1) - lat_traces.append(go.Box(**lat_kwargs)) - show_latency = True - else: - lat_traces.append(go.Box()) + if not all(pd.isna(y_lat)): + customdata = list() + for _, row in itm_data.iterrows(): + hdrh = get_hdrh_latencies( + row, + f"{metadata['infra']}-{metadata['test']}" + ) + metadata["csit-ref"] = f"{row['job']}/{row['build']}" + customdata.append({ + "metadata": deepcopy(metadata), + "hdrh": hdrh + }) + nr_of_samples = len(y_lat) + lat_kwargs = dict( + y=y_lat, + name=( + f"{idx + 1}. " + f"({nr_of_samples:02d} " + f"run{u's' if nr_of_samples > 1 else u''}) " + f"{itm['id']}" + ), + hoverinfo="all", + boxpoints="all", + jitter=0.3, + marker=dict(color=get_color(idx)), + customdata=customdata + ) + x_lat.append(idx + 1) + lat_traces.append(go.Box(**lat_kwargs)) - if show_tput: + if tput_traces: pl_tput = deepcopy(layout["plot-throughput"]) pl_tput["xaxis"]["tickvals"] = [i for i in range(len(sel))] pl_tput["xaxis"]["ticktext"] = [str(i + 1) for i in range(len(sel))] pl_tput["yaxis"]["title"] = f"Throughput [{'|'.join(sorted(y_units))}]" if y_tput_max: - pl_tput["yaxis"]["range"] = [0, (int(y_tput_max / 1e6) + 2) * 1e6] + pl_tput["yaxis"]["range"] = [0, int(y_tput_max) + 2e6] fig_tput = go.Figure(data=tput_traces, layout=pl_tput) - if show_latency: + if band_traces: + pl_band = deepcopy(layout["plot-bandwidth"]) + pl_band["xaxis"]["tickvals"] = [i for i in range(len(x_band))] + pl_band["xaxis"]["ticktext"] = x_band + pl_band["yaxis"]["title"] = \ + f"Bandwidth [{'|'.join(sorted(y_band_units))}]" + if y_band_max: + pl_band["yaxis"]["range"] = [0, int(y_band_max) + 2e9] + fig_band = go.Figure(data=band_traces, layout=pl_band) + + if lat_traces: pl_lat = deepcopy(layout["plot-latency"]) pl_lat["xaxis"]["tickvals"] = [i for i in range(len(x_lat))] pl_lat["xaxis"]["ticktext"] = x_lat if y_lat_max: - pl_lat["yaxis"]["range"] = [0, (int(y_lat_max / 10) + 1) * 10] + pl_lat["yaxis"]["range"] = [0, int(y_lat_max) + 5] fig_lat = go.Figure(data=lat_traces, layout=pl_lat) - return fig_tput, fig_lat + return fig_tput, fig_band, fig_lat diff --git a/csit.infra.dash/app/cdash/report/layout.py b/csit.infra.dash/app/cdash/report/layout.py index 81cc913903..cbcc6e88b1 100644 --- a/csit.infra.dash/app/cdash/report/layout.py +++ b/csit.infra.dash/app/cdash/report/layout.py @@ -758,38 +758,55 @@ class Layout: if not tests: return C.PLACEHOLDER - figs = graph_iterative(self._data, tests, self._graph_layout, normalize) + graphs = \ + graph_iterative(self._data, tests, self._graph_layout, normalize) - if not figs[0]: + if not graphs[0]: return C.PLACEHOLDER - - row_items = [ - dbc.Col( + + tab_items = [ + dbc.Tab( children=dcc.Graph( id={"type": "graph", "index": "tput"}, - figure=figs[0] + figure=graphs[0] ), - class_name="g-0 p-1", - width=6 + label="Throughput", + tab_id="tab-tput" ) ] - if figs[1]: - row_items.append( - dbc.Col( + if graphs[1]: + tab_items.append( + dbc.Tab( + children=dcc.Graph( + id={"type": "graph", "index": "bandwidth"}, + figure=graphs[1] + ), + label="Bandwidth", + tab_id="tab-bandwidth" + ) + ) + + if graphs[2]: + tab_items.append( + dbc.Tab( children=dcc.Graph( id={"type": "graph", "index": "lat"}, - figure=figs[1] + figure=graphs[2] ), - class_name="g-0 p-1", - width=6 + label="Latency", + tab_id="tab-lat" ) ) return [ dbc.Row( - children=row_items, - class_name="g-0 p-0", + dbc.Tabs( + children=tab_items, + id="tabs", + active_tab="tab-tput", + ), + class_name="g-0 p-0" ), dbc.Row( [ @@ -1364,8 +1381,16 @@ class Layout: trigger = Trigger(callback_context.triggered) + if trigger.idx == "tput": + idx = 0 + elif trigger.idx == "bandwidth": + idx = 1 + elif trigger.idx == "lat": + idx = len(graph_data) - 1 + else: + return list(), list(), False + try: - idx = 0 if trigger.idx == "tput" else 1 graph_data = graph_data[idx]["points"] except (IndexError, KeyError, ValueError, TypeError): raise PreventUpdate @@ -1391,6 +1416,8 @@ class Layout: elif len(data) == 1: if param == "lat": stats = ("average latency at 50% PDR", ) + elif param == "bandwidth": + stats = ("bandwidth", ) else: stats = ("throughput", ) else: @@ -1419,6 +1446,8 @@ class Layout: graph = list() if trigger.idx == "tput": title = "Throughput" + elif trigger.idx == "bandwidth": + title = "Bandwidth" elif trigger.idx == "lat": title = "Latency" if len(graph_data) == 1: diff --git a/csit.infra.dash/app/cdash/report/layout.yaml b/csit.infra.dash/app/cdash/report/layout.yaml index 0be2898dea..9e30642111 100644 --- a/csit.infra.dash/app/cdash/report/layout.yaml +++ b/csit.infra.dash/app/cdash/report/layout.yaml @@ -11,7 +11,7 @@ plot-throughput: showticklabels: True tickcolor: "rgb(220, 220, 220)" tickmode: "array" - zeroline: False + zeroline: True yaxis: title: "Throughput [pps|cps|rps|bps]" gridcolor: "rgb(230, 230, 230)" @@ -23,8 +23,48 @@ plot-throughput: showline: True showticklabels: True tickcolor: "rgb(220, 220, 220)" - zeroline: False - range: [0, 50] + zeroline: True + range: [0, 100] + autosize: True + margin: + t: 50 + b: 0 + l: 80 + r: 20 + showlegend: False + height: 800 + paper_bgcolor: "#fff" + plot_bgcolor: "#fff" + hoverlabel: + namelength: -1 + +plot-bandwidth: + xaxis: + title: "Test Cases [Index]" + autorange: True + fixedrange: False + gridcolor: "rgb(230, 230, 230)" + linecolor: "rgb(220, 220, 220)" + linewidth: 1 + showgrid: True + showline: True + showticklabels: True + tickcolor: "rgb(220, 220, 220)" + tickmode: "array" + zeroline: True + yaxis: + title: "Bandwidth [bps]" + gridcolor: "rgb(230, 230, 230)" + hoverformat: ".3s" + tickformat: ".3s" + linecolor: "rgb(220, 220, 220)" + linewidth: 1 + showgrid: True + showline: True + showticklabels: True + tickcolor: "rgb(220, 220, 220)" + zeroline: True + range: [0, 200] autosize: True margin: t: 50 @@ -32,7 +72,6 @@ plot-throughput: l: 80 r: 20 showlegend: False - # width: 700 height: 800 paper_bgcolor: "#fff" plot_bgcolor: "#fff" @@ -52,7 +91,7 @@ plot-latency: showticklabels: True tickcolor: "rgb(220, 220, 220)" tickmode: "array" - zeroline: False + zeroline: True yaxis: title: "Average Latency at 50% PDR [us]" gridcolor: "rgb(230, 230, 230)" @@ -64,8 +103,8 @@ plot-latency: showline: True showticklabels: True tickcolor: "rgb(220, 220, 220)" - zeroline: False - range: [0, 50] + zeroline: True + range: [0, 200] autosize: True margin: t: 50 @@ -73,7 +112,6 @@ plot-latency: l: 80 r: 20 showlegend: False - # width: 700 height: 800 paper_bgcolor: "#fff" plot_bgcolor: "#fff" diff --git a/csit.infra.dash/app/cdash/utils/constants.py b/csit.infra.dash/app/cdash/utils/constants.py index 2ed29eef77..f5519d6f4e 100644 --- a/csit.infra.dash/app/cdash/utils/constants.py +++ b/csit.infra.dash/app/cdash/utils/constants.py @@ -247,6 +247,9 @@ class Constants: "mrr": "result_receive_rate_rate_values", "ndr": "result_ndr_lower_rate_value", "pdr": "result_pdr_lower_rate_value", + "mrr-bandwidth": "result_receive_rate_bandwidth_avg", + "ndr-bandwidth": "result_ndr_lower_bandwidth_value", + "pdr-bandwidth": "result_pdr_lower_bandwidth_value", "latency": "result_latency_forward_pdr_50_avg", "hoststack-cps": "result_rate_value", "hoststack-rps": "result_rate_value", -- 2.16.6