2 被动和主动 Agent 检查

概述

本节提供有关 Zabbix agentZabbix agent 2 执行的被动和主动检查的详细信息。

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

从Zabbix 7.0起,Zabbix agent 和 Zabbix agent 2 协议已统一。Zabbix agent 和 Zabbix agent 2 请求/响应之间的差异由”variant” 标签值表示。

被动检查

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

被动检查是异步执行的 - 在其他检查开始之前不需要接收对一个请求的响应。 DNS 解析也是异步的。

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

异步agent pollers 由 StartAgentPollers 参数定义.

Server 请求

头部和数据长度的定义请参考 协议详情

  1. {
  2. "request": "passive checks",
  3. "data": [
  4. {
  5. "key": "agent.version",
  6. "timeout": 3
  7. }
  8. ]
  9. }

Agent 响应

  1. {
  2. "version": "7.0.0",
  3. "variant": 2,
  4. "data": [
  5. {
  6. "value": "7.0.0"
  7. }
  8. ]
  9. }

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

  1. Server 打开一个 TCP 连接。
  2. Server 发送 <HEADER><DATALEN>{“request”:”passive checks”,”data”:[{“key”:”agent.ping”,”timeout”:3}]}
  3. Agent 读取请求并响应 <HEADER><DATALEN>{“version”:”7.0.0”,”variant”:2,”data”:[{“value”:1}]}
  4. Server 处理数据以获取值, 例如’1’
  5. TCP 连接关闭。

对于不支持的监控项:

  1. Server 打开一个 TCP 连接。
  2. Server 发送 <HEADER><DATALEN>{“request”:”passive checks”,”data”:[{“key”:”vfs.fs.size[/nono]“,”timeout”:3}]}
  3. Agent 读取请求并响应 <HEADER><DATALEN>{“version”:”7.0.0”,”variant”:2,”data”:[{“error”:”Unsupported item key.”}]}
  4. Server 处理数据, 更改监控项状态为不支持并显示指定的错误消息。
  5. TCP 连接关闭。
故障转移到旧协议

为了确保 Zabbix server或proxy可以与 7.0 之前版本(具有明文协议)的Agent一起使用,实现了到旧协议的故障转移。

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

请注意, Zabbix server/proxy 每小时都会再次尝试使用所有接口的新协议,如果有需要,则回退到旧协议。

主动检查

主动检查需要更复杂的处理,agent 必须首先从server/proxy端获取监控项列表,或通过 远程命令 进行独立处理。

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

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

然后,agent定期向服务器发送新值。如果Agent收到任何远程命令 需要去执行,执行结果也会被发送。请注意,自 Zabbix Agent 7.0 起,支持在主动Agent上执行远程命令。

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

获取监控项列表

Agent 请求

主动检查请求用于获取agent要处理的主动检查。 此请求由agent在启动时发送,然后以 RefreshActiveChecks 间隔发送。

  1. {
  2. "request": "active checks",
  3. "host": "Zabbix server",
  4. "host_metadata": "mysql,nginx",
  5. "hostinterface": "zabbix.server.lan",
  6. "ip": "159.168.1.1",
  7. "port": 12050,
  8. "version": "7.0.0",
  9. "variant": 2,
  10. "config_revision": 1,
  11. "session": "e3dcbd9ace2c9694e1d7bbd030eeef6e"
  12. }
字段类型必填
requeststringyes主动检查
hoststringyes主机名.
host_metadatastringno配置参数 HostMetadata 或 HostMetadataItem 度量值.
hostinterfacestringno配置参数 HostInterface 或 HostInterfaceItem 度量值.
ipstringno如果设置了,配置参数 ListenIP 第一个 IP.
portnumberno配置参数 ListenPort 值(如果已设置)而不是默认agent侦听端口.
versionstringyesagent 版本号.
variantnumberyesagent 变体 (1 - Zabbix agent, 2 - Zabbix agent 2).
config_revisionnumberno增量配置同步的配置标识符.
sessionstringno增量配置同步的会话标识符.

Server 响应

在处理主动检查请求之后,主动检查响应由服务器发送回agent。

  1. {
  2. "response": "success",
  3. "config_revision": 2,
  4. "data": [
  5. {
  6. "key": "system.uptime",
  7. "itemid": 1234,
  8. "delay": "10s",
  9. "lastlogsize": 0,
  10. "mtime": 0
  11. },
  12. {
  13. "key": "agent.version",
  14. "itemid": 5678,
  15. "delay": "10m",
  16. "lastlogsize": 0,
  17. "mtime": 0,
  18. "timeout": "30s"
  19. }
  20. ],
  21. "commands": [
  22. {
  23. "command": "df -h --output=source,size / | awk 'NR>1 {print $2}'",
  24. "id": 1324,
  25. "wait": 1
  26. }
  27. ]
  28. }
字段类型必填
responsestringyes成功 | 失败
infostringno失败时的错误信息.
dataarray of objectsno主动检查监控项. 如果主机配置未更改则省略.
keystringno具有扩展宏的Item key.
itemidnumberno监控项ID.
delaystringno监控项更新时间.
从 Zabbix 7.0 开始,Zabbix agent 和 Zabbix agent 2 都支持灵活/调度间隔.
lastlogsizenumberno监控项最新日志大小.
mtimenumberno监控项更改时间.
timeoutstringno监控项超时时间.
refresh_unsupportednumberno不支持的监控项更新时间.
regexparray of objectsno全局正则表达式.
namestringno全局正则表达式名称.
expressionstringno全局正则表达式.
expression_typenumberno全局正则表达式类型.
exp_delimiterstringno全局正则表达式分隔符.
case_sensitivenumberno全局正则表达式区分大小写设置.
commandsarray of objectsno远程执行命令. 如果远程执行命令被 操作 或手动脚本 执行触发,也包含在内. 请注意,自 Zabbix Agent 7.0 起,支持主动Agent上执行远程命令。较旧的主动Agent将忽略主动检查服务器响应中包含的任何远程命令.
commandstringno远程命令.
idnumberno远程命令标识符.
waitnumberno远程命令执行方式 (“0” (不等待) 对于从动作 操作; “1” (等待) 对于从手动的 脚本 执行).
config_revisionnumberno增量配置同步 的配置标识符. 如果主机配置未更改,则省略。如果主机配置更改则增加.

服务器必须成功响应。

例如:

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

请注意,在使用主动检查时,(敏感)配置数据可能供有权访问 Zabbix server采集器端口的各方使用。这是可能的,因为任何人都可能假装是一个主动agent并请求监控项配置数据。除非您使用加密 选项,否则不会进行身份验证。

发送收集的数据

Agent 发送

Agent数据请求包含收集的监控项值和执行的远程命令的值(如果有)。

  1. {
  2. "request": "agent data",
  3. "data": [
  4. {
  5. "id": 1,
  6. "itemid": 5678,
  7. "value": "7.0.0",
  8. "clock": 1712830783,
  9. "ns": 76808644
  10. },
  11. {
  12. "id": 2,
  13. "itemid": 1234,
  14. "value": "69672",
  15. "clock": 1712830783,
  16. "ns": 77053975
  17. }
  18. ],
  19. "commands": [
  20. {
  21. "id": 1324,
  22. "value": "16G"
  23. }
  24. ],
  25. "session": "1234456akdsjhfoui",
  26. "host": "Zabbix server",
  27. "version": "7.0.0",
  28. "variant": 2
  29. }
字段类型必填
requeststringyesagent数据
dataarray of objectsyes监控项值.
idnumberyes值标识符(用于在出现网络问题时检查重复值的增量计数器).
itemidstringyes监控项ID.
valuestringno监控项值.
lastlogsizenumberno监控项 lastlogsize.
mtimenumberno监控项修改时间.
statenumberno监控项状态.
sourcestringno值事件日志源.
eventidnumberno值事件日志eventid.
severitynumberno值事件日志严重性.
timestampnumberno值事件日志时间戳.
clocknumberyes值时间戳(自纪元以来的秒数).
nsnumberyes值时间戳纳秒.
commandsarray of objectsno远程命令执行结果. 请注意,自 Zabbix Agent 7.0 起,支持在主动Agent上执行远程命令。较旧的主动Agent将忽略主动检查服务器响应中包含的任何远程命令.
idnumberno远程命令标识符.
valuestringno远程命令执行结果,如果执行成功.
errorstringno远程命令执行错误消息,如果执行失败.
sessionstringyes每次启动Agent时生成的唯一会话标识符.
hoststringyes主机名.
versionstringyesagent 版本号.
variantnumberyesagent 变体 (1 - Zabbix agent, 2 - Zabbix agent 2).

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

Server 响应

agent数据响应在处理agent数据请求后由服务器发送回agent。

  1. {
  2. "response": "success",
  3. "info": "processed: 2; failed: 0; total: 2; seconds spent: 0.003534"
  4. }
字段类型必填
responsestringyes成功 | 失败
infostringyes监控项处理结果.

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

例如:

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

请注意,在上面的示例中,vfs.fs.size[/nono] 的不支持状态是如何通过”state”值 1 和“value”属性中的错误消息来指示的。

服务器端错误消息将被修剪为 2048 个符号。

心跳消息

心跳消息由主动Agent每隔 HeartbeatFrequency 秒 (在Zabbix agent)/ agent 2 配置文件中配置)发送到Zabbix server/proxy。

它用于监视主动检查的可用性。

  1. {
  2. "request": "active check heartbeat",
  3. "host": "Zabbix server",
  4. "heartbeat_freq": 60,
  5. "version": "7.0.0",
  6. "variant": 2
  7. }
字段类型必填
requeststringyes主动检查心跳
hoststringyes主机名.
heartbeat_freqnumberyesagent 心跳频率 ( HeartbeatFrequency 配置参数 ).
versionstringyesagent 版本号 .
variantnumberyesagent 变体 (1 - Zabbix agent, 2 - Zabbix agent 2).

较旧的XML协议

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