Zabbix 的场景扩展层是实现「无代码/低代码适配不同监控场景」的核心层级,围绕「模块扩展、模板配置、前端组件扩展、算法/表达式扩展」四大维度构建,通过标准化的扩展接口和配置规范,支持快速适配 Hadoop、SharePoint、HPE Synergy 等不同监控场景。以下是场景扩展层的核心目录、扩展机制与典型场景示例:
一、场景扩展层核心维度与目录映射
场景扩展层的核心目标是「不修改核心引擎代码,仅通过配置/扩展模块实现场景适配」,各维度对应目录及职责如下:
| 扩展维度 | 核心职责 | 关键目录/文件 |
|---|---|---|
| 模块扩展 | 动态新增/修改菜单、页面、业务逻辑(如新增监控模块、定制化权限) | ui/tests/selenium/modules/(模块示例)、ui/widgets/(组件模块) |
| 模板配置扩展 | 声明式定义采集规则、预处理规则、LLD 规则(适配不同监控对象) | templates/(采集模板)、database/(模板配置存储) |
| 前端样式/组件扩展 | 定制化前端展示(如地图组件、图标、菜单样式) | sass/stylesheets/sass/components/(样式扩展)、ui/js/vendors/(第三方组件) |
| 算法/表达式扩展 | 扩展监控指标计算逻辑(如自定义聚合函数、表达式解析规则) | tests/libs/zbxalgo/(算法测试)、tests/libs/zbxeval/(表达式解析测试) |
| 加密扩展 | 适配不同加密场景(如数据传输加密、配置加密) | src/libs/zbxcrypto/(加密算法实现) |
二、核心目录与场景扩展的深度解析
1. 模块扩展:ui/tests/selenium/modules/(扩展模块示例)+ 生产级模块规范
Zabbix 提供模块化扩展框架 ,通过 Module.php(逻辑)+ manifest.json(配置)+ views/(页面)+ actions/(业务逻辑)的组合,实现菜单、页面、功能的无侵入扩展。
核心目录结构(以 module_number_2 为例):
module_number_2/
├── Module.php # 模块初始化(如新增菜单)
├── manifest.json # 模块元配置(版本、命名空间、路由)
├── views/
│ └── second.module.php # 前端页面展示
└── actions/
└── Test2.php # 业务逻辑处理(权限、输入校验、响应)
关键扩展能力:
(1)菜单扩展(Module.php)
通过 APP::Component()->get('menu.main') 操作主菜单,支持新增/删除/修改菜单节点:
php
// 示例:在 Monitoring 菜单下新增子菜单
public function init(): void {
$menu = APP::Component()->get('menu.main');
$menu
->find('Monitoring')
->getSubMenu()
->add(
(new \CMenuItem('2nd Module'))->setAction('second.module')
);
}
// 示例:删除指定菜单(module_number_6)
public function init(): void {
$menu = APP::Component()->get('menu.main');
$menu->remove('Reports'); // 删除顶级菜单
$menu
->find('Monitoring')
->getSubMenu()
->remove('Maps'); // 删除子菜单
}
(2)模块元配置(manifest.json)
定义模块的基础信息、路由映射,是模块加载的核心配置:
json
{
"manifest_version": 2.0, // 模块配置版本(需符合Zabbix规范)
"id": "two", // 模块唯一ID
"name": "2nd Module name", // 模块名称
"namespace": "Example_B", // 模块命名空间(对应PHP命名空间)
"actions": { // 路由-业务逻辑映射
"second.module": { // 路由标识
"class": "Test2", // 处理类(对应actions/Test2.php)
"view": "second.module"// 页面模板(对应views/second.module.php)
}
}
}
(3)业务逻辑扩展(actions/Test2.php)
继承Zabbix核心控制器 CController,实现自定义业务逻辑:
php
namespace Modules\Example_B\Actions;
use CController as CAction;
class Test2 extends CAction {
// 初始化(如关闭CSRF校验、设置权限)
public function init() {
$this->disableCsrfValidation();
}
// 权限校验
protected function checkPermissions() {
return true;
}
// 输入校验
protected function checkInput() {
return true;
}
// 核心业务逻辑
protected function doAction() {
$response = new \CControllerResponseData([]);
$response->setTitle('2nd Module');
$this->setResponse($response);
}
}
(4)页面扩展(views/second.module.php)
通过Zabbix内置的 CHtmlPage 快速构建前端页面:
php
(new CHtmlPage())
->addItem(
(new CTag('h1', true, '2nd module is also working'))
)->show();
模块扩展注意事项:
manifest_version需符合Zabbix支持的版本(如 2.0 合法,2.01 会被判定为不兼容);- 命名空间需与
manifest.json中的namespace一致,否则类加载失败; - 路由Action需唯一,避免与核心模块/其他扩展模块冲突。
2. 模板配置扩展:templates/(采集规则扩展)
模板扩展是Zabbix适配不同监控场景的核心方式,无需修改代码,仅通过配置文件定义:
- 按监控对象分类(
app//db//server//san/),如templates/app/hadoop_http/适配Hadoop监控; - 定义采集项(Item)、LLD发现规则、预处理规则、触发器(Trigger);
- 支持多协议扩展(SNMP/HTTP/Agent/Traps),如HTTP_AGENT采集Hadoop的JMX接口数据。
3. 前端样式/组件扩展
(1)样式扩展:sass/stylesheets/sass/components/
通过Sass变量和混合宏(Mixin)扩展前端样式,适配不同场景的UI展示:
- 图标样式扩展:
_icons-extended.scss定义不同尺寸图标(large/medium/small/smaller)、带内容图标(%icon-with-content); - 菜单样式扩展:
_menu-main.scss定制主菜单/子菜单的选中、展开、悬浮样式; - 地图组件样式扩展:
dashboard/_widget-geomap.scss定制地理地图组件的标记簇、悬浮/选中样式; - 折叠面板扩展:
_expandable-subfilter.scss定义可折叠的筛选器样式,适配长文本展示场景。
(2)第三方组件扩展:ui/js/vendors/
集成第三方前端组件并扩展,适配监控数据可视化场景:
Leaflet.markercluster/leaflet.markercluster.js:扩展Leaflet地图的标记簇功能,支持大批量监控节点的集群展示;- 核心逻辑:
addLayers方法实现分层加载标记、集群化渲染,避免大量标记导致的性能问题。
4. 算法/表达式扩展
Zabbix支持通过自定义算法和表达式规则,扩展监控指标的计算逻辑:
(1)算法扩展:tests/libs/zbxalgo/
定义指标计算模式(value/max/min/delta/avg),适配不同场景的指标分析:
yaml
# zbx_mode_code.yaml 示例:扩展算法模式
---
test case: "1. Case value"
in:
str_mode: "value"
out:
return: SUCCEED
mode_str_exp: "VALUE"
(2)表达式扩展:tests/libs/zbxeval/
扩展监控触发器表达式的解析规则,支持自定义函数、逻辑运算:
yaml
# zbx_eval_execute_ext.yaml 示例:扩展sum函数
---
test case: Expression 'sum(hist(/host/key,1h))'
in:
rules: [ZBX_EVAL_PARSE_FUNCTION,ZBX_EVAL_PARSE_GROUP,ZBX_EVAL_PARSE_ITEM_QUERY]
expression: 'sum(hist(/host/key,1h))'
callbacks:
- name: hist
args_num: 2
retval: [1, 2, 3]
out:
result: SUCCEED
value: 6
5. 加密扩展:src/libs/zbxcrypto/
适配不同加密场景(如数据传输、配置加密),实现AES算法的密钥扩展:
c
// aes.c 核心逻辑:KeyExpansion函数生成轮密钥,适配AES-128/AES-256等加密场景
static void KeyExpansion(uint8_t *RoundKey, const uint8_t *Key)
{
unsigned i, j, k;
uint8_t tempa[4];
// 初始轮密钥 = 原始密钥
for (i = 0; i < Nk; ++i) {
RoundKey[(i * 4) + 0] = Key[(i * 4) + 0];
RoundKey[(i * 4) + 1] = Key[(i * 4) + 1];
RoundKey[(i * 4) + 2] = Key[(i * 4) + 2];
RoundKey[(i * 4) + 3] = Key[(i * 4) + 3];
}
// 生成后续轮密钥(支持AES256扩展)
for (i = Nk; i < Nb * (Nr + 1); ++i) {
// 轮密钥变换(RotWord/SubWord/Rcon异或)
// ...
#if defined(AES256) && (AES256 == 1)
if (i % Nk == 4) {
// AES256专属SubWord变换
tempa[0] = getSBoxValue(tempa[0]);
tempa[1] = getSBoxValue(tempa[1]);
tempa[2] = getSBoxValue(tempa[2]);
tempa[3] = getSBoxValue(tempa[3]);
}
#endif
// 轮密钥异或生成
RoundKey[j + 0] = RoundKey[k + 0] ^ tempa[0];
// ...
}
}
三、场景扩展层核心设计原则
1. 无侵入扩展
所有扩展逻辑均通过「配置/模块」实现,不修改Zabbix核心引擎代码(src/zbxserver//src/zbxdb/等),保证核心代码的稳定性。
2. 标准化接口
- 模块扩展遵循
manifest.json配置规范 +CModule基类接口; - 模板扩展遵循Zabbix Item/Trigger/LLD配置规范;
- 前端扩展遵循Sass变量命名规范 + 第三方组件接口规范。
3. 分层扩展
- 数据采集层:通过模板扩展适配不同监控对象;
- 业务逻辑层:通过模块扩展新增/修改功能;
- 前端展示层:通过样式/组件扩展定制UI;
- 算法层:通过表达式/算法规则扩展计算逻辑;
- 安全层:通过加密算法扩展适配不同加密场景。
4. 可测试性
扩展逻辑配套测试用例(如 zbxeval/zbx_eval_execute_ext.yaml/zbxalgo/zbx_mode_code.yaml),保证扩展功能的正确性。
四、典型场景扩展示例(新增Hadoop监控模块)
- 模板扩展 :在
templates/app/hadoop_http/定义Hadoop DataNode的HTTP_AGENT采集项,配置JSONPATH预处理规则; - 模块扩展 :
manifest.json:定义模块ID、命名空间、路由(hadoop.module);Module.php:在Monitoring菜单下新增「Hadoop监控」子菜单;actions/TestHadoop.php:实现Hadoop指标的聚合计算;views/hadoop.module.php:展示Hadoop集群的磁盘/内存/CPU指标;
- 前端扩展 :在
_widget-geomap.scss定制Hadoop节点的地图标记样式; - 表达式扩展 :新增
hadoop_datanode_remaining()函数,计算DataNode剩余磁盘空间。
五、核心目录补充说明
| 目录/文件 | 场景扩展角色 | 核心作用 |
|---|---|---|
ui/widgets/geomap/manifest.json |
组件模块配置 | 定义地理地图组件的元信息、输入输出参数、JS类映射 |
sass/stylesheets/sass/components/_icons-extended.scss |
图标样式扩展 | 定义不同尺寸/状态的图标样式,适配不同场景的UI展示 |
src/libs/zbxcrypto/aes.c |
加密算法扩展 | 实现AES密钥扩展,适配不同加密强度(AES-128/AES-256)的场景 |
ui/tests/selenium/modules/module_number_5/ |
多语言模块扩展 | 支持俄文菜单/页面,适配国际化场景 |
tests/libs/zbxeval/zbx_eval_execute_ext.yaml |
表达式规则扩展 | 测试/定义自定义表达式函数,适配复杂监控场景的指标计算 |
Zabbix场景扩展层的核心价值在于「高扩展性+低耦合」:通过标准化的扩展接口,无需修改核心代码即可适配不同行业(如金融/能源/互联网)、不同监控对象(如Hadoop/数据库/网络设备)的场景需求,同时保证扩展功能的可维护性和可测试性。