From c882805d92b851ccf004667b8e2aad67fa73f692 Mon Sep 17 00:00:00 2001 From: tofu Date: Mon, 30 Jun 2025 18:11:16 -0700 Subject: [PATCH 1/3] add support for other panel types --- grafana/provisioning/dashboards/wrapper.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/grafana/provisioning/dashboards/wrapper.py b/grafana/provisioning/dashboards/wrapper.py index 5bcc951..61f92a3 100644 --- a/grafana/provisioning/dashboards/wrapper.py +++ b/grafana/provisioning/dashboards/wrapper.py @@ -1,11 +1,17 @@ from dataclasses import dataclass from typing import Optional, Final -from grafanalib.core import Row, Dashboard, Target, TimeSeries, GridPos +from enum import Enum + +from grafanalib.core import Row, Dashboard, Target, TimeSeries, GridPos, GaugePanel from common import PROMETHEUS_DATASOURCE_NAME +class Panel(Enum): + TIME_SERIES = TimeSeries + GAUGE = GaugePanel + class RefIdGenerator: STARTING_CHAR_INTEGER = ord("A") @@ -39,7 +45,7 @@ def __init__(self, title, panel_width=12, panel_height=8): def DefineRow(self, title): self.rows.append(Row(title=title, panels=[])) - def AddPanel(self, title, queries: list[ExpressionAndLegendPair], unit='', dydt=False): + def AddPanel(self, title, queries: list[ExpressionAndLegendPair], unit='', dydt=False, panel_type=Panel.TIME_SERIES): targets = [] iterator = RefIdGenerator() for query in queries: @@ -80,9 +86,7 @@ def AddPanel(self, title, queries: list[ExpressionAndLegendPair], unit='', dydt= datasource=PROMETHEUS_DATASOURCE_NAME, ) ) - row_or_panel = self.rows[-1].panels if self.rows else self.panels - row_or_panel.append( - TimeSeries( + panel = panel_type.value( title=title, targets=targets, gridPos=GridPos( @@ -91,10 +95,11 @@ def AddPanel(self, title, queries: list[ExpressionAndLegendPair], unit='', dydt= x=self.current_x, y=self.current_y, ), - lineWidth=2, - unit=unit ) - ) + unit_var = 'unit' if hasattr(panel_type.value, 'unit') else 'format' + setattr(panel, unit_var, unit) + row_or_panel = self.rows[-1].panels if self.rows else self.panels + row_or_panel.append(panel) self.current_x += self.panel_width if self.current_x > self.MAX_WIDTH / 2: self.current_y += self.panel_height From 8fcd1ea3c31005f7a12da4eb33031e05e6aa4102 Mon Sep 17 00:00:00 2001 From: tofu Date: Mon, 30 Jun 2025 22:21:27 -0700 Subject: [PATCH 2/3] formatting --- grafana/provisioning/dashboards/wrapper.py | 32 ++++++++++++++-------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/grafana/provisioning/dashboards/wrapper.py b/grafana/provisioning/dashboards/wrapper.py index 61f92a3..e89cf92 100644 --- a/grafana/provisioning/dashboards/wrapper.py +++ b/grafana/provisioning/dashboards/wrapper.py @@ -12,6 +12,7 @@ class Panel(Enum): TIME_SERIES = TimeSeries GAUGE = GaugePanel + class RefIdGenerator: STARTING_CHAR_INTEGER = ord("A") @@ -45,7 +46,14 @@ def __init__(self, title, panel_width=12, panel_height=8): def DefineRow(self, title): self.rows.append(Row(title=title, panels=[])) - def AddPanel(self, title, queries: list[ExpressionAndLegendPair], unit='', dydt=False, panel_type=Panel.TIME_SERIES): + def AddPanel( + self, + title, + queries: list[ExpressionAndLegendPair], + unit="", + dydt=False, + panel_type=Panel.TIME_SERIES, + ): targets = [] iterator = RefIdGenerator() for query in queries: @@ -87,16 +95,16 @@ def AddPanel(self, title, queries: list[ExpressionAndLegendPair], unit='', dydt= ) ) panel = panel_type.value( - title=title, - targets=targets, - gridPos=GridPos( - h=self.panel_height, - w=self.panel_width, - x=self.current_x, - y=self.current_y, - ), - ) - unit_var = 'unit' if hasattr(panel_type.value, 'unit') else 'format' + title=title, + targets=targets, + gridPos=GridPos( + h=self.panel_height, + w=self.panel_width, + x=self.current_x, + y=self.current_y, + ), + ) + unit_var = "unit" if hasattr(panel_type.value, "unit") else "format" setattr(panel, unit_var, unit) row_or_panel = self.rows[-1].panels if self.rows else self.panels row_or_panel.append(panel) @@ -107,5 +115,5 @@ def AddPanel(self, title, queries: list[ExpressionAndLegendPair], unit='', dydt= def Render(self): return Dashboard( - title=self.title, rows=self.rows, panels=self.panels, timezone='browser' + title=self.title, rows=self.rows, panels=self.panels, timezone="browser" ).auto_panel_ids() From 4ed37dc895c43e1c7b5beb346fb5d610e1b363fd Mon Sep 17 00:00:00 2001 From: tofu Date: Mon, 30 Jun 2025 23:31:36 -0700 Subject: [PATCH 3/3] add comment and change variable names --- grafana/provisioning/dashboards/wrapper.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/grafana/provisioning/dashboards/wrapper.py b/grafana/provisioning/dashboards/wrapper.py index e89cf92..0888976 100644 --- a/grafana/provisioning/dashboards/wrapper.py +++ b/grafana/provisioning/dashboards/wrapper.py @@ -8,7 +8,7 @@ from common import PROMETHEUS_DATASOURCE_NAME -class Panel(Enum): +class PanelType(Enum): TIME_SERIES = TimeSeries GAUGE = GaugePanel @@ -52,7 +52,7 @@ def AddPanel( queries: list[ExpressionAndLegendPair], unit="", dydt=False, - panel_type=Panel.TIME_SERIES, + panel_type_enum=PanelType.TIME_SERIES, ): targets = [] iterator = RefIdGenerator() @@ -94,7 +94,7 @@ def AddPanel( datasource=PROMETHEUS_DATASOURCE_NAME, ) ) - panel = panel_type.value( + panel = panel_type_enum.value( title=title, targets=targets, gridPos=GridPos( @@ -104,7 +104,8 @@ def AddPanel( y=self.current_y, ), ) - unit_var = "unit" if hasattr(panel_type.value, "unit") else "format" + # maybe only a few of the panel types are missing the unit field + unit_var = "unit" if hasattr(panel_type_enum.value, "unit") else "format" setattr(panel, unit_var, unit) row_or_panel = self.rows[-1].panels if self.rows else self.panels row_or_panel.append(panel)