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))
本文来自博客园,作者:呱嗒呱嗒,转载请注明原文链接:https://www.cnblogs.com/auqiver/p/15557326.html
浙公网安备 33010602011771号