ロード可能モジュールは、Zabbixの機能を拡張するための、性能を考慮した選択肢となります。
Zabbixの機能を拡張する既存の方法には、次のものがあります。
system.run[]
Zabbix エージェントアイテムこれらの方法は有用ですが、fork()という大きな難があります。Zabbixがユーザーメトリックに対応するたびにプロセスを起動する必要があり、性能に悪影響があります。通常はあまり問題ありませんが、付属のシステムを監視する際、大量の監視パラメータを有する場合、複雑なロジックの重いスクリプトを実行する場合、または起動時間が長い場合には、深刻な問題になり得ます。
Zabbix 2.2からは、性能を損ねることなく、Zabbixエージェントおよびサーバーを拡張するためのロード可能モジュールがサポートされるようになりました。
ロード可能モジュールは、基本的にZabbixエージェントおよびサーバーによって使用される共有ライブラリであり、起動後に読み込まれます。ファイルが本当にロードでき機能するか、Zabbixが検知するためにライブラリには特定の関数が用意されています。
ロード可能モジュールには、数多くのメリットがあります。様々なロジックを実装するための優れた性能および能力は非常に重要ですが、最も重要な利点は、Zabbixモジュールを開発、使用および共有する能力です。これによりトラブルのないメンテナンスを実現すると同時に、より簡単にかつZabbixコアコードベースとは関係なく、新しい機能を提供することができます。
Zabbixサーバーおよびエージェントは、以下のモジュールに対応するために、2つのパラメータをサポートします:
例えば、Zabbixエージェントを拡張する場合には、次のパラメータを追加することができます:
LoadModulePath=/usr/local/lib/zabbix/agent/
LoadModule=mariadb.so
LoadModule=apache.so
LoadModule=kernel.so
LoadModule=dummy.so
エージェント起動時に、/usr/local/lib/zabbix/agentディレクトリからmariadb.so、apache.so、kernel.soおよびdummy.soモジュールが読み込まれます。モジュールがない場合、権限が不適切な場合、または共有ライブラリがZabbixモジュールではない場合、読み込まれません。
Zabbix 2.2には、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 alex 67 Apr 24 17:54 Makefile
-rw-rw-r-- 1 alex alex 245 Apr 24 17:54 README
モジュールは解説がされており、ユーザーのモジュールのテンプレートとして使用することができます。
dummy.soのモジュールをビルドするためにmakeを行います。
/*
** Zabbix
** Copyright (C) 2001-2013 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
** MA 02110-1301, USA.
**/
#include "sysinc.h"
#include "module.h"
/* the variable keeps timeout setting for item processing */
static int item_timeout = 0;
int zbx_module_dummy_ping(AGENT_REQUEST *request, AGENT_RESULT *result);
int zbx_module_dummy_echo(AGENT_REQUEST *request, AGENT_RESULT *result);
int zbx_module_dummy_random(AGENT_REQUEST *request, AGENT_RESULT *result);
static ZBX_METRIC keys[] =
/* KEY FLAG FUNCTION TEST PARAMETERS */
{
{"dummy.ping", 0, zbx_module_dummy_ping, NULL},
{"dummy.echo", CF_HAVEPARAMS, zbx_module_dummy_echo, "a message"},
{"dummy.random", CF_HAVEPARAMS, zbx_module_dummy_random,"1,1000"},
{NULL}
};
/******************************************************************************
* *
* Function: zbx_module_api_version *
* *
* Purpose: returns version number of the module interface *
* *
* Return value: ZBX_MODULE_API_VERSION_ONE - the only version supported by *
* Zabbix currently *
* *
******************************************************************************/
int zbx_module_api_version()
{
return ZBX_MODULE_API_VERSION_ONE;
}
/******************************************************************************
* *
* Function: zbx_module_item_timeout *
* *
* Purpose: set timeout value for processing of items *
* *
* Parameters: timeout - timeout in seconds, 0 - no timeout set *
* *
******************************************************************************/
void zbx_module_item_timeout(int timeout)
{
item_timeout = timeout;
}
/******************************************************************************
* *
* Function: zbx_module_item_list *
* *
* Purpose: returns list of item keys supported by the module *
* *
* Return value: list of item keys *
* *
******************************************************************************/
ZBX_METRIC *zbx_module_item_list()
{
return keys;
}
int zbx_module_dummy_ping(AGENT_REQUEST *request, AGENT_RESULT *result)
{
SET_UI64_RESULT(result, 1);
return SYSINFO_RET_OK;
}
int zbx_module_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;
}
/******************************************************************************
* *
* Function: zbx_module_dummy_random *
* *
* Purpose: a main entry point for processing of an item *
* *
* Parameters: request - structure that contains item key and parameters *
* request→key - item key without parameters *
* request→nparam - number of parameters *
* request→timeout - processing should not take longer than *
* this number of seconds *
* request→params[N-1] - pointers to item key parameters *
* *
* 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 *
* *
* Comment: get_rparam(request, N-1) can be used to get a pointer to the Nth *
* parameter starting from 0 (first parameter). Make sure it exists *
* by checking value of request→nparam. *
* *
******************************************************************************/
int zbx_module_dummy_random(AGENT_REQUEST *request, AGENT_RESULT *result)
{
char *param1, *param2;
int from, to;
if (request→nparam != 2)
{
/* 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 for simplicity sake */
from = atoi(param1);
to = atoi(param2);
if (from > to)
{
SET_MSG_RESULT(result, strdup("Incorrect range given"));
return SYSINFO_RET_FAIL;
}
SET_UI64_RESULT(result, from + rand() % (to - from + 1));
return SYSINFO_RET_OK;
}
/******************************************************************************
* *
* Function: zbx_module_init *
* *
* Purpose: the function is called on agent startup *
* It should be used to call any initialization routines *
* *
* Return value: ZBX_MODULE_OK - success *
* ZBX_MODULE_FAIL - module initialization failed *
* *
* Comment: the module won't be loaded in case of ZBX_MODULE_FAIL *
* *
******************************************************************************/
int zbx_module_init()
{
/* initialization for dummy.random */
srand(time(NULL));
return ZBX_MODULE_OK;
}
/******************************************************************************
* *
* Function: zbx_module_uninit *
* *
* Purpose: the function is called on agent shutdown *
* It should be used to cleanup used resources if there are any *
* *
* Return value: ZBX_MODULE_OK - success *
* ZBX_MODULE_FAIL - function failed *
* *
******************************************************************************/
int zbx_module_uninit()
{
return ZBX_MODULE_OK;
}
モジュールは3つの新しいアイテムをエクスポートします:
dummy.ping
- 常に「1」を返します。dummy.echo[param1]
- dummy.echo[ABC]がABCを返すといったように、最初のパラメータをそのままの形で返します。dummy.random[param1, param2]
- dummy.random[1,1000000]など、param1からparam2の範囲内の乱数を返します。ロード可能モジュールは、Unixのプラットフォームのみでサポートされます。Windowsエージェントでは使用できません。
場合によっては、モジュールがzabbix_agentd.confからモジュール関連設定パラメータを読み取る必要がありますが、現時点ではサポートされていません。モジュールが設定パラメータを使用する必要がある場合には、モジュール固有の設定ファイルの解析を行う必要があります。
本ページは2014/08/05時点の原文を基にしておりますので、内容は必ずしも最新のものとは限りません。
最新の情報は、英語版のZabbix2.2マニュアルを参照してください。