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