Zabbix 核心代码目录:场景扩展层设计

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监控模块)

  1. 模板扩展 :在 templates/app/hadoop_http/ 定义Hadoop DataNode的HTTP_AGENT采集项,配置JSONPATH预处理规则;
  2. 模块扩展
    • manifest.json:定义模块ID、命名空间、路由(hadoop.module);
    • Module.php:在Monitoring菜单下新增「Hadoop监控」子菜单;
    • actions/TestHadoop.php:实现Hadoop指标的聚合计算;
    • views/hadoop.module.php:展示Hadoop集群的磁盘/内存/CPU指标;
  3. 前端扩展 :在 _widget-geomap.scss 定制Hadoop节点的地图标记样式;
  4. 表达式扩展 :新增 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/数据库/网络设备)的场景需求,同时保证扩展功能的可维护性和可测试性。

相关推荐
Sakuyu4346812 小时前
zabbix源码安装
linux·运维·zabbix
IT WorryFree1 天前
Zabbix介绍
zabbix
一fan风顺3 天前
部署基于nginx+mysql+elasticsearch的zabbix监控系统,实现数据采集和可视化
zabbix
IT WorryFree3 天前
通过Zabbix监控14条不同线路的出口IP,并与预设值对比,不一致时通过飞书告警
tcp/ip·飞书·zabbix
数据知道8 天前
详解MongoDB监控体系:Zabbix/Prometheus集成实战指南
mongodb·zabbix·prometheus
XMYX-011 天前
Zabbix 7.0 自定义 Linux 监控模板(Agent Active版,支持CPU/内存/磁盘/网卡自动发现)
linux·zabbix
人间打气筒(Ada)11 天前
zabbix报警多媒介(企业微信、钉钉)
运维·钉钉·企业微信·zabbix·监控·告警媒介
人间打气筒(Ada)11 天前
zabbix进阶与分布式-主被动模式/自动发现
运维·zabbix·监控·自动发现·主被动模式
不做菜鸟的网工24 天前
Zabbix收集H3C交换机实时配置命令 「SNMP TRAP」
zabbix