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模块吧。

3F
49685bdd0901bea514d4d6f3bb842d1a沙发大家爱了就哦了
2F
49685bdd0901bea514d4d6f3bb842d1a帮帮我看一下这是怎么回事呢
?
1F
咋这么6呢