Python抓取zabbix性能监控图

一、通过查询zabbix db的方式通过主机IP获取到所需要的graphid(比如CPU监控图、内存监控图等,每个图对应一个graphid),最后将图片保存到本地

       注:该graph必须要在 screen中存在才可以获取到相应的graphid,否则graphid为空。

import urllib2,requests,cookielib,urllib
#定义登录地址
login_url = 'http://10.16.2.4/zabbix/index.php'
#定义登录所需要用的信息,如用户名、密码等,使用urllib进行编码
login_data = urllib.urlencode({
                        "name": 'admin',
                        "password": 'password',
                        "autologin": 1,
                        "enter": "Sign in"})

#设置一个cookie处理器,它负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookie  
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
urllib2.install_opener(opener)
opener.open(login_url,login_data).read()
#这部分没有具体写
sql_hostid = select hostid from hosts where host='10.16.3.2'; #通过host查询hostid
sql_itemid = select itemid,`name`,key_ from items where hostid='10251' #通过hostid查询itemid,通过key_过滤性能监视器
sql_graphid = select graphid from graphs_items where itemid='33712' #通过itemid查询对应的graphid

graph_args = urllib.urlencode({
                        "graphid":'3346',
                        "width":'400',
                        "height":'156',
                        "stime":'20160511000000', #图形开始时间
                        "period":'86400'})


graph_url = 'http://10.16.2.4/zabbix/chart2.php'
print graph_args  #返回格式:width=400&screenid=28&graphid=4769&period=86400&height=156

data = opener.open(graph_url,graph_args).read()
# print data
file=open('d:\\zaa225.png','wb')
file.write(data)
file.flush()
file.close()

 

二、通过zabbix API获取graphID,最后将图片保存到本地以当前日期为名的文件夹中,实现多线程并发:

  

# -*- coding: UTF-8 -*-
import urllib2,json,cookielib,urllib,datetime,os,threading
from urllib2 import Request, urlopen, URLError, HTTPError
global auth_code,zabbix_url,zabbix_header,login_url,graph_url,login_data,pic_save_path_dir,yesterday9,opener
#zabbix接口地址、登录地址、图片地址
zabbix_url="http://10.16.2.4/zabbix/api_jsonrpc.php"
login_url = 'http://10.16.2.4/zabbix/index.php'
graph_url = 'http://10.16.2.4/zabbix/chart2.php'

zabbix_header = {"Content-Type":"application/json"}
zabbix_user   = "admin"
zabbix_pass   = "password"
auth_code     = ""
auth_data = json.dumps({
    "jsonrpc":"2.0",
    "method":"user.login",
    "params":
            {
            "user":zabbix_user,
            "password":zabbix_pass
            },
    "id":0
    })

#定义登录所需要用的信息,如用户名、密码等,使用urllib进行编码
login_data = urllib.urlencode({
                        "name": zabbix_user,
                        "password": zabbix_pass,
                        "autologin": 1,
                        "enter": "Sign in"})

#新建以当天日期为名的文件夹保存图片
today = datetime.datetime.now().date().strftime('%Y%m%d')
pic_save_path_dir= os.path.join('d:\\pic',today ) #修改图片保存位置
if not os.path.exists(pic_save_path_dir):
    os.makedirs(pic_save_path_dir)

#定义graph的starttime参数,从前一天的9:00开始
yesterday = (datetime.datetime.now()-datetime.timedelta(days=1))
yesterday9 = datetime.datetime(yesterday.year,yesterday.month,yesterday.day,9).strftime('%Y%m%d%H%M%S')

#登录zabbix,设置一个cookie处理器,负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookie  
cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
urllib2.install_opener(opener) 
opener.open(login_url,login_data)#.read()

request = urllib2.Request(zabbix_url,auth_data)
for key in zabbix_header:
    request.add_header(key,zabbix_header[key])
try:
    result = urllib2.urlopen(request)
except HTTPError, e:
    print 'The server couldn\'t fulfill the request, Error code: ', e.code
except URLError, e:
    print 'We failed to reach a server.Reason: ', e.reason
else:
    response=json.loads(result.read())
    #print response
    result.close()

#判断SESSIONID是否在返回的数据中
if  'result'  in  response:
    auth_code=response['result']
else:
    print  response['error']['data']

def Http_access(data):
    request = urllib2.Request(zabbix_url,data)
    for key in zabbix_header:
        request.add_header(key,zabbix_header[key])
    result = urllib2.urlopen(request)
    
    response = json.loads(result.read())
    # print result.read()
    # print response
    result.close()  
    if len(response['result']) > 0:
        return response['result'][0]

def get_hostid(ip):
    get_host_data = ''
    if len(auth_code) <> 0:
        get_host_data = json.dumps({
            "jsonrpc": "2.0",
            "method": "host.get",
            "params": {
                "output": "extend",
                "filter": {
                    "host": [
                        ip,
                    ]
                }
            },
            "auth": auth_code,
            "id": 1
        })
    return get_host_data 

def get_itemid(hostid,itemtype):
    get_item_data = ''
    if (len(auth_code) <> 0) and (hostid is not None):
        get_item_data = json.dumps({
            "jsonrpc": "2.0",
            "method": "item.get",
            "params": {
                "output": "extend",
                "hostids": hostid,
                "search":{
                "name": itemtype
                        },
            "sortfield": "name"
                    },
            "auth": auth_code,
            "id": 1
        })
    return get_item_data


def get_graphid(itemid):
    get_graph_data = ''
    if (len(auth_code) <> 0) and (itemid is not None):
        get_graph_data = json.dumps({
            "jsonrpc": "2.0",
            "method": "graphitem.get",
            "params": {
                "output": "extend",
                "expandData": 1,
                "itemids": itemid
            },
            "auth": auth_code,
            "id": 1
        })
    return get_graph_data

def pic_save(ip,name,graphid):
    graph_args = urllib.urlencode({
                            "graphid":graphid,
                            "width":'400', #定义图片宽度
                            "height":'156', #定义图片高度
                            "stime":yesterday9, #图形开始时间
                            "period":'86400'}) #定义时长,取1天的数据

    data = opener.open(graph_url,graph_args).read()
    #pic_save_path = pic_save_path_dir + ip + '-' + name +'.png'
    picname = ip + '-' + name +'.png'
    pic_save_path = os.path.join(pic_save_path_dir,picname)
    file=open(pic_save_path,'wb')
    file.write(data)
    #file.flush()
    file.close()

#多线程并发调用该函数
def pic_save_th(ip):
    #根据ip获取hostid
    host_data = get_hostid(ip)
    host_result = Http_access(host_data)
    if host_result is not None: #判断该IP是否在zabbix中存在
        hostid = host_result['hostid'] 

        #根据监视器名称获取相应的itemid
        cpuname = 'CPU Usage'
        memoryname = 'Memory - Memory available'
        diskname = 'Disk - Current Disk Queue Length'
        netcard = 'Traffic for Public Receive'
        item_cpu = get_itemid(hostid,cpuname)
        item_memory = get_itemid(hostid,memoryname)
        item_disk = get_itemid(hostid,diskname)
        item_netcard = get_itemid(hostid,netcard)

        itemid_cpu = Http_access(item_cpu)['itemid'] 
        itemid_memory = Http_access(item_memory)['itemid'] 
        itemid_disk = Http_access(item_disk)['itemid'] 
        itemid_netcard = Http_access(item_netcard)['itemid'] 

        #根据itemid获取相应的graphid
        graphdata_cpu = get_graphid(itemid_cpu)
        graphdata_memory = get_graphid(itemid_memory)
        graphdata_disk = get_graphid(itemid_disk)
        graphdata_netcard = get_graphid(itemid_netcard)

        graphid_cpu = Http_access(graphdata_cpu)['graphid'] 
        graphid_memory = Http_access(graphdata_memory)['graphid'] 
        graphid_disk = Http_access(graphdata_disk)['graphid'] 
        graphid_netcard = Http_access(graphdata_netcard)['graphid'] 

        print ip#,graphid_cpu,graphid_memory,graphid_disk,graphid_netcard

        #调用pic_save函数保存图片到本地
        pic_save(ip,cpuname,graphid_cpu)
        pic_save(ip,memoryname,graphid_memory)
        pic_save(ip,diskname,graphid_disk)
        pic_save(ip,netcard,graphid_netcard)
    else:
        print '%s doesnot exist in zabbix' %ip

#定义线程数控制函数,num表示每次并发的线程数
def lstg(num,lst):
#定义每段的个数num
    l = len(lst)
    g = l/num #取分成几组
    last = l%num #判断是否有剩余的数
    lstn = []
    if num >= l:
        lstn.append(lst)
    else:
        for i in range(g):
            i=i+1
            n=i*num
            m=n-num 
            lstn.append(lst[m:n])

        if  last <> 0:
            lstn.append(lst[-last:])
    return lstn

# serverip=['10.160.26.30','10.160.26.31','10.160.26.32']
# for ip in serverip:
#     pic_save_th(ip)
    
if __name__ =='__main__':
    #定义线程数量
    tnum = 5
    serverips=['10.160.26.30','10.160.26.31','10.160.26.32','10.160.31.31','10.160.31.32','10.160.31.36','10.160.34.250','10.160.34.251','192.168.200.250','192.168.200.251']
    for ips in lstg(tnum,serverips):
        threads=[]
        for ip in ips:
            #创建并启动进程
            t = threading.Thread(target=pic_save_th,args=(ip,))
            #t.setName('th-'+ ip)
            t.setDaemon(True)
            t.start()
            threads.append(t)
        #等待每个线程结束   
        for t in threads:
            #print t.name,t.is_alive(),ctime()
            t.join()

 

posted on 2016-05-12 14:27  momingliu11  阅读(8903)  评论(2编辑  收藏  举报