# 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
[配置文件](/zh/manual/appendix/config/zabbix_agentd)中的 'ServerActive'
参数中配置， 检查的频率是由相同配置文件中的'RefreshActiveChecks'
参数设置。 主动检查失败后会在60秒后重试。

agent定期向zabbix server发送新值。

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

##### 获取监控项列表

**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，并请求项目配置数据;
除非你使用 [加密](/zh/manual/encryption)
选项，否则认证不会发生
:::

##### 发送收集的数据

**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协议

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