Zabbix Documentation 3.2

3.04.05.0 (current)| In development:5.2 (devel)| Unsupported:1.82.02.22.43.23.44.24.4Guidelines

User Tools

Site Tools


ru:manual:discovery:low_level_discovery

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:discovery:low_level_discovery [2016/01/07 23:34]
dotneft
ru:manual:discovery:low_level_discovery [2020/01/06 05:54]
Line 1: Line 1:
-==== - #3 Низкоуровневое обнаружение ==== 
-=== Обзор ===  
  
-Низкоуровневое обнаружение (LLD) даёт возможность автоматического создания элементов данных,​ триггеров и графиков для различных объектов на компьютере. Например,​ Zabbix может автоматически начать мониторить файловые системы или сетевые интерфейсы с вашего устройства,​ без необходимости создания вручную элементов данных для каждой файловой системы или сетевого интерфейса. Кроме того, в Zabbix имеется возможность настроить удаление ненужных объектов,​ основываясь на фактических результатах периодически выполняемого обнаружения. 
- 
-В Zabbix поддерживаются три встроенных типа элементов данных для обнаружения:​ 
- 
-  * обнаружение файловых систем;​ 
-  * обнаружение сетевых интерфейсов;​ 
-  * обнаружение CPU и ядер CPU; 
-  * обнаружение SNMP OID'​ов;​ 
-  * обнаружение с использованием SQL запросов ODBC; 
-  * обнаружение Windows служб. 
- 
-Пользователь имеет возможность определить свои собственные типы обнаружения,​ обеспечив их функционирование согласно спецификации JSON протокола. 
- 
-Общая архитектура процессов обнаружения заключается в следующем. 
- 
-Сначала,​ пользователь создает правило обнаружения в "​Настройка"​ -> "​Шаблоны"​ -> колонка "​Обнаружение"​. Правило обнаружения состоит из (1) элемента данных,​ который осуществляет обнаружение необходимых объектов (например,​ файловые системы или сетевые интерфейсы) и (2) прототипов элементов данных,​ триггеров и графиков,​ которые должны быть созданы на основании полученных значений этого элемента данных. 
- 
-Элемент данных,​ который осуществляет обнаружение необходимых объектов,​ подобен обычным элементам данных,​ которые видны в других местах:​ Zabbix сервер запрашивает у Zabbix агента (или любой другой указанный тип элемента данных) значение этого элемента данных,​ и агент отвечает текстовым значением. Разница в том, что значение,​ которое возвращает агент, должно содержать список обнаруженных объектов в специальном JSON формате. Хотя детали этого формата важны только для создателей собственных проверок обнаружения,​ всё же всем необходимо знать, что возвращаемое значение содержит список из пар: макрос -> значение. Например,​ элемент данных "​net.if.discovery"​ может вернуть две пары: "​{#​IFNAME}"​ -> "​lo"​ и "​{#​IFNAME}"​ -> "​eth0"​. 
- 
-<​note>​Элементы данных низкоуровневого обнаружения - vfs.fs.discovery,​ net.if.discovery поддерживаются Zabbix агентом начиная с версии 2.0.\\ Элемент данных низкоуровневого обнаружения "​system.cpu.discovery"​ поддерживается Zabbix агентом начиная с версии 2.4.\\ Обнаружение SNMP OID'​ов поддерживается Zabbix сервером и прокси начиная с версии 2.0.\\ Обнаружение с использованием SQL запросов ODBC поддерживается Zabbix сервером и прокси начиная с версии 3.0.</​note>​ 
- 
-<​note>​Zabbix прокси на IBM DB2 базе данных имеет ограничение в 2048 байт на возвращаемое значение правил низкоуровневого обнаружения. Это ограничение не распространяется на Zabbix сервер,​ так как возвращаемые значения обрабатываются без предварительной записи в базу данных.</​note>​ 
- 
-Эти макросы затем используются в именах,​ ключах и в других полях прототипов,​ которые являются основой для создания реальных элементов данных,​ триггеров и графиков каждому обнаруженному объекту. Смотрите полный список [[:​ru/​manual/​appendix/​macros/​supported_by_location#​макросы_используемые_в_низкоуровневых_обнаружениях|опций]] по использованию макросов в низкоуровневом обнаружении. 
- 
-Когда сервер получает значение элемента данных обнаружения,​ он смотрит на пару макрос -> значение и для каждой пары создает реальные элементы данных,​ триггеров и графиков,​ основанных на их прототипах. В приведенном выше примере с "​net.if.discovery",​ сервер будет создавать один набор элементов данных,​ триггеров и графиков для локального интерфейса "​lo"​ и другой набор для интерфейса "​eth0"​. 
- 
-Следующий раздел иллюстрирует весь процесс,​ описанный выше, в деталях и служит руководством,​ как осуществлять все упомянутые выше типы обнаружений. Последний раздел описывает формат JSON элементов данных обнаружения и дает пример того, как реализовать ваш собственный скрипт для обнаружения файловых систем,​ используя Perl скрипт. 
- 
-=== - Обнаружение файловых систем === 
- 
-Для настройки обнаружения файловых систем,​ сделайте следующее:​ 
- 
-  * Перейдите в: //​Настройки//​ -> //​Шаблоны//  ​ 
-  * Нажмите на //​Обнаружение//​ в строке соответствующего шаблона 
- 
-{{manual:​discovery:​low_level_discovery:​fs_templates.png|}} 
- 
-  * Нажмите на //​Создать правило обнаружения//​ в верхнем правом углу экрана 
-  * Заполните диалог следующими деталями 
- 
-Вкладка **Правило обнаружения** содержит общие атрибуты правила обнаружения:​ 
- 
-{{manual:​discovery:​low_level_discovery:​lld_rule_fs.png|}} 
- 
-^Параметр^Описание^ ​ 
-|//​Имя// ​ |Имя правила обнаружения. ​ |  
-|//​Тип// ​ |Тип проверки выполняемого обнаружения;​ должен быть //Zabbix агент//​ или //Zabbix агент (активный)//​ при обнаружении файловых систем. ​ |  
-|//​Ключ// ​ |Элемент данных "​vfs.fs.discovery"​ уже встроен в Zabbix агент на многих платформах (для получения более детальных сведений смотрите [[ru:​manual:​appendix:​items:​supported_by_platform|список поддерживаемых ключей элементов данных]]),​ который возвращает список файловых систем,​ присутствующих в компьютере,​ и их типы в формате JSON.  |  
-|//​Интервал обновления (в сек)// ​ |Этот фильтр задает как часто Zabbix выполняет обнаружение. В начале,​ когда вы только настраиваете обнаружение файловых систем,​ вы можете указать маленький интервал,​ но как только вы удостоверитесь что всё работает,​ вы можете установить его в 30 минут или более, потому что обычно файловые системы не меняются очень часто.\\ //​Обратите внимание//:​ Если укажите значение равное '​0',​ элемент данных не будет обрабатываться. Однако,​ если также существует переменный интервал с ненулевым значением,​ элемент данных будет обрабатываться в течении действия переменного интервала. ​ |  
-|//​Пользовательские интервалы// ​ |Вы можете создавать пользовательские правила проверки элемента данных:​\\ **Гибкий** - создание исключений из Интервала обновления (интервал с другой частотой обновления)\\ **По расписанию** - создание пользовательского расписания проверки.\\ Для получения более подробной информации смотрите [[ru:​manual:​config:​items:​item:​custom_intervals|Пользовательские интервалы]]. Проверка по расписанию поддерживается начиная с Zabix 3.0.0. ​ |  
-|//​Период сохранения потерянных ресурсов (дней)// ​ |Это поле позволяет вам указать как много дней обнаруженный объект будет храниться (не будет удален),​ как только его состояние обнаружения станет "Не обнаруживается более"​ (макс 3650 дней). \\ //​Обратите внимание://​ Если значение равно "​0",​ объекты будут удалены сразу. Использование значения "​0"​ не рекомендуется,​ так как простое ошибочное изменение фильтра может закончится тем, что объект будет удален вместе со всеми данными истории. ​  ​| ​ 
-|//​Описание// ​ |Введите описание. ​ |  
-|//​Состояние// ​ |Если отмечено,​ правило будет обрабатываться. | 
- 
-Вкладка **Фильтры** содержит определения фильтрации правила обнаружения:​ 
- 
-{{manual:​discovery:​low_level_discovery:​lld_rule_fs2.png|}} 
- 
-^Параметр^Описание^ 
-|//Тип вычисления// ​ |Доступны следующие опции расчета фильтров:​\\ **И** - должны выполниться все фильтры;​\\ **Или** - достаточно выполнения одного фильтра;​\\ **И/​Или** - используется //И// для разных имен макросов и //Или// с одинаковым именем макроса;​\\ **Пользовательское выражение** - появляется возможность указать пользовательское вычисление фильтров. Формула должна включать в себя все фильтры из списка.\\ Ограничено 255 символами. ​ | 
-|//​Фильтры// ​ | Фильтр можно использовать только для генерирования реальных элементов данных,​ триггеров и графиков конкретных файловых систем. Ожидается использование [[ru:​manual:​regular_expressions|Расширенные регулярные выражения POSIX]]. Например,​ если вы заинтересованы только в файловых системах C:, D: и E:, вы можете поместить {#FSNAME} в поле "​Макрос"​ и регулярное выражение <​nowiki>"​^C|^D|^E"</​nowiki>​ в текстовые поля "​Регулярное выражение"​. Фильтрация также возможна по типам файловых систем,​ при использовании макроса {#FSTYPE} (например,​ <​nowiki>"​^ext|^reiserfs"</​nowiki>​) и по типу диска (поддерживается только Windows агентов),​ используя макрос {#​FSDRIVETYPE} ​ (например,​ <​nowiki>"​fixed"</​nowiki>​).\\ Вы можете ввести в поле "​Регулярное выражение"​ регулярное выражение или ссылку на глобальное [[ru:​manual:​regular_expressions|регулярное выражение]].\\ Для проверки регулярного выражения вы можете использовать "grep -E", например:​ <code bash>for f in ext2 nfs reiserfs smbfs; do echo $f | grep -E '​^ext|^reiserfs'​ || echo "SKIP: $f"; done</​code>​Макрос {#​FSDRIVETYPE} на Windows поддерживается начиная с Zabbix **3.0.0**.\\ Определение нескольких фильтров поддерживается начиная с **2.4.0**.\\ Обратите внимание,​ что если какой-то макрос из фильтра пропущен в ответе,​ найденный объект будет игнорироваться. ​ | 
- 
-<note important>​База данных Zabbix в MySQL должна быть создана чувствительной к регистру,​ если имена файловых систем различаются только по регистру,​ чтобы обнаружение сработало корректно.</​note>​ 
-  
-<​note>​История правил обнаружения не сохраняется.</​note>​ 
- 
-Как только правило будет создано,​ перейдем к элементам данных этого правила и нажмем "​Создать прототип",​ чтобы создать прототип элементов данных. Обратите внимание на то, как используется макрос {#FSNAME}, где требуется указать имя файловой системы. Когда правило будет обрабатываться,​ этот макрос будет заменен обнаруженной файловой системой. 
- 
-{{manual:​discovery:​low_level_discovery:​item_prototype_fs.png|}} 
- 
-<​note>​Если прототип элемента данных создан с состоянием //​Деактивирован//,​ то он будет добавлен как обнаруженный объект,​ но в деактивированном состоянии.</​note>​ 
- 
-//​Прототип группы элементов данных//​ является опцией,​ которая указывается в свойствах прототипов элементов данных. В свойствах группы элементов данных вы можете использовать макросы низкоуровневого обнаружения,​ которые,​ после выполнения обнаружения,​ будут заменены реальными значениями при создании групп элементов данных,​ которые специфичны для обнаруженного объекта. Смотрите также [[ru:​manual:​discovery:​low_level_discovery:​notes|заметки по обнаружению групп элементов данных]] для получения более подробной информации. 
- 
-Мы можем создать несколько прототипов элементов данных для каждой интересующей нас характеристики файловой системы:​ 
- 
-{{manual:​discovery:​low_level_discovery:​item_prototypes_fs.png|}} 
- 
-Теперь похожим способом мы создадим прототипы триггеров:​ 
- 
-{{manual:​discovery:​low_level_discovery:​trigger_prototype_fs.png|}} 
- 
-Также вы можете задать [[:​ru/​manual/​config/​triggers/​dependencies|зависимости]] между прототипами триггеров (поддерживается начиная с Zabbix 3.0). Чтобы это сделать,​ перейдите на вкладку //​Зависимости//​. Прототип триггеров может зависеть от другого прототипа триггеров из этого же правила низкоуровневого обнаружения (LLD) или от обычного триггера. Прототип триггеров не может зависеть от прототипа триггеров из другого правила LLD и от триггера созданного другим прототипом триггеров. Прототип триггеров узла сети не может зависеть от триггера из шаблона. 
- 
-{{manual:​discovery:​low_level_discovery:​trigger_prototypes_fs.png|}} 
- 
-И также прототипы графиков:​ 
- 
-{{manual:​discovery:​low_level_discovery:​graph_prototype_fs.png|}} 
- 
-{{manual:​discovery:​low_level_discovery:​graph_prototypes_fs.png|}} 
- 
-В конце концов,​ мы создали правило обнаружения,​ которое выглядит как видно ниже. Оно имеет пять прототипов элементов данных,​ два прототипа триггеров и один прототип графика. 
- 
-{{manual:​discovery:​low_level_discovery:​lld_rules_fs.png|}} 
- 
-//​Обратите внимание//:​ Для получения информации по настройке прототипов узлов сети, смотрите в разделе мониторинга виртуальных машин о настройке [[:​ru/​manual/​vm_monitoring#​прототипы_узлов_сети|прототипов узлов сети]]. 
- 
-Представленные снимки экрана ниже иллюстрируют как выглядят уже обнаруженные элементы данных,​ триггера и графики в настройке узла сети. Обнаруженные объекты имеют префикс ссылку золотистого цвета, которая ведет к правилу обнаружения,​ создавшего эти объекты. 
- 
-{{manual:​discovery:​low_level_discovery:​discovered_items.png|}} 
- 
-Обратите внимание,​ что обнаруженные объекты не будут созданы в случае,​ если объекты с такими же условиями уникальности уже существуют,​ например,​ элемент данных с таким же ключем или график с таким же именем. 
- 
-Элементы данных (а также, триггеры и графики) созданые с помощью низкоуровневого правила обнаружения невозможно удалить вручную. Тем не менее, они будут удалены автоматически,​ если обнаруженный объект (файловая система,​ интерфейс и т.д.) более не обнаруживается (или более не попадает под фильтр). В этом случае они будут удалены спустя некоторое количество дней указанное в поле //​Период сохранения потерянных ресурсов//​. 
- 
-Когда обнаруженный объект становится '​Более не обнаруживается',​ в списке элементов данных будет отображаться оранжевый индикатор времени жизни. Переместите курсор мыши на этот индикатор и вы увидите сообщение с количеством дней до момента удаления элемента данных. 
- 
-{{:​manual:​discovery:​low_level_discovery:​not_discovered_message.png|}} 
- 
-Если объекты отмечены на удаление,​ но не были удалены в назначенное время (деактивировано правило обнаружения или элемент данных узла сети), они удалятся при следующем выполнении правила обнаружения. 
- 
-{{manual:​discovery:​low_level_discovery:​discovered_triggers.png|}} 
- 
-{{manual:​discovery:​low_level_discovery:​discovered_graphs.png|}} 
- 
-=== - Обнаружение сетевых интерфейсов === 
- 
-Обнаружение сетевых интерфейсов осуществляется таким же образом,​ как и обнаружение файловых систем,​ за исключением того, что мы используем ключ правила обнаружения "​net.if.discovery"​ вместо "​vfs.fs.discovery"​ и макрос {#IFNAME} вместо {#FSNAME} в фильтре и в прототипах элементов данных/​триггеров/​графиков. 
- 
-Примеры прототипов элементов данных,​ которые вы можете захотеть создать основываются на "​net.if.discovery":​ "​net.if.in[{#​IFNAME},​bytes]",​ "​net.if.out[{#​IFNAME},​bytes]"​. 
- 
-[[#​обнаружение_файловых_систем|Смотрите выше]] для получения информации по поводу фильтра. 
-=== - Обнаружение CPU и ядер CPU === 
- 
-Обнаружение CPU и ядер CPU выполняется аналогично обнаружению сетевых интерфейсов за исключением того, что ключем правила обнаружения является "​system.cpu.discovery"​. Этот ключ обнаружения возвращаетс два макроса - {#​CPU.NUMBER} и {#​CPU.STATUS},​ идентифицирующие порядковый номер CPU и состояние соответственно. Отметим,​ нельзя сделать четкого различия между действительными,​ физическими процессорами,​ ядрами и hyperthread. {#​CPU.STATUS} на Linux, UNIX и BSD системах возвращают состояние процессора,​ которое может быть как "​online",​ так и "​offline"​. На Windows системах,​ этот же макрос может представлять собой третье значение - "​unknown"​ - которое указывает на то, что процессор был обнаружен,​ но информация по нему еще не собрана. 
- 
-Обнаружение CPU основано на процессе коллектора агента,​ чтобы поддерживать соответствие с данными,​ которые поставляются коллектором и сохранить ресурсы на получение данных. Такое поведение дает эффект,​ что этот ключ элемента данных не работает с флагом командой строки тестирования (-t) бинарного файла, который возвращает состояние NOT_SUPPORTED и сопутствующее сообщение о том, что процесс коллектора не запущен. 
- 
-Прототипы элементов данных,​ которые можно создать на основе обнаружения CPU включают в себя "​system.cpu.load[{#​CPU.NUMBER},​ <​режим>​]",​ "​system.cpu.util[{#​CPU.NUMBER},​ <​тип>,​ <​режим>​]"​ и другие. 
- 
-=== - Обнаружение SNMP OID'​ов === 
- 
-В этом примере мы осуществим обнаружение SNMP на коммутаторе. Сначала перейдем в "​Настройка"​ -> "​Шаблоны"​. 
- 
-{{manual:​discovery:​low_level_discovery:​templates_snmp.png|}} 
- 
-Для изменения правил обнаружения шаблона,​ нажмите на ссылку в колонке "​Обнаружение"​. 
- 
-Затем нажмите "​Создать правило"​ и заполните форму, как отображено на снимке экрана ниже. 
- 
-В отличие от обнаружения файловых систем и сетевых интерфейсов - этот элемент данных не требует наличия ключа "​snmp.discovery",​ достаточно указать,​ что типом элемента данных является SNMP агент. 
- 
-OID'ы для обнаружения добавляются в поле SNMP OID в следующем формате:​ ''​discovery[{#​МАКРОС1},​ oid1, {#​МАКРОС2},​ oid2, …,​]''​ 
- 
-где //​{#​МАКРОС1}//,​ //​{#​МАКРОС2}//​ …  допустимые имена низкоуровневых макросов и //oid1//, //oid2//... являются OID'​ами способными сгенерировать ​   осмысленные значения для этих макросов. Встроенный макрос //​{#​SNMPINDEX}//​ содержит индекс обнаруженного OID, который применяется к обнаруженным объектам. Обнаруженные объекты группируются по значению макроса //​{#​SNMPINDEX}//​. 
- 
-Для понимания того, что мы имеем в виду, давайте выполним несколько раз snmpwalk на нашем коммутаторе:​ 
-  $ snmpwalk -v 2c -c public 192.168.1.1 IF-MIB::​ifDescr 
-  IF-MIB::​ifDescr.1 = STRING: WAN 
-  IF-MIB::​ifDescr.2 = STRING: LAN1 
-  IF-MIB::​ifDescr.3 = STRING: LAN2 
-  ​ 
-  $ snmpwalk -v 2c -c public 192.168.1.1 IF-MIB::​ifPhysAddress 
-  IF-MIB::​ifPhysAddress.1 = STRING: 8:​0:​27:​90:​7a:​75 
-  IF-MIB::​ifPhysAddress.2 = STRING: 8:​0:​27:​90:​7a:​76 
-  IF-MIB::​ifPhysAddress.3 = STRING: 8:​0:​27:​2b:​af:​9e 
- 
-И зададим SNMP OID равным:​ ''​discovery[{#​IFDESCR},​ ifDescr, {#​IFPHYSADDRESS},​ ifPhysAddress]''​ 
- 
-Теперь это правило будет обнаруживать объекты с макросом {#IFDESCR} равным **WAN**, **LAN1** и **LAN2**, макросом {#​IFPHYSADDRESS} равным **8:​0:​27:​90:​7a:​75**,​ **8:​0:​27:​90:​7a:​76**,​ и **8:​0:​27:​2b:​af:​9e**,​ макросом {#​SNMPINDEX} равным индексам обнаруженных OID **1**, **2** и **3**: 
-  { 
-      "​data":​ [ 
-          { 
-              "​{#​SNMPINDEX}":​ "​1",​ 
-              "​{#​IFDESCR}":​ "​WAN",​ 
-              "​{#​IFPHYSADDRESS}":​ "​8:​0:​27:​90:​7a:​75"​ 
-          }, 
-          { 
-              "​{#​SNMPINDEX}":​ "​2",​ 
-              "​{#​IFDESCR}":​ "​LAN1",​ 
-              "​{#​IFPHYSADDRESS}":​ "​8:​0:​27:​90:​7a:​75"​ 
-          }, 
-          { 
-              "​{#​SNMPINDEX}":​ "​3",​ 
-              "​{#​IFDESCR}":​ "​LAN2",​ 
-              "​{#​IFPHYSADDRESS}":​ "​8:​0:​27:​2b:​af:​9e"​ 
-          } 
-      ] 
-  } 
- 
-Если обнаруженный объект не имеет указанный OID, тогда по этому объекту соответстующий макрос пропускается. Например,​ если у нас есть следующие данные:​ 
-  ifDescr.1 "​Interface #1" 
-  ifDescr.2 "​Interface #2" 
-  ifDescr.4 "​Interface #4" 
-  ​ 
-  ifAlias.1 "​eth0"​ 
-  ifAlias.2 "​eth1"​ 
-  ifAlias.3 "​eth2"​ 
-  ifAlias.5 "​eth4"​ 
-  
-Тогда, в случае SNMP обнаружения ''​discovery[{#​IFDESCR},​ ifDescr, {#IFALIAS}, ifAlias]''​ вернется следующая структура:​ 
-  { 
-      "​data":​ [ 
-          { 
-              "​{#​SNMPINDEX}":​ 1, 
-              "​{#​IFDESCR}":​ "​Interface #1", 
-              "​{#​IFALIAS}":​ "​eth0"​ 
-          }, 
-          { 
-              "​{#​SNMPINDEX}":​ 2, 
-              "​{#​IFDESCR}":​ "​Interface #2", 
-              "​{#​IFALIAS}":​ "​eth1"​ 
-          }, 
-          { 
-              "​{#​SNMPINDEX}":​ 3, 
-              "​{#​IFALIAS}":​ "​eth2"​ 
-          }, 
-          { 
-              "​{#​SNMPINDEX}":​ 4, 
-              "​{#​IFDESCR}":​ "​Interface #4" 
-          }, 
-          { 
-              "​{#​SNMPINDEX}":​ 5, 
-              "​{#​IFALIAS}":​ "​eth4"​ 
-          } 
-      ] 
-  }  ​ 
- 
-{{manual:​discovery:​low_level_discovery:​lld_rule_snmp.png|}} 
- 
-Представленный снимок экрана иллюстрирует как мы можем использовать эти макросы в прототипах элементов данных:​ 
- 
-{{manual:​discovery:​low_level_discovery:​item_prototype_snmp.png|}} 
- 
-Опять же, создадим столько прототипов элементов данных,​ сколько необходимо:​ 
- 
-{{manual:​discovery:​low_level_discovery:​item_prototypes_snmp.png|}} 
- 
-Также как и прототипы триггеров:​ 
- 
-{{manual:​discovery:​low_level_discovery:​trigger_prototype_snmp.png|}} 
- 
-{{manual:​discovery:​low_level_discovery:​trigger_prototypes_snmp.png|}} 
- 
-И прототипы графиков:​ 
- 
-{{manual:​discovery:​low_level_discovery:​graph_prototype_snmp.png|}} 
- 
-{{manual:​discovery:​low_level_discovery:​graph_prototypes_snmp.png|}} 
- 
-Результат нашего правила обнаружения:​ 
- 
-{{manual:​discovery:​low_level_discovery:​lld_rules_snmp.png|}} 
- 
-Когда сервер работает,​ он создаст реальные элементы данных,​ триггеры и графики на основе значений,​ полученных от SNMP правила обнаружения. В настройках узлов сети они будут иметь префикс ссылку оранжевого цвета, которая ведет к правилу обнаружения,​ их создавшего. 
- 
-{{manual:​discovery:​low_level_discovery:​discovered_items_snmp.png?​600|}} 
- 
-{{manual:​discovery:​low_level_discovery:​discovered_triggers_snmp.png?​600|}} 
- 
-{{manual:​discovery:​low_level_discovery:​discovered_graphs_snmp.png?​600|}} 
- 
-=== - Обнаружение с использованием SQL запросов ODBC === 
- 
-Этот тип обнаружения осуществляется с использованием SQL запросов,​ полученные результаты которых автоматически преобразуются в объект JSON, пригодный для низкоуровневого обнаружения. SQL запросы выполняются при помощи элементов данных типа "​Монитор баз данных"​. Так что, большая часть указаний со страницы [[:​ru/​manual/​config/​items/​itemtypes/​odbc_checks|ODBC мониторинга]] применима к получению работающего "​Монитора баз данных"​ правила обнаружения,​ единственная разница лишь в том, что необходимо использовать ключ "​db.odbc.discovery[<​описание>,<​dsn>​]"​ вместо "​db.odbc.select[<​описание>,<​dsn>​]"​. 
- 
-В качестве практического примера,​ иллюстрирующего как SQL запрос трансформируется в JSON, рассмотрим низкоуровневое обнаружения Zabbix прокси,​ выполнив ODBC запрос в Zabbix базу данных. Он может быть полезен для автоматического создания [[:​ru/​manual/​config/​items/​itemtypes/​internal|внутренних элементов данных]] "​zabbix[proxy,<​имя>,​lastaccess]",​ чтобы наблюдать какие прокси живы. 
- 
-Давайте начнем с настройки правила обнаружения:​ 
- 
-{{manual:​discovery:​low_level_discovery:​discovery_rule_odbc.png}} 
- 
-Здесь используется следующий прямой запрос в базу данных Zabbix для выборки всех Zabbix прокси вместе с количеством узлов сети, за которыми эти прокси наблюдают. Количество узлов сети можно использовать,​ например,​ для фильтрации пустых прокси:​ 
- 
-<​code>​ 
-mysql> SELECT h1.host, COUNT(h2.host) AS count FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxy_hostid WHERE h1.status IN (5, 6) GROUP BY h1.host; 
-+---------+-------+ 
-| host    | count | 
-+---------+-------+ 
-| Japan 1 |     5 | 
-| Japan 2 |    12 | 
-| Latvia ​ |     3 | 
-+---------+-------+ 
-3 rows in set (0.01 sec) 
-</​code>​ 
- 
-Благодаря внутреннему механизму обработки элемента данных "​db.odbc.discovery[]",​ результат этого запроса автоматически преобразуется в следующий JSON: 
- 
-<code js> 
-{ 
-    "​data":​ [ 
-        { 
-            "​{#​HOST}":​ "Japan 1", 
-            "​{#​COUNT}":​ "​5"​ 
-        }, 
-        { 
-            "​{#​HOST}":​ "Japan 2", 
-            "​{#​COUNT}":​ "​12"​ 
-        }, 
-        { 
-            "​{#​HOST}":​ "​Latvia",​ 
-            "​{#​COUNT}":​ "​3"​ 
-        } 
-    ] 
-} 
-</​code>​ 
- 
-Видно, что имена колонок становятся именами макросов и выбранные строки становятся значениями этих макросов. 
- 
-<​note>​ 
-Если результат преобразования имени колонки в имя макроса неочевиден,​ предлагается использовать алиасы к именам колонок,​ так же как "​COUNT(h2.host) AS count" в примере выше. 
- 
-В случае,​ если имя колонки не удается сконвертировать в допустимое имя макроса,​ правило обнаружения становится неподдерживаемым с детальным сообщением об ошибке какой номер колонки не удалось преобразовать. Если желательна дополнительная помощь,​ полученные имена колонки отражаются при ​ DebugLevel=4 в файле журнала Zabbix сервера:​ 
- 
-<​code>​ 
-$ grep db.odbc.discovery /​tmp/​zabbix_server.log 
- ... 
- ​23876:​20150114:​153410.856 In db_odbc_discovery() query:'​SELECT h1.host, COUNT(h2.host) FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxy_hostid WHERE h1.status IN (5, 6) GROUP BY h1.host;'​ 
- ​23876:​20150114:​153410.860 db_odbc_discovery() column[1]:'​host'​ 
- ​23876:​20150114:​153410.860 db_odbc_discovery() column[2]:'​COUNT(h2.host)'​ 
- ​23876:​20150114:​153410.860 End of db_odbc_discovery():​NOTSUPPORTED 
- ​23876:​20150114:​153410.860 Item [Zabbix server:​db.odbc.discovery[proxies,​{$DSN}]] error: Cannot convert column #2 name to macro. 
-</​code>​ 
-</​note>​ 
- 
-Теперь,​ когда мы понимаем как SQL запрос трансформируется в JSON объект,​ мы можем использовать макрос {#HOST} в прототипах элементов данных:​ 
- 
-{{manual:​discovery:​low_level_discovery:​item_prototype_odbc.png}} 
- 
-Как только обнаружение будет выполнено,​ элемент данных будет создан по каждому прокси:​ 
- 
-{{manual:​discovery:​low_level_discovery:​discovered_items_odbc.png}} 
- 
-=== - Обнаружение служб Windows === 
- 
-Обнаружение служб Windows осуществляется тем же самым способом,​ что и обнаружение файловых систем. Используемым ключем в правиле обнаружения является "​service.discovery"​ и поддерживаются следующие макросы для применения их в [[#​обнаружение_файловых_систем|фильтре]] и прототипах элементов данных/​триггерах/​графиков:​ 
- 
-<​code>​ 
-{#​SERVICE.NAME} 
-{#​SERVICE.DISPLAYNAME} 
-{#​SERVICE.DESCRIPTION} 
-{#​SERVICE.STATE} 
-{#​SERVICE.STATENAME} 
-{#​SERVICE.PATH} 
-{#​SERVICE.USER} 
-{#​SERVICE.STARTUP} 
-{#​SERVICE.STARTUPNAME} 
-</​code>​ 
- 
-На основе обнаружения служб Windows вы можете создать прототип элементов данных вроде "​service.info[{#​SERVICE.NAME},<​парам>​]",​ где //​парам//​ принимает следующие значения:​ //state//, //​displayname//,​ //path//, //user//, //startup// или //​description//​. Например,​ чтобы получить отображаемое имя службы вам необходимо использовать элемент данных "​service.info[{#​SERVICE.NAME},​displayname]"​. Если значение //​парам//​ не указано ("​service.info[{#​SERVICE.NAME}]"​),​ будет использоваться параметр //state// по умолчанию. 
- 
-Макросы {#​SERVICE.STATE} и {#​SERVICE.STATENAME} возвращают одинаковое содержимое,​ однако,​ {#​SERVICE.STATE} возвращает числовое значение (0-7), тогда как {#​SERVICE.STATENAME} возвращает текст (//​running//,​ //paused//, //start pending//, //pause pending//, //continue pending//, //stop pending//, //stopped// или //​unknown//​). То же самое относится и к {#​SERVICE.STARTUP} и {#​SERVICE.STARTUPNAME},​ где первый возвращает числовое значение (0-4), тогда как второй - текст (//​automatic//,​ //automatic delayed//, //manual//, //​disabled//,​ //​unknown//​). 
-=== - Создание пользовательских LLD правил === 
- 
-Также имеется возможность создать полностью пользовательское правило низкоуровневого обнаружения,​ для обнаружения любого типа объектов - к примеру,​ баз данных на сервере баз данных. 
- 
-Чтобы это сделать,​ необходимо создать пользовательский элемент данных,​ который будет возвращать JSON, определяющий найденные объекты и опционально - некоторые свойства этих объектов. Количество макросов на объект не ограничено - в то время как встроенные правила обнаружения возвращают либо один, либо два макроса (нппример,​ два в случае обнаружения файловых систем),​ имеется возможность возвращать больше. 
- 
-Требуемый JSON формат лучше всего иллюстрируется в примере. Предположим,​ что мы оставим старый Zabbix агент версии 1.8 (который не поддерживает "​vfs.fs.discovery"​),​ но нам также нужно обнаруживать файловые системы. Вот простой Perl скрипт для Linux, который обнаруживает примонтированные файловые системы и выдает на выходе данные JSON, в которых включено и имя, и тип файловой системы. Одним из способов его использования является UserParameter с ключем "​vfs.fs.discovery_perl":​ 
- 
-<code perl> 
-#​!/​usr/​bin/​perl 
- 
-$first = 1; 
- 
-print "​{\n";​ 
-print "​\t\"​data\":​[\n\n";​ 
- 
-for (`cat /​proc/​mounts`) 
-{ 
-    ($fsname, $fstype) = m/\S+ (\S+) (\S+)/; 
-    $fsname =~ s!/!\\/!g; 
- 
-    print "​\t,​\n"​ if not $first; 
-    $first = 0; 
- 
-    print "​\t{\n";​ 
-    print "​\t\t\"​{#​FSNAME}\":​\"​$fsname\",​\n";​ 
-    print "​\t\t\"​{#​FSTYPE}\":​\"​$fstype\"​\n";​ 
-    print "​\t}\n";​ 
-} 
- 
-print "​\n\t]\n";​ 
-print "​}\n";​ 
-</​code>​ 
- 
-<note important>​Допустимыми символами в именах макросов низкоуровневых правил обнаружения являются **0-9** , **A-Z** , **_** , **.** \\ \\  Буквы в нижнем регистре в именах не поддерживаются.</​note>​ 
- 
-Пример его вывода (переформатирован для наглядности) представлен ниже. JSON данные от пользовательской проверки обнаружения следуют такому же формату. ​ 
- 
-  { 
-    "​data":​[ 
-    ​ 
-    { "​{#​FSNAME}":"​\/", ​                          "​{#​FSTYPE}":"​rootfs" ​  }, 
-    { "​{#​FSNAME}":"​\/​sys", ​                       "​{#​FSTYPE}":"​sysfs" ​   }, 
-    { "​{#​FSNAME}":"​\/​proc", ​                      "​{#​FSTYPE}":"​proc" ​    }, 
-    { "​{#​FSNAME}":"​\/​dev", ​                       "​{#​FSTYPE}":"​devtmpfs"​ }, 
-    { "​{#​FSNAME}":"​\/​dev\/​pts", ​                  "​{#​FSTYPE}":"​devpts" ​  }, 
-    { "​{#​FSNAME}":"​\/", ​                          "​{#​FSTYPE}":"​ext3" ​    }, 
-    { "​{#​FSNAME}":"​\/​lib\/​init\/​rw", ​             "​{#​FSTYPE}":"​tmpfs" ​   }, 
-    { "​{#​FSNAME}":"​\/​dev\/​shm", ​                  "​{#​FSTYPE}":"​tmpfs" ​   }, 
-    { "​{#​FSNAME}":"​\/​home", ​                      "​{#​FSTYPE}":"​ext3" ​    }, 
-    { "​{#​FSNAME}":"​\/​tmp", ​                       "​{#​FSTYPE}":"​ext3" ​    }, 
-    { "​{#​FSNAME}":"​\/​usr", ​                       "​{#​FSTYPE}":"​ext3" ​    }, 
-    { "​{#​FSNAME}":"​\/​var", ​                       "​{#​FSTYPE}":"​ext3" ​    }, 
-    { "​{#​FSNAME}":"​\/​sys\/​fs\/​fuse\/​connections",​ "​{#​FSTYPE}":"​fusectl" ​ } 
-    ​ 
-    ] 
-  } 
-  
-  
-Тогда, в правилах обнаружения в поле "​Фильтр"​ мы можем указать "​{#​FSTYPE}",​ как макрос,​ и "​rootfs|ext3",​ как регулярное выражение. 
- 
-<​note>​Вы не обязаны использовать имена макросов FSNAME/​FSTYPE в пользовательских правилах низкоуровневого обнаружения,​ вы можете использовать любые другие имена, которые вам нравятся.</​note>​