代码如下:
#!/bin/python2
# -*- coding: utf-8 -*-
# 自做一个zabbix_sender程序
import socket
import struct
import json
# Zabbix Agent数据发送协议: <HEADER><DATALEN><DATA>
# <HEADER> - "ZBXD\x01" (5 bytes) , 头部信息"ZBXD"\协议版本"0x01"
# <DATALEN> - 数据长度 (8 bytes). 1将被格式化为01/00/00/00/00/00/00/00 (十六进制数8字节,64位数字)
# <DATA> - (为了不耗尽Zabbix-Server的内存,单次连接数据接收限制128M)
class ZabbixSender:
zbx_header = 'ZBXD'
zbx_version = 1
zbx_sender_data = {u'request': u'sender data',
u'data': []
}
send_data = ''
def __init__(self,server_host,server_port = 10051):
self.server_ip = socket.gethostbyname(server_host)
self.server_port = server_port
def AddData(self,host,key,value,clock = None):
add_data = { u'host': host,
u'key': key,
u'value': value
}
if clock != None:
add_data[u'clock'] = clock
self.zbx_sender_data['data'].append(add_data)
return self.zbx_sender_data
def ClearData(self):
self.zbx_sender_data['data'] = []
return self.zbx_sender_data
def __MakeSendData(self):
zbx_sender_json = json.dumps(
self.zbx_sender_data,
separators=(',',':'),
ensure_ascii=False
).encode('utf-8')
json_byte = len(zbx_sender_json)
self.send_data = struct.pack(
"<4sBq" + str(json_byte) + "s",
self.zbx_header,
self.zbx_version,
json_byte,
zbx_sender_json
)
def Send(self):
self.__MakeSendData()
so = socket.socket()
so.connect((self.server_ip,self.server_port))
wobj = so.makefile(u'wb')
wobj.write(self.send_data)
wobj.close()
robj = so.makefile(u'rb')
recv_data = robj.read()
robj.close()
so.close()
tmp_data = struct.unpack(
"<4sBq" + str(len(recv_data) - struct.calcsize("<4sBq")) + "s",
recv_data
)
recv_json = json.loads(tmp_data[3])
return recv_data
if __name__ == '__main__':
sender = ZabbixSender(u'127.0.0.1')
for num in range(0,2):
sender.AddData(u'Zabbix server',u'test',u'sent data' + str(num))
# Zabbix Server为host, test为key, sent data为value
# 创建一个key为"test"的trapper监控项
res = sender.Send()
print(sender.send_data)
print(res)
# 上例概述:Sender和Server建立Socket连接,发送key的数据(注意头部信息正确性),Server对数据进行处理响应的一个过程