zabbix加載擴展模塊 第三方庫支持


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM