summaryrefslogtreecommitdiffstats
path: root/python/mozperftest/mozperftest/metrics/perfboard/grafana.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mozperftest/mozperftest/metrics/perfboard/grafana.py')
-rw-r--r--python/mozperftest/mozperftest/metrics/perfboard/grafana.py87
1 files changed, 87 insertions, 0 deletions
diff --git a/python/mozperftest/mozperftest/metrics/perfboard/grafana.py b/python/mozperftest/mozperftest/metrics/perfboard/grafana.py
new file mode 100644
index 0000000000..1fa76ea991
--- /dev/null
+++ b/python/mozperftest/mozperftest/metrics/perfboard/grafana.py
@@ -0,0 +1,87 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+import json
+import os
+
+from grafana_api.grafana_face import GrafanaFace
+
+HERE = os.path.dirname(__file__)
+
+
+with open(os.path.join(HERE, "dashboard.json")) as f:
+ template = json.loads(f.read())
+
+with open(os.path.join(HERE, "panel.json")) as f:
+ panel_template = json.loads(f.read())
+
+with open(os.path.join(HERE, "target.json")) as f:
+ target_template = json.loads(f.read())
+
+
+class Grafana:
+ def __init__(self, layer, key, host="perfboard.dev.mozaws.net", port=3000):
+ self.client = GrafanaFace(host=host, port=port, auth=key)
+ self.layer = layer
+
+ def get_dashboard(self, title):
+ existing = self.client.search.search_dashboards(tag="component")
+ existing = dict(
+ [(dashboard["title"].lower(), dashboard["uid"]) for dashboard in existing]
+ )
+ if title in existing:
+ return self.client.dashboard.get_dashboard(existing[title])
+ self.layer.debug(f"Creating dashboard {title}")
+ d = dict(template)
+ d["title"] = title.capitalize()
+ res = self.client.dashboard.update_dashboard(
+ dashboard={"dashboard": d, "folderId": 0, "overwrite": False}
+ )
+
+ return self.client.dashboard.get_dashboard(res["uid"])
+
+ def _add_panel(self, dashboard, panel_title, metrics):
+ found = None
+ ids = []
+ for panel in dashboard["dashboard"]["panels"]:
+ ids.append(panel["id"])
+
+ if panel["title"] == panel_title:
+ found = panel
+
+ ids.sort()
+
+ need_update = False
+ if found is None:
+ # create the panel
+ panel = panel_template
+ panel["title"] = panel_title
+ if ids != []:
+ panel["id"] = ids[-1] + 1
+ else:
+ panel["id"] = 1
+ self.layer.debug("Creating panel")
+ dashboard["dashboard"]["panels"].append(panel)
+ need_update = True
+ else:
+ self.layer.debug("Panel exists")
+ panel = found
+
+ # check the metrics
+ existing = [target["measurement"] for target in panel["targets"]]
+
+ for metric in metrics:
+ if metric in existing:
+ continue
+ m = dict(target_template)
+ m["measurement"] = metric
+ panel["targets"].append(m)
+ need_update = True
+
+ if need_update:
+ self.layer.debug("Updating dashboard")
+ self.client.dashboard.update_dashboard(dashboard=dashboard)
+
+ def add_panel(self, dashboard, panel, metrics):
+ dashboard = self.get_dashboard(dashboard)
+ self._add_panel(dashboard, panel, metrics)