zabbix从2.2版本开始增加了使用动态库来扩展zabbix功能。loadable modules实际上和我们前面提到的用户自定义key是一样的功能,不同的是,他用加载lib库的方式,并且zabbix不需要fork一个新的进程,性能更好。目前类似的功能包含user parameters 、 external checks 、 system.run[] ,如果这些脚本逻辑过于复杂、耗时太长会出现比较严重的问题。
工作中,我们可以使用c开发一些适用于我们自己生产环境的模块。当然你也可以将它分享给出来,而不需要公布你的源代码,如果你对自己写的代码不自信的话。当agentd、server、proxy启动的时候同时将模块加载进来,退出的时候也会释放。
zabbix模块API
zabbix代码中有提供api所需的头文件.h,目前模块有两类接口需要实现,一类是必须实现的,一类是可选的。
必须实现的接口
两个接口: zbx_module_api_version()、zbx_module_init()
1
|
int zbx_module_api_version(void);
|
用于返回API版本,必须实现,默认返回常量ZBX_MODULE_API_VERSION_ONE(数值1)
1
|
int zbx_module_init(void);
|
模块必要的一些初始化,初始化成功返回ZBX_MODULE_OK,否则返回ZBX_MODULE_FAIL。
可选接口
可选接口有zbx_module_item_list()、 zbx_module_item_timeout()、 zbx_module_uninit()
1
|
ZBX_METRIC *zbx_module_item_list(void);
|
返回模块内定义的item列表,包含key,如:agent.ping、agent.version,每个item都使用结构体ZBX_METRIC
1
|
void zbx_module_item_timeout(int timeout);
|
超时时间设置,秒为单位
1
|
int zbx_module_uninit(void);
|
释放资源,如:文件描述等
定义item结构体
1
2
3
4
5
6
7
8
|
typedef struct
{
char *key;
unsigned flags;
int (*function)();
char *test_param;
}
ZBX_METRIC;
|
key:item key名称,例如agent.ping、mysql.version等
flags:CF_HAVEPARAMS 或者0
function:将要调用的函数
test_param:参数列表
示例
1
2
3
4
5
|
static ZBX_METRIC keys[] =
{
{ “dummy.random”, CF_HAVEPARAMS, zbx_module_dummy_random, “1,1000” },
{ NULL }
}
|
在定义function需要接收两个参数AGENT_REQUEST 、AGENT_RESULT ,如下
1
2
3
4
5
6
7
8
|
int zbx_module_dummy_random(AGENT_REQUEST *request, AGENT_RESULT *result)
{
...
SET_UI64_RESULT(result, from + rand() % (to – from + 1));
return SYSINFO_RET_OK;
}
|
编译模块
编译准备
zabbix提供了一份用于测试的模块源码,在zabbix源码目录下
1
2
3
4
5
6
|
# 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(不能带参数,否则会报错)。
开始编译
1
2
3
4
5
6
7
8
9
10
11
12
|
# 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目录下
1
|
# cp dummy.so /usr/local/zabbix-2.4.3/lib/
|
修改配置文件
1
2
|
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
1
2
3
4
5
6
|
# ./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模块吧。
文章转载来自:ttlsa.com