-
Notifications
You must be signed in to change notification settings - Fork 411
/
check_grafana.py
executable file
·81 lines (71 loc) · 2.87 KB
/
check_grafana.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/usr/bin/env python3
# Copyright 2023 PingCAP, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
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())