第十五章 Zabbix 协议与API
本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中,并将数据发送到Zabbix server,这在无法安装Zabbix agent等程序的场景(例如专用的嵌入式系统)中非常有用。你也可以利用Zabbix API开发自己的业务系统,或灵活的与现有系统整合集成。
近日完成《深入浅出 zabbix 4.0》视频教程的录制并正式发布,该教程基于 zabbix 4.2 ,对Zabbix进行全面讲解。欢迎大家围观。课程链接:https://edu.youkuaiyun.com/course/detail/24870
15.1 Zabbix 协议
Zabbix协议非常简单,通过Zabbix协议你可以开发自有的客户端,不用依赖任何Zabbix提供的工具就能把数据发送到Zabbix server中,这种方式极大的满足了专用系统的监控需求。
Zabbix 协议组成结构为:
<HEADER><DATA_LENGTH><DATA>
其中各部分含义如下:
-
<HEADER>:数据头部,长度为5个字节,内容为ZBXD\x01。实际上前面4个字节是头部,第五个字节用来指定协议的版本,当前,只有版本 1 是支持的(0x01 HEX)
-
<DATA_LENGTH>:数据长度,长度为8个字节,内容为16进制。例如1将格式化为01/00/00/00/00/00/00/00,一个8字节(或64-bit)16进制的数字。
-
<DATA>:数据内容,使用JSON格式。为了防止Server的内存溢出,限定一次传输的数据不能超过128MB。
-
协议
Zabbix get协议非常简单和容易实现的,实际上,你只需要把key发送数据到Zabbix server的10050端口,Zabbix agent返回响应数据。在shell脚本中可以轻松的实现。
# telnet 127.0.0.1 10050
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
agent.version
ZBXD3.0.1Connection closed by foreign host.
在上面例子中通过telnet收集agent 版本,你会注意到返回的数据是以ZBXD开始,后面是实际的数据即3.0.1。通过协议直接从安装在server中的agent收集数据并在shell脚本中使用。
使用该协议时不需要登录到server,并且可以监测所有agent中使用UserParameter定义的key。
15.1.2 Zabbix sender协议
Zabbix sender发送的数据中可以包含来自不同主机或不同item key的数据,例如:
{
"request":"sender data",
"data":[
{
"host":"Host name 1",
"key":"item_key",
"value":"33"},
{
"host":"Host name 2",
"key":"item_key",
"value":"55"
}
]
}
Zabbix sender发送的数据中还可以包含时间戳,例如:
{
"request":"sender data",
"data": [
{
"host": "Host name 1",
"key": "item_key",
"value": "33",
"clock": 1381482894
},
{
"host": "Host name 2",
"key": "item_key",
"value": "55",
}
],
"clock":1381482905
}
在协议中clock是一个选项,在JSON对象中以及数据部分的结尾可以忽略。当你编写自己的Zabbix sender程序时,通过 clock参数可以指定item已被接收的时间戳。
Zabbix server返回的响应数据格式如下:
{
"response":"success",
"info":"Processed 1 Failed 1 Total 2 Seconds spent0.000253"
}
在响应数据中,response的状态可以是success或failure。有些items接收失败后,在info中只有简单的失败数量,没有更详细的失败items的信息,无法提供是哪个item失败以及失败的原因。。
15.1.3 Zabbix agent 协议
Zabbix agent有主动式(Active)和被动式(Passive)两种,开发客户端程序时多以主动式协议开发,因此在这里主要介绍Zabbix agent(主动式)协议。主动式agent协议稍微复杂一些,它涉及到多个步骤。当一个主动式agent启动后,首先会连接到server询问需要对哪些items进行监控。发送的查询数据如下:
<HEADER><DATALEN>{
"request":"active checks",
"host":"< Host name >"
}
如果主机发送的数据中有metadata时,发送的查询数据如下:
<HEADER><DATALEN>{
"host":"Host name",
"host_metadata": "apache|mysql|postfix",
"request":"active checks"
}
如果主机没有配置默认的监听IP地址或端口时,发送的查询数据如下:
<HEADER><DATALEN>{
"host":"Host name",
"ip":"127.0.0.1",
"port": 10055,
"request":"active checks"
}
发送请求的主机允许被监控并且配置有active items时,agent将从server接收响应的数据如下:
<HEADER><DATALEN>{
"response":"success",
"data":[{
"key":"log[\/var\/log\/localmessages,@errors]",
"delay":1,
"lastlogsize":12189,
"mtime":0
},
{
"key":"agent.version",
"delay":"900"
}]
"regexp":[
{
"name":"errors",
"expression":"error",
"expression_type":0,
"exp_delimiter":",",
"case_sensitive":1
}]
}
Zabbix server响应中response必须是success,并在后面列出需要监控的items和delay。当需要监控的items为log和logrt时,server将在响应中包含lastlogsize,如果items为logrt时还需要在响应中包含mtime。如果在server中定义了全局正则表达式,将在regexp当中响应。如果使用了user macro,key将被解析并以最初的key发送key_orig,最初的key是user macro名称。
当agent收到响应数据后,将关闭TCP连接,开始收集items的监控数据。当数据收集完成后,这些收集的items数据将发送到server中,发送的数据如下:
<HEADER><DATALEN>{
"request":"agentdata",
"data":[
{
"host":"HOSTNAME",
"key":"log[\/var\/log\/localmessages]",
"v