14 Мониторинг JMX

14.1 Обзор

Мониторинг JMX может быть использован для наблюдения за счетчиками JMX в Java приложениях.

В Zabbix 1.8, если вы хотели наблюдать за счетчиками JMX в Java приложениях, ваш лучший выбор был бы Zapcat JMX Zabbix Bridge. Вы могли бы отредактировать исходный код нашей программы для связи с файлом Zapcat JAR и программно запустить Zabbix агента, или вы могли установить готовый плагин Zapcat для приложений, которые его поддерживают (таких как Jetty или Tomcat).

В Zabbix 2.0 добавлена встроенная поддержка мониторинга JMX введением нового Zabbix демона называемого "Zabbix Java gateway".

Когда Zabbix сервер захочет узнать значение конкретного счетчика JMX на узле сети, он спросит Zabbix Java gateway, который в свою очередь использует API управление JMX, запросить интересующее приложение удаленно.

Для получения более подробных сведений о Zabbix Java gateway, включая где его можно взять и как настроить, смотрите этот раздел руководства.

14.2 Включение удаленного 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 \
       -jar /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar

С помощью этой команды Java будет слушать входящие соединения JMX на порт 12345 без требования аутентификации или SSL.

Если вы хотите быть более строгим в плане безопасности, есть много других опций в 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 \
       -Djavax.net.ssl.keyStore=$ВАШ_КЛЮЧ_ХРАНИЛИЩАE \
       -Djavax.net.ssl.keyStorePassword=$ВАШ_ПАРОЛЬ_К_КЛЮЧУ_ХРАНИЛИЩА \
       -Djavax.net.ssl.trustStore=$ВАШЕ_ДОВЕРЕННОЕ_ХРАНИЛИЩЕ \
       -Djavax.net.ssl.trustStorePassword=$ВАШ_ПАРОЛЬ_К_ДОВЕРЕННОМУ_ХРАНИЛИЩУ \
       -Dcom.sun.management.jmxremote.ssl.need.client.auth=true \
       -jar /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar

Значительное количество (если не все) этих настроек можно указать в /etc/java-6-openjdk/management/management.properties (или там, где этот файл расположен на вашем компьютере).

Обратите внимание, если вы желаете использовать SSL, то вы должны изменить скрипт startup.sh, добавив в него опции -Djavax.net.ssl.* для Java gateway, так чтобы он знал где искать ключ и доверенное хранилище.

Смотрите Мониторинг и Управление с использованием JMX [en] для получения более подробной информации.

14.3 Настройка JMX интерфейсов и элементов данных в веб-интерфейсе Zabbix

With Java gateway running, server knowing where to find it and a Java application started with support for remote JMX monitoring, самое время настроить интерфейсы и элементы данных в Веб-интерфейсе Zabbix.

Настройка JMX интерфейса

Начнем с создания интерфейса JMX-типа у интересующего узла сети:

Добавление элемента данных JMX агента

Для каждого интересующего вас счетчика JMX вам необходимо добавить элемент данных с типом JMX агент присоединенный к этому интерфейсу. Если вы уже настроили аутентификацию у вашего Java приложения, то тогда вы должны также указать имя пользователя и пароль.

Ключ на снимке экрана выше имеет вид jmx["java.lang:type=Memory","HeapMemoryUsage.used"]. Синтаксис ключа элемента данных JMX идентичен элементам данных Zapcat, за исключением того, что используется запятая для разделения аргументов, а не "][". Ключ состоит из 2 параметров:

  • имя объекта - который представляет собой имя объекта MBean
  • имя атрибута - имя атрибута MBean с дополнительными составными данными имен полей, разделенных точками

Смотрите ниже для получения более подробных сведений о ключах элементов данных типа JMX.

Если вы хотите мониторить Логический счетчик, который равен одному из двух значений "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]


Проблема с точками

Пока все хорошо. Но что, если имя атрибута или ключ хэша содержит точку символа? Вот пример:

jmx[com.example:Type=Hello,all.fruits.apple.weight]

Это проблема. Как сказать Zabbix'у, что имя атрибута "all.fruits", а не просто "all"? Как отличить точку, которая является частью имени, от точки которая разделяет имя атрибута и ключи хэшей?

До 2.0.4 Zabbix Java gateway был не способен справится с такими ситуациями и пользователи оставались с НЕПОДДЕРЖИВАЕМЫМИ элементами данных. Начиная с 2.0.4 это стало возможно, все что вам требуется сделать - это экранировать точки, которые являются частью имени, обратной косой чертой:

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["com.example:Type=Hello","fruits.apple.total weight"]

На самом деле это все, что нужно сделать. Успешного мониторинга JMX!