本节提供监控项值预处理细节。监控项值预处理功能允许为接收到的监控项值定义并executetransformation rules。
预处理由预处理管理器进程管理,该进程与执行预处理步骤的工作进程一同在Zabbix 3.4版本引入。所有来自不同数据采集器的值(无论是否经过预处理)在存入history cache前都需经过预处理管理器。数据采集器(轮询器、捕获器等)与预处理进程间采用基于套接字的IPC通信。Zabbix server或Zabbix proxy(针对proxy监控的监控项)将执行预处理步骤。
为了可视化从数据源到Zabbix数据库的数据流,我们可以使用以下简化示意图:
上图仅以简化形式展示了与监控项值处理相关的进程、objects和操作。该示意图未显示条件方向变更、错误处理或循环。预处理管理器的本地数据缓存也未显示,因为它不会直接影响数据流。此示意图的目的是展示参与监控项值处理的进程及其交互方式。
数据采集始于数据源的原始数据。此时数据仅包含ID、时间戳和值(也可能是多个值)
无论使用何种类型的数据采集器,对于主动或被动检查、trapper 监控项等都采用相同原理,因为这只会改变数据格式和通信发起方(数据采集器要么等待连接和数据,要么主动发起通信并请求数据)。原始数据经过验证后,从configuration cache中检索监控项配置(数据会被配置数据增强)
使用基于套接字的IPC机制将数据从数据采集器传递到预处理管理器。此时数据采集器会继续采集数据,而无需等待预处理管理器的响应
执行数据预处理。这包括执行
preprocessing steps and dependent item processing.
如果在执行预处理步骤时任何步骤失败,监控项可能将其状态更改为NOT SUPPORTED。
预处理管理器本地数据缓存中的历史数据正被刷新到history cache
此时数据流停止,直到下一次history cache同步(当历史同步器进程执行数据同步时)
同步进程从数据规范化开始,存储数据
in Zabbix database. Data normalization performs conversions to desired item type (type defined in item configuration), including truncation of textual data based on predefined sizes allowed for those types (HISTORY_STR_VALUE_LEN for string, HISTORY_TEXT_VALUE_LEN for text and HISTORY_LOG_VALUE_LEN for log values). Data is being sent to Zabbix database after normalization is done.
如果数据规范化失败(例如当文本值无法转换为数字时),监控项可能将其状态更改为NOT SUPPORTED。
为了可视化数据预处理过程,我们可以使用以下 简化示意图:
上图仅展示了与objects相关的主要流程和核心操作 以简化形式对监控项值进行预处理。该图表未 不显示条件方向变更、错误处理或循环。仅 图中显示了一个预处理工作进程(多个 预处理工作器可在实际场景中使用时,仅有一个监控项 值正在处理中,我们假设此监控项需要 execute 至少需要一个预处理步骤。该图的目的是 展示 监控项 值预处理流水线背后的设计理念
监控项 可以放置在末尾或开头 预处理队列。Zabbix内部监控项始终被置于 预处理队列的开头,而其他监控项类型则被排入 结束
监控项值处理通过多个步骤(或阶段)执行 多个进程。这可能导致:
依赖项 监控项 可以接收值,而主项值则不能。
This can be achieved by using the following use case:
UINT
, (trapper item can be used), dependent item has value type TEXT
.UINT
, (可使用trapper 监控项), 依赖项监控项具有值类型TEXT
. - 主节点和从节点均无需进行预处理步骤 依赖项 监控项 - 文本值(例如"abc")应传递给主节点监控项。 - 由于execute没有预处理步骤,预处理 manager检查master 监控项是否不处于NOT SUPPORTED状态 如果设置了值(两者均为真)并将依赖的监控项加入队列 与主节点监控项相同的值(由于没有预处理 步骤). - 当主和依赖监控项达到历史记录 同步阶段,主节点监控项变为NOT SUPPORTED, 由于数值转换错误(文本数据无法 转换为无符号integer)。
因此,依赖监控项接收到一个值,而主监控项发生变化 其状态变为NOT SUPPORTED。
CHAR
类型 master 监控项, 然后 master 监控项 值将在历史记录中被截断 同步阶段,而依赖的监控项将接收其 来自主项监控项初始(未截断)值的数值预处理队列是一种FIFO数据结构,用于存储数值并保持预处理管理器审查数值的顺序。FIFO逻辑存在以下例外情况:
可通过以下示意图理解预处理队列的逻辑:
预处理队列中的数值会从队列开头刷新至第一个未处理值。例如预处理管理器会刷新数值1、2和3,但不会刷新数值5,因为数值4尚未处理:
刷新后队列仅保留两个数值(4和5),这些数值会被添加至预处理管理器的本地数据缓存,随后从本地缓存转移至history cache。预处理管理器可以以单一监控项模式或批量模式(用于依赖监控项和批量接收的数值)刷新本地数据缓存中的数值。
Zabbix server配置file允许用户设置预处理工作进程的数量。StartPreprocessors配置参数应用于设置预处理工作进程的预派生实例数量。最优的预处理工作进程数量可由多种因素决定,包括"可预处理"监控项的数量(需要execute任何预处理步骤的监控项)、数据收集进程数量、监控项预处理的平均步骤数等。
但假设没有像解析大型XML/JSON块这样的繁重预处理操作,预处理工作进程数量可以与数据收集器总数相匹配。这样,在大多数情况下(除了数据从收集器批量到达时),至少会有一个空闲的预处理工作进程来处理收集到的数据。
过多的数据收集进程(轮询器、不可达轮询器、ODBC轮询器、HTTP轮询器、Java轮询器、pingers、trappers、代理轮询器)与IPMI管理器、SNMP trapper和预处理工作进程一起可能会耗尽预处理管理器每个进程的file描述符限制。这将导致Zabbix server停止(通常在启动后不久,但有时可能需要更长时间)。应修改配置file或提高限制以避免这种情况。