13. JMX мониторинг
Обзор
Мониторинг JMX можно использовать для мониторинга счётчиков JMX в Java приложениях.
Мониторинг JMX имеет в Zabbix встроенную поддержку в виде демона Zabbix, называемого «Zabbix Java gateway».
Когда Zabbix сервер хочет узнать значение конкретного счетчика JMX у узла сети, он опрашивает Zabbix Java gateway, который, в свою очередь, использует API управления JMX [en], чтобы удалённо опросить интересующее приложение.
Для получения более подробных сведений, включая настройку, смотрите раздел Zabbix Java gateway.
Подключения между Java gateway и наблюдаемым JMX приложением не должны быть закрыты брандмауэром.
Включение удалённого JMX мониторинга для Java приложений
Приложению Java не требуется какое-либо дополнительно установленное программное обеспечение, но для поддержки удалённого мониторинга JMX приложение необходимо запустить с указанными ниже параметрами командной строки.
Как минимум, если вы просто хотите начать мониторинг простого приложения Java на локальном хосте без какой-либо защиты, запустите его со следующими параметрами:
java \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.registry.ssl=false \
-jar /полный/путь/приложение.jar
С этими аргументами Java будет слушать входящие соединения JMX на порту 12345, только с локального хоста, без необходимости в аутентификации или SSL.
Если вы хотите разрешить подключения с другого интерфейса, укажите параметр -Djava.rmi.server.hostname равным IP адресу этого интерфейса.
Если вы хотите иметь более строгую проверку в плане безопасности, вам доступно множество других опций Java. Скажем, следующий пример запускает приложение с более мудрёным набором опций и открывает это приложение для более широкой сети, а не только для локального компьютера.
java \
-Djava.rmi.server.hostname=192.168.3.14 \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.password.file=/etc/java-6-openjdk/management/jmxremote.password \
-Dcom.sun.management.jmxremote.access.file=/etc/java-6-openjdk/management/jmxremote.access \
-Dcom.sun.management.jmxremote.ssl=true \
-Dcom.sun.management.jmxremote.registry.ssl=true \
-Djavax.net.ssl.keyStore=$ВАШЕ_ХРАНИЛИЩЕ_КЛЮЧЕЙ \
-Djavax.net.ssl.keyStorePassword=$ВАШ_ПАРОЛЬ_К_ХРАНИЛИЩУ_КЛЮЧЕЙ \
-Djavax.net.ssl.trustStore=$ВАШЕ_ДОВЕРЕННОЕ_ХРАНИЛИЩЕ \
-Djavax.net.ssl.trustStorePassword=$ВАШ_ПАРОЛЬ_К_ДОВЕРЕННОМУ_ХРАНИЛИЩУ \
-Dcom.sun.management.jmxremote.ssl.need.client.auth=true \
-jar /полный/путь/приложение.jar
Большинство (если не все) из этих настроек можно указать в $JRE/lib/management/management.properties (или там, где этот файл расположен на вашем компьютере).
Обратите внимание, что если вы хотите использовать SSL, вам необходимо изменить скрипт startup.sh, добавив в него опции Java gateway
-Djavax.net.ssl.*, чтобы он знал, где найти хранилище ключей и доверенное хранилище.
Смотрите Мониторинг и Управление с использованием JMX [en] для получения более подробной информации.
Настройка JMX интерфейсов и элементов данных в веб-интерфейсе Zabbix
Когда Java Gateway запущен, сервер знает, где его искать, и Java приложение запущено с поддержкой удалённого JMX мониторинга, самое время настроить интерфейсы и элементы данных в веб-интерфейсе Zabbix.
Настройка JMX интерфейса
Начнём с создания интерфейса типа JMX у интересующего узла сети.

Все обязательные поля ввода отмечены красной звёздочкой.
Добавление элемента данных JMX агента
Для каждого интересующего вас счётчика JMX необходимо добавить элемент данных с типом JMX агент, присоединённый к этому интерфейсу.\
Ключ на снимке экрана ниже имеет следующий вид: jmx["java.lang:type=Memory","HeapMemoryUsage.used"].

Все обязательные поля ввода отмечены красной звёздочкой.
Поля, требующие информации, специфичной для JMX элементов данных:
| Тип (Type) | Укажите здесь JMX агент. |
| Ключ (Key) | Ключ элемента данных jmx[] содержит три параметра:имя объекта — имя объекта MBean; имя атрибута — имя атрибута MBean с опциональными составными именами полей данных, разделённых точками. уникальное короткое описание — уникальное описание, которое позволит создать на одном узле сети несколько JMX элементов данных с одинаковыми именем объекта и именем атрибута (опционально) Подробнее о ключах JMX элементов данных смотрите ниже. Вы можете обнаруживать MBeans и MBean атрибуты, используя элемент данных низкоуровневого обнаружения jmx.discovery[]. |
| JMX endpoint | Вы можете указать пользовательский JMX endpoint. Убедитесь, что параметры подключения JMX endpoint совпадают с JMX интерфейсом. Это можно сделать при помощи макросов {HOST.*}, как уже сделано в JMX endpoint по умолчанию. Поддерживаются макросы} и пользовательские макросы. |
| Имя пользователя (User name) |
Укажите имя пользователя (до 255 символов), если вы настроили аутентификацию у вашего Java приложения. Поддерживаются пользовательские макросы. |
| Пароль (Password) |
Укажите пароль (до 255 символов), если вы настроили аутентификацию у вашего Java приложения. Поддерживаются пользовательские макросы. |
Если вы хотите наблюдать за логическим счётчиком, который может иметь значение «true» или «false», укажите тип информации «Числовой (целое положительное)» и добавьте шаг предварительной обработки «Логический в десятичный» на вкладке Предобработка. Сервер будет сохранять логические значения как 1 или 0, соответственно.
Более подробно о ключах элементов данных JMX
Простые атрибуты
Имя объекта MBean — это не что иное, как строка, которую вы определили в вашем Java приложении. Имя атрибута, с другой стороны, может быть более сложным. В случае, если атрибут возвращает простой тип данных (целое число, строку и т.п.), то беспокоиться не о чем, ключ будет выглядеть примерно так:
jmx[com.example:Type=Hello,weight]
В этом примере именем объекта является «com.example:Type=Hello», именем атрибута будет «weight», а тип возвращаемого значения, скорее всего, должен быть «Числовой (с плавающей точкой)».
Атрибуты, возвращающие составные данные
Ключ становится более сложным, когда ваш атрибут возвращает составные данные. Например: именем вашего атрибута является «apple», и он возвращает хеш представляющих его параметров, таких как «weight», «color» и прочее. Тогда ваш ключ может выглядеть примерно так:
jmx[com.example:Type=Hello,apple.weight]
Этот пример показывает, как разделяются с помощью точки имя атрибута и ключ хеша. Точно также, если атрибут возвращает вложенные составные данные, их части снова нужно разделять точкой:
jmx[com.example:Type=Hello,fruits.apple.weight]
Атрибуты, возвращающие табличные данные
Атрибуты с табличными данными состоят из одного или нескольких составных атрибутов. Если такой атрибут указан в параметре имени атрибута, то значение этого элемента данных вернёт всю структуру атрибута в формате JSON. Значения отдельных элементов из табличных данных можно извлечь с помощью предобработки.
Пример атрибута с табличными данными:
jmx[com.example:type=Hello,foodinfo]
Значение элемента данных:
[
{
"a": "apple",
"b": "banana",
"c": "cherry"
},
{
"a": "potato",
"b": "lettuce",
"c": "onion"
}
]
Проблема с точками
Пока все хорошо. Но что, если имя атрибута или ключ хеша содержит символ точки? Вот пример:
jmx[com.example:Type=Hello,all.fruits.apple.weight]
Это проблема. Как сказать Zabbix'у, что имя атрибута — «all.fruits», а не просто «all»? Как отличить точку, которая является частью имени, от точки, которая разделяет имя атрибута и ключи хешей?
Это возможно; всё, что вам требуется сделать — экранировать точки, которые являются частью имени, обратной косой чертой:
jmx[com.example:Type=Hello,all\.fruits.apple.weight]
Аналогично, если ваш ключ хеша содержит точку, вам необходимо её экранировать:
jmx[com.example:Type=Hello,all\.fruits.apple.total\.weight]
Другие проблемы
Символ обратной косой черты в имени атрибута также необходимо экранировать:
jmx[com.example:type=Hello,c:\\documents]
Для обработки любых других символов в ключе JMX элемента данных, пожалуйста, обратитесь к разделу формата ключа элементов данных.
На самом деле это всё, что нужно сделать. Успешного мониторинга JMX!
Непримитивные типы данных
Имеется возможность работы с пользовательскими MBean, возвращающими непримитивные типы данных, которые переопределяют метод toString().
Использование пользовательского endpoint с JBoss EAP 6.4
Пользовательские endpoint'ы позволяют работать с различными транспортными протоколами, отличными от протокола по умолчанию RMI.
Для иллюстрации этой возможности давайте попытаемся настроить мониторинг JBoss EAP 6.4 в качестве примера. Во-первых, давайте сделаем некоторые предположения:
- У вас уже имеется установленный Zabbix Java gateway. Если нет, тогда вы можете его установить, руководствуясь документацией.
- Zabbix сервер и Java gateway установлены с префиксом
/usr/local/. - JBoss уже установлен в
/opt/jboss-eap-6.4/и запущен в автономном режиме. - Мы предположим, что все эти компоненты работают на одном и том же узле сети.
- Брандмауэр и SELinux отключены (или настроены должным образом).
Давайте выполним некоторые простые настройки в zabbix_server.conf:
JavaGateway=127.0.0.1
StartJavaPollers=5
И в файле конфигурации zabbix_java/settings.sh (или zabbix_java_gateway.conf):
START_POLLERS=5
Удостоверьтесь, что JBoss слушает свой стандартный порт управления:
$ netstat -natp | grep 9999
tcp 0 0 127.0.0.1:9999 0.0.0.0:* LISTEN 10148/java
Теперь давайте создадим в Zabbix узел сети с JMX интерфейсом 127.0.0.1:9999.

Поскольку мы знаем, что эта версия JBoss использует протокол JBoss Remoting вместо RMI, то мы можем использовать массовое обновление параметра JMX endpoint в нашем шаблоне JMX соответствующим образом:
service:jmx:remoting-jmx://{HOST.CONN}:{HOST.PORT}

Давайте обновим кэш конфигурации:
/usr/local/sbin/zabbix_server -R config_cache_reload
Обратите внимание, что сначала может возникнуть ошибка.

«Unsupported protocol: remoting-jmx» означает, что Java gateway не знает, как работать с указанным протоколом. Эту ошибку можно исправить, создав файл ~/needed_modules.txt со следующим содержимым:
jboss-as-remoting
jboss-logging
jboss-logmanager
jboss-marshalling
jboss-remoting
jboss-sasl
jcl-over-slf4j
jul-to-slf4j-stub
log4j-jboss-logmanager
remoting-jmx
slf4j-api
xnio-api
xnio-nio
и затем выполнив эту команду:
for i in $(cat ~/needed_modules.txt); do find /opt/jboss-eap-6.4 -iname "${i}*.jar" -exec cp '{}' /usr/local/sbin/zabbix_java/lib/ \; ; done
Таким образом, Java gateway будет иметь все необходимые модули для работы с jmx-remoting. Осталось только перезапустить Java gateway, немного подождать и, если вы всё сделали правильно, вы увидите, что данные JMX мониторинга начинают поступать в Zabbix (смотрите также: Последние данные).