分布式监控系统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)

zabbix专题:第七章 添加图像Graphs,添加聚合图形Screens

zabbix自定义聚合图形展示多台主机的监控图形

02 . Zabbix配置监控项及聚合图形

02 . Zabbix配置监控项及聚合图形

使用python脚本创建zabbix screen(聚合图形)。