diff --git a/dashboards/dashboard_walberla.py b/dashboards/dashboard_walberla.py index 2b58fbff33f56d505e65b8a616d07c549f2d2664..e1257443d521069ebd494da6b58bd864706b28d5 100644 --- a/dashboards/dashboard_walberla.py +++ b/dashboards/dashboard_walberla.py @@ -1,49 +1,51 @@ -from dashboards.dashboard_base import (DashboardOptions, - build_dashboard, - get_commit_annotation, - pack_in_row, - Repeat, - get_grid_pos) - - -from dashboards.panels import PanelInfos, get_time_series_panel -from dashboards.variables import get_dashboard_variable, Filter -from dashboards.overrides import get_color_regex_override - -from dashboards.influx_queries import join_variable_and -from dashboards.legends import Units - from cbutil.ncu_keys import ( - memory_write_data_key, - memory_read_data_key, + dp_key, + memory_bandwidth_key, memory_data_key, - memory_write_bandwidth_key, memory_read_bandwidth_key, - memory_bandwidth_key, - runtime_key, + memory_read_data_key, + memory_write_bandwidth_key, + memory_write_data_key, operational_intensity_key, p_max_key, - dp_key, + runtime_key, +) +from dashboards.dashboard_base import ( + DashboardOptions, + Repeat, + build_dashboard, + get_commit_annotation, + get_grid_pos, + pack_in_row, +) +from dashboards.influx_queries import join_variable_and +from dashboards.legends import Units +from dashboards.overrides import get_color_regex_override +from dashboards.panels import PanelInfos, get_time_series_panel +from dashboards.variables import ( + Filter, + get_dashboard_variable, + get_time_dependend_dashboard_variable, ) def dashboard_uniformgridcpu(): - data_source = 'InfluxDB-1' - arch = 'CPU' - measurment_name = f'UniformGrid{arch}' + data_source = "InfluxDB-1" + arch = "CPU" + measurment_name = f"UniformGrid{arch}" row_repeat = "host" options = DashboardOptions( - title=f'Uniform Grid {arch}', + title=f"Uniform Grid {arch}", description=f"Benchmark dashboard for the Uniform Grid {arch} Benchmark from walberla", - tags=[arch, 'benchmark', 'walberla', 'Uniform Grid'], + tags=[arch, "benchmark", "walberla", "Uniform Grid"], timezone="browser", ) filters = [ Filter(row_repeat), - Filter("project_id", multi=True, default_value='walberla/walberla'), - Filter("branch", multi=True, default_value='master'), + Filter("project_id", multi=True, default_value="walberla/walberla"), + Filter("branch", multi=True, default_value="master"), Filter("collisionSetup"), Filter("mpi_num_processes"), Filter("streamingPattern"), @@ -60,27 +62,48 @@ def dashboard_uniformgridcpu(): Filter("periodic_2"), ] - fields = [PanelInfos("Runtime (RDTSC) [s] STAT Max", Units.seconds), - PanelInfos("mlupsPerProcess", Units.number), - PanelInfos("DP [MFLOP/s] STAT Sum", Units.mflop_sec), - PanelInfos("Operational intensity STAT Sum", Units.flop_per_byte), - PanelInfos('AVX DP [MFLOP/s] STAT Sum" / "DP [MFLOP/s] STAT Sum', Units.percent), - PanelInfos('Memory bandwidth [MBytes/s] STAT Sum', Units.mbytes_per_second), - PanelInfos('Memory write bandwidth [MBytes/s] STAT Sum', Units.mbytes_per_second), - PanelInfos('Memory read bandwidth [MBytes/s] STAT Sum', Units.mbytes_per_second), - PanelInfos('Memory data volume [GBytes] STAT Sum', Units.gigabyte), - PanelInfos('Memory read data volume [GBytes] STAT Sum', Units.gigabyte), - PanelInfos('Memory write data volume [GBytes] STAT Sum', Units.gigabyte), - PanelInfos('Energy [J] STAT Sum', Units.joule), - PanelInfos('Power [W] STAT Sum', Units.watt), - PanelInfos('Clock [MHz] STAT Avg', Units.megahertz), ] - - filter_vars = [get_dashboard_variable(filter, measurment_name, data_source) for filter in filters] + fields = [ + PanelInfos("Runtime (RDTSC) [s] STAT Max", Units.seconds), + PanelInfos("mlupsPerProcess", Units.number), + PanelInfos("DP [MFLOP/s] STAT Sum", Units.mflop_sec), + PanelInfos("Operational intensity STAT Sum", Units.flop_per_byte), + PanelInfos( + 'AVX DP [MFLOP/s] STAT Sum" / "DP [MFLOP/s] STAT Sum', Units.percent + ), + PanelInfos( + "Memory bandwidth [MBytes/s] STAT Sum", Units.mbytes_per_second), + PanelInfos( + "Memory write bandwidth [MBytes/s] STAT Sum", Units.mbytes_per_second + ), + PanelInfos( + "Memory read bandwidth [MBytes/s] STAT Sum", Units.mbytes_per_second + ), + PanelInfos("Memory data volume [GBytes] STAT Sum", Units.gigabyte), + PanelInfos( + "Memory read data volume [GBytes] STAT Sum", Units.gigabyte), + PanelInfos( + "Memory write data volume [GBytes] STAT Sum", Units.gigabyte), + PanelInfos("Energy [J] STAT Sum", Units.joule), + PanelInfos("Power [W] STAT Sum", Units.watt), + PanelInfos("Clock [MHz] STAT Avg", Units.megahertz), + ] + + filter_vars = [ + get_dashboard_variable(filter, measurment_name, data_source) + for filter in filters[1:] + ] + filter_vars = [ + get_time_dependend_dashboard_variable( + filters[0], measurment_name, data_source, inner_field_key="mlupsPerProcess" + ), + *filter_vars, + ] row_repeat_var = [fv for fv in filter_vars if fv.name == row_repeat][0] where = join_variable_and([f.name for f in filters]) - annotations = get_commit_annotation(data_source, "red", "commits", measurment_name) + annotations = get_commit_annotation( + data_source, "red", "commits", measurment_name) panels = [ get_time_series_panel( @@ -90,36 +113,36 @@ def dashboard_uniformgridcpu(): where=where, group_by=[f.name for f in filters], ) - for field in fields] + for field in fields + ] row = pack_in_row( title=f"{row_repeat}: ${row_repeat_var.name}", panels=[*panels], - repeat=Repeat('v', row_repeat_var.name), + repeat=Repeat("v", row_repeat_var.name), + ) + return build_dashboard( + options, rows=[row], templating=[*filter_vars], annotations=annotations ) - return build_dashboard(options, - rows=[row], - templating=[*filter_vars], - annotations=annotations) def dashboard_uniformgridgpu(): - data_source = 'InfluxDB-1' - arch = 'GPU' - measurment_name = f'UniformGrid{arch}' + data_source = "InfluxDB-1" + arch = "GPU" + measurment_name = f"UniformGrid{arch}" row_repeat = "host" options = DashboardOptions( - title=f'Uniform Grid {arch}', + title=f"Uniform Grid {arch}", description=f"Benchmark dashboard for the Uniform Grid {arch} Benchmark from walberla", - tags=[arch, 'benchmark', 'walberla', 'Uniform Grid'], + tags=[arch, "benchmark", "walberla", "Uniform Grid"], timezone="browser", ) filters = [ - Filter("project_id", multi=True, default_value='walberla/walberla'), - Filter("branch", multi=True, default_value='master'), - Filter("host", multi=False, default_value='medusa'), + Filter("host", multi=False, default_value="medusa"), + Filter("project_id", multi=True, default_value="walberla/walberla"), + Filter("branch", multi=True, default_value="master"), Filter("GPU"), Filter("collisionSetup"), Filter("mpi_num_processes"), @@ -140,14 +163,20 @@ def dashboard_uniformgridgpu(): Filter("periodic_2"), ] - fields = [PanelInfos("mlupsPerProcess", Units.number), ] + fields = [ + PanelInfos("mlupsPerProcess", Units.number), + ] - filter_vars = [get_dashboard_variable(filter, measurment_name, data_source) for filter in filters] + filter_vars = [ + get_dashboard_variable(filter, measurment_name, data_source) + for filter in filters + ] row_repeat_var = [fv for fv in filter_vars if fv.name == row_repeat][0] where = join_variable_and([f.name for f in filters]) - annotations = get_commit_annotation(data_source, "red", "commits", measurment_name) + annotations = get_commit_annotation( + data_source, "red", "commits", measurment_name) panels = [ get_time_series_panel( @@ -157,36 +186,36 @@ def dashboard_uniformgridgpu(): where=where, group_by=[f.name for f in filters], ) - for field in fields] + for field in fields + ] row = pack_in_row( title=f"{row_repeat}: ${row_repeat_var.name}", panels=[*panels], - repeat=Repeat('v', row_repeat_var.name), + repeat=Repeat("v", row_repeat_var.name), + ) + return build_dashboard( + options, rows=[row], templating=[*filter_vars], annotations=annotations ) - return build_dashboard(options, - rows=[row], - templating=[*filter_vars], - annotations=annotations) def dashboard_uniformgridgpu_profile(): - data_source = 'InfluxDB-1' - arch = 'GPU' - measurment_name = f'UniformGrid{arch}_profile' + data_source = "InfluxDB-1" + arch = "GPU" + measurment_name = f"UniformGrid{arch}_profile" row_repeat = "host" options = DashboardOptions( - title=f'Uniform Grid {arch} GPU Profiling', + title=f"Uniform Grid {arch} GPU Profiling", description=f"Benchmark dashboard for the Uniform Grid {arch} Benchmark from walberla", - tags=[arch, 'benchmark', 'walberla', 'Uniform Grid', 'profiling'], + tags=[arch, "benchmark", "walberla", "Uniform Grid", "profiling"], timezone="browser", ) filters = [ - Filter("project_id", multi=True, default_value='walberla/walberla'), - Filter("branch", multi=True, default_value='master'), - Filter("host", multi=False, default_value='medusa'), + Filter("host", multi=False, default_value="medusa"), + Filter("project_id", multi=True, default_value="walberla/walberla"), + Filter("branch", multi=True, default_value="master"), Filter("GPU"), Filter("collisionSetup"), Filter("mpi_num_processes"), @@ -207,25 +236,30 @@ def dashboard_uniformgridgpu_profile(): Filter("periodic_2"), ] - fields = [PanelInfos(runtime_key, Units.seconds), - PanelInfos(dp_key, Units.mflop_sec), - PanelInfos(p_max_key, Units.mflop_sec), - PanelInfos(f'{dp_key}"/"{p_max_key}', Units.percent), - PanelInfos(operational_intensity_key, Units.flop_per_byte), - PanelInfos(memory_bandwidth_key, Units.mbytes_per_second), - PanelInfos(memory_write_bandwidth_key, Units.mbytes_per_second), - PanelInfos(memory_read_bandwidth_key, Units.mbytes_per_second), - PanelInfos(memory_data_key, Units.gigabyte), - PanelInfos(memory_write_data_key, Units.gigabyte), - PanelInfos(memory_read_data_key, Units.gigabyte), - ] - - filter_vars = [get_dashboard_variable(filter, measurment_name, data_source) for filter in filters] + fields = [ + PanelInfos(runtime_key, Units.seconds), + PanelInfos(dp_key, Units.mflop_sec), + PanelInfos(p_max_key, Units.mflop_sec), + PanelInfos(f'{dp_key}"/"{p_max_key}', Units.percent), + PanelInfos(operational_intensity_key, Units.flop_per_byte), + PanelInfos(memory_bandwidth_key, Units.mbytes_per_second), + PanelInfos(memory_write_bandwidth_key, Units.mbytes_per_second), + PanelInfos(memory_read_bandwidth_key, Units.mbytes_per_second), + PanelInfos(memory_data_key, Units.gigabyte), + PanelInfos(memory_write_data_key, Units.gigabyte), + PanelInfos(memory_read_data_key, Units.gigabyte), + ] + + filter_vars = [ + get_dashboard_variable(filter, measurment_name, data_source) + for filter in filters + ] row_repeat_var = [fv for fv in filter_vars if fv.name == row_repeat][0] where = join_variable_and([f.name for f in filters]) - annotations = get_commit_annotation(data_source, "red", "commits", measurment_name) + annotations = get_commit_annotation( + data_source, "red", "commits", measurment_name) panels = [ get_time_series_panel( @@ -235,44 +269,50 @@ def dashboard_uniformgridgpu_profile(): where=where, group_by=[f.name for f in filters], ) - for field in fields] + for field in fields + ] row = pack_in_row( title=f"{row_repeat}: ${row_repeat_var.name}", panels=[*panels], - repeat=Repeat('v', row_repeat_var.name), + repeat=Repeat("v", row_repeat_var.name), + ) + return build_dashboard( + options, rows=[row], templating=[*filter_vars], annotations=annotations ) - return build_dashboard(options, - rows=[row], - templating=[*filter_vars], - annotations=annotations) def dashboard_fslbmgravitywave(): - data_source = 'InfluxDB-1' - arch = 'CPU' - measurment_name = 'FSLBM_gravitywave' + data_source = "InfluxDB-1" + arch = "CPU" + measurment_name = "FSLBM_gravitywave" options = DashboardOptions( - title='Free Surface LBM - Gravity Wave', + title="Free Surface LBM - Gravity Wave", description="Benchmark dashboard for the FSBLM Gravitywave Benchmark from walberla", - tags=[arch, 'benchmark', 'walberla', 'FSLBM'], + tags=[arch, "benchmark", "walberla", "FSLBM"], timezone="browser", ) filters = [ Filter("host"), - Filter("project_id", multi=True, default_value='walberla/walberla'), - Filter("branch", multi=True, default_value='master'), + Filter("project_id", multi=True, default_value="walberla/walberla"), + Filter("branch", multi=True, default_value="master"), Filter("numMPIProcesses"), ] - fields = [PanelInfos("simulationTime", Units.seconds), ] + fields = [ + PanelInfos("simulationTime", Units.seconds), + ] - filter_vars = [get_dashboard_variable(filter, measurment_name, data_source) for filter in filters] + filter_vars = [ + get_dashboard_variable(filter, measurment_name, data_source) + for filter in filters + ] where = join_variable_and([f.name for f in filters]) - annotations = get_commit_annotation(data_source, "red", "commits", measurment_name) + annotations = get_commit_annotation( + data_source, "red", "commits", measurment_name) groups = ["Communication", "Sweep", "MPI Barrier"] colors = ["red", "green", "blue"] overrides = [ @@ -287,9 +327,10 @@ def dashboard_fslbmgravitywave(): measurment_name, where=where, group_by=[f.name for f in filters], - gridPos=get_grid_pos(12, 24, 0, idx*(13)) + gridPos=get_grid_pos(12, 24, 0, idx * (13)), ) - for idx, field in enumerate(fields)] + for idx, field in enumerate(fields) + ] panels.append( get_time_series_panel( PanelInfos("/.*_percentage/", Units.percent), @@ -297,7 +338,7 @@ def dashboard_fslbmgravitywave(): measurment_name, where=where, group_by=[f.name for f in filters], - gridPos=get_grid_pos(12, 12, 0, len(fields)*(13)), + gridPos=get_grid_pos(12, 12, 0, len(fields) * (13)), drawStyle="bars", stacking={"mode": "normal"}, fillOpacity=70, @@ -305,7 +346,8 @@ def dashboard_fslbmgravitywave(): tooltipMode="single", overrides=overrides, colorMode="fixed", - )) + ) + ) panels.append( get_time_series_panel( @@ -314,13 +356,14 @@ def dashboard_fslbmgravitywave(): measurment_name, where=where, group_by=[f.name for f in filters], - gridPos=get_grid_pos(12, 12, 12, len(fields)*(13)), + gridPos=get_grid_pos(12, 12, 12, len(fields) * (13)), drawStyle="bars", stacking={"mode": "normal"}, fillOpacity=70, gradientMode="Opacity", tooltipMode="single", - )) + ) + ) panels.append( get_time_series_panel( @@ -329,13 +372,14 @@ def dashboard_fslbmgravitywave(): measurment_name, where=where, group_by=[f.name for f in filters], - gridPos=get_grid_pos(12, 12, 0, (len(fields)+1)*(13)), + gridPos=get_grid_pos(12, 12, 0, (len(fields) + 1) * (13)), drawStyle="bars", stacking={"mode": "normal"}, fillOpacity=70, gradientMode="Opacity", tooltipMode="single", - )) + ) + ) panels.append( get_time_series_panel( @@ -344,15 +388,15 @@ def dashboard_fslbmgravitywave(): measurment_name, where=where, group_by=[f.name for f in filters], - gridPos=get_grid_pos(12, 12, 12, (len(fields)+1)*(13)), + gridPos=get_grid_pos(12, 12, 12, (len(fields) + 1) * (13)), drawStyle="bars", stacking={"mode": "normal"}, fillOpacity=70, gradientMode="Opacity", tooltipMode="single", - )) + ) + ) - return build_dashboard(options, - panels=panels, - templating=filter_vars, - annotations=annotations) + return build_dashboard( + options, panels=panels, templating=filter_vars, annotations=annotations + ) diff --git a/dashboards/influx_queries.py b/dashboards/influx_queries.py index ac09048759f0f3174670ed217ee250eb8c40a478..d2113cfa50d8c7a1d4d9df3e3362c15ccbb4a8ae 100644 --- a/dashboards/influx_queries.py +++ b/dashboards/influx_queries.py @@ -14,25 +14,25 @@ class Query: def _get_select(self): if self.select_string: - return f'SELECT \"{self.select_}\" ' + return f'SELECT "{self.select_}" ' else: - return f'SELECT {self.select_} ' + return f"SELECT {self.select_} " def _get_from(self): if self.from_string: - return f'FROM \"{self.from_}\" ' + return f'FROM "{self.from_}" ' else: - return f'FROM {self.from_} ' + return f"FROM {self.from_} " def _get_where(self): - return f'WHERE ({self.where_}) AND $timeFilter ' + return f"WHERE ({self.where_}) AND $timeFilter " def _get_group_by(self): if self.group_by: - group_by = ', '.join(f'"{tag}"' for tag in self.group_by) - return f'GROUP BY {group_by}' + group_by = ", ".join(f'"{tag}"' for tag in self.group_by) + return f"GROUP BY {group_by}" else: - return '' + return "" def __str__(self): ret = self._get_select() @@ -49,7 +49,15 @@ def show_tag_values(table: str, key_name: str) -> str: if table != "": from_part = f'FROM "{table}" ' - return f"{base} {from_part}WITH key = \"{key_name}\"" + return f'{base} {from_part}WITH key = "{key_name}"' + + +def get_tag_values(table: str, key_name: str, *, inner_field_key="") -> str: + inner_select = "*" + if inner_field_key != "": + inner_select = f'"{inner_field_key}", "{key_name}"' + inner_query = f'SELECT {inner_select} FROM "{table}" WHERE $timeFilter' + return f'SELECT distinct("{key_name}") FROM ({inner_query}) GROUP BY {key_name}' def get_variable_condition(variable_name: str, *, tag_key: str = None) -> str: @@ -75,12 +83,11 @@ def join_conditions(conditions: List[str], operators: Union[List[str], str]): ret = conditions[0] for op, cond in zip(ops, conditions[1:]): - ret += f' {op} {cond}' + ret += f" {op} {cond}" return ret def join_variable_and(variable_names: List[str]) -> str: return join_conditions( - [get_variable_condition(name) for name in variable_names], - "AND" + [get_variable_condition(name) for name in variable_names], "AND" ) diff --git a/dashboards/variables.py b/dashboards/variables.py index 22a6d44a5368339179aaa566e76ef89383a7fddb..63dc836494edb2daf61dc0fdc8b82c4a45de7b9f 100644 --- a/dashboards/variables.py +++ b/dashboards/variables.py @@ -1,13 +1,15 @@ from grafanalib.core import Template from collections import namedtuple -from dashboards.influx_queries import show_tag_values +from dashboards.influx_queries import show_tag_values, get_tag_values -Filter = namedtuple("Filter", ("name", "multi", "default_value"), defaults=('', True, '')) +Filter = namedtuple( + "Filter", ("name", "multi", "default_value"), defaults=("", True, "") +) -def get_measurement_filter(name, data_source, - *, filter_pattern: str = None, - **kwargs) -> Template: +def get_measurement_filter( + name, data_source, *, filter_pattern: str = None, **kwargs +) -> Template: query = "SHOW MEASUREMENTS" if filter_pattern: query += f" WITH MEASUREMENT =~ /{filter_pattern}/" @@ -16,21 +18,49 @@ def get_measurement_filter(name, data_source, def get_dashboard_variable(filter: Filter, measurment_name: str, data_source: str): query = show_tag_values(measurment_name, filter.name) - kwargs = {'includeAll': filter.multi, 'multi': filter.multi, } + kwargs = { + "includeAll": filter.multi, + "multi": filter.multi, + } if filter.default_value: - kwargs.update({'default': filter.default_value}) + kwargs.update({"default": filter.default_value}) return get_dashboard_variable_query(filter.name, query, data_source, **kwargs) -def get_dashboard_variable_query(name: str, template_query: str, - dataSource: str, *, - includeAll=True, - multi=True, - **kwargs) -> Template: - return Template(name, - template_query, - dataSource=dataSource, - type="query", - includeAll=includeAll, - multi=multi, - **kwargs) +def get_time_dependend_dashboard_variable( + filter: Filter, + measurment_name: str, + data_source: str, + *, + inner_field_key: str = "", +): + query = get_tag_values( + measurment_name, filter.name, inner_field_key=inner_field_key + ) + kwargs = { + "includeAll": filter.multi, + "multi": filter.multi, + } + if filter.default_value: + kwargs.update({"default": filter.default_value}) + return get_dashboard_variable_query(filter.name, query, data_source, **kwargs) + + +def get_dashboard_variable_query( + name: str, + template_query: str, + dataSource: str, + *, + includeAll=True, + multi=True, + **kwargs, +) -> Template: + return Template( + name, + template_query, + dataSource=dataSource, + type="query", + includeAll=includeAll, + multi=multi, + **kwargs, + )