Sidebar

Become a monitoring expert!
Sign up for Zabbix training

5 ロード可能モジュール

概要

ロード可能モジュールは、Zabbixの機能を拡張するための、性能を考慮した選択肢となります。

Zabbixの機能を拡張する既存の方法には、次のものがあります。

これらの方法は有用ですが、fork()という大きな難があります。Zabbixがユーザーメトリックに対応するたびにプロセスを起動する必要があり、性能に悪影響があります。通常はあまり問題ありませんが、付属のシステムを監視する際、大量の監視パラメータを有する場合、複雑なロジックの重いスクリプトを実行する場合、または起動時間が長い場合には、深刻な問題になり得ます。

Zabbix 2.2からは、性能を損ねることなく、Zabbixエージェントおよびサーバーを拡張するためのロード可能モジュールがサポートされるようになりました。

ロード可能モジュールは、基本的にZabbixエージェントおよびサーバーによって使用される共有ライブラリであり、起動後に読み込まれます。ファイルが本当にロードでき機能するか、Zabbixが検知するためにライブラリには特定の関数が用意されています。

ロード可能モジュールには、数多くのメリットがあります。様々なロジックを実装するための優れた性能および能力は非常に重要ですが、最も重要な利点は、Zabbixモジュールを開発、使用および共有する能力です。これによりトラブルのないメンテナンスを実現すると同時に、より簡単にかつZabbixコアコードベースとは関係なく、新しい機能を提供することができます。

設定パラメータ

Zabbixサーバーおよびエージェントは、以下のモジュールに対応するために、2つのパラメータをサポートします:

  • LoadModulePath – ロード可能モジュールを格納するディレクトリのフルパス
  • LoadModule – 起動時に読み込まれるモジュール;モジュールはLoadModulePathで指定するディレクトリに置く必要があります。複数のLoadModuleパラメータを含むことができます。

例えば、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に格納されています:

[email protected]:~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マニュアルを参照してください。