Zabbix Documentation 3.2

3.04.04.4 (current)| In development:5.0 (devel)| Unsupported:1.82.02.22.43.23.44.2Guidelines

User Tools

Site Tools


ru:manual:config:items:loadablemodules

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
ru:manual:config:items:loadablemodules [2015/12/22 23:01]
dotneft
ru:manual:config:items:loadablemodules [2018/07/08 04:48] (current)
dotneft
Line 1: Line 1:
-==== - #5 Подгружаемые модули ====+==== 5 Подгружаемые модули ====
  
 === - Обзор === === - Обзор ===
Line 5: Line 5:
 Подгружаемые модули предлагают производительную опцию для расширения функциональности Zabbix. Подгружаемые модули предлагают производительную опцию для расширения функциональности Zabbix.
  
-Уже есть возможности для раширения функциональности Zabbix ​с помощью:+Уже ​имеются возможности для расширения функциональности Zabbix ​при ​помощи:
   * [[userparameters|пользовательских параметров]] (метрики агента)   * [[userparameters|пользовательских параметров]] (метрики агента)
   * [[ru:​manual:​config:​items:​itemtypes:​external|внешние проверки]] (мониторинг без агента)   * [[ru:​manual:​config:​items:​itemtypes:​external|внешние проверки]] (мониторинг без агента)
-  * ''​system.run[]'' ​Zabbix ​[[ru:​manual:​config:​items:​itemtypes:​zabbix_agent|элемент данных агента]].+  * ''​system.run[]''​ [[ru:​manual:​config:​items:​itemtypes:​zabbix_agent|элемент данных ​Zabbix ​агента]].
  
 Они работают очень хорошо,​ но имеют главный недостаток,​ называемый форком (fork()). Zabbix должен создавать новый ответвленный процесс каждый раз для сбора пользовательских проверок,​ что не очень хорошо сказывается на производительности. Обычно это не самая большая проблема,​ но тем не менее это может быть серьезной проблемой для мониторинга встроенных систем,​ имеющих большое количество наблюдаемых параметров или тяжелых скриптов со сложной логикой или длительным временем запуска. Они работают очень хорошо,​ но имеют главный недостаток,​ называемый форком (fork()). Zabbix должен создавать новый ответвленный процесс каждый раз для сбора пользовательских проверок,​ что не очень хорошо сказывается на производительности. Обычно это не самая большая проблема,​ но тем не менее это может быть серьезной проблемой для мониторинга встроенных систем,​ имеющих большое количество наблюдаемых параметров или тяжелых скриптов со сложной логикой или длительным временем запуска.
Line 18: Line 18:
 Подгружаемые модули имеют много преимуществ. Отличная производительность и возможность внедрения в любую логику что очень важно, но возможно наиболее важное преимущество - возможность развития,​ использования и распространения Zabbix модулей. Это поспособствует безпроблемному обслуживанию и поможет вносить новую функциональность легче и независимо от кода ядра Zabbix. Подгружаемые модули имеют много преимуществ. Отличная производительность и возможность внедрения в любую логику что очень важно, но возможно наиболее важное преимущество - возможность развития,​ использования и распространения Zabbix модулей. Это поспособствует безпроблемному обслуживанию и поможет вносить новую функциональность легче и независимо от кода ядра Zabbix.
  
-=== - API модуль ​===+Лицензирование и распространение ​модулей в бинарной форме регламентируется GPL лицензией (модули линкуются с Zabbix во время выполнения и используют заголовки Zabbix; в настоящее время весь код Zabbix лицензируется под GPL лицензией). Бинарная совместимость не гарантируется Zabbix'​ом. ​
  
-Для того чтобы разделяемая библиотека обрабатывалась как Zabbix модуль,​ она должна реализовывать и экспортировать несколько функций. На данный момент имеется ​пять функций в API модулей Zabbix, две из которых обязательны,​ а остальные три - опциональны.+Постоянство API модулей гарантируется в пределах одного цикла Zabbix LTS (Долгосрочная поддержка) [[https://​www.zabbix.com/​ru/​life_cycle_and_release_policy|выпуска]]. Постоянство Zabbix API не гаратируется (технически имеется возможность вызова внутренних функций Zabbix из модуля,​ но гарантии,​ что такие модули будут работать нет). 
 + 
 +=== - API модулей === 
 + 
 +Для того чтобы разделяемая библиотека обрабатывалась как Zabbix модуль,​ она должна реализовывать и экспортировать несколько функций. На данный момент имеется ​шесть функций в API модулей Zabbix, ​только одна из которых обязательны,​ а остальные ​пять - опциональны.
  
  
 == - Обязательный интерфейс == == - Обязательный интерфейс ==
  
-Имеется ​две обязательных функции - **zbx_module_api_version()** и **zbx_module_init()**:+Единственная ​обязательная функции - **zbx_module_api_version()**:​
  
-<code c>+<file c>
 int zbx_module_api_version(void);​ int zbx_module_api_version(void);​
-</code>+</file>
  
-Эта функция должна возвращать API версию реализованную в модуле. На данный момент существует только ​одна версия, ZBX_MODULE_API_VERSION_ONE (определенная как 1), таким образом эта функция должна возвращать эту константу.+Эта функция должна возвращать API версию реализованную в модуле ​и, чтобы модуль загрузился, версия должна совпадать с версией API модулей ​поддерживаемой Zabbix. Версией API модулей поддерживаемой Zabbix ​является ZBX_MODULE_API_VERSION. Таким образом эта функция должна возвращать эту константу. Старая константа ZBX_MODULE_API_VERSION_ONE,​ которая ранее использовалась для этих целей, теперь определена равной ZBX_MODULE_API_VERSION для сохранения совместимости исходного кода, но её использование не рекомендуется.
  
-<code c> +== - Опциональный интерфейс ==
-int zbx_module_init(void);​ +
-</​code>​+
  
-Эта функция должна выполнять необходимую инициализацию для модуля (если таковые имеются). В случае успеха, функция должна вернуть ZBX_MODULE_OK. В противном случаеона должна вернуть ZBX_MODULE_FAIL.+Опциональными функциями являются следующие функции ​- **zbx_module_init()****zbx_module_item_list()**,​ **zbx_module_item_timeout()**,​ **zbx_module_history_write_cbs()** и **zbx_module_uninit()**:​
  
-== - Опциональный интерфейс ==+<file c> 
 +int zbx_module_init(void);​ 
 +</​file>​
  
-Имеется три опциональных функции ​- **zbx_module_item_list()****zbx_module_item_timeout()**,​ **zbx_module_uninit()**:​+Эта функция должна выполнять необходимую инициализацию для модуля (если таковые имеются). В случае успеха, функция должна вернуть ZBX_MODULE_OK. В противном случаеона должна вернуть ZBX_MODULE_FAIL. В последнем случае Zabbix не запустится.
  
-<code c>+<file c>
 ZBX_METRIC *zbx_module_item_list(void);​ ZBX_METRIC *zbx_module_item_list(void);​
-</code>+</file>
  
-Эта функция должна возвращать список элементов данных,​ поддерживаемых модулем. Каждый элемент данныхуказанный в структуре ZBX_METRIC, смотрите раздел ниже для подробностей. Список завершается ​с помощью структуры ZBX_METRIC с полем "​key"​ равным NULL.+Эта функция должна возвращать список элементов данных,​ поддерживаемых модулем. Каждый элемент данных указывается ​в структуре ZBX_METRIC, смотрите раздел ниже для подробностей. Список завершается ​при ​помощи структуры ZBX_METRIC с полем "​key"​ равным NULL.
  
-<code c>+<file c>
 void zbx_module_item_timeout(int timeout); void zbx_module_item_timeout(int timeout);
-</code>+</file> 
 + 
 +Если модуль экспортирует **zbx_module_item_list()**,​ тогда эта функция используется Zabbix, чтобы задать опцию времени ожидания в файле конфигурации Zabbix, которой проверки элементов данных реализованных в модуле должны подчиняться. Здесь, параметр "​время ожидания"​ задается в секундах. 
 + 
 +<file c> 
 +ZBX_HISTORY_WRITE_CBS zbx_module_history_write_cbs(void);​ 
 +</file>
  
-Эта функция ​используется ​в Zabbix для ​того ​чтобы указать ​настройки ​времени ожидания из файла конфигурации ​Zabbix, которым модуль должен ​следовать. Здесь, параметр "​timeout" ​указывается в секундах.+Эта функция ​должна возвращать функции обратного ​вызова (callback), которые будут использоваться Zabbix сервером или прокси для экспорта истории различных типов данных. Функции обратного вызова представляют собой поля ZBX_HISTORY_WRITE_CBS ​структуры,​ поля могут быть NULL, если модуль не заинтересован в истории некоторого типа.
  
-<code c>+<file c>
 int zbx_module_uninit(void);​ int zbx_module_uninit(void);​
-</code>+</file>
  
 Эта функция должна выполнять необходимые деинициализации (если таковые имеются),​ такие как освобождение выделенных ресурсов,​ закрытие файловых дескрипторов и так далее. Эта функция должна выполнять необходимые деинициализации (если таковые имеются),​ такие как освобождение выделенных ресурсов,​ закрытие файловых дескрипторов и так далее.
Line 67: Line 77:
 Каждый элемент данных определяется в структуре ZBX_METRIC: Каждый элемент данных определяется в структуре ZBX_METRIC:
  
-<code c>+<file c>
 typedef struct typedef struct
 { {
Line 76: Line 86:
 } }
 ZBX_METRIC; ZBX_METRIC;
-</code>+</file>
  
 Здесь, **key** - ключ элемента данных (например,​ "​dummy.random"​),​ **flags** - либо CF_HAVEPARAMS,​ либо 0 (в зависимости от того, принимает ли элемент данных параметры или нет), **function** - C функция,​ которая обрабатывает элемент данных (например,​ "​zbx_module_dummy_random"​),​ и **test_param** - список параметров,​ которые используется когда Zabbix агент запускается с флагом "​-p"​ (например,​ "​1,​1000",​ может быть NULL). Пример определения может выглядеть наподобие этого: Здесь, **key** - ключ элемента данных (например,​ "​dummy.random"​),​ **flags** - либо CF_HAVEPARAMS,​ либо 0 (в зависимости от того, принимает ли элемент данных параметры или нет), **function** - C функция,​ которая обрабатывает элемент данных (например,​ "​zbx_module_dummy_random"​),​ и **test_param** - список параметров,​ которые используется когда Zabbix агент запускается с флагом "​-p"​ (например,​ "​1,​1000",​ может быть NULL). Пример определения может выглядеть наподобие этого:
  
-<code c>+<file c>
 static ZBX_METRIC keys[] = static ZBX_METRIC keys[] =
 { {
Line 86: Line 96:
  { NULL }  { NULL }
 } }
-</code>+</file>
  
 Каждая функция,​ которая обрабатывает элемент данных должна принимать два указателя параметра,​ первый с типом AGENT_REQUEST и второй с типом AGENT_RESULT:​ Каждая функция,​ которая обрабатывает элемент данных должна принимать два указателя параметра,​ первый с типом AGENT_REQUEST и второй с типом AGENT_RESULT:​
  
-<code c>+<file c>
 int zbx_module_dummy_random(AGENT_REQUEST *request, AGENT_RESULT *result) int zbx_module_dummy_random(AGENT_REQUEST *request, AGENT_RESULT *result)
 { {
Line 99: Line 109:
  return SYSINFO_RET_OK;​  return SYSINFO_RET_OK;​
 } }
-</code>+</file>
  
 Эти функции должны возвращать SYSINFO_RET_OK,​ если значение элемента данных получено успешно. В противном случае,​ функции должны возвращать SYSINFO_RET_FAIL. Смотрите пример "​dummy"​ модуля ниже для получения деталей как получать информацию от AGENT_REQUEST и как указывать информацию в AGENT_RESULT. Эти функции должны возвращать SYSINFO_RET_OK,​ если значение элемента данных получено успешно. В противном случае,​ функции должны возвращать SYSINFO_RET_FAIL. Смотрите пример "​dummy"​ модуля ниже для получения деталей как получать информацию от AGENT_REQUEST и как указывать информацию в AGENT_RESULT.
 +
 +== - Предоставление обратного вызова экспорту истории ==
 +
 +Модуль может задавать функции для экспорта данных истории по типам: Числовой (с плавающей точкой),​ Числовой (целое положительное),​ Символ,​ Текст и Журнал (лог):
 +
 +<file c>
 +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;​
 +</​file>​
 +
 +Каждый из них должен принимать массив "​history"​ из элементов "​history_num"​ в виде аргументов. В зависимости от экспортируемого типа данных истории,​ "​history"​ является массивом из следующих структур,​ соответственно:​
 +
 +<file c>
 +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;​
 +</​file>​
 +
 +Обратные вызовы будут использоваться Zabbix сервером или прокси процессами синхронизации истории в конце процедуры синхронизации истории после того, как данные записаны в базу данных Zabbix и сохранены в кэш значений.
 +
 +<​note>​
 +Для экспорта через модули прокси доступны только сырые значения. (Пользовательские множители не будут применяться,​ дельта не будет вычисляться и т.д.)
 +</​note>​
  
 == - Сборка модулей == == - Сборка модулей ==
Line 135: Line 220:
  
 Подгружаемые модули подерживаются Zabbix агентом,​ сервером и прокси. Следовательно,​ тип элемента данных в Zabbix веб-интерфейсе зависит от того где этот модуль загружен. Если модуль загружен на стороне агента,​ тогда тип элемента данных должен быть "​Zabbix агент"​ или "​Zabbix агент (активный)"​. Если модуль загружен на стороне сервера или прокси,​ тогда тип элемента данных должен быть "​Простая проверка"​. Подгружаемые модули подерживаются Zabbix агентом,​ сервером и прокси. Следовательно,​ тип элемента данных в Zabbix веб-интерфейсе зависит от того где этот модуль загружен. Если модуль загружен на стороне агента,​ тогда тип элемента данных должен быть "​Zabbix агент"​ или "​Zabbix агент (активный)"​. Если модуль загружен на стороне сервера или прокси,​ тогда тип элемента данных должен быть "​Простая проверка"​.
 +
 +Экспорт истории через модули Zabbix не требует какой-либо настройки через веб-интерфейс. Если модуль успешно загружен сервером или прокси и предоставляет функцию **zbx_module_history_write_cbs()**,​ которая возвращает по крайней мере одну не-NULL функцию обратной связи, тогда экспорт истории будет включен автоматически.
  
 === - Пустой модуль === === - Пустой модуль ===
  
-Zabbix ​2.4 включает простой модуль,​ написанный на языке С. Модуль находиться в src/​modules/​dummy:​+Zabbix включает простой модуль,​ написанный на языке С. Модуль находиться в src/​modules/​dummy:​
  
   [email protected]:​~trunk/​src/​modules/​dummy$ ls -l   [email protected]:​~trunk/​src/​modules/​dummy$ ls -l
Line 149: Line 236:
 После выполнения ./configure в корне дерева исходных кодов Zabbix, как описано ранее, просто выполните **make** для сборки **dummy.so**. После выполнения ./configure в корне дерева исходных кодов Zabbix, как описано ранее, просто выполните **make** для сборки **dummy.so**.
  
-<code c>+<file c>
 /* /*
 ** Zabbix ** Zabbix
-** Copyright (C) 2001-2013 Zabbix SIA+** Copyright (C) 2001-2016 Zabbix SIA
 ** **
 ** This program is free software; you can redistribute it and/or modify ** This program is free software; you can redistribute it and/or modify
Line 166: Line 253:
 ** You should have received a copy of the GNU General Public License ** You should have received a copy of the GNU General Public License
 ** along with this program; if not, write to the Free Software ** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-** MA  02110-1301, USA.+
 **/ **/
  
Line 174: Line 260:
  
 /* the variable keeps timeout setting for item processing */ /* the variable keeps timeout setting for item processing */
-static int    item_timeout = 0;+static int item_timeout = 0;
  
-int    ​zbx_module_dummy_ping(AGENT_REQUEST *request, AGENT_RESULT *result); +/* module SHOULD define internal functions as static and use a naming pattern different from Zabbix internal */ 
-int    ​zbx_module_dummy_echo(AGENT_REQUEST *request, AGENT_RESULT *result); +/* symbols (zbx_*) and loadable module API functions (zbx_module_*) to avoid conflicts ​                      */ 
-int    ​zbx_module_dummy_random(AGENT_REQUEST *request, AGENT_RESULT *result);+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[] = static ZBX_METRIC keys[] =
-/* KEY               ​FLAG           ​FUNCTION ​               TEST PARAMETERS */+/* KEY FLAG FUNCTION TEST PARAMETERS */
 { {
-    ​{"​dummy.ping", ​  ​0,             zbx_module_dummy_ping NULL}, + {"​dummy.ping",​ 0, dummy_ping, NULL}, 
-    {"​dummy.echo", ​  ​CF_HAVEPARAMS, ​zbx_module_dummy_echo "a message"​},​ + {"​dummy.echo",​ CF_HAVEPARAMS,​ dummy_echo, "a message"​},​ 
-    {"​dummy.random",​ CF_HAVEPARAMS, ​zbx_module_dummy_random,"​1,​1000"​},​ + {"​dummy.random",​ CF_HAVEPARAMS,​ dummy_random,​ "​1,​1000"​},​ 
-    {NULL}+ {NULL}
 }; };
  
 /​****************************************************************************** /​******************************************************************************
-*                                                                            * + *                                                                            * 
-* Function: zbx_module_api_version ​                                          * + * Function: zbx_module_api_version ​                                          * 
-*                                                                            * + ​* ​                                                                           * 
-* Purpose: returns version number of the module interface ​                   * + * Purpose: returns version number of the module interface ​                   * 
-*                                                                            * + ​* ​                                                                           * 
-* Return value: ​ZBX_MODULE_API_VERSION_ONE ​the only version ​supported by   + * Return value: ​ZBX_MODULE_API_VERSION ​- version ​of module.h module is       
-*               ​Zabbix ​currently ​                                            + ​* ​              compiled with, in order to load module successfully ​Zabbix ​  * 
-*                                                                            * + ​* ​              MUST be compiled with the same version of this header file   
-******************************************************************************/​ + ​* ​                                                                           * 
-int    zbx_module_api_version()+ ​******************************************************************************/​ 
 +int zbx_module_api_version(void)
 { {
-    ​return ​ZBX_MODULE_API_VERSION_ONE;+ return ​ZBX_MODULE_API_VERSION;
 } }
  
 /​****************************************************************************** /​******************************************************************************
-*                                                                            * + *                                                                            * 
-* Function: zbx_module_item_timeout ​                                         * + * Function: zbx_module_item_timeout ​                                         * 
-*                                                                            * + ​* ​                                                                           * 
-* Purpose: set timeout value for processing of items                         * + * Purpose: set timeout value for processing of items                         * 
-*                                                                            * + ​* ​                                                                           * 
-* Parameters: timeout - timeout in seconds, 0 - no timeout set               * + * Parameters: timeout - timeout in seconds, 0 - no timeout set               * 
-*                                                                            * + ​* ​                                                                           * 
-******************************************************************************/​ + ​******************************************************************************/​ 
-void    zbx_module_item_timeout(int timeout)+void zbx_module_item_timeout(int timeout)
 { {
-    ​item_timeout = timeout;+ item_timeout = timeout;
 } }
  
 /​****************************************************************************** /​******************************************************************************
-*                                                                            * + *                                                                            * 
-* Function: zbx_module_item_list ​                                            * + * Function: zbx_module_item_list ​                                            * 
-*                                                                            * + ​* ​                                                                           * 
-* Purpose: returns list of item keys supported by the module ​                * + * Purpose: returns list of item keys supported by the module ​                * 
-*                                                                            * + ​* ​                                                                           * 
-* Return value: list of item keys                                            * + * Return value: list of item keys                                            * 
-*                                                                            * + ​* ​                                                                           * 
-******************************************************************************/​ + ​******************************************************************************/​ 
-ZBX_METRIC ​   *zbx_module_item_list()+ZBX_METRIC *zbx_module_item_list(void)
 { {
-    ​return keys;+ return keys;
 } }
  
-int    ​zbx_module_dummy_ping(AGENT_REQUEST *request, AGENT_RESULT *result)+static ​int dummy_ping(AGENT_REQUEST *request, AGENT_RESULT *result)
 { {
-    ​SET_UI64_RESULT(result,​ 1);+ SET_UI64_RESULT(result,​ 1);
  
-    ​return SYSINFO_RET_OK;​+ return SYSINFO_RET_OK;​
 } }
  
-int    ​zbx_module_dummy_echo(AGENT_REQUEST *request, AGENT_RESULT *result)+static ​int dummy_echo(AGENT_REQUEST *request, AGENT_RESULT *result)
 { {
-    ​char    *param;+ char *param;​
  
-    ​if (1 != request->​nparam) + if (1 != request->​nparam) 
-    +
-        /* set optional error message */ + /* set optional error message */ 
-        SET_MSG_RESULT(result,​ strdup("​Invalid number of parameters"​));​ + SET_MSG_RESULT(result,​ strdup("​Invalid number of parameters.")); 
-        return SYSINFO_RET_FAIL;​ + return SYSINFO_RET_FAIL;​ 
-    }+ }
  
-    ​param = get_rparam(request,​ 0);+ param = get_rparam(request,​ 0);
  
-    ​SET_STR_RESULT(result,​ strdup(param));​+ SET_STR_RESULT(result,​ strdup(param));​
  
-    ​return SYSINFO_RET_OK;​+ return SYSINFO_RET_OK;​
 } }
  
 /​****************************************************************************** /​******************************************************************************
-*                                                                            * + *                                                                            * 
-* Function: ​zbx_module_dummy_random ​                                         ​+ * Function: ​dummy_random ​                                                    
-*                                                                            * + ​* ​                                                                           * 
-* Purpose: a main entry point for processing of an item                      * + * Purpose: a main entry point for processing of an item                      * 
-*                                                                            * + ​* ​                                                                           * 
-* Parameters: request - structure that contains item key and parameters ​     * + * Parameters: request - structure that contains item key and parameters ​     * 
-*              request->​key - item key without parameters ​                   * + ​* ​             request->​key - item key without parameters ​                   * 
-*              request->​nparam - number of parameters ​                       * + ​* ​             request->​nparam - number of parameters ​                       * 
-*              request->​timeout - processing should not take longer than     * + ​* ​             request->​timeout - processing should not take longer than     * 
-*                                 this number of seconds ​                    * + ​* ​                                this number of seconds ​                    * 
-*              request->​params[N-1] - pointers to item key parameters ​       * + ​* ​             request->​params[N-1] - pointers to item key parameters ​       * 
-*                                                                            * + ​* ​                                                                           * 
-*             ​result - structure that will contain result ​                   * + ​* ​            ​result - structure that will contain result ​                   * 
-*                                                                            * + ​* ​                                                                           * 
-* Return value: SYSINFO_RET_FAIL - function failed, item will be marked ​     * + * Return value: SYSINFO_RET_FAIL - function failed, item will be marked ​     * 
-*                                 as not supported by zabbix ​                * + ​* ​                                as not supported by zabbix ​                * 
-*               ​SYSINFO_RET_OK - success ​                                    * + ​* ​              ​SYSINFO_RET_OK - success ​                                    * 
-*                                                                            * + ​* ​                                                                           * 
-* Comment: get_rparam(request,​ N-1) can be used to get a pointer to the Nth  * + * 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 ​ * + ​* ​         parameter starting from 0 (first parameter). Make sure it exists ​ * 
-*          by checking value of request->​nparam. ​                            * + ​* ​         by checking value of request->​nparam. ​                            * 
-*                                                                            * + ​* ​                                                                           * 
-******************************************************************************/​ + ​******************************************************************************/​ 
-int    ​zbx_module_dummy_random(AGENT_REQUEST *request, AGENT_RESULT *result)+static ​int dummy_random(AGENT_REQUEST *request, AGENT_RESULT *result)
 { {
-    ​char  *param1, *param2; + char *param1,​ *param2; 
-    int   ​from, to;+ int from, to;
  
-    ​if (request->​nparam ​!= 2+ if (2 != request->​nparam) 
-    +
-        /* set optional error message */ + /* set optional error message */ 
-        SET_MSG_RESULT(result,​ strdup("​Invalid number of parameters"​));​ + SET_MSG_RESULT(result,​ strdup("​Invalid number of parameters.")); 
-        return SYSINFO_RET_FAIL;​ + return SYSINFO_RET_FAIL;​ 
-    }+ }
  
-    ​param1 = get_rparam(request,​ 0); + param1 = get_rparam(request,​ 0); 
-    param2 = get_rparam(request,​ 1);+ param2 = get_rparam(request,​ 1);
  
-    ​/* there is no strict validation of parameters for simplicity sake */ + /* there is no strict validation of parameters for simplicity sake */ 
-    from = atoi(param1);​ + from = atoi(param1);​ 
-    to = atoi(param2);​+ to = atoi(param2);​
  
-    ​if (from > to) + if (from > to) 
-    +
-        SET_MSG_RESULT(result,​ strdup("​Incorrect ​range given")); + SET_MSG_RESULT(result,​ strdup("​Invalid ​range specified.")); 
-        return SYSINFO_RET_FAIL;​ + return SYSINFO_RET_FAIL;​ 
-    }+ }
  
-    ​SET_UI64_RESULT(result,​ from + rand() % (to - from + 1));+ SET_UI64_RESULT(result,​ from + rand() % (to - from + 1));
  
-    ​return SYSINFO_RET_OK;​+ return SYSINFO_RET_OK;​
 } }
  
 /​****************************************************************************** /​******************************************************************************
-*                                                                            * + *                                                                            * 
-* Function: zbx_module_init ​                                                 * + * Function: zbx_module_init ​                                                 * 
-*                                                                            * + ​* ​                                                                           * 
-* Purpose: the function is called on agent startup ​                          * + * Purpose: the function is called on agent startup ​                          * 
-*          It should be used to call any initialization routines ​            * + ​* ​         It should be used to call any initialization routines ​            * 
-*                                                                            * + ​* ​                                                                           * 
-* Return value: ZBX_MODULE_OK - success ​                                     * + * Return value: ZBX_MODULE_OK - success ​                                     * 
-*               ​ZBX_MODULE_FAIL - module initialization failed ​              * + ​* ​              ​ZBX_MODULE_FAIL - module initialization failed ​              * 
-*                                                                            * + ​* ​                                                                           * 
-* Comment: the module won't be loaded in case of ZBX_MODULE_FAIL ​            * + * Comment: the module won't be loaded in case of ZBX_MODULE_FAIL ​            * 
-*                                                                            * + ​* ​                                                                           * 
-******************************************************************************/​ + ​******************************************************************************/​ 
-int    zbx_module_init()+int zbx_module_init(void)
 { {
-    ​/* initialization for dummy.random */ + /* initialization for dummy.random */ 
-    srand(time(NULL));​+ srand(time(NULL));​
  
-    ​return ZBX_MODULE_OK;​+ return ZBX_MODULE_OK;​
 } }
  
 /​****************************************************************************** /​******************************************************************************
-*                                                                            * + *                                                                            * 
-* Function: zbx_module_uninit ​                                               * + * Function: zbx_module_uninit ​                                               * 
-*                                                                            * + ​* ​                                                                           * 
-* Purpose: the function is called on agent shutdown ​                         * + * Purpose: the function is called on agent shutdown ​                         * 
-*          It should be used to cleanup used resources if there are any      * + ​* ​         It should be used to cleanup used resources if there are any      * 
-*                                                                            * + ​* ​                                                                           * 
-* Return value: ZBX_MODULE_OK - success ​                                     * + * Return value: ZBX_MODULE_OK - success ​                                     * 
-*               ​ZBX_MODULE_FAIL - function failed ​                           * + ​* ​              ​ZBX_MODULE_FAIL - function failed ​                           * 
-*                                                                            * + ​* ​                                                                           * 
-******************************************************************************/​ + ​******************************************************************************/​ 
-int    zbx_module_uninit()+int zbx_module_uninit(void)
 { {
-    ​return ZBX_MODULE_OK;​+ return ZBX_MODULE_OK
 +
 + 
 +/​****************************************************************************** 
 + ​* ​                                                                           * 
 + * Functions: dummy_history_float_cb ​                                         * 
 + ​* ​           dummy_history_integer_cb ​                                       * 
 + ​* ​           dummy_history_string_cb ​                                        * 
 + ​* ​           dummy_history_text_cb ​                                          * 
 + ​* ​           dummy_history_log_cb ​                                           * 
 + ​* ​                                                                           * 
 + * Purpose: callback functions for storing historical data of types float, ​   * 
 + ​* ​         integer, string, text and log respectively in external storage ​   * 
 + ​* ​                                                                           * 
 + * Parameters: history ​    - array of historical data                         * 
 + ​* ​            ​history_num - number of elements in history array              * 
 + ​* ​                                                                           * 
 + ​******************************************************************************/​ 
 +static void dummy_history_float_cb(const ZBX_HISTORY_FLOAT *history, int history_num) 
 +
 + int i; 
 + 
 + for (i = 0; i < history_num;​ i++) 
 +
 + /* do something with 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++) 
 +
 + /* do something with 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++) 
 +
 + /* do something with 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++) 
 +
 + /* do something with 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++) 
 +
 + /* do something with history[i].itemid,​ history[i].clock,​ history[i].ns,​ history[i].value,​ ... */ 
 +
 +
 + 
 +/​****************************************************************************** 
 + ​* ​                                                                           * 
 + * Function: zbx_module_history_write_cbs ​                                    * 
 + ​* ​                                                                           * 
 + * Purpose: returns a set of module functions Zabbix will call to export ​     * 
 + ​* ​         different types of historical data                                * 
 + ​* ​                                                                           * 
 + * Return value: structure with callback function pointers (can be NULL if    * 
 + ​* ​              ​module is not interested in data of certain types) ​          * 
 + ​* ​                                                                           * 
 + ​******************************************************************************/​ 
 +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;
 } }
-</code>+</file>
  
 Модуль экпортирует 3 новых элемента данных:​ Модуль экпортирует 3 новых элемента данных:​