分布式监控系统Zabbix-批量添加聚合图形
Posted 散尽浮华
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式监控系统Zabbix-批量添加聚合图形相关的知识,希望对你有一定的参考价值。
之前部署了Zabbix(3.4.4版本)监控环境,由于主机比较多,分的主机组也比较多,添加聚合图形比较麻烦,故采用python脚本进行批量添加聚合图形。脚本下载地址:https://pan.baidu.com/s/1bpApIPp (密码:wpts)脚本操作如下:
[root@zabbix01 ~]# cd /opt/ [root@zabbix01 opt]# ls create_Disk_space_usage_screen.py create_screen.py ====================================================================================== [root@zabbix01 opt]# cat create_screen.py #!/bin/env python import json import urllib2 import argparse import re re_digits = re.compile(r\'(\\d+)\') def emb_numbers(s): pieces=re_digits.split(s) pieces[1::2]=map(int,pieces[1::2]) return pieces def sort_strings_with_emb_numbers2(alist): return sorted(alist, key=emb_numbers) def requestjson(url, values): data = json.dumps(values) req = urllib2.Request(url, data, {\'Content-Type\': \'application/json-rpc\'}) res = urllib2.urlopen(req, data) output = json.loads(res.read()) return output def authenticate(url, username, password): values = {\'jsonrpc\': \'2.0\', \'method\': \'user.login\', \'params\': { \'user\': username, \'password\': password }, \'id\': \'0\' } output = requestjson(url, values) return output[\'result\'] def gethosts(groupname, url, auth): host_list = {} values = {\'jsonrpc\': \'2.0\', \'method\': \'hostgroup.get\', \'params\': { \'output\': \'extend\', \'filter\': {\'name\': groupname}, \'selectHosts\': [\'host\'] }, \'auth\': auth, \'id\': \'2\' } output = requestjson(url, values) for host in output[\'result\'][0][\'hosts\']: host_list[host[\'host\']]=(host[\'hostid\']) #return host_list hosts_sort = [] for host in sort_strings_with_emb_numbers2(host_list.keys()): hosts_sort.append(host_list[host]) return hosts_sort def getgraphs(host_list, name_list, url, auth, columns, graphtype=0, dynamic=0): if (graphtype == 0): selecttype = [\'graphid\'] select = \'selectGraphs\' if (graphtype == 1): selecttype = [\'itemid\', \'value_type\'] select = \'selectItems\' graphs = [] for host in host_list: values = ({\'jsonrpc\': \'2.0\', \'method\': \'graph.get\', \'params\': { select: [selecttype, \'name\'], \'output\': [\'graphid\', \'name\'], \'hostids\': host, \'filter\': {\'name\': name_list}, \'sortfield\': \'name\' }, \'auth\': auth, \'id\': \'3\' }) output = requestjson(url, values) bb = sorted(output[\'result\']) if (graphtype == 0): for i in bb: graphs.append(i[\'graphid\']) if (graphtype == 1): for i in bb: if int(i[\'value_type\']) in (0, 3): graphs.append(i[\'itemid\']) graph_list = [] x = 0 y = 0 for graph in graphs: graph_list.append({ \'resourcetype\': graphtype, \'resourceid\': graph, \'width\': \'600\', \'height\': \'100\', \'x\': str(x), \'y\': str(y), \'colspan\': \'1\', \'rowspan\': \'1\', }) x += 1 if x == int(columns): x = 0 y += 1 return graph_list def screencreate(url, auth, screen_name, graphids, columns): columns = int(columns) if len(graphids) % columns == 0: vsize = len(graphids) / columns else: vsize = (len(graphids) / columns) + 1 values = {\'jsonrpc\': \'2.0\', \'method\': \'screen.create\', \'params\': [{ \'name\': screen_name, \'hsize\': columns, \'vsize\': vsize, \'screenitems\': [] }], \'auth\': auth, \'id\': 2 } for i in graphids: values[\'params\'][0][\'screenitems\'].append(i) output = requestjson(url, values) def main(): url = \'http://10.0.8.40/api_jsonrpc.php\' username = \'Admin\' password = \'qwkg@monitor\' auth = authenticate(url, username, password) host_list = gethosts(groupname, url, auth) graph_ids = getgraphs(host_list, graphname, url, auth, columns) screencreate(url, auth, screen_name, graph_ids, columns) if __name__ == \'__main__\': parser = argparse.ArgumentParser() parser.add_argument(\'-g\', dest=\'groupname\', nargs=\'+\', metavar=\'groupname\', type=str, help=\'which group you want to select\') parser.add_argument(\'-G\', dest=\'graphname\', nargs=\'+\', metavar=\'graphname\', type=str, help=\'which graph you want to select\') parser.add_argument(\'-c\', dest=\'columns\', metavar=\'columns\', type=int, help=\'the screen columns\') parser.add_argument(\'-n\', dest=\'screen_name\', metavar=\'screen_name\', type=str, help=\'the screen name\') args = parser.parse_args() groupname = args.groupname graphname = args.graphname columns = args.columns screen_name = args.screen_name main() ====================================================================================== [root@zabbix01 opt]# cat create_Disk_space_usage_screen.py #!/bin/env python import json import urllib2 import argparse import re re_digits = re.compile(r\'(\\d+)\') def emb_numbers(s): pieces=re_digits.split(s) pieces[1::2]=map(int,pieces[1::2]) return pieces def sort_strings_with_emb_numbers2(alist): return sorted(alist, key=emb_numbers) def requestjson(url, values): data = json.dumps(values) req = urllib2.Request(url, data, {\'Content-Type\': \'application/json-rpc\'}) res = urllib2.urlopen(req, data) output = json.loads(res.read()) return output def authenticate(url, username, password): values = {\'jsonrpc\': \'2.0\', \'method\': \'user.login\', \'params\': { \'user\': username, \'password\': password }, \'id\': \'0\' } output = requestjson(url, values) return output[\'result\'] def gethosts(groupname, url, auth): host_list = {} values = {\'jsonrpc\': \'2.0\', \'method\': \'hostgroup.get\', \'params\': { \'output\': \'extend\', \'filter\': {\'name\': groupname}, \'selectHosts\': [\'host\'] }, \'auth\': auth, \'id\': \'2\' } output = requestjson(url, values) for host in output[\'result\'][0][\'hosts\']: host_list[host[\'host\']]=(host[\'hostid\']) #return host_list hosts_sort = [] for host in sort_strings_with_emb_numbers2(host_list.keys()): hosts_sort.append(host_list[host]) return hosts_sort def getgraphs(host_list, name_list, url, auth, columns, graphtype=0, dynamic=0): if (graphtype == 0): selecttype = [\'graphid\'] select = \'selectGraphs\' if (graphtype == 1): selecttype = [\'itemid\', \'value_type\'] select = \'selectItems\' graphs = [] for host in host_list: values = ({\'jsonrpc\': \'2.0\', \'method\': \'graph.get\', \'params\': { select: [selecttype, \'name\'], \'output\': [\'graphid\', \'name\'], \'hostids\': host, \'filter\': {\'name\': name_list}, \'sortfield\': \'name\' }, \'auth\': auth, \'id\': \'3\' }) output = requestjson(url, values) bb = sorted(output[\'result\']) if (graphtype == 0): for i in bb: graphs.append(i[\'graphid\']) if (graphtype == 1): for i in bb: if int(i[\'value_type\']) in (0, 3): graphs.append(i[\'itemid\']) graph_list = [] x = 0 y = 0 for graph in graphs: graph_list.append({ \'resourcetype\': graphtype, \'resourceid\': graph, \'width\': \'400\', \'height\': \'400\', \'x\': str(x), \'y\': str(y), \'colspan\': \'1\', \'rowspan\': \'1\', }) x += 1 if x == int(columns): x = 0 y += 1 return graph_list def screencreate(url, auth, screen_name, graphids, columns): columns = int(columns) if len(graphids) % columns == 0: vsize = len(graphids) / columns else: vsize = (len(graphids) / columns) + 1 values = {\'jsonrpc\': \'2.0\', \'method\': \'screen.create\', \'params\': [{ \'name\': screen_name, \'hsize\': columns, \'vsize\': vsize, \'screenitems\': [] }], \'auth\': auth, \'id\': 2 } for i in graphids: values[\'params\'][0][\'screenitems\'].append(i) output = requestjson(url, values) def main(): url = \'http://10.0.8.40/api_jsonrpc.php\' username = \'Admin\' password = \'qwkg@monitor\' auth = authenticate(url, username, password) host_list = gethosts(groupname, url, auth) graph_ids = getgraphs(host_list, graphname, url, auth, columns) screencreate(url, auth, screen_name, graph_ids, columns) if __name__ == \'__main__\': parser = argparse.ArgumentParser() parser.add_argument(\'-g\', dest=\'groupname\', nargs=\'+\', metavar=\'groupname\', type=str, help=\'which group you want to select\') parser.add_argument(\'-G\', dest=\'graphname\', nargs=\'+\', metavar=\'graphname\', type=str, help=\'which graph you want to select\') parser.add_argument(\'-c\', dest=\'columns\', metavar=\'columns\', type=int, help=\'the screen columns\') parser.add_argument(\'-n\', dest=\'screen_name\', metavar=\'screen_name\', type=str, help=\'the screen name\') args = parser.parse_args() groupname = args.groupname graphname = args.graphname columns = args.columns screen_name = args.screen_name main() ====================================================================================== 上面两个脚本create_screen.py和create_Disk_space_usage_screen.py,脚本中只需要按照自己的实际zabbix访问情况修改三处: url username password 前者用于批量生成负载、带宽、IO等监控的聚合图形,后者用于生成磁盘监控的聚合图形。 两个脚本唯一不同的就是width和height的值不一样。 批量生成聚合图形的操作如下: [root@zabbix01 opt]# python create_screen.py -g \'财务系统\' -G \'Network traffic on bond0\' -c 2 -n \'财务系统---Network traffic on bond0\' [root@zabbix01 opt]# python create_screen.py -g \'财务系统\' -G \'CPU load\' -c 2 -n \'财务系统---CPU load\' [root@zabbix01 opt]# python create_screen.py -g \'财务系统\' -G \'CPU utilization\' -c 2 -n \'财务系统---CPU utilization\' [root@zabbix01 opt]# python create_screen.py -g \'财务系统\' -G \'Memory usage\' -c 2 -n \'财务系统---Memory usage\' [root@zabbix01 opt]# python create_screen.py -g \'财务系统\' -G \'Read and Write speed on /\' -c 2 -n \'财务系统---Read and Write speed on /\' [root@zabbix01 opt]# python create_screen.py -g \'财务系统\' -G \'Read and Write speed on /data\' -c 2 -n \'财务系统---Read and Write speed on /data\' [root@zabbix01 opt]# python create_Disk_space_usage_screen.py -g \'财务系统\' -G \'Disk space usage /\' -c 3 -n \'财务系统---Disk space usage /\' [root@zabbix01 opt]# python create_Disk_space_usage_screen.py -g \'财务系统\' -G \'Disk space usage /data\' -c 3 -n \'财务系统---Disk space usage /data\' 对于以上命令中的参数解释: -g 要显示zabbix的群组(注意这个是在zabbix界面的"图形"里显示的"群组"选项,不能随便写,必须是存在zabbix里的)。 -G 要显示的zabbix图形(注意这个是在zabbix界面的"图形"里显示的"图形"选项,不能随便写,必须是存在zabbix里的)。 -c 显示几列,注意要调整脚本里的:\'width\': ,\'height\': 参数来设置大小。 -n 在screen 里面显示的名称。 上面的命令的意思就是:把"财务系统"组里面每个服务器的bond0网卡、load负载、磁盘等监控图形,接每列4个图形(磁盘的按美3个图形)的显示在聚合图形里。 同理:如果添加其他主机组,即将上面的"财务系统" 统一替换掉即可!
如果后续zabbix监控的主机群组里又追加了新机器,那么就把之前生产的该群组的聚合图形删除,然后再按照上面的脚本命令再次重新生成聚合图形,这样新加入到主机群组内机器的聚合图形就会显示出来了。
以上是关于分布式监控系统Zabbix-批量添加聚合图形的主要内容,如果未能解决你的问题,请参考以下文章
利用python3 调用zabbix接口完成批量加聚合图形(screens)