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()
int zbx_module_api_version(void)
用於返回API版本,必須實現,默認返回常量ZBX_MODULE_API_VERSION_ONE(數值1)
int zbx_module_init(void);
模塊必要的一些初始化,初始化成功返回ZBX_MODULE_OK,否則返回ZBX_MODULE_FAIL。
可選接口
可選接口有zbx_module_item_list()、 zbx_module_item_timeout()、 zbx_module_uninit()
ZBX_METRIC *zbx_module_item_list(void);
返回模塊內定義的item列表,包含key,如:agent.ping、agent.version,每個item都使用結構體ZBX_METRIC
void zbx_module_item_timeout(int timeout);
超時時間設置,秒為單位
int zbx_module_uninit(void);
釋放資源,如:文件描述等
定義item結構體
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:參數列表
示例
static ZBX_METRIC keys[] = { { "dummy.random", CF_HAVEPARAMS, zbx_module_dummy_random, "1,1000" }, { NULL } }
在定義function需要接收兩個參數AGENT_REQUEST 、AGENT_RESULT ,如下
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源碼目錄下
# 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(不能帶參數,否則會 報錯)。
開始編譯
# 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模塊吧。
