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模块吧。
转载请注明:成长的对话 » zabbix加载扩展模块 第三方库支持(92)