2 预处理详情

概述

本节提供监控项值预处理的详细信息。项值预处理允许为接收到的项值定义并执行 转换规则

预处理是由Preprocessing manager进程管理的,它是在Zabbix 3.4中添加的,以及执行预处理步骤的预处理工作器。来自不同数据收集器的所有值(带或不带预处理)在添加到历史缓存之前都要经过预处理管理器。数据收集器(pollers, trappers等)和预处理过程之间使用基于套接字的IPC通信。Zabbix server或Zabbix proxy(用于由代理监视的项目)正在执行预处理步骤。

监控项值预处理

为了可视化从数据源到Zabbix数据库的数据流,我们可以使用以下简化图:

2 预处理详情 - 图1

上面的图表仅以一种简化的形式显示了监控项值预处理相关的过程、对象和动作。该图不显示条件方向更改、错误处理或循环。预处理管理进程的本地数据缓存也不显示,因为它不会直接影响数据流。这张图的目的是展示项目价值处理的过程以及它们相互作用的方式。

  • 数据收集从数据源的原始数据开始。此时,数据只包含ID、时间戳和值(也可以是多个值)

  • 无论使用哪种类型的数据采集者,概念都是相同与主动或被动检查、捕获器监控项等,因为它只改变了数据格式和通信起动器(数据采集者是等待一个连接和数据,或数据采集者发起通信和请求数据)。验证原始数据,从配置缓存中检索项配置(使用配置数据丰富数据)。

  • 基于套接字的IPC机制用于将数据从数据收集器传递到预处理管理器。此时,数据收集器继续收集数据,而不等待预处理管理器的响应。

  • 进行数据预处理。这包括执行预处理步骤和相关项处理。

如果任何预处理步骤失败,则在执行预处理时,项可以将其状态更改为不支持。

  • 预处理管理器将本地数据缓存中的历史数据正在刷新到历史缓存中。

  • 此时,数据流将停止,直到历史缓存的下一次同步(当历史同步器进程执行数据同步时)。

  • 同步过程从数据规范化开始,将数据存储在Zabbix数据库中。数据规范化执行到所需的项目类型(在项目配置中定义的类型)的转换,包括基于这些类型允许的预定义大小(HISTORY_STR_VALUE_LEN表示字符串,HISTORY_TEXT_VALUE_LEN表示文本,HISTORY_LOG_VALUE_LEN表示日志值)截断文本数据。数据在标准化完成后被发送到Zabbix数据库。

如果数据规范化失败(例如,当文本值不能转换为数字时),监控项将其状态更改为不支持。

  • 正在处理收集的数据—检查触发器,如果项目变得不支持,则更新项目配置,等等。

  • 从监控项值处理的角度来看,这被认为是数据流的结束。

监控项值预处理

为了可视化数据预处理过程,我们可以使用以下简化图:

2 预处理详情 - 图2

上面的图表仅以简化的形式显示了监控项值预处理相关的过程、对象和主要动作。该图不显示条件方向更改、错误处理或循环。图中只显示了一个预处理进程(在实际场景中可以使用多个预处理进程),只处理一个监控项值,我们假设该监控项需要执行至少一个预处理步骤。这个图的目的是展示监控项值预处理后端调用流程图。

  • 监控数据和监控项值使用基于套接字的IPC机制传递给预处理管理器。

  • 监控项被放在预处理队列中。

监控项可以放在预处理队列的末尾或开头。Zabbix内部监控项总是放置在预处理队列的开头,而其他类型的项则在最后进入队列。

  • 此时,数据流将停止,直到至少有一个未被占用(即没有执行任何任务)的预处理进程为止。

  • 当预处理进程可用时, 将向其发送预处理任务。

  • 在预处理完成之后(预处理步骤的失败和成功执行),预处理值被传递回预处理管理器。

  • 预处理管理器将结果转换为所需格式(由项值类型定义),并将结果放入预处理队列。如果当前监控项有依赖项,则依赖监控项也将添加到预处理队列中。依赖项在主监控项后面的预处理队列中排队,但仅适用于设置了值且不处于不支持状态的主监控项。

监控项值处理流水线

监控项值处理由多个进程在多个步骤(或阶段)中执行。这可能会导致:

  • 依赖监控项可以接收值,而主项不能。这可以通过以下用例实现:

    • 主监控项的值类型为“UINT”(可以使用Zabbix采集器监控项),依赖监控项的值类型为“TEXT”。

    • 主监控项和依赖监控项都不需要预处理步骤。

    • 文本值(如“abc”)应传递给主监控项。

    • 由于没有要执行的预处理步骤,预处理管理器将检查主监控项是否处于不受支持的状态,以及是否设置了值(两者都为true),并将具有与主监控项相同值的依赖项排队(因为没有预处理步骤)。

    • 当主监控项和依赖监控项都达到历史同步阶段时,由于值转换错误(文本数据不能转换为无符号整数),主监控项将变为不支持。

结果,依赖监控项接收一个值,而主监控项将其状态更改为不支持。

  • 依赖监控项接收主监控项历史记录中不存在的值。除了主监控项类型之外,用例与前一个非常相似。例如,如果“CHAR”类型用于主监控项,则主监控项值将在历史同步阶段被截断,而依赖项将从主项的初始值(未被截断的)中接收它们的值。

预处理队列

预处理队列是一种FIFO数据结构,用于存储值,以保留预处理管理器对值进行重新排序的顺序。 FIFO逻辑有多个例外:

  • 内部项在队列的开头排队

  • 依赖监控项总是排在主监控项之后

为了可视化预处理队列的逻辑,我们可以使用下图:

2 预处理详情 - 图3

预处理队列中的值从队列的开头刷新到第一个未处理的值。例如,预处理管理器将刷新值1、2和3,但不会刷新值5,因为值4尚未处理: 2 预处理详情 - 图4

刷新后,队列(4和5)中只剩下两个值,值被添加到预处理管理器的本地数据缓存中,然后值从本地缓存传输到历史缓存中。预处理管理器可以以单项模式或批量模式(用于批量接收的依赖项和值)刷新本地数据缓存中的值。

预处理进程

Zabbix服务器配置文件允许用户设置预处理工作进程的数量。应该使用StartPreprocessors配置参数来设置预处理工作程序的预分支实例数。可以由许多因素确定最佳的预处理人员数量,包括“可预处理”项目的数量(需要执行任何预处理步骤的项目),数据收集过程的数量,项目预处理的平均步骤数量等。

但是,假设没有大体量XML/JSON格式数据解析这样的繁重的预处理操作,则预处理工作程序的数量可以匹配数据收集器的总数。这样,大多数情况下(收集器中的数据成批散布的情况除外)至少要有一个空闲的预处理器来收集数据。

太多的数据收集进程(轮询程序,不支持检查轮询程序,HTTP轮询程序,Java轮询程序,pinger轮询程序,Zabbix 采集器轮询程序,proxy轮询程序)与IPMI管理器,SNMP trap程序和预处理器一起会耗尽预处理管理器的按进程文件描述符限制。这将导致Zabbix服务器停止(通常在启动后不久,但有时可能需要更多时间)。为了避免这种情况,应修改配置文件或提高限制。