zabbix加载扩展模块 第三方库支持(92)

凉白开 zabbix327,8262字数 2538阅读8分27秒阅读模式

zabbix从2.2版本开始增加了使用动态库来扩展zabbix功能。loadable modules实际上和我们前面提到的用户自定义key是一样的功能,不同的是,他用加载lib库的方式,并且zabbix不需要fork一个新的进程,性能更好。目前类似的功能包含user parameters 、 external checks 、 system.run[] ,如果这些脚本逻辑过于复杂、耗时太长会出现比较严重的问题。

工作中,我们可以使用c开发一些适用于我们自己生产环境的模块。当然你也可以将它分享给出来,而不需要公布你的源代码,如果你对自己写的代码不自信的话。当agentd、server、proxy启动的时候同时将模块加载进来,退出的时候也会释放。文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

zabbix模块API

zabbix代码中有提供api所需的头文件.h,目前模块有两类接口需要实现,一类是必须实现的,一类是可选的。文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

必须实现的接口

两个接口: zbx_module_api_version()、zbx_module_init()文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

int    zbx_module_api_version(void);

用于返回API版本,必须实现,默认返回常量ZBX_MODULE_API_VERSION_ONE(数值1)文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

int    zbx_module_init(void);

模块必要的一些初始化,初始化成功返回ZBX_MODULE_OK,否则返回ZBX_MODULE_FAIL。文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

可选接口

可选接口有zbx_module_item_list()、 zbx_module_item_timeout()、 zbx_module_uninit()文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

ZBX_METRIC    *zbx_module_item_list(void);

返回模块内定义的item列表,包含key,如:agent.ping、agent.version,每个item都使用结构体ZBX_METRIC文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

void    zbx_module_item_timeout(int timeout);

超时时间设置,秒为单位文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

int    zbx_module_uninit(void);

释放资源,如:文件描述等文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

定义item结构体文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

typedef struct
{
    char        *key;
    unsigned    flags;
    int        (*function)();
    char        *test_param;
}
ZBX_METRIC;

key:item key名称,例如agent.ping、mysql.version等文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

flags:CF_HAVEPARAMS 或者0文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

function:将要调用的函数文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

test_param:参数列表文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

示例文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

static ZBX_METRIC keys[] =
{
    { "dummy.random", CF_HAVEPARAMS, zbx_module_dummy_random, "1,1000" },
    { NULL }
}

在定义function需要接收两个参数AGENT_REQUEST 、AGENT_RESULT ,如下文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

int    zbx_module_dummy_random(AGENT_REQUEST *request, AGENT_RESULT *result)
{
    ...
 
    SET_UI64_RESULT(result, from + rand() % (to - from + 1));
 
    return SYSINFO_RET_OK;
}

编译模块

编译准备文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

zabbix提供了一份用于测试的模块源码,在zabbix源码目录下文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

# cd /usr/local/src/zabbix-2.4.3/src/modules/dummy
# ll
total 32
-rw-r--r-- 1 1001 1001 9024 Dec 16 07:37 dummy.c
-rw-r--r-- 1 1001 1001   73 Dec 16 07:37 Makefile
-rw-r--r-- 1 1001 1001  245 Dec 16 07:37 README

请一定记住所有的源代码最好放到modules目录下来编译,因为他需要一些接口都在源码中。例如include/module.h、include/sysinc.h、 include/config.h,前面两个.h文件解压就存在,而config.h需要在源码根目录下执行./configure(不能带参数,否则会报错)。文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

开始编译文章源自运维生存时间-https://www.ttlsa.com/zabbix/zabbix-loadable-modules/

# cd  /usr/local/src/zabbix-2.4.3/
# ./configure
.....内容忽略.....
# cd /usr/local/src/zabbix-2.4.3/src/modules/dummy
# make
gcc -fPIC -shared -o dummy.so dummy.c -I../../../include
# ll
total 32
-rw-r--r-- 1 1001 1001 9024 Dec 16 07:37 dummy.c
-rwxr-xr-x 1 root root 8526 Feb 10 10:48 dummy.so
-rw-r--r-- 1 1001 1001   73 Dec 16 07:37 Makefile
-rw-r--r-- 1 1001 1001  245 Dec 16 07:37 README

加载模块

拷贝so文件到zabbix目录下

# cp dummy.so /usr/local/zabbix-2.4.3/lib/

修改配置文件

LoadModulePath=/usr/local/zabbix-2.4.3/lib/ # 可自定义
LoadModule=dummy.so # 可以加载多个

测试模块

重启zabbix_agentd

# killall zabbix_agentd

# /usr/local/zabbix-2.4.3/sbin/zabbix_agentd

测试key

# ./zabbix_get -s 127.0.0.1 -k dummy.echo[ttlsa.com]
ttlsa.com
#./zabbix_get -s 127.0.0.1 -k dummy.ping
1
#./zabbix_get -s 127.0.0.1 -k dummy.random[10,100]
73

可以看到定义好的三个key都成功了。学好linux c开发自己的zabbix模块吧。

 

 

 

weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
凉白开
  • 本文由 发表于 26/02/2015 01:00:57
  • 转载请务必保留本文链接:https://www.ttlsa.com/zabbix/zabbix-loadable-modules/
评论  3  访客  3
    • 我诶平
      我诶平 0

      49685bdd0901bea514d4d6f3bb842d1a沙发大家爱了就哦了

      • 李丹妮
        李丹妮 0

        49685bdd0901bea514d4d6f3bb842d1a帮帮我看一下这是怎么回事呢

        • Aceslup
          Aceslup 4

          咋这么6呢

        评论已关闭!