5 Обнаружение JMX объектов

Обзор

Существует возможность обнаруживать все JMX MBean-ы или атрибуты MBean, либо указывать шаблон для обнаружения этих объектов.

Для настройки правила обнаружения обязательно нужно понимать различие между объектами MBean и атрибутами MBean. MBean - это объект, который может представлять устройство, приложение или любой другой ресурс, требующий наблюдения.

Например, существует MBean, представляющий веб-сервер. Его атрибутами являются количество соединений, количество потоков, тайм-аут запроса, файловый кэш http, использование памяти и т.д. Выражая эту мысль понятным человеческим языком, мы можем определить кофеварку как MBean, имеющий следующие атрибуты для мониторинга: количество воды на чашку, средний расход воды за определенный период времени, количество кофейных зёрен, необходимое на чашку, время перезаправки кофейными зёрнами и водой и т. д.

Ключ элемента данных

В настройках правила обнаружения, в поле Тип выберите JMX агент.

Для обнаружения JMX объектов поддерживаются два ключа элементов данных - jmx.discovery[] и jmx.get[]:

Ключ элемента данных
Возвращаемое значение Параметры Комментарий
jmx.discovery[<режим обнаружения>,<имя объекта>,<уникальное короткое описание>]
Этот элемент данных возвращает массив JSON с LLD макросами, описывающими объекты MBean или их атрибуты. режим обнаружения - один из следующих: attributes (вернуть атрибуты JMX MBean, по умолчанию) или beans (вернуть объекты JMX MBean)
имя объекта - шаблон имени объекта (см. документацию [en]), идентифицирующий имена MBean-ов, которые надо вернуть (по умолчанию пусто, вернёт все зарегистрированные bean-ы)
уникальное короткое описание - уникальное описание, позволяющее на том же узле сети задать несколько элементов данных JMX с тем же режимом обнаружения и именем объекта (опционально)
Примеры:
→ jmx.discovery - вернуть все атрибуты JMX MBean-ов
→ jmx.discovery[beans] - вернуть все JMX MBean-ы
→ jmx.discovery[attributes,"*:type=GarbageCollector,name=*"] - вернуть все атрибуты сборщика мусора (garbage collector-а)
→ jmx.discovery[beans,"*:type=GarbageCollector,name=*"] - вернуть все сборщики мустора

Имеются некоторые ограничения относительно того, какие свойства MBean-ов этот элемент данных может вернуть, вызванные ограниченным набором символов, который поддерживается при генерации имён макросов (поддерживаемые символы могут быть описаны следующим регулярным выражением: «A-Z0-9_\.»). Поэтому для обнаружения, скажем, свойств MBean-ов, содержащих слова через дефис (знак минус) или не-ASCII символы, вам нужно использовать jmx.get[].

Поддерживается с версии Zabbix Java gateway 3.4.
jmx.get[<режим обнаружения>,<имя объекта>,<уникальное короткое описание>]
Этот элемент данных возвращает массив JSON с объектами MBean или их атрибутами.

По сравнению с jmx.discovery[], он не определяет LLD макросы.
режим обнаружения - один из следующих: attributes (вернуть атрибуты JMX MBean, по умолчанию) или beans (вернуть объекты JMX MBean)
имя объекта - шаблон имени объекта (см. документацию [en]), идентифицирующий имена MBean-ов, которые надо вернуть (по умолчанию пусто, вернёт все зарегистрированные bean-ы)
уникальное короткое описание - уникальное описание, позволяющее на том же узле сети задать несколько элементов данных JMX с тем же режимом обнаружения и именем объекта (опционально)
При использовании этого элемента данных необходимо определить настраиваемые макросы низкоуровневого обнаружения, указывающие на значения, извлекаемые из возвращаемого JSON-а с помощью JSONPath.

Поддерживается с версии Zabbix Java gateway 4.4.

Если не передано никаких параметров, из JMX запрашиваются все атрибуты MBean-ов. Отсутствие параметров для JMX обнаружения или попытка получить все атрибуты для широкого диапазона наподобие *:type=*,name=* может привести к потенциальным проблемам с производительностью.

Использование jmx.discovery

Этот элемент данных возвращает объект JSON с макросами низкоуровневого обнаружения, описывающими объекты MBean или их атрибуты. Например, при обнаружении атрибутов MBean attributes (отформатировано для наглядности):

[
           {
               "{#JMXVALUE}":"0",
               "{#JMXTYPE}":"java.lang.Long",
               "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
               "{#JMXDESC}":"java.lang:type=GarbageCollector,name=PS Scavenge,CollectionCount",
               "{#JMXATTR}":"CollectionCount"
           },
           {
               "{#JMXVALUE}":"0",
               "{#JMXTYPE}":"java.lang.Long",
               "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
               "{#JMXDESC}":"java.lang:type=GarbageCollector,name=PS Scavenge,CollectionTime",
               "{#JMXATTR}":"CollectionTime"
           },
           {
               "{#JMXVALUE}":"true",
               "{#JMXTYPE}":"java.lang.Boolean",
               "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
               "{#JMXDESC}":"java.lang:type=GarbageCollector,name=PS Scavenge,Valid",
               "{#JMXATTR}":"Valid"
           },
           {
               "{#JMXVALUE}":"PS Scavenge",
               "{#JMXTYPE}":"java.lang.String",
               "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
               "{#JMXDESC}":"java.lang:type=GarbageCollector,name=PS Scavenge,Name",
               "{#JMXATTR}":"Name"
           },
           {
               "{#JMXVALUE}":"java.lang:type=GarbageCollector,name=PS Scavenge",
               "{#JMXTYPE}":"javax.management.ObjectName",
               "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
               "{#JMXDESC}":"java.lang:type=GarbageCollector,name=PS Scavenge,ObjectName",
               "{#JMXATTR}":"ObjectName"
           }
       ]

При обнаружении объектов MBeans (отформатировано для наглядности):

[
           {
               "{#JMXDOMAIN}":"java.lang",
               "{#JMXTYPE}":"GarbageCollector",
               "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
               "{#JMXNAME}":"PS Scavenge"
           }
       ]
Поддерживаемые макросы

Следующие макросы поддерживаются для использования в фильтре правил обнаружения и прототипах элементов данных, триггеров и графиков:

Макрос Описание
Обнаружение атрибутов MBean
{#JMXVALUE} Значение атрибута.
{#JMXTYPE} Тип атрибута.
{#JMXOBJ} Имя объекта.
{#JMXDESC} Имя объекта вместе с именем атрибута.
{#JMXATTR} Имя атрибута.
Обнаружение объектов MBeans
{#JMXDOMAIN} Домен MBean. (зарезервированное имя Zabbix)
{#JMXOBJ} Имя объекта. (зарезервированное имя Zabbix)
{#JMX<свойство ключа>} Свойства MBean (наподобие {#JMXTYPE}, {#JMXNAME}) (смотрите Ограничения ниже).
Ограничения

Имеются некоторые ограничения, связанные с алгоритмом создания имён LLD макросов из имён свойств MBean:

  • имена атрибутов приводятся к верхнему регистру
  • имена атрибутов игнорируются (LLD макросы не генерируются), если они состоят из символов, неподдерживаемых для имён LLD макросов. Поддерживаемые символы могут быть описаны следующим регулярным выражением: A-Z0-9_\.
  • если атрибуты называются «obj» или «domain», они будут проигнорированы, т.к. перекрываются со значениями зарезервированных в Zabbix свойств {#JMXOBJ} и {#JMXDOMAIN} (поддерживются с версии Zabbix 3.4.3.)

Пожалуйста, рассмотрите данный пример jmx.discovery (с режимом «beans»). MBean имеет следующие определённые для него свойства (некоторые из которых будут игнорироваться; см. ниже):

name=test
       тип=Type
       attributes []=1,2,3
       Name=NameOfTheTest
       domAin=some

В результате JMX обнаружения, будут сгенерированы следующие LLD макросы:

  • {#JMXDOMAIN} - внутренний макрос Zabbix, описывающий домен MBean
  • {#JMXOBJ} - внутренний макрос Zabbix, описывающий объект MBean
  • {#JMXNAME} - создан из свойства «name»

Проигнорированные свойства:

  • тип : его имя содержит неподдерживаемые символы (не-ASCII)
  • attributes[] : его имя содержит неподдерживаемые символы (квадратные скобки не поддерживаются)
  • Name : уже определено (name=test)
  • domAin : зарезервированное имя Zabbix
Примеры

Давайте обратимся ещё к двум более практическим примерам создания правил LLD с применением MBean. Для лучшего понимания разницы между правилом LLD, собирающем объекты MBeans, и правилом LLD, собирающем атрибуты MBean, взгляните на следующую таблицу:

MBean1 MBean2 MBean3
MBean1Attribute1 MBean2Attribute1 MBean3Attribute1
MBean1Attribute2 MBean2Attribute2 MBean3Attribute2
MBean1Attribute3 MBean2Attribute3 MBean3Attribute3
Пример 1: Обнаружение MBeans

Это правило вернёт 3 объекта: верхнюю строку со столбцами: MBean1, MBean2, MBean3.

Для более подробной информации об объектах, пожалуйста, обратитесь к таблице поддерживаемые макросы, раздел Обнаружение объектов MBean.

Конфигурация правила обнаружения для сбора объектов MBeans (без атрибутов) выглядит наподобие следующего:

lld_rule_mbean.png

Используемый здесь ключ:

jmx.discovery[beans,"*:type=GarbageCollector,name=*"]

Будут обнаружены все сборщики мусора (garbage collectors) без атрибутов. Поскольку сборщики мусора имеют одинаковый набор атрибутов, мы можем использовать желаемые атрибуты в прототипах элементов данных следующим образом:

lld_rule_mbean_prototypes.png

Используемые здесь ключи:

jmx[{#JMXOBJ},CollectionCount] 
       jmx[{#JMXOBJ},CollectionTime] 
       jmx[{#JMXOBJ},Valid] 

Правило LLD обнаружения приведёт к чему-то, близкому к этому (элементы данных обнаружены для двух сборщиков мусора):

discovery_rule_mbean_3.png

Пример 2: Обнаружение атрибутов MBean

Этот объект вернёт 9 объектов со следующими полями: MBean1Attribute1, MBean2Attribute1, MBean3Attribute1, MBean1Attribute2, MBean2Attribute2, MBean3Attribute2, MBean1Attribute3, MBean2Attribute3, MBean3Attribute3.

Для более подробной информации об объектах, пожалуйста, обратитесь к таблице поддеживаемых макросов, раздел Обнаружение атрибутов MBean.

Конфигурация правила обнаружения, собирающего атрибуты MBean, выглядит наподобие следующего:

lld_rule_mbean_attr.png

Используемый здесь ключ:

jmx.discovery[attributes,"*:type=GarbageCollector,name=*"]

Будут обнаружены все сборщики мусора с одним атрибутом.

lld_rule_mbean_attr_prototypes.png

В данном конкретном случае будет создан элемент данных из прототипа для каждого атрибута MBean. Главный недостаток этой конфигурации - что невозможно создание триггера из прототипа триггера, поскольку имеется только один прототип элемента данных для всех атрибутов. Поэтому такая настройка может использоваться для сбора данных, но не рекомендуется для автоматического мониторинга.

Использование jmx.get

Элемент данных jmx.get[] похож на jmx.discovery[], но он не превращает свойства объектов Java в имена макросов низкоуровневого обнаружения и поэтому может возвращать значения без ограничений, связанных с генерацией имён LLD макросов - таких как дефисы или не-ASCII символы.

При использовании jmx.get[] для обнаружения, макросы низкоуровневого обнаружения могут быть определены отдельно на вкладке настраиваемых LLD макросов настроек правила обнаружения, используя JSONPath для указания на нужные значения.

Обнаружение объектов MBean

Элемент данных обнаружения: jmx.get[beans,"com.example:type=*,*"]

Ответ:

[
           {
               "object": "com.example:type=Hello,data-src=data-base,ключ=значение",
               "domain": "com.example",
               "properties": {
                   "data-src": "data-base",
                   "ключ": "значение",
                   "type": "Hello"
               }
           },
           {
               "object": "com.example:type=Atomic",
               "domain": "com.example",
               "properties": {
                   "type": "Atomic"
               }
           }
       ]
Обнаружение атрибутов MBean

Элемент данных обнаружения: jmx.get[attributes,"com.example:type=*,*"]

Ответ:

[
           {
               "object": "com.example:type=*",
               "domain": "com.example",
               "properties": {
                   "type": "Simple"
               }
           },
           {
               "object": "com.zabbix:type=yes,domain=zabbix.com,data-source=/dev/rand,ключ=значение,obj=true",
               "domain": "com.zabbix",
               "properties": {
                   "type": "Hello",
                   "domain": "com.example",
                   "data-source": "/dev/rand",
                   "ключ": "значение",
                   "obj": true
               }
           }
       ]