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

1 Обзор

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

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

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

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

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.

Если вы хотите разрешить подключения с другого интерфейса, укажите параметр -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 \
       -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 /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar

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

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

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

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

Когда Java Gateway запущен, сервер знает где его искать и Java приложение запущено с поддержкой удаленного JMX мониторинга, самое время настроить интерфейсы и элементы данных в Веб-интерфейсе Zabbix.

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

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

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

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

Ключ на снимке экрана выше имеет вид jmx["java.lang:type=Memory","HeapMemoryUsage.used"]. Ключ состоит из 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!