Модули који се могу учитати нуде опцију за проширење Zabbix функционалности усмерену на перформансе.
Можете проширити Zabbix функционалност на много начина, на пример, са кориснички параметри, спољне провере, и system.run[]
Zabbix ставке агента. Они раде веома добро, али имају један велики недостатак, namely fork(). Zabbix мора да формира нови процес сваки пут када обрађује корисничку метрику, што је није добро за перформансе. То иначе није велика ствар, међутим може бити озбиљан проблем када се надгледају уграђени системи, који имају а велики број праћених параметара или тешке скрипте са сложеном логиком или дуго време покретања.
Подршка модула који се могу учитати нуди начине за проширење Zabbix агента, сервер и прокси без жртвовања перформанси.
Модул који се може учитати је у основи заједничка библиотека коју користи Zabbix демон и учитава се при покретању. Библиотека треба да садржи одређене функције, тј да Zabbix процес може открити да је датотека заиста модул који може оптерећење и рад са.
Модули који се могу учитати имају низ предности. Одлична изведба и способност имплементације било које логике су веома важне, али можда и најважније важна предност је могућност развоја, коришћења и дељења Zabbix-а модула. Доприноси одржавању без проблема и помаже у испоруци нова функционалност лакша и независно од Zabbix базе кода.
Лиценцирање и дистрибуција модула у бинарном облику је регулисана AGPL-3.0 лиценцу (модули се повезују са Zabbix-ом у времену извођења и користе Zabbix заглавља; цео Zabbix код је лиценциран под AGPL-3.0 лиценцом од Zabbix-а 7.0). Zabbix не гарантује бинарну компатибилност.
Стабилност API модула је загарантована током једног Zabbix LTS-а (Long Term Support) release циклуса. Стабилност Zabbix API-ја није загарантована (технички јесте могуће је позвати Zabbix интерне функције из модула, али постоји нема гаранције да ће такви модули радити).
Да би се дељена библиотека третирала као Zabbix модул, то треба да имплементира и извезе неколико функција. Тренутно их има шест функције у API-ју Zabbix модула, од којих је само један обавезан и осталих пет је опционо.
Једина обавезна функција је zbx_module_api_version():
Ова функција треба да врати верзију API-ја коју имплементира овај модул а да би се модул учитао ова верзија мора да одговара модулу API верзија коју подржава Заббик. Верзија модула АПИ коју подржава Zabbix је ZBX_MODULE_API_VERSION. Дакле, ова функција би требало да врати ово константан. За ово се користи стара константа ZBX_MODULE_API_VERSION_ONE сврха је сада дефинисана да буде једнака ZBX_MODULE_API_VERSION за очување компатибилност извора, али се не препоручује његова употреба.
Опционе функције су zbx_module_init(), zbx_module_item_list(), zbx_module_item_timeout(), zbx_module_history_write_cbs() and zbx_module_uninit():
Ова функција треба да изврши неопходну иницијализацију за модул (ако их има). Ако успе, требало би да врати ZBX_MODULE_OK. Иначе, то треба да врати ZBX_MODULE_FAIL. У последњем случају Zabbix неће почети.
Ова функција треба да врати листу ставки које модул подржава. Свака ставка је дефинисана у ZBX_METRIC структури, погледајте одељак испод за детаље. Листа је завршена структуром ZBX_METRIC са "кључно" поље од NULL.
Ако модул извози zbx_module_item_list() онда је ова функција користи Zabbix да одреди подешавања временског ограничења у Zabbix конфигурацији датотеку коју треба да поштује провере ставке које имплементира модул. овде, параметар "timeout" је у секундама.
Ова функција би требало да врати функције повратног позива које ће Zabbix сервер користити извоз историје различитих типова података. Обезбеђене су функције повратног позива као поља структуре ZBX_HISTORY_WRITE_CBS, поља могу бити NULL ако модул није заинтересован за историју одређеног типа.
Ова функција треба да изврши неопходну иницијализацију (ако постоји) као што је ослобађање додељених ресурса, затварање дескриптора датотека итд.
Све функције се позивају једном приликом покретања Zabbix када је модул покренут учитан, са изузетком zbx_module_uninit(), који се зове једном приликом искључивања Zabbix када се модул испразни.
Свака ставка је дефинисана у ZBX_METRIC структури:
Овде је кључ кључ ставке (нпр. "dummy.random"), заставице је или CF_HAVEPARAMS или 0 (у зависности од тога да ли ставка прихвата параметри или не), функција је C функција која имплементира ставка (нпр. "zbx_module_dummy_random"), а test_param је листа параметара која ће се користити када се Zabbix агент покрене са "-p" заставица (нпр. „1,1000“, може бити NULL). Пример дефиниције може изгледати овако ово:
static ZBX_METRIC keys[] =
{
{ "dummy.random", CF_HAVEPARAMS, zbx_module_dummy_random, "1,1000" },
{NULL}
}
Свака функција која имплементира ставку треба да прихвати два показивача параметара, први типа 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;
}
Ове функције треба да врате SYSINFO_RET_OK, ако је вредност ставке била успешно добијен. У супротном, требало би да врате SYSINFO_RET_FAIL. Погледајте пример "dummy" модула испод за детаље о томе како да добијете информације од AGENT_REQUEST и како поставити информације у AGENT_RESULT.
Извоз историје преко модула више није подржан од стране Zabbix прокси.
Модул може специфицирати функције за извоз података историје по типу: Нумерички (флоат), нумерички (непотписани), карактер, текст и евиденција:
typedef struct
{
void (*history_float_cb)(const ZBX_HISTORY_FLOAT *history, int history_num);
void (*history_integer_cb)(const ZBX_HISTORY_INTEGER *history, int history_num);
void (*history_string_cb)(const ZBX_HISTORY_STRING *history, int history_num);
void (*history_text_cb)(const ZBX_HISTORY_TEXT *history, int history_num);
void (*history_log_cb)(const ZBX_HISTORY_LOG *history, int history_num);
}
ZBX_HISTORY_WRITE_CBS;
Сваки од њих треба да узме "history" низ елемената "history_num". аргументима. У зависности од типа података историје који се извози, "history" је низ следећих структура, респективно:
typedef struct
{
zbx_uint64_t itemid;
int clock;
int ns;
double value;
}
ZBX_HISTORY_FLOAT;
typedef struct
{
zbx_uint64_t itemid;
int clock;
int ns;
zbx_uint64_t value;
}
ZBX_HISTORY_INTEGER;
typedef struct
{
zbx_uint64_t itemid;
int clock;
int ns;
const char *value;
}
ZBX_HISTORY_STRING;
typedef struct
{
zbx_uint64_t itemid;
int clock;
int ns;
const char *value;
}
ZBX_HISTORY_TEXT;
typedef struct
{
zbx_uint64_t itemid;
int clock;
int ns;
const char *value;
const char *source;
int timestamp;
int logeventid;
int severity;
}
ZBX_HISTORY_LOG;
Повратне позиве ће користити процеси синхронизације историје Zabbix сервера у крај процедуре синхронизације историје након што су подаци уписани у Zabbix базу података и сачувани у кешу вредности.
У случају интерне грешке у модулу за извоз историје, препоручује се да се модул напише на такав начин да не блокира цео надзор док се не опорави али уместо тога одбацује податке и дозвољава Zabbix серверу да настави да ради.
Модули су тренутно предвиђени за изградњу унутар Zabbix изворног стабла, јер API модула зависи од неких структура података које су дефинисане у Zabbix заглављима.
Најважније заглавље за модуле који се могу учитати је include/module.h, који дефинише ове структуре података. Друга неопходна системска заглавља која помоћ include/module.h за исправан рад су stdlib.h и stdint.h.
Имајући на уму ове информације, све је спремно за модул изграђена. Модул треба да садржи stdlib.h, stdint.h и module.h, а скрипта за прављење треба да се увери да су ове датотеке у путањи укључивања. Погледајте пример "dummy" модула испод за детаље.
Још једно корисно заглавље је include/zbxcommon.h, које дефинише zabbix_log() функција, која се може користити за евидентирање и отклањање грешака сврхе.
Zabbix агент, сервер и прокси подржавају два параметри за решавање модули:
На пример, да бисмо проширили Zabbix агент, могли бисмо додати следеће параметри:
LoadModulePath=/usr/local/lib/zabbix/agent/
LoadModule=mariadb.so
LoadModule=apache.so
LoadModule=kernel.so
LoadModule=/usr/local/lib/zabbix/dummy.so
По покретању агента учитаће mariadb.so, apache.so и kernel.so модули из директоријума /usr/local/lib/zabbix/agent док dummy.so биће учитано из /usr/local/lib/zabbix. Агент неће успети да се покрене ако је модул недостаје, у случају лоших дозвола или ако заједничка библиотека није а Zabbix модул.
Zabbix агент, сервер и проки подржавају модуле који се могу учитати. Стога, тип ставке у Zabbix корисничком интерфејсу зависи од тога где се модул налази натоварен. Ако је модул учитан у агента, онда тип ставке треба да буде "Zabbix агент" или "Zabbix агент (активан)". Ако је модул учитано на сервер или прокси, онда би тип ставке требао бити "Једноставно провери".
За извоз историје преко Zabbix модула није потребан никакав кориснички интерфејс конфигурацију. Ако је сервер успешно учитао модул и пружа zbx_module_history_write_cbs() функцију која враћа најмање једна функција повратног позива која није NULL, тада ће бити извоз историје омогућено аутоматски.
Zabbix укључује узорак модула написан на језику C. Модул је смештен под src/modules/dummy:
alex@alex:~trunk/src/modules/dummy$ ls -l
-rw-rw-r-- 1 alex alex 9019 Apr 24 17:54 dummy.c
-rw-rw-r-- 1 alex alex67 Apr 24 17:54 Makefile
-rw-rw-r-- 1 alex alex245 Apr 24 17:54 README
Модул је добро документован, може се користити као шаблон за сопствене модуле.
Након што се ./configure покрене у корену Zabbix изворног стабла као што је горе описано, само покрените make да бисте направили dummy.so.
/*
** Zabbix
** Copyright (C) 2001-2020 Zabbix SIA
**
** Овај програм је бесплатан софтвер; можете га редистрибуирати и/или модификовати
** под условима GNU Опште јавне лиценце коју је објавио
** Фондација за слободни софтвер; било верзију 2 лиценце, или
** (по вашој жељи) било коју каснију верзију.
**
** Овај програм се дистрибуира у нади да ће бити користан,
** али БЕЗ ИКАКВЕ ГАРАНЦИЈЕ; чак и без подразумеване гаранције о
** ПРИЛИКА ЗА ПРОДАЈУ или ПРИКЛАДНОСТ ЗА ОДРЕЂЕНУ НАМЕНУ. Видите
** GNU General Public License за више детаља.
**
** Требало је да добијете копију GNU General Public License
** уз овај програм; ако не, пишите слободном софтверу
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA02110-1301, USA.
**/
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdint.h>
#include "module.h"
/*променљива задржава подешавање временског ограничења за обраду ставке*/
static int item_timeout = 0;
/*модул ТРЕБА да дефинише унутрашње функције као статичке и да користи образац именовања различит од Zabbix интерног */
/* symbols (zbx_*) и функције API модула које се могу учитати (zbx_module_*) да би се избегли конфликти */
static int dummy_ping(AGENT_REQUEST *request, AGENT_RESULT *result);
static int dummy_echo(AGENT_REQUEST *request, AGENT_RESULT *result);
static int dummy_random(AGENT_REQUEST *request, AGENT_RESULT *result);
static ZBX_METRIC keys[] =
/* KEY FLAG FUNCTION TEST PARAMETERS */
{
{"dummy.ping", 0, dummy_ping, NULL},
{dummy.echo", CF_HAVEPARAMS, dummy_echo, "a message"},
{"dummy.random", CF_HAVEPARAMS, dummy_random, "1,1000"},
{NULL}
};
/******************************************************************************
* *
* Функција: zbx_module_api_version *
* *
* Сврха: враћа број верзије интерфејса модула *
* *
* Враћа вредности: ZBX_MODULE_API_VERSION - верзија module.h модул је *
* компајлиран са, да би се модул успешно учитао Zabbix *
* МОРА се компајлирати са истом верзијом ове датотеке заглавља *
* *
******************************************************************************/
int zbx_module_api_version(void)
{
return ZBX_MODULE_API_VERSION;
}
/******************************************************************************
* *
* Функција: zbx_module_item_timeout *
* *
* Сврха: подешавање времена чекања за обраду ставки *
* *
* Параметри: timeout - временско ограничење у секундама, 0 - није подешено временско ограничење *
* *
******************************************************************************/
void zbx_module_item_timeout(int timeout)
{
item_timeout = timeout;
}
/******************************************************************************
* *
* Функција: zbx_module_item_list *
* *
* Сврха: враћа листу кључева ставки које подржава модул *
* *
* Повратна вредност: листа кључева ставки *
* *
******************************************************************************/
ZBX_METRIC *zbx_module_item_list(void)
{
return keys;
}
static int dummy_ping(AGENT_REQUEST *request, AGENT_RESULT *result)
{
SET_UI64_RESULT(result, 1);
return SYSINFO_RET_OK;
}
static int dummy_echo(AGENT_REQUEST *request, AGENT_RESULT *result)
{
char *param;
if (1 != request->nparam)
{
/* set optional error message */
SET_MSG_RESULT(result, strdup("Invalid number of parameters."));
return SYSINFO_RET_FAIL;
}
param = get_rparam(request, 0);
SET_STR_RESULT(result, strdup(param));
return SYSINFO_RET_OK;
}
/******************************************************************************
* *
* Функција: dummy_random *
* *
* Сврха: главна улазна тачка за обраду ставке *
* *
* Параметри: захтев - структура која садржи кључ ставке и параметре *
* request->key - item key without parameters *
* request->nparam - number of parameters *
* request->params[N-1] - pointers to item key parameters *
* request->types[N-1] - item key parameters types: *
* REQUEST_PARAMETER_TYPE_UNDEFINED (key parameter is empty) *
* REQUEST_PARAMETER_TYPE_ARRAY (array) *
* REQUEST_PARAMETER_TYPE_STRING (quoted or unquoted string) *
* *
* result - structure that will contain result *
* *
* Return value: SYSINFO_RET_FAIL - function failed, item will be marked *
* as not supported by zabbix *
* SYSINFO_RET_OK - success *
* *
* Коментар: get_rparam(request, N-1) може се користити за добијање показивача на Nth *
* параметар који почиње од 0 (први параметар). Уверите се да постоји *
* провером вредности од request->nparam. *
* На исти начин се може користити get_rparam_type(request, N-1) *
* добити тип параметра. *
* *
******************************************************************************/
static int dummy_random(AGENT_REQUEST *request, AGENT_RESULT *result)
{
char *param1, *param2;
int from, to;
if (2 != request->nparam)
{
/* set optional error message */
SET_MSG_RESULT(result, strdup("Invalid number of parameters."));
return SYSINFO_RET_FAIL;
}
param1 = get_rparam(request, 0);
param2 = get_rparam(request, 1);
/* there is no strict validation of parameters and types for simplicity sake */
from = atoi(param1);
to = atoi(param2);
if (from > to)
{
SET_MSG_RESULT(result, strdup("Invalid range specified."));
return SYSINFO_RET_FAIL;
}
SET_UI64_RESULT(result, from + rand() % (to - from + 1));
return SYSINFO_RET_OK;
}
/******************************************************************************
* *
* Функција: zbx_module_init *
* *
* Сврха: функција се позива при покретању агента *
* Требало би да се користи за позивање било које рутине за иницијализацију *
* *
* Повратна вредност: ZBX_MODULE_OK - успех *
* ZBX_MODULE_FAIL - иницијализација модула није успела *
* *
* Коментар: модул се неће учитати у случају ZBX_MODULE_FAIL *
* *
******************************************************************************/
int zbx_module_init(void)
{
/* initialization for dummy.random */
srand(time(NULL));
return ZBX_MODULE_OK;
}
/******************************************************************************
* *
* Функција: zbx_module_uninit *
* *
* Сврха: функција се позива при гашењу агента *
* Требало би да се користи за чишћење коришћених ресурса ако их има *
* *
* Повратна вредност: ZBX_MODULE_OK - успех *
* ZBX_MODULE_FAIL - функција није успела *
* *
******************************************************************************/
int zbx_module_uninit(void)
{
return ZBX_MODULE_OK;
}
/******************************************************************************
* *
* Функција: dummy_history_float_cb *
* dummy_history_integer_cb *
* dummy_history_string_cb *
* dummy_history_text_cb *
* dummy_history_log_cb *
* *
* Сврха: функције повратног позива за складиштење историјских података типа флоат, *
* цео број, стринг, текст и дневник у спољној меморији *
* *
* Параметри: историја - низ историјских података *
* history_num - број елемената у низу историје *
* *
******************************************************************************/
static void dummy_history_float_cb(const ZBX_HISTORY_FLOAT *history, int history_num)
{
int i;
for (i = 0; i < history_num; i++)
{
/* уради нешто са history[i].itemid, history[i].clock, history[i].ns, history[i].value, ... */
}
}
static void dummy_history_integer_cb(const ZBX_HISTORY_INTEGER *history, int history_num)
{
int i;
for (i = 0; i < history_num; i++)
{
/* уради нешто са history[i].itemid, history[i].clock, history[i].ns, history[i].value, ... */
}
}
static void dummy_history_string_cb(const ZBX_HISTORY_STRING *history, int history_num)
{
int i;
for (i = 0; i < history_num; i++)
{
/* уради нешто са history[i].itemid, history[i].clock, history[i].ns, history[i].value, ... */
}
}
static void dummy_history_text_cb(const ZBX_HISTORY_TEXT *history, int history_num)
{
int i;
for (i = 0; i < history_num; i++)
{
/* уради нешто са history[i].itemid, history[i].clock, history[i].ns, history[i].value, ... */
}
}
static void dummy_history_log_cb(const ZBX_HISTORY_LOG *history, int history_num)
{
int i;
for (i = 0; i < history_num; i++)
{
/* уради нешто са history[i].itemid, history[i].clock, history[i].ns, history[i].value, ... */
}
}
/******************************************************************************
* *
* Функција: zbx_module_history_write_cbs *
* *
* Сврха: враћа скуп функција модула које ће Zabbix позвати за извоз *
* различите врсте историјских података *
* *
* Повратна вредност: структура са показивачима функције повратног позива (може бити NULL ако *
* модул не занимају подаци одређених типова) *
* *
******************************************************************************/
ZBX_HISTORY_WRITE_CBS zbx_module_history_write_cbs(void)
{
static ZBX_HISTORY_WRITE_CBS dummy_callbacks =
{
dummy_history_float_cb,
dummy_history_integer_cb,
dummy_history_string_cb,
dummy_history_text_cb,
dummy_history_log_cb,
};
return dummy_callbacks;
}
Модул извози три нове ставке:
dummy.ping
- увек враћа '1'dummy.echo[param1]
- враћа први параметар какав јесте, за на пример, dummy.echo[ABC]
ће вратити ABCdummy.random[param1, param2]
- враћа насумични број унутар опсег param1-param2, на пример, dummy.random[1,1000000]
Подршка учитавих модула је имплементирана само за Unix платформу. То значи да не ради за Windows агенте.
У неким случајевима модул ће можда морати да прочита конфигурацију везану за модул параметри из zabbix_agentd.conf. Тренутно није подржан. Ако потребан вам је модул да бисте користили неке параметре конфигурације које бисте требали вероватно имплементирати рашчлањивање конфигурационе датотеке специфичне за модул.