2022 Zabbix中国峰会
2022 Zabbix中国峰会

3 被动和主动代理检查

概述

本节提供关于Zabbix代理执行的被动和主动检查的详细信息。

Zabbix使用一个基于JSON的通信协议来与Zabbix代理进行通信。

被动检查

被动检查是一个简单的数据请求。Zabbix服务器或proxy请求一些数据(例如,CPU负载),Zabbix agent将结果发送回服务器。

Server 请求

<item key>\n

Agent 响应

<DATA>[\0<ERROR>]

在上面,方括号中的部分是可选的,只发送到不受支持的项目。

例如, 对于支持的监控项:

  1. Server 打开一个TCP连接
  2. Server 发送 agent.ping\n
  3. Agent 读取请求并响应 <HEADER><DATALEN>1
  4. Server 处理数据以获取值, '1' in our case
  5. TCP连接关闭

对于不支持的监控项:

  1. Server 打开一个TCP连接
  2. Server 发送 vfs.fs.size[/nono]\n
  3. Agent 读取请求并响应 <HEADER><DATALEN>ZBX_NOTSUPPORTED\0Cannot obtain filesystem information: [2] No such file or directory
  4. Server 处理数据, 更改项目状态为不支持并显示指定的错误消息
  5. TCP连接关闭

主动检查

主动检查需要更复杂的处理,agent 必须首先从server端检索监控项的列表以便独立处理。

主动检查的zabbix server列表在agent 配置文件中的 'ServerActive' 参数中配置, 检查的频率是由相同配置文件中的'RefreshActiveChecks' 参数设置。 主动检查失败后会在60秒后重试。

agent定期向zabbix server发送新值。

如果代理位于防火墙后面,则可以考虑仅使用主动检查,因为在这种情况下,不需要修改防火墙以允许初始传入连接。

获取监控项列表

Agent 请求

{
           "request":"active checks",
           "host":"<hostname>"
       }

Server 响应

{
           "response":"success",
           "data":[
               {
                   "key":"log[/home/zabbix/logs/zabbix_agentd.log]",
                   "delay":30,
                   "lastlogsize":0,
                   "mtime":0
               },
               {
                   "key":"agent.version",
                   "delay":600,
                   "lastlogsize":0,
                   "mtime":0
               },
               {
                   "key":"vfs.fs.size[/nono]",
                   "delay":600,
                   "lastlogsize":0,
                   "mtime":0
               }
           ]
       }

服务器必须响应成功。 对于每一个返回的监控项, 不管监控项是不是日志监控项,必须存在 key, delay, lastlogsize and mtime

例如:

  1. Agent 打开一个TCP连接
  2. Agent 请求检查清单
  3. Server 响应为监控项列表 (item key, delay)
  4. Agent 解析响应
  5. TCP 关闭连接
  6. Agent 开始定期收集数据

<note important>注意,在使用主动检查时,有权访问Zabbix服务器trapper端口的第三方程序可能会获得(敏感)配置数据,因为任何一个程序都可以假装是一个主动agent,并请求项目配置数据; 除非你使用 加密 选项,否则认证不会发生 :::

发送收集的数据

Agent 发送

{
           "request":"agent data",
           "session": "12345678901234567890123456789012",
           "data":[
               {
                   "host":"<hostname>",
                   "key":"agent.version",
                   "value":"2.4.0",
                   "id": 1,
                   "clock":1400675595,            
                   "ns":76808644
               },
               {
                   "host":"<hostname>",
                   "key":"log[/home/zabbix/logs/zabbix_agentd.log]",
                   "lastlogsize":112,
                   "value":" 19845:20140621:141708.521 Starting Zabbix Agent [<hostname>]. Zabbix 2.4.0 (revision 50000).",
                   "id": 2,
                   "clock":1400675595,            
                   "ns":77053975
               },
               {
                   "host":"<hostname>",
                   "key":"vfs.fs.size[/nono]",
                   "state":1,
                   "value":"Cannot obtain filesystem information: [2] No such file or directory",
                   "id": 3,
                   "clock":1400675595,            
                   "ns":78154128
               }
           ],
           "clock": 1400675595,
           "ns": 78211329
       }

为每个值分配一个虚拟ID。Value ID是一个简单的递增计数器,在一个数据会话中是唯一的(由会话令牌标识)。此ID用于丢弃在连接不良环境中可能发送的重复值。 Server 响应

{
           "response":"success",
           "info":"processed: 3; failed: 0; total: 3; seconds spent: 0.003534"
       }

<note important>如果在服务器上发送一些值失败(例如,因为主机或监控项被禁用或删除),agnet将不会重试发送这些值。 :::

例如:

  1. Agent 打开一个TCP连接
  2. Agent 发送一个值列表
  3. Server 处理数据并将状态返回
  4. TCP 连接关闭

注意,上面例子中vfs.fs.size[/nono]状态为not supported,因为 "state" 值为 1 和 "value" 中的错误消息。

<note important>在服务器端,错误消息最大长度为2048个字符。 :::

老的XML协议

Zabbix将占用16 MB的XML base64编码的数据, 但单个解码值应该不超过64kb,否则,在解码时将被截断到64 KB。