UTI: PoC - Read data from parquets
[csit.git] / resources / tools / dash / app / pal / trending / graphs.py
1 # Copyright (c) 2022 Cisco and/or its affiliates.
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at:
5 #
6 #     http://www.apache.org/licenses/LICENSE-2.0
7 #
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
13
14 """
15 """
16
17
18 import plotly.graph_objects as go
19 import pandas as pd
20 import re
21
22 from datetime import datetime
23
24 from dash import no_update
25
26
27 def trending_tput(data: pd.DataFrame, sel:dict, layout: dict, start: datetime,
28     end: datetime):
29     """
30     """
31
32     if not sel:
33         return no_update, no_update
34
35     def _generate_trace(ttype: str, name: str, df: pd.DataFrame,
36         start: datetime, end: datetime):
37
38         value = {
39             "mrr": "result_receive_rate_rate_avg",
40             "ndr": "result_ndr_lower_rate_value",
41             "pdr": "result_pdr_lower_rate_value"
42         }
43         unit = {
44             "mrr": "result_receive_rate_rate_unit",
45             "ndr": "result_ndr_lower_rate_unit",
46             "pdr": "result_pdr_lower_rate_unit"
47         }
48
49         x_axis = [
50             d for d in df["start_time"] if d >= start and d <= end
51         ]
52         hover_txt = list()
53         for _, row in df.iterrows():
54             hover_itm = (
55                 f"date: "
56                 f"{row['start_time'].strftime('%d-%m-%Y %H:%M:%S')}<br>"
57                 f"average [{row[unit[ttype]]}]: "
58                 f"{row[value[ttype]]}<br>"
59                 f"{row['dut_type']}-ref: {row['dut_version']}<br>"
60                 f"csit-ref: {row['job']}/{row['build']}"
61             )
62             if ttype == "mrr":
63                 stdev = (
64                     f"stdev [{row['result_receive_rate_rate_unit']}]: "
65                     f"{row['result_receive_rate_rate_stdev']}<br>"
66                 )
67             else:
68                 stdev = ""
69             hover_itm = hover_itm.replace("<stdev>", stdev)
70             hover_txt.append(hover_itm)
71
72         return go.Scatter(
73             x=x_axis,
74             y=df[value[ttype]],
75             name=name,
76             mode="markers+lines",
77             text=hover_txt,
78             hoverinfo=u"text+name"
79         )
80
81     # Generate graph:
82     fig = go.Figure()
83     for itm in sel:
84         phy = itm["phy"].split("-")
85         if len(phy) == 4:
86             topo, arch, nic, drv = phy
87             if drv in ("dpdk", "ixgbe"):
88                 drv = ""
89             else:
90                 drv += "-"
91         else:
92             continue
93         cadence = \
94             "weekly" if (arch == "aws" or itm["testtype"] != "mrr") else "daily"
95         sel_topo_arch = (
96             f"csit-vpp-perf-"
97             f"{itm['testtype'] if itm['testtype'] == 'mrr' else 'ndrpdr'}-"
98             f"{cadence}-master-{topo}-{arch}"
99         )
100         df_sel = data.loc[(data["job"] == sel_topo_arch)]
101         regex = (
102             f"^.*{nic}.*\.{itm['framesize']}-{itm['core']}-{drv}{itm['test']}-"
103             f"{'mrr' if itm['testtype'] == 'mrr' else 'ndrpdr'}$"
104         )
105         df = df_sel.loc[
106             df_sel["test_id"].apply(
107                 lambda x: True if re.search(regex, x) else False
108             )
109         ].sort_values(by="start_time", ignore_index=True)
110         name = (
111             f"{itm['phy']}-{itm['framesize']}-{itm['core']}-"
112             f"{itm['test']}-{itm['testtype']}"
113         )
114         fig.add_trace(_generate_trace(itm['testtype'], name, df, start, end))
115
116     style={
117         "vertical-align": "top",
118         "display": "inline-block",
119         "width": "80%",
120         "padding": "5px"
121     }
122
123     layout = layout.get("plot-trending", dict())
124     fig.update_layout(layout)
125
126     return fig, style