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

Обзор

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

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

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

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

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

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

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

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

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

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

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

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

[
    {
        "{#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"
    }
]

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

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

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

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

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

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

Рассмотрим следующий пример 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, собирающим MBean, и правилом LLD, собирающим атрибуты MBean, пожалуйста, взгляните на следующую таблицу:

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

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

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

Настройка правила обнаружения, собирающего MBeans (без атрибутов), выглядит следующим образом:

lld\_rule\_mbean.png

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

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

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

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 macro в конфигурации правила обнаружения, используя 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
        }
    }
]