本节提供监控项值预处理的详细信息。项值预处理允许为接收到的项值定义并执行 转换规则。
预处理是由Preprocessing manager进程管理的,它是在Zabbix 3.4中添加的,以及执行预处理步骤的预处理工作器。来自不同数据收集器的所有值(带或不带预处理)在添加到历史缓存之前都要经过预处理管理器。数据收集器(pollers, trappers等)和预处理过程之间使用基于套接字的IPC通信。Zabbix server或Zabbix proxy(用于由代理监视的项目)正在执行预处理步骤。
为了可视化从数据源到Zabbix数据库的数据流,我们可以使用以下简化图:
上面的图表仅以一种简化的形式显示了监控项值预处理相关的过程、对象和动作。该图不显示条件方向更改、错误处理或循环。预处理管理进程的本地数据缓存也不显示,因为它不会直接影响数据流。这张图的目的是展示项目价值处理的过程以及它们相互作用的方式。
如果任何预处理步骤失败,则在执行预处理时,项可以将其状态更改为不支持。
如果数据规范化失败(例如,当文本值不能转换为数字时),监控项将其状态更改为不支持。
为了可视化数据预处理过程,我们可以使用以下简化图:
上面的图表仅以简化的形式显示了监控项值预处理相关的过程、对象和主要动作。该图不显示条件方向更改、错误处理或循环。图中只显示了一个预处理进程(在实际场景中可以使用多个预处理进程),只处理一个监控项值,我们假设该监控项需要执行至少一个预处理步骤。这个图的目的是展示监控项值预处理后端调用流程图。
监控项可以放在预处理队列的末尾或开头。Zabbix内部监控项总是放置在预处理队列的开头,而其他类型的项则在最后进入队列。
监控项值处理由多个进程在多个步骤(或阶段)中执行。这可能会导致:
* 主监控项的值类型为“UINT”(可以使用Zabbix采集器监控项),依赖监控项的值类型为“TEXT”。
* 主监控项和依赖监控项都不需要预处理步骤。
* 文本值(如“abc”)应传递给主监控项。
* 由于没有要执行的预处理步骤,预处理管理器将检查主监控项是否处于不受支持的状态,以及是否设置了值(两者都为true),并将具有与主监控项相同值的依赖项排队(因为没有预处理步骤)。
* 当主监控项和依赖监控项都达到历史同步阶段时,由于值转换错误(文本数据不能转换为无符号整数),主监控项将变为不支持。
结果,依赖监控项接收一个值,而主监控项将其状态更改为不支持。
预处理队列是一种FIFO数据结构,用于存储值,以保留预处理管理器对值进行重新排序的顺序。 FIFO逻辑有多个例外:
为了可视化预处理队列的逻辑,我们可以使用下图:
预处理队列中的值从队列的开头刷新到第一个未处理的值。例如,预处理管理器将刷新值1、2和3,但不会刷新值5,因为值4尚未处理:
刷新后,队列(4和5)中只剩下两个值,值被添加到预处理管理器的本地数据缓存中,然后值从本地缓存传输到历史缓存中。预处理管理器可以以单项模式或批量模式(用于批量接收的依赖项和值)刷新本地数据缓存中的值。
Zabbix服务器配置文件允许用户设置预处理工作进程的数量。应该使用StartPreprocessors配置参数来设置预处理工作程序的预分支实例数。可以由许多因素确定最佳的预处理人员数量,包括“可预处理”项目的数量(需要执行任何预处理步骤的项目),数据收集过程的数量,项目预处理的平均步骤数量等。
但是,假设没有大体量XML/JSON格式数据解析这样的繁重的预处理操作,则预处理工作程序的数量可以匹配数据收集器的总数。这样,大多数情况下(收集器中的数据成批散布的情况除外)至少要有一个空闲的预处理器来收集数据。
<note warning>太多的数据收集进程(轮询程序,不支持检查轮询程序,HTTP轮询程序,Java轮询程序,pinger轮询程序,Zabbix 采集器轮询程序,proxy轮询程序)与IPMI管理器,SNMP trap程序和预处理器一起会耗尽预处理管理器的按进程文件描述符限制。这将导致Zabbix服务器停止(通常在启动后不久,但有时可能需要更多时间)。为了避免这种情况,应修改配置文件或提高限制。 :::