diff options
Diffstat (limited to 'resources/tools/dash/app/pal/trending')
-rw-r--r-- | resources/tools/dash/app/pal/trending/graphs.py | 120 | ||||
-rw-r--r-- | resources/tools/dash/app/pal/trending/layout.py | 144 | ||||
-rw-r--r-- | resources/tools/dash/app/pal/trending/trending.py | 14 |
3 files changed, 73 insertions, 205 deletions
diff --git a/resources/tools/dash/app/pal/trending/graphs.py b/resources/tools/dash/app/pal/trending/graphs.py index a63bebb818..0b4968082f 100644 --- a/resources/tools/dash/app/pal/trending/graphs.py +++ b/resources/tools/dash/app/pal/trending/graphs.py @@ -22,96 +22,14 @@ import hdrh.codec from datetime import datetime -from ..data.utils import classify_anomalies - -_NORM_FREQUENCY = 2.0 # [GHz] -_FREQURENCY = { # [GHz] - "2n-aws": 1.000, - "2n-dnv": 2.000, - "2n-clx": 2.300, - "2n-icx": 2.600, - "2n-skx": 2.500, - "2n-tx2": 2.500, - "2n-zn2": 2.900, - "3n-alt": 3.000, - "3n-aws": 1.000, - "3n-dnv": 2.000, - "3n-icx": 2.600, - "3n-skx": 2.500, - "3n-tsh": 2.200 -} - -_ANOMALY_COLOR = { - "regression": 0.0, - "normal": 0.5, - "progression": 1.0 -} -_COLORSCALE_TPUT = [ - [0.00, "red"], - [0.33, "red"], - [0.33, "white"], - [0.66, "white"], - [0.66, "green"], - [1.00, "green"] -] -_TICK_TEXT_TPUT = ["Regression", "Normal", "Progression"] -_COLORSCALE_LAT = [ - [0.00, "green"], - [0.33, "green"], - [0.33, "white"], - [0.66, "white"], - [0.66, "red"], - [1.00, "red"] -] -_TICK_TEXT_LAT = ["Progression", "Normal", "Regression"] -_VALUE = { - "mrr": "result_receive_rate_rate_avg", - "ndr": "result_ndr_lower_rate_value", - "pdr": "result_pdr_lower_rate_value", - "pdr-lat": "result_latency_forward_pdr_50_avg" -} -_UNIT = { - "mrr": "result_receive_rate_rate_unit", - "ndr": "result_ndr_lower_rate_unit", - "pdr": "result_pdr_lower_rate_unit", - "pdr-lat": "result_latency_forward_pdr_50_unit" -} -_LAT_HDRH = ( # Do not change the order - "result_latency_forward_pdr_0_hdrh", - "result_latency_reverse_pdr_0_hdrh", - "result_latency_forward_pdr_10_hdrh", - "result_latency_reverse_pdr_10_hdrh", - "result_latency_forward_pdr_50_hdrh", - "result_latency_reverse_pdr_50_hdrh", - "result_latency_forward_pdr_90_hdrh", - "result_latency_reverse_pdr_90_hdrh", -) -# This value depends on latency stream rate (9001 pps) and duration (5s). -# Keep it slightly higher to ensure rounding errors to not remove tick mark. -PERCENTILE_MAX = 99.999501 - -_GRAPH_LAT_HDRH_DESC = { - "result_latency_forward_pdr_0_hdrh": "No-load.", - "result_latency_reverse_pdr_0_hdrh": "No-load.", - "result_latency_forward_pdr_10_hdrh": "Low-load, 10% PDR.", - "result_latency_reverse_pdr_10_hdrh": "Low-load, 10% PDR.", - "result_latency_forward_pdr_50_hdrh": "Mid-load, 50% PDR.", - "result_latency_reverse_pdr_50_hdrh": "Mid-load, 50% PDR.", - "result_latency_forward_pdr_90_hdrh": "High-load, 90% PDR.", - "result_latency_reverse_pdr_90_hdrh": "High-load, 90% PDR." -} +from ..utils.constants import Constants as C +from ..utils.utils import classify_anomalies def _get_color(idx: int) -> str: """ """ - _COLORS = ( - "#1A1110", "#DA2647", "#214FC6", "#01786F", "#BD8260", "#FFD12A", - "#A6E7FF", "#738276", "#C95A49", "#FC5A8D", "#CEC8EF", "#391285", - "#6F2DA8", "#FF878D", "#45A27D", "#FFD0B9", "#FD5240", "#DB91EF", - "#44D7A8", "#4F86F7", "#84DE02", "#FFCFF1", "#614051" - ) - return _COLORS[idx % len(_COLORS)] + return C.PLOT_COLORS[idx % len(C.PLOT_COLORS)] def _get_hdrh_latencies(row: pd.Series, name: str) -> dict: @@ -119,7 +37,7 @@ def _get_hdrh_latencies(row: pd.Series, name: str) -> dict: """ latencies = {"name": name} - for key in _LAT_HDRH: + for key in C.LAT_HDRH: try: latencies[key] = row[key] except KeyError: @@ -176,7 +94,7 @@ def _generate_trending_traces(ttype: str, name: str, df: pd.DataFrame, """ """ - df = df.dropna(subset=[_VALUE[ttype], ]) + df = df.dropna(subset=[C.VALUE[ttype], ]) if df.empty: return list() df = df.loc[((df["start_time"] >= start) & (df["start_time"] <= end))] @@ -185,9 +103,9 @@ def _generate_trending_traces(ttype: str, name: str, df: pd.DataFrame, x_axis = df["start_time"].tolist() if ttype == "pdr-lat": - y_data = [(itm / norm_factor) for itm in df[_VALUE[ttype]].tolist()] + y_data = [(itm / norm_factor) for itm in df[C.VALUE[ttype]].tolist()] else: - y_data = [(itm * norm_factor) for itm in df[_VALUE[ttype]].tolist()] + y_data = [(itm * norm_factor) for itm in df[C.VALUE[ttype]].tolist()] anomalies, trend_avg, trend_stdev = classify_anomalies( {k: v for k, v in zip(x_axis, y_data)} @@ -199,7 +117,7 @@ def _generate_trending_traces(ttype: str, name: str, df: pd.DataFrame, d_type = "trex" if row["dut_type"] == "none" else row["dut_type"] hover_itm = ( f"date: {row['start_time'].strftime('%Y-%m-%d %H:%M:%S')}<br>" - f"<prop> [{row[_UNIT[ttype]]}]: {y_data[idx]:,.0f}<br>" + f"<prop> [{row[C.UNIT[ttype]]}]: {y_data[idx]:,.0f}<br>" f"<stdev>" f"{d_type}-ref: {row['dut_version']}<br>" f"csit-ref: {row['job']}/{row['build']}<br>" @@ -277,7 +195,7 @@ def _generate_trending_traces(ttype: str, name: str, df: pd.DataFrame, if anomaly in ("regression", "progression"): anomaly_x.append(x_axis[idx]) anomaly_y.append(trend_avg[idx]) - anomaly_color.append(_ANOMALY_COLOR[anomaly]) + anomaly_color.append(C.ANOMALY_COLOR[anomaly]) hover_itm = ( f"date: {x_axis[idx].strftime('%Y-%m-%d %H:%M:%S')}<br>" f"trend [pps]: {trend_avg[idx]:,.0f}<br>" @@ -301,8 +219,8 @@ def _generate_trending_traces(ttype: str, name: str, df: pd.DataFrame, "size": 15, "symbol": "circle-open", "color": anomaly_color, - "colorscale": _COLORSCALE_LAT \ - if ttype == "pdr-lat" else _COLORSCALE_TPUT, + "colorscale": C.COLORSCALE_LAT \ + if ttype == "pdr-lat" else C.COLORSCALE_TPUT, "showscale": True, "line": { "width": 2 @@ -314,8 +232,8 @@ def _generate_trending_traces(ttype: str, name: str, df: pd.DataFrame, "titleside": "right", "tickmode": "array", "tickvals": [0.167, 0.500, 0.833], - "ticktext": _TICK_TEXT_LAT \ - if ttype == "pdr-lat" else _TICK_TEXT_TPUT, + "ticktext": C.TICK_TEXT_LAT \ + if ttype == "pdr-lat" else C.TICK_TEXT_TPUT, "ticks": "", "ticklen": 0, "tickangle": -90, @@ -349,7 +267,7 @@ def graph_trending(data: pd.DataFrame, sel:dict, layout: dict, if normalize: phy = itm["phy"].split("-") topo_arch = f"{phy[0]}-{phy[1]}" if len(phy) == 4 else str() - norm_factor = (_NORM_FREQUENCY / _FREQURENCY[topo_arch]) \ + norm_factor = (C.NORM_FREQUENCY / C.FREQUENCY[topo_arch]) \ if topo_arch else 1.0 else: norm_factor = 1.0 @@ -400,11 +318,11 @@ def graph_hdrh_latency(data: dict, layout: dict) -> go.Figure: # For 100%, we cut that down to "x_perc" to avoid # infinity. percentile = item.percentile_level_iterated_to - x_perc = min(percentile, PERCENTILE_MAX) + x_perc = min(percentile, C.PERCENTILE_MAX) xaxis.append(previous_x) yaxis.append(item.value_iterated_to) hovertext.append( - f"<b>{_GRAPH_LAT_HDRH_DESC[lat_name]}</b><br>" + f"<b>{C.GRAPH_LAT_HDRH_DESC[lat_name]}</b><br>" f"Direction: {('W-E', 'E-W')[idx % 2]}<br>" f"Percentile: {prev_perc:.5f}-{percentile:.5f}%<br>" f"Latency: {item.value_iterated_to}uSec" @@ -413,7 +331,7 @@ def graph_hdrh_latency(data: dict, layout: dict) -> go.Figure: xaxis.append(next_x) yaxis.append(item.value_iterated_to) hovertext.append( - f"<b>{_GRAPH_LAT_HDRH_DESC[lat_name]}</b><br>" + f"<b>{C.GRAPH_LAT_HDRH_DESC[lat_name]}</b><br>" f"Direction: {('W-E', 'E-W')[idx % 2]}<br>" f"Percentile: {prev_perc:.5f}-{percentile:.5f}%<br>" f"Latency: {item.value_iterated_to}uSec" @@ -425,9 +343,9 @@ def graph_hdrh_latency(data: dict, layout: dict) -> go.Figure: go.Scatter( x=xaxis, y=yaxis, - name=_GRAPH_LAT_HDRH_DESC[lat_name], + name=C.GRAPH_LAT_HDRH_DESC[lat_name], mode="lines", - legendgroup=_GRAPH_LAT_HDRH_DESC[lat_name], + legendgroup=C.GRAPH_LAT_HDRH_DESC[lat_name], showlegend=bool(idx % 2), line=dict( color=_get_color(int(idx/2)), diff --git a/resources/tools/dash/app/pal/trending/layout.py b/resources/tools/dash/app/pal/trending/layout.py index d632820b99..48a8e5481e 100644 --- a/resources/tools/dash/app/pal/trending/layout.py +++ b/resources/tools/dash/app/pal/trending/layout.py @@ -30,8 +30,9 @@ from copy import deepcopy from json import loads, JSONDecodeError from ast import literal_eval +from ..utils.constants import Constants as C +from ..utils.url_processing import url_decode, url_encode from ..data.data import Data -from ..data.url_processing import url_decode, url_encode from .graphs import graph_trending, graph_hdrh_latency, \ select_trending_data @@ -40,51 +41,6 @@ class Layout: """ """ - # If True, clear all inputs in control panel when button "ADD SELECTED" is - # pressed. - CLEAR_ALL_INPUTS = False - - STYLE_DISABLED = {"display": "none"} - STYLE_ENABLED = {"display": "inherit"} - - CL_ALL_DISABLED = [{ - "label": "All", - "value": "all", - "disabled": True - }] - CL_ALL_ENABLED = [{ - "label": "All", - "value": "all", - "disabled": False - }] - - PLACEHOLDER = html.Nobr("") - - DRIVERS = ("avf", "af-xdp", "rdma", "dpdk") - - LABELS = { - "dpdk": "DPDK", - "container_memif": "LXC/DRC Container Memif", - "crypto": "IPSec IPv4 Routing", - "ip4": "IPv4 Routing", - "ip6": "IPv6 Routing", - "ip4_tunnels": "IPv4 Tunnels", - "l2": "L2 Ethernet Switching", - "srv6": "SRv6 Routing", - "vm_vhost": "VMs vhost-user", - "nfv_density-dcr_memif-chain_ipsec": "CNF Service Chains Routing IPSec", - "nfv_density-vm_vhost-chain_dot1qip4vxlan":"VNF Service Chains Tunnels", - "nfv_density-vm_vhost-chain": "VNF Service Chains Routing", - "nfv_density-dcr_memif-pipeline": "CNF Service Pipelines Routing", - "nfv_density-dcr_memif-chain": "CNF Service Chains Routing", - } - - URL_STYLE = { - "background-color": "#d2ebf5", - "border-color": "#bce1f1", - "color": "#135d7c" - } - def __init__(self, app: Flask, html_layout_file: str, graph_layout_file: str, data_spec_file: str, tooltip_file: str, time_period: str=None) -> None: @@ -135,7 +91,7 @@ class Layout: replace("2n-", "") test = lst_test[-1] nic = suite.split("-")[0] - for drv in self.DRIVERS: + for drv in C.DRIVERS: if drv in test: if drv == "af-xdp": driver = "af_xdp" @@ -242,7 +198,7 @@ class Layout: return self._time_period def label(self, key: str) -> str: - return self.LABELS.get(key, key) + return C.LABELS.get(key, key) def _show_tooltip(self, id: str, title: str, clipboard_id: str=None) -> list: @@ -364,21 +320,21 @@ class Layout: id="row-graph-tput", class_name="g-0 p-2", children=[ - self.PLACEHOLDER + C.PLACEHOLDER ] ), dbc.Row( # Latency id="row-graph-lat", class_name="g-0 p-2", children=[ - self.PLACEHOLDER + C.PLACEHOLDER ] ), dbc.Row( # Download id="row-btn-download", class_name="g-0 p-2", children=[ - self.PLACEHOLDER + C.PLACEHOLDER ] ) ] @@ -497,7 +453,7 @@ class Layout: children=[ dbc.Checklist( id="cl-ctrl-framesize-all", - options=self.CL_ALL_DISABLED, + options=C.CL_ALL_DISABLED, inline=True, switch=False ), @@ -528,7 +484,7 @@ class Layout: children=[ dbc.Checklist( id="cl-ctrl-core-all", - options=self.CL_ALL_DISABLED, + options=C.CL_ALL_DISABLED, inline=False, switch=False ) @@ -559,7 +515,7 @@ class Layout: children=[ dbc.Checklist( id="cl-ctrl-testtype-all", - options=self.CL_ALL_DISABLED, + options=C.CL_ALL_DISABLED, inline=True, switch=False ), @@ -648,7 +604,7 @@ class Layout: dbc.Row( id="row-card-sel-tests", class_name="gy-1", - style=self.STYLE_DISABLED, + style=C.STYLE_DISABLED, children=[ dbc.Label( "Selected tests", @@ -665,7 +621,7 @@ class Layout: ), dbc.Row( id="row-btns-sel-tests", - style=self.STYLE_DISABLED, + style=C.STYLE_DISABLED, children=[ dbc.ButtonGroup( class_name="gy-2", @@ -695,12 +651,6 @@ class Layout: class ControlPanel: def __init__(self, panel: dict) -> None: - CL_ALL_DISABLED = [{ - "label": "All", - "value": "all", - "disabled": True - }] - # Defines also the order of keys self._defaults = { "dd-ctrl-dut-value": str(), @@ -716,15 +666,15 @@ class Layout: "cl-ctrl-core-options": list(), "cl-ctrl-core-value": list(), "cl-ctrl-core-all-value": list(), - "cl-ctrl-core-all-options": CL_ALL_DISABLED, + "cl-ctrl-core-all-options": C.CL_ALL_DISABLED, "cl-ctrl-framesize-options": list(), "cl-ctrl-framesize-value": list(), "cl-ctrl-framesize-all-value": list(), - "cl-ctrl-framesize-all-options": CL_ALL_DISABLED, + "cl-ctrl-framesize-all-options": C.CL_ALL_DISABLED, "cl-ctrl-testtype-options": list(), "cl-ctrl-testtype-value": list(), "cl-ctrl-testtype-all-value": list(), - "cl-ctrl-testtype-all-options": CL_ALL_DISABLED, + "cl-ctrl-testtype-all-options": C.CL_ALL_DISABLED, "btn-ctrl-add-disabled": True, "cl-normalize-value": list(), "cl-selected-options": list(), @@ -788,9 +738,9 @@ class Layout: (fig_tput, fig_lat) = figs - row_fig_tput = self.PLACEHOLDER - row_fig_lat = self.PLACEHOLDER - row_btn_dwnld = self.PLACEHOLDER + row_fig_tput = C.PLACEHOLDER + row_fig_lat = C.PLACEHOLDER + row_btn_dwnld = C.PLACEHOLDER if fig_tput: row_fig_tput = [ @@ -822,7 +772,7 @@ class Layout: class_name="me-1", children=[ dbc.InputGroupText( - style=self.URL_STYLE, + style=C.URL_STYLE, children=self._show_tooltip( "help-url", "URL", "input-url") ), @@ -830,7 +780,7 @@ class Layout: id="input-url", readonly=True, type="url", - style=self.URL_STYLE, + style=C.URL_STYLE, value=url ) ] @@ -971,15 +921,15 @@ class Layout: "cl-ctrl-core-options": list(), "cl-ctrl-core-value": list(), "cl-ctrl-core-all-value": list(), - "cl-ctrl-core-all-options": self.CL_ALL_DISABLED, + "cl-ctrl-core-all-options": C.CL_ALL_DISABLED, "cl-ctrl-framesize-options": list(), "cl-ctrl-framesize-value": list(), "cl-ctrl-framesize-all-value": list(), - "cl-ctrl-framesize-all-options": self.CL_ALL_DISABLED, + "cl-ctrl-framesize-all-options": C.CL_ALL_DISABLED, "cl-ctrl-testtype-options": list(), "cl-ctrl-testtype-value": list(), "cl-ctrl-testtype-all-value": list(), - "cl-ctrl-testtype-all-options": self.CL_ALL_DISABLED, + "cl-ctrl-testtype-all-options": C.CL_ALL_DISABLED, }) elif trigger_id == "dd-ctrl-phy": try: @@ -1005,15 +955,15 @@ class Layout: "cl-ctrl-core-options": list(), "cl-ctrl-core-value": list(), "cl-ctrl-core-all-value": list(), - "cl-ctrl-core-all-options": self.CL_ALL_DISABLED, + "cl-ctrl-core-all-options": C.CL_ALL_DISABLED, "cl-ctrl-framesize-options": list(), "cl-ctrl-framesize-value": list(), "cl-ctrl-framesize-all-value": list(), - "cl-ctrl-framesize-all-options": self.CL_ALL_DISABLED, + "cl-ctrl-framesize-all-options": C.CL_ALL_DISABLED, "cl-ctrl-testtype-options": list(), "cl-ctrl-testtype-value": list(), "cl-ctrl-testtype-all-value": list(), - "cl-ctrl-testtype-all-options": self.CL_ALL_DISABLED, + "cl-ctrl-testtype-all-options": C.CL_ALL_DISABLED, }) elif trigger_id == "dd-ctrl-area": try: @@ -1036,15 +986,15 @@ class Layout: "cl-ctrl-core-options": list(), "cl-ctrl-core-value": list(), "cl-ctrl-core-all-value": list(), - "cl-ctrl-core-all-options": self.CL_ALL_DISABLED, + "cl-ctrl-core-all-options": C.CL_ALL_DISABLED, "cl-ctrl-framesize-options": list(), "cl-ctrl-framesize-value": list(), "cl-ctrl-framesize-all-value": list(), - "cl-ctrl-framesize-all-options": self.CL_ALL_DISABLED, + "cl-ctrl-framesize-all-options": C.CL_ALL_DISABLED, "cl-ctrl-testtype-options": list(), "cl-ctrl-testtype-value": list(), "cl-ctrl-testtype-all-value": list(), - "cl-ctrl-testtype-all-options": self.CL_ALL_DISABLED, + "cl-ctrl-testtype-all-options": C.CL_ALL_DISABLED, }) elif trigger_id == "dd-ctrl-test": core_opts = list() @@ -1069,15 +1019,15 @@ class Layout: "cl-ctrl-core-options": core_opts, "cl-ctrl-core-value": list(), "cl-ctrl-core-all-value": list(), - "cl-ctrl-core-all-options": self.CL_ALL_ENABLED, + "cl-ctrl-core-all-options": C.CL_ALL_ENABLED, "cl-ctrl-framesize-options": framesize_opts, "cl-ctrl-framesize-value": list(), "cl-ctrl-framesize-all-value": list(), - "cl-ctrl-framesize-all-options": self.CL_ALL_ENABLED, + "cl-ctrl-framesize-all-options": C.CL_ALL_ENABLED, "cl-ctrl-testtype-options": testtype_opts, "cl-ctrl-testtype-value": list(), "cl-ctrl-testtype-all-value": list(), - "cl-ctrl-testtype-all-options": self.CL_ALL_ENABLED, + "cl-ctrl-testtype-all-options": C.CL_ALL_ENABLED, }) elif trigger_id == "cl-ctrl-core": val_sel, val_all = self._sync_checklists( @@ -1180,17 +1130,17 @@ class Layout: "testtype": ttype.lower() }) store_sel = sorted(store_sel, key=lambda d: d["id"]) - row_card_sel_tests = self.STYLE_ENABLED - row_btns_sel_tests = self.STYLE_ENABLED - if self.CLEAR_ALL_INPUTS: + row_card_sel_tests = C.STYLE_ENABLED + row_btns_sel_tests = C.STYLE_ENABLED + if C.CLEAR_ALL_INPUTS: ctrl_panel.set(ctrl_panel.defaults) elif trigger_id == "btn-sel-remove-all": _ = btn_remove_all - row_fig_tput = self.PLACEHOLDER - row_fig_lat = self.PLACEHOLDER - row_btn_dwnld = self.PLACEHOLDER - row_card_sel_tests = self.STYLE_DISABLED - row_btns_sel_tests = self.STYLE_DISABLED + row_fig_tput = C.PLACEHOLDER + row_fig_lat = C.PLACEHOLDER + row_btn_dwnld = C.PLACEHOLDER + row_card_sel_tests = C.STYLE_DISABLED + row_btns_sel_tests = C.STYLE_DISABLED store_sel = list() ctrl_panel.set({"cl-selected-options": list()}) elif trigger_id == "btn-sel-remove": @@ -1210,8 +1160,8 @@ class Layout: d_start = self._get_date(url_params.get("start", list())[0]) d_end = self._get_date(url_params.get("end", list())[0]) if store_sel: - row_card_sel_tests = self.STYLE_ENABLED - row_btns_sel_tests = self.STYLE_ENABLED + row_card_sel_tests = C.STYLE_ENABLED + row_btns_sel_tests = C.STYLE_ENABLED if trigger_id in ("btn-ctrl-add", "url", "dpr-period", "btn-sel-remove", "cl-ctrl-normalize"): @@ -1226,11 +1176,11 @@ class Layout: "cl-selected-options": self._list_tests(store_sel) }) else: - row_fig_tput = self.PLACEHOLDER - row_fig_lat = self.PLACEHOLDER - row_btn_dwnld = self.PLACEHOLDER - row_card_sel_tests = self.STYLE_DISABLED - row_btns_sel_tests = self.STYLE_DISABLED + row_fig_tput = C.PLACEHOLDER + row_fig_lat = C.PLACEHOLDER + row_btn_dwnld = C.PLACEHOLDER + row_card_sel_tests = C.STYLE_DISABLED + row_btns_sel_tests = C.STYLE_DISABLED store_sel = list() ctrl_panel.set({"cl-selected-options": list()}) diff --git a/resources/tools/dash/app/pal/trending/trending.py b/resources/tools/dash/app/pal/trending/trending.py index 1c64677eea..3697f7150f 100644 --- a/resources/tools/dash/app/pal/trending/trending.py +++ b/resources/tools/dash/app/pal/trending/trending.py @@ -14,8 +14,8 @@ """Instantiate the Trending Dash applocation. """ import dash -import dash_bootstrap_components as dbc +from ..utils.constants import Constants as C from .layout import Layout @@ -30,16 +30,16 @@ def init_trending(server, time_period=None): dash_app = dash.Dash( server=server, - routes_pathname_prefix=u"/trending/", - external_stylesheets=[dbc.themes.LUX], + routes_pathname_prefix=C.TREND_ROUTES_PATHNAME_PREFIX, + external_stylesheets=C.EXTERNAL_STYLESHEETS ) layout = Layout( app=dash_app, - html_layout_file="pal/templates/trending_layout.jinja2", - graph_layout_file="pal/trending/layout.yaml", - data_spec_file="pal/data/data.yaml", - tooltip_file="pal/data/tooltips.yaml", + html_layout_file=C.TREND_HTML_LAYOUT_FILE, + graph_layout_file=C.TREND_GRAPH_LAYOUT_FILE, + data_spec_file=C.DATA_SPEC_FILE, + tooltip_file=C.TOOLTIP_FILE, time_period=time_period ) dash_app.index_string = layout.html_layout |