Обнаружение объектов JMX
Обзор
Существует возможность обнаруживать все JMX MBean-ы или атрибуты MBean, либо указывать шаблон для обнаружения этих объектов.
Для настройки правила обнаружения обязательно нужно понимать различие между объектами MBean и атрибутами MBean. MBean — это объект, который может представлять устройство, приложение или любой другой ресурс, требующий наблюдения.
Например, существует MBean, представляющий веб-сервер. Его атрибутами являются количество соединений, количество потоков, тайм-аут запроса, файловый кэш http, использование памяти и т.д. Выражая эту мысль понятным человеческим языком, мы можем определить кофеварку как MBean, имеющий следующие атрибуты для мониторинга: количество воды на чашку, средний расход воды за определённый период времени, количество кофейных зёрен, необходимое на чашку, время перезаправки кофейными зёрнами и водой и т. д.
Ключ элемента данных
В конфигурации правила обнаружения выберите JMX agent в поле Type.
Для обнаружения JMX-объектов поддерживаются два ключа элемента данных - jmx.discovery[] и jmx.get[]:
| Ключ элемента данных | |||
|---|---|---|---|
| Возвращаемое значение | Параметры | Комментарий | |
| jmx.discovery[<режим обнаружения>,<имя объекта>,<уникальное краткое описание>] | |||
| Этот элемент данных возвращает массив JSON с макросами LLD, описывающими объекты MBean или их атрибуты. | режим обнаружения - один из следующих: attributes (получение атрибутов JMX MBean, по умолчанию) или beans (получение JMX MBeans) имя объекта - шаблон имени объекта (см. документацию), определяющий имена 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) имя объекта - шаблон имени объекта (см. документацию), определяющий имена MBean, которые нужно получить (по умолчанию пусто, получаются все зарегистрированные beans) уникальное краткое описание - уникальное описание, позволяющее использовать несколько элементов данных JMX с одинаковыми режимом обнаружения и именем объекта на узле сети (необязательно) |
При использовании этого элемента данных необходимо определить пользовательские макросы низкоуровневого обнаружения, указывающие на значения, извлеченные из возвращаемого JSON с помощью JSONPath. | |
Если параметры не переданы, запрашиваются все атрибуты MBean
из JMX. Неуказание параметров для обнаружения 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}
Пожалуйста, рассмотрите данный пример 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 (без атрибутов) выглядит наподобие следующего:

Используемый здесь ключ:
jmx.discovery[beans,"*:type=GarbageCollector,name=*"]
Будут обнаружены все сборщики мусора (garbage collectors) без атрибутов. Поскольку сборщики мусора имеют одинаковый набор атрибутов, мы можем использовать желаемые атрибуты в прототипах элементов данных следующим образом:

Используемые здесь ключи:
jmx[{#JMXOBJ},CollectionCount]
jmx[{#JMXOBJ},CollectionTime]
jmx[{#JMXOBJ},Valid]
Правило LLD обнаружения приведёт к чему-то, близкому к этому (элементы данных обнаружены для двух сборщиков мусора):

Пример 2: Обнаружение атрибутов MBean
Этот объект вернёт 9 объектов со следующими полями: MBean1Attribute1, MBean2Attribute1, MBean3Attribute1, MBean1Attribute2, MBean2Attribute2, MBean3Attribute2, MBean1Attribute3, MBean2Attribute3, MBean3Attribute3.
Для более подробной информации об объектах, пожалуйста, обратитесь к таблице поддеживаемых макросов, раздел Обнаружение атрибутов MBean.
Конфигурация правила обнаружения, собирающего атрибуты MBean, выглядит наподобие следующего:

Используемый здесь ключ:
jmx.discovery[attributes,"*:type=GarbageCollector,name=*"]
Будут обнаружены все сборщики мусора с одним атрибутом.

В данном конкретном случае будет создан элемент данных из прототипа для каждого атрибута 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
}
}
]