zabbix API数据收集

Posted on 2021-11-15 17:19  呱嗒呱嗒  阅读(256)  评论(0)    收藏  举报

zabbix API数据收集

#!/usr/bin/env python
# Version = 3.7.2
# __auth__ = 'Huang Ning'
import json
import requests
import re
import time
import socket
import datetime
import numpy as np
#import ssl
#from datetime import timedelts
from urllib import request, parse
#from socket import *

class zabbix:

    ### 构造函数传参
    def __init__(self):
        self.header = {
            'Content-Type': 'application/json-rpc'
            }
        ## zabbix环境地址配置
        self.url = 'http://192.168.100.252/zabbix/api_jsonrpc.php'

    ### 登录验证
    def login(self):
        data = {    "jsonrpc": "2.0",
            "method": "user.login",
            "params": {
                "user": "Admin",
                "password": "zabbix"
            },
            "id": 1,
            "auth": None,
        }

        ssl._create_default_https_context = ssl._create_unverified_context

        # 由于API接收的是json字符串,故需要转化一下
        value = json.dumps(data).encode('utf-8')
         
        # 对请求进行包装
        req = request.Request(url=self.url, data=value, headers=self.header)
         
        # 验证并获取Auth ID
        try:
            # 打开包装过的url
            result = request.urlopen(req)
        except Exception as e:
            print("Auth Failed, Please Check Your Name And Password:", e)
        else:
            response = result.read()
            # 上面获取的是bytes类型数据,故需要decode转化成字符串
            page = response.decode('utf-8')
            # 将此json字符串转化为python字典
            page = json.loads(page)
            result.close()
            #print("{}".format(page.get('result')))
            return page.get('result')

    ### 通过配置的需要采集数据group名获取group_id 
    def get_groupid(self,auth,groupName):
        groupid_data = {
            "jsonrpc": "2.0",
            "method": "hostgroup.get",
            "params": {
                "output": "extend",    
                "filter": {
                    "name": groupName
                 }
            },
            "auth": auth,
            "id": 1
        }
        #print(groupName)
        #groupids = list()
        groupids = ""
        groupid_res = requests.get(url=self.url,data=json.dumps(groupid_data),headers=self.header)
        #print(groupid_res.json()['result'])
        result = groupid_res.json()['result']    
        for i in result:
            groupids = i['groupid']
        return groupids  
        #return result

    ### 根据hostid和指标名获取指标ID
    def get_itemid(self,auth,hostid,key):
        data = {
            "jsonrpc": "2.0",
            "method": "item.get",
            "params": {
                "output": "extend",
                "hostids": hostid,
                "search": {
                    "name": key
                }
            },
            "auth": auth,
            "id": 1
        }
        #print(hostid)
        #print(auth)
        itemids = list()
        itemids_res = requests.post(url=self.url,data=json.dumps(data),headers=self.header)

        result = itemids_res.json()['result']

        #print(result)
        for i in result:
            itemids.append(i['itemid'])
        return itemids

    ###基于Group来获取hostid列表
    def get_hosts(self,auth,groupids):
        hosts_data={
            "jsonrpc": "2.0",
            "method": "host.get",
            "params": {
                "output": ["hostid"],
                "groupids": groupids
            },
            "auth": auth,
            "id": 1
        }

        #print(groupids)

        hostids = list()
        hosts_res = requests.post(url=self.url,data=json.dumps(hosts_data),headers=self.header)
       # print hosts_res.json()
        result = hosts_res.json()['result']

        for i in result:
             hostids.append(i['hostid'])
        return hostids

    ###基于inventory来获取hostid列表
    def get_hosts_inv(self,auth,inventory):
        hosts_data={
            "jsonrpc": "2.0",
            "method": "host.get",
            "params": {
                "output": ["hostid","host"],
                "selectInventory": ["os"],
                "searchInventory": {"os": inventory}
            },
            "auth": auth,
            "id": 2
        }

        #print(groupids)

        hostids = list()
        hosts_res = requests.post(url=self.url,data=json.dumps(hosts_data),headers=self.header)
       # print hosts_res.json()
        result = hosts_res.json()['result']

        for i in result:
             hostids.append(i['hostid'])
        return hostids

    ### 获取problem
    def get_problems(self,auth,triggerid):
        data={
            "jsonrpc": "2.0",
            "method": "problem.get",
            "params": {
                "output": "extend",
                "selectAcknowledges": "extend",
                "selectTags": "extend",
                "objectids": triggerid,
                "recent": "true",
                "sortfield": ["eventid"],
                "sortorder": "DESC"
            },
            "auth": auth,
            "id": 1
        }


        problems = list()
        problems_res = requests.post(url=self.url,data=json.dumps(data),headers=self.header)

        result = problems_res.json()['result']

        return result


    ### 触发器id获取
    def get_trigger(self,auth):
        data={
            "jsonrpc": "2.0",
            "method": "trigger.get",
            "params": {
            "output": [
                "triggerid",
                "description",
                "priority"
                ],
                "filter": {
                    "value": 1
                },
                "sortfield": "priority",
                "sortorder": "DESC"
            },
            "auth": auth,
            "id": 1
        }

        triggerids = list()
        triggerids_res = requests.post(url=self.url,data=json.dumps(data),headers=self.header)
        
        result = triggerids_res.json()['result']

        for i in result:
            triggerids.append(i['triggerid'])
        return triggerids

    ### 获取数据
    def get_data(self,auth,itemid):
        
        tm2 = datetime.datetime.now()
        tm1 = tm2 + datetime.timedelta(minutes=-5)
        time_from = int(time.mktime(tm1.timetuple()))
        time_util = int(time.mktime(tm2.timetuple()))

        #print(time_from)
        #print(time_util)
        
        data = {
            "jsonrpc": "2.0",
            "method": "history.get",
            "params": {
                "output": "extend",
                "history": 0,
                "time_from": time_from,
                "time_till": time_util,
                "itemids": itemid,
                "sortfield": "clock",
                "sortorder": "DESC",
                "limit": 100
            },
            "auth": auth,
            "id": 1
        }

        metricData = list()
        metricData_res = requests.post(url=self.url,data=json.dumps(data),headers=self.header)

        result = metricData_res.json()['result']
        #result = result.replace("[","")
        return result
        #print(result)

    def com_data(self,jsonData,metricName,groupid,hostid):

        #jsonData = (str(jsonData.to_json_string()))
        for x in jsonData:
            #print(type(x))
            result = {}
            itemid = x['itemid']
            _time = time.localtime(eval(x['clock']))
            _time = time.strftime("%Y-%m-%d %H:%M:%S",_time)
            value = x['value']
            result["_time"] = _time
            result["groupid"] = groupid
            result["hostid"] = hostid
            result["metricName"] = metricName
            result["itemid"] = itemid
            result["value"] = value
            return json.dumps(result)
            #print(result)


    def listToJson(lst):
        keys = [str(x) for x in np.arange(len(lst))]
        list_json = dict(zip(keys, lst))
        str_json = json.dumps(list_json, indent=2, ensure_ascii=False)  # json转为string
        return str_json

    def udp_send(self,serverIP,serverPort,result):
        ## UDP转发项配置
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        while True:
            server_address = (serverIP,serverPort)
            ### 转发至UDP端口
            #print(result)

            client_socket.sendto(result.encode('utf-8'),server_address)
            break
        ## 关闭UDP连接
        client_socket.close()



dm = zabbix()
#dm.login()
print(dm.login())

# 采集指标配置项
#metricNames = ["system.cpu.util","vm.memory.utilization","cpu.load"]
metricNames = [
"CPU utilization",
"Memory utilization",
"sda: Disk write rate",
"Load average (15m avg)",
"Load average (1m avg)"
]
## 采集group组配置项
groupNameSet = ["Linux servers","Zabbix servers"]

## 配置UDP转发
serverIP = '192.168.100.252'
serverPort = 30514

### main程序
for groupName in groupNameSet:
    print("正在采集并发送\t" + groupName + "\t组采集的指标数据")
    groupid=dm.get_groupid(dm.login(),groupName)
    #print(groupid)
    hostids = dm.get_hosts(dm.login(),groupid)

    for hostid in hostids:
        #print(hostid)
        for metric in metricNames:
            #print(metric)
            #print(x)
            itemids = dm.get_itemid(dm.login(),hostid,metric)
            #print(itemids)   
            result = dm.get_data(dm.login(),itemids)
            #result = dm.listToJson(getData)
            #print(result)
            metricData = dm.com_data(result,metric,groupid,hostid)
            #print(metricData)
            dm.udp_send(serverIP,serverPort,str(metricData)) 

## 获取触发器ID
triggerid = dm.get_trigger(dm.login())


#print(dm.get_problems(dm.login(),'19459'))

## udp发送
for i in triggerid:
    #print(i)
    problem_item = dm.get_problems(dm.login(),i)
    #problem_item = dm.listToJson(problem_item)

    print("正在采集并发送触发器ID为" + i +"的problem")
    print(json.dumps(problem_item,ensure_ascii=True))
    dm.udp_send(serverIP,serverPort,str(problem_item))