Zabbix 采集层:多协议 / 多类型数据采集的实现逻辑
Zabbix 采集层作为数据入口核心通过「配置驱动采集规则 引擎层协议适配 预处理标准化」的三层架构实现 SNMP、HTTP/HTTPS、Agent、Traps、ICMP 等数十种协议/类型的数据采集且无需修改核心代码即可扩展新协议/新场景。一、核心架构配置与引擎解耦采集层的核心设计是「声明式配置templates/」与「通用采集引擎src/」分离前者定义采集什么、怎么采集后者实现协议怎么解析、数据怎么获取二者通过标准化的「采集项 Key 采集类型」关联。层级核心目录/模块作用配置层templates/定义采集规则协议类型、目标地址、指标路径、预处理无代码扩展引擎层src/zbxserver/poller/主动采集调度轮询按配置层规则触发不同协议的采集逻辑协议适配层src/libs/zbx{snmptools/http/agent}/封装各协议的底层交互逻辑如 SNMP OID 解析、HTTP 请求发送二、多协议采集的实现流程通用逻辑所有协议的采集均遵循「规则解析 → 协议适配 → 数据获取 → 预处理」的标准化流程以 SNMP网络设备和 HTTP应用为例核心流程如下SNMP_AGENTHTTP_AGENTZABBIX_AGENTICMPTRAPtemplates/ 采集规则采集引擎解析规则判断采集类型/协议src/libs/zbxsnmptools/ 解析OIDsrc/libs/zbxhttp/ 构造请求src/libs/zbxagent/ 通信封装src/libs/zbxicmp/ 发包检测src/zbxserver/trapper/ 被动接收原始数据返回预处理清洗/转换输出标准化数据至传输层关键步骤说明规则解析采集引擎poller/trapper读取templates/中定义的采集项Item提取核心参数type采集类型如SNMP_AGENT/HTTP_AGENT/ZABBIX_AGENTkey采集项唯一标识如snmp.get[1.3.6.1.2.1.1.1.0]/http.get[https://hadoop:50070/jmx]params协议参数如 SNMP 社区串、HTTP 请求头、Agent 超时时间preprocessing数据预处理规则如 JSONPATH 提取、数值转换。协议适配引擎根据type调用对应协议的封装库完成底层交互数据预处理对原始数据做标准化清洗消除不同协议/设备的格式差异。三、主流协议的具体实现方式1. SNMP 协议采集网络设备/服务器硬件SNMP 是 Zabbix 最核心的采集协议覆盖 90% 网络设备监控场景核心模块配置层templates/net/xxx_snmp/如extreme_snmp//zyxel_snmp/定义SNMP_AGENT类型采集项指定 OID/宏变量引擎层src/zbxserver/poller/snmp/主动轮询、src/zbxserver/trapper/snmptrap/被动接收 Trap协议封装src/libs/zbxsnmptools/SNMP v1/v2c/v3 适配、MIB 解析、OID 转换。实现逻辑主动采集轮询从模板读取 SNMP 采集项如snmp.get[{$SNMP_COMMUNITY},1.3.6.1.2.1.2.2.1.10.{#IFINDEX}]{#IFINDEX} 为 LLD 动态变量zbxsnmptools封装 SNMP 请求支持 v3 的认证/加密发送至目标设备解析返回的 SNMP PDU 包提取指标值如端口入流量执行预处理如DISCARD_UNCHANGED_HEARTBEAT丢弃未变化数据。被动采集TrapZabbix Server/Proxy 监听 UDP 162 端口SNMP Trap 默认端口snmptrap模块解析 Trap 报文匹配模板中定义的SNMP_TRAP类型采集项提取 Trap 中的 OID 和值触发告警如设备端口 Down 事件。2. HTTP/HTTPS 协议采集应用/云服务/API适配无 Agent 场景下的应用监控如 Hadoop、Travis CI、Veeam 备份、SharePoint核心模块配置层templates/app/xxx_http/如hadoop_http//travis_ci_http/定义HTTP_AGENT类型采集项协议封装src/libs/zbxhttp/HTTP 请求构造、响应解析、Cookie/Header 管理、HTTPS 证书校验。实现逻辑模板中配置 HTTP 采集项指定 URL、请求方法GET/POST、请求头如Content-Type: application/jsonzbxhttp发送 HTTP 请求接收 JSON/XML/文本响应通过预处理规则提取指标如 JSONPATH$.beans[?(.nameHadoop:serviceDataNode)].Remaining支持高级特性超时重试、代理配置、自定义变量如{$HADOOP_DATANODE_PORT}。3. Zabbix Agent 采集服务器/客户端适用于深度监控服务器 OSCPU/内存/磁盘、本地应用核心模块配置层模板中定义ZABBIX_AGENT/ZABBIX_ACTIVE类型采集项引擎层src/zbxserver/poller/agent/被动模式Server 主动拉取、src/zabbix_agent/客户端采集逻辑协议封装src/libs/zbxcomm/TCP/UDP 通信Agent 协议封装。实现逻辑被动模式Server → AgentServer 轮询 Agent 端口10050发送采集 Key如system.cpu.util[all,avg1]Agent 执行本地采集脚本如读取/proc/stat计算 CPU 使用率返回数值Server 接收并标准化数据。主动模式Agent → ServerAgent 本地配置采集规则从 Server 同步模板主动采集数据Agent 连接 Server 端口10051推送采集结果Server 的trapper模块接收数据减少 Server 轮询压力。4. 其他协议/类型采集协议/类型核心模块适用场景实现要点ICMPsrc/libs/zbxicmp/设备可达性检测发送 ICMP Echo 请求计算丢包率/响应时间支持 IPv4/IPv6JMXsrc/zbxserver/poller/jmx/Java 应用监控Tomcat/JVM通过 JMXMP/Jolokia 协议连接 JVM读取 MBean 指标ODBCsrc/libs/zbxodbc/数据库监控Oracle/MySQL通过 ODBC 驱动执行 SQL 查询采集数据库性能指标如连接数、慢查询数SSH/Telnetsrc/zbxserver/poller/ssh/命令行采集无 Agent 设备执行远程命令如df -h解析输出结果Trapssrc/zbxserver/trapper/被动告警SNMP Trap/自定义监听指定端口接收并解析 Trap 报文匹配告警规则四、多类型数据的标准化处理不同协议返回的数据格式差异大SNMP 是数值/字符串、HTTP 是 JSON/XML、Agent 是文本采集层通过「预处理规则」实现标准化核心预处理能力配置在 templates/ 采集项中预处理类型作用示例场景JSONPATH从 JSON 响应中提取指定字段Hadoop JMX 响应中提取 DataNode 剩余磁盘空间REGEX正则提取文本中的数值SharePoint 响应头中提取健康分数X-SharePointHealthScoreMULTIPLIER数值单位转换如百分秒→秒SNMP 采集的运行时间×0.01DISCARD_UNCHANGED丢弃未变化数据减少存储压力设备型号/固件版本无需频繁采集CHECK_NOT_SUPPORTED兼容不支持的指标采集失败时返回默认值部分设备不支持的 SNMP OID 返回 0JAVASCRIPT复杂数据转换/拼接Zyxel 固件版本多字段拼接Vx.y(z)_a.b.c示例HTTP 采集 Hadoop 数据的预处理preprocessing:-type:JSONPATHparameters:[$.beans[?(.nameHadoop:serviceDataNode,nameFSDatasetState)].Remaining.first()]-type:MULTIPLIERparameters:[0.000001]# 字节转MB-type:DISCARD_UNCHANGED_HEARTBEATparameters:[1h]# 1小时内未变化则丢弃五、动态发现LLD适配多实例/动态拓扑采集层不仅支持静态采集还通过 LLD低级别发现实现「动态多实例采集」适配如端口、容器、数据库实例等动态拓扑实现逻辑模板中定义 LLD 发现规则如snmp.discovery[1.3.6.1.2.1.2.2.1.1]发现网络端口采集引擎执行发现规则返回实例列表如 {#IFINDEX}1、{#IFNAME}eth0根据「采集项原型」动态生成每个实例的采集项如监控 eth0/eth1 的流量支持嵌套 LLD父规则发现集群子规则发现集群内节点。六、核心设计优势协议无关性无论 SNMP/HTTP/Agent采集引擎均通过「采集类型」抽象新增协议仅需扩展src/libs/zbx{proto}/封装库无代码扩展新增采集场景仅需在templates/新增配置文件无需修改核心引擎标准化预处理统一的预处理规则消除不同协议的数据格式差异降低下游计算层复杂度高性能调度采集引擎采用多进程/多线程调度支持采集频率自定义如 10s/1min/5min适配不同指标的采集需求。总结Zabbix 采集层实现多协议/多类型采集的核心是「配置驱动 协议封装 标准化预处理」配置层templates/通过声明式规则定义“采集什么”适配不同业务场景引擎层src/通过协议封装库实现“怎么采集”屏蔽底层协议差异预处理规则实现“数据怎么标准化”为后续存储/计算层提供统一格式的数据。这种设计既保证了多协议的兼容性又实现了采集规则的灵活扩展是 Zabbix 适配各类监控场景的核心基础。