2 被动和主动 Agent 检查

概述

本节详细介绍由 Zabbix agent 和 Zabbix agent 2 执行的被动检查和主动检查。

Zabbix 使用基于 JSON 的通信协议与 agent 进行通信。

自 Zabbix 7.0 起,Zabbix agent 和 Zabbix agent 2 的协议已统一。Zabbix agent 与 Zabbix agent 2 请求/响应之间的差异通过 "variant" 标签值表示。

被动检查

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

被动检查以异步方式执行 - 无需在开始其他检查之前接收某个请求的响应。 DNS 解析同样是异步的。

agent 轮询器将尝试连接 DNS 查询返回的所有地址。 这样可以确保在某个 IP 地址无法访问时,轮询器会尝试下一个可用地址,从而提高连接成功的可能性。 此增强功能同时适用于 Zabbix 服务器和 proxy。

异步检查的最大并发数为 1000(由 MaxConcurrentChecksPerPoller 定义)。

异步 agent 轮询器的数量由 StartAgentPollers 参数定义。

服务器请求

有关标头和数据长度的定义,请参阅协议 详细信息。

{
  "request": "passive checks",
  "data": [
    {
      "key": "agent.version",
      "timeout": 3
    }
  ]
}
Field Type Mandatory Value
request string yes "passive checks"
data array of object yes 被动检查监控项。
key string yes 展开宏后的监控项键值。
timeout number yes 通信超时时间。

agent 响应

{
  "version": "7.4.0",
  "variant": 2,
  "data": [
    {
      "value": "7.4.0"
    }
  ]
}
Field Type Mandatory Value
version string yes agent 版本号。
variant number yes agent 变体(1 - Zabbix agent,2 - Zabbix agent 2)。
data array of object yes 包含检查结果。
value string no 检查成功时的监控项值。
error string no 检查失败时的错误消息。

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

  1. 服务器打开 TCP 连接
  2. 服务器发送 <HEADER><DATALEN>{"request":"passive checks","data":[{"key":"agent.ping","timeout":3}]}
  3. agent 读取请求并响应 <HEADER><DATALEN>{"version":"7.4.0","variant":2,"data":[{"value":1}]}
  4. 服务器处理数据以获取值,在本例中为“1”
  5. TCP 连接关闭

对于不受支持的监控项:

  1. 服务器打开 TCP 连接
  2. 服务器发送 <HEADER><DATALEN>{"request":"passive checks","data":[{"key":"vfs.fs.size[/nono]","timeout":3}]}
  3. agent 读取请求并响应 <HEADER><DATALEN>{"version":"7.4.0","variant":2,"data":[{"error":"Unsupported item key."}]}
  4. 服务器处理数据,并将监控项状态更改为不受支持,同时设置指定的错误消息
  5. TCP 连接关闭
回退到旧协议

为确保 Zabbix 服务器或 proxy 能够与使用明文协议的 7.2 之前版本的 agent 正常工作,系统实现了回退到旧协议的机制。

重启后或接口配置发生更改时,被动检查会使用 JSON 协议(7.0 及更高版本)执行。 如果响应中未收到有效的 JSON(agent 发送了 "ZBX_NOTSUPPORTED"),Zabbix 会将该接口缓存为使用旧协议,并通过仅发送监控项键来重试检查。

请注意,Zabbix 服务器/proxy 每小时都会再次尝试使用新协议处理所有接口;如有需要,则回退到旧协议。

主动检查

主动检查需要更复杂的处理过程。 agent 必须首先从服务器/proxy 获取监控项和/或远程命令列表,以便独立处理。

用于获取主动检查的服务器/proxy 列在agent 配置文件的 ServerActive 参数中。 请求这些检查的频率由同一配置文件中的 RefreshActiveChecks 参数设置。 但是,如果刷新主动检查失败,则会在硬编码的 60 秒后重试。

从 Zabbix 6.4 开始,Agent(处于主动模式)不再每两分钟从server/proxy接收一次完整的配置副本(默认)。相反,为了减少网络流量和资源使用,每 5 秒(默认)执行一次增量配置同步,server/proxy 仅在Agent尚未收到配置时才提供配置的完整副本,或者主机配置、全局宏或全局正则表达式发生了某些变化。

然后,agent 会定期将新值发送到服务器。 如果 agent 收到要执行的任何远程命令,也会发送执行结果。 请注意,active agent 上的远程命令执行自 Zabbix agent 7.0 起受支持。

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

获取监控项列表

Agent 请求

active checks 请求用于获取 agent 要处理的 active checks。 agent 启动时会发送此请求,之后按照 RefreshActiveChecks 间隔发送。

{
  "request": "active checks",
  "host": "Zabbix server",
  "host_metadata": "mysql,nginx",
  "interface": "zabbix.server.lan",
  "ip": "159.168.1.1",
  "port": 12050,
  "version": "7.4.0",
  "variant": 2,
  "config_revision": 1,
  "session": "e3dcbd9ace2c9694e1d7bbd030eeef6e"
}
字段 类型 必填 值
request string 是 active checks
host string 是 主机名称。
host_metadata string 否 配置参数 HostMetadata 或 HostMetadataItem 的指标值。
interface string 否 配置参数 HostInterface 或 HostInterfaceItem 的指标值。
ip string 否 配置参数 ListenIP 设置后的第一个 IP。
port number 否 配置参数 ListenPort 的值(如果已设置且不等于默认 agent 监听端口)。
version string 是 agent 版本号。
variant number 是 agent 变体(1 - Zabbix agent,2 - Zabbix agent 2)。
config_revision number 否 用于增量配置同步的配置标识符。
session string 否 用于增量配置同步的会话标识符。

服务器响应

服务器在处理 active checks 请求后,将 active checks 响应发送回 agent。

{
  "response": "success",
  "config_revision": 2,
  "data": [
    {
      "key": "system.uptime",
      "itemid": 1234,
      "delay": "10s",
      "lastlogsize": 0,
      "mtime": 0
    },
    {
      "key": "agent.version",
      "itemid": 5678,
      "delay": "10m",
      "lastlogsize": 0,
      "mtime": 0,
      "timeout": "30s"
    }
  ],
  "commands": [
    {
      "command": "df -h --output=source,size / | awk 'NR>1 {print $2}'",
      "id": 1324,
      "wait": 1
    }
  ]
}
字段 类型 必填 值
response string 是 success | failed
info string 否 失败时的错误信息。
data array of objects 否 active check 监控项。如果主机配置未发生变化,则省略。
key string 否 展开宏后的监控项键值。
itemid number 否 监控项标识符。
delay string 否 监控项更新间隔。
自 Zabbix 7.0 起,Zabbix agent 和 Zabbix agent 2 均支持灵活/调度间隔。
lastlogsize number 否 监控项的 lastlogsize。
mtime number 否 监控项的 mtime。
timeout string 否 监控项超时时间。
refresh_unsupported number 否 不支持的监控项刷新间隔。
regexp array of objects 否 全局正则表达式。
name string 否 全局正则表达式名称。
expression string 否 全局正则表达式。
expression_type number 否 全局正则表达式类型。
exp_delimiter string 否 全局正则表达式分隔符。
case_sensitive number 否 全局正则表达式大小写敏感设置。
commands array of objects 否 要执行的远程命令。如果远程命令执行由操作 operation 或手动执行 script 触发,则会包含此字段。请注意,自 Zabbix agent 7.0 起支持在 active agent 上执行远程命令。较旧版本的 active agent 将忽略 active checks 服务器响应中包含的任何远程命令。
command string 否 远程命令。
id number 否 远程命令标识符。
wait number 否 远程命令执行模式(来自操作 operations 的命令使用 "0"(nowait);手动执行 script 的命令使用 "1"(wait))。
timeout number 否 服务器/proxy 配置中的远程命令执行超时时间。
config_revision number 否 用于增量配置同步的配置标识符。如果主机配置未发生变化,则省略。主机配置发生变化时递增。

服务器必须以 success 响应。

例如:

  1. agent 打开 TCP 连接
  2. agent 请求检查项列表
  3. 服务器响应监控项列表以及要执行的远程命令
  4. agent 解析响应
  5. TCP 连接关闭
  6. agent 开始定期收集数据并执行远程命令(自 Zabbix agent 7.0 起支持)

请注意,使用 active check 时,能够访问 Zabbix 服务器 trapper 端口的各方可能会获取(敏感的)配置数据。 这是因为任何人都可以伪装成 active agent 并请求监控项配置数据;除非使用加密选项,否则不会进行身份验证。

发送已收集的数据

agent 发送

agent 数据请求包含已收集的监控项值,以及已执行的远程命令的结果(如果有)。

{
  "request": "agent data",
  "data": [
    {
      "id": 1,
      "itemid": 5678,
      "value": "7.0.0",
      "clock": 1712830783,
      "ns": 76808644
    },
    {
      "id": 2,
      "itemid": 1234,
      "value": "69672",
      "clock": 1712830783,
      "ns": 77053975
    }
  ],
  "commands": [
    {
      "id": 1324,
      "value": "16G"
    }
  ],
  "session": "8495cd52070e6ca52b371f29c8574165",
  "host": "Zabbix server",
  "version": "7.4.0",
  "variant": 2
}
字段 类型 必填 值
request string 是 agent data
data array of objects 是 监控项值。
id number 是 值标识符(用于在网络问题导致重复值的情况下检查重复值的递增计数器)。
itemid number 是 监控项标识符。
value string 否 监控项值。
lastlogsize number 否 监控项的 lastlogsize。
mtime number 否 监控项的 mtime。
state number 否 监控项状态。
source string 否 值事件日志的来源。
eventid number 否 值事件日志的 eventid。
severity number 否 值事件日志的严重性。
timestamp number 否 值事件日志的 timestamp。
clock number 是 值时间戳(自 Epoch 起的秒数)。
ns number 是 值时间戳的纳秒数。
commands array of objects 否 远程命令执行结果。请注意,active agent 上的远程命令执行自 Zabbix agent 7.0 起受支持。较旧版本的 active agent 将忽略 active checks 服务器响应中包含的任何远程命令。
id number 否 远程命令标识符。
value string 否 远程命令执行成功时的执行结果。
error string 否 远程命令执行失败时的错误消息。
session string 是 每次 agent 启动时生成的唯一会话标识符(长度为 32 位十六进制数字)。
host string 是 主机名称。
version string 是 agent 版本号。
variant number 是 agent 变体(1 - Zabbix agent,2 - Zabbix agent 2)。

每个值都会分配一个虚拟 ID。 值 ID 是一个简单的递增计数器,在一个数据会话中唯一(由会话令牌标识)。 此 ID 用于丢弃在网络连接质量较差的环境中可能发送的重复值。

服务器响应

服务器处理 agent 数据请求后,会将 agent 数据响应发送回 agent。

{
  "response": "success",
  "info": "processed: 2; failed: 0; total: 2; seconds spent: 0.003534"
}
字段 类型 必填 值
response string 是 success | failed
info string 是 监控项处理结果。

如果服务器无法发送某些值(例如,因为主机或监控项已被禁用或删除),agent 将不会重试发送这些值。

例如:

  1. agent 打开 TCP 连接
  2. agent 发送值列表
  3. 服务器处理数据并将状态发送回 agent
  4. TCP 连接关闭

服务器端会将错误消息截断为 2048 个字符。

心跳消息

agent 发送

心跳消息由 active agent 每隔 HeartbeatFrequency 秒发送到 Zabbix 服务器/proxy(在 Zabbix agent/agent 2 配置文件中配置)。

它用于监控 active checks 的可用性。

{
  "request": "active check heartbeat",
  "host": "Zabbix server",
  "heartbeat_freq": 60,
  "version": "7.4.0",
  "variant": 2
}
字段 类型 必填 值
request string 是 active check heartbeat
host string 是 主机名称。
heartbeat_freq number 是 agent 心跳频率(HeartbeatFrequency 配置参数)。
version string 是 agent 版本号。
variant number 是 agent 变体(1 - Zabbix agent,2 - Zabbix agent 2)。

重定向响应

当主机被重新分配后,服务器可能会指示 agent 将其心跳消息(以及后续的 active checks)重定向到另一个 proxy 或服务器实例。

  {
    "response": "failed",
    "redirect": {
      "revision": 2,
      "address": "192.0.2.1:10055"
    }
  }
字段 类型 必填 值
response string 是 success | failed
redirect object 是 重定向指令。
revision number 是 配置修订标识符。
address string 是 目标服务器/proxy 地址。

旧版 XML 协议

Zabbix 将接受最大 16 MB 的 XML Base64 编码数据,但单个解码后的值不应超过 64 KB;否则,在解码时将被截断为 64 KB。