Last active
September 13, 2023 06:55
-
-
Save JaySon-Huang/740e8900cd4db66052f8f6cd66a32489 to your computer and use it in GitHub Desktop.
Validate the correctness of the Grafana JSON model
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
import sys | |
import json | |
import logging | |
def main(): | |
logging.basicConfig(format='%(asctime)s [%(levelname)s] %(message)s', datefmt='%Y/%m/%d %H:%M:%S', level=logging.INFO) | |
if len(sys.argv) < 2: | |
logging.error("Usage: {} path/to/grafana.json".format(sys.argv[0])) | |
return 1 | |
infile = sys.argv[1] | |
j = json.load(open(infile)) | |
panels = j['panels'] | |
existing_ids = {} | |
ok = True | |
if j["title"] != "Test-Cluster-TiFlash-Summary": | |
ok = False | |
logging.error("key={} actual={}".format("title", j["title"])) | |
if j["uid"] != "SVbh2xUWk": | |
ok = False | |
logging.error("key={} actual={}".format("uid", j["uid"])) | |
if j["__inputs"][0]["name"] != "DS_TEST-CLUSTER" or j["__inputs"][0]["label"] != "Test-Cluster": | |
ok = False | |
logging.error("key={} actual={}".format("__inputs", j["__inputs"])) | |
for panel in panels: | |
ok &= handle_panel(panel, j["title"], existing_ids) | |
if not ok: | |
logging.error("!!!Error detected!!!") | |
return 2 | |
else: | |
logging.info("All checks passed") | |
return 0 | |
def handle_panel(panel, parent_title, existing_ids): | |
logging.debug('title: {} type: {}'.format(parent_title, panel["type"])) | |
if panel["type"] == "row": | |
# Check sub panels recursively | |
logging.info("Checking panels under row '{}'".format(panel["title"])) | |
sub_panels = panel["panels"] | |
ok = True | |
for p in sub_panels: | |
ok &= handle_panel(p, panel["title"], existing_ids) | |
logging.info("Check done for panels under row '{}'".format(panel["title"])) | |
return ok | |
# Check whether there exist duplicate id | |
if panel["id"] not in existing_ids: | |
existing_ids[panel["id"]] = { | |
"panel": panel, | |
"parent_title": parent_title, | |
} | |
return True | |
else: | |
current_title = panel["title"] | |
existing_panel = existing_ids[panel["id"]] | |
logging.error("Found duplicated id {}".format(panel["id"])) | |
logging.error("Original panel title: '{}' under row '{}'".format(existing_panel["panel"]["title"], existing_panel["parent_title"])) | |
logging.error("Duplicate panel title: '{}' under row '{}'".format(current_title, parent_title)) | |
return False | |
if __name__ == '__main__': | |
sys.exit(main()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment