Мониторинг JMX можно использовать для наблюдения за счетчиками JMX в Java приложениях.
В Zabbix 2.0 добавлена встроенная поддержка мониторинга JMX, был выпущен новый Zabbix демон, так называемый "Zabbix Java gateway".
Когда Zabbix сервер хочет узнать значение конкретного счетчика JMX у узла сети, он опрашивает Zabbix Java gateway, который в свою очередь используя API управление JMX, удаленно опрашивает интересующее приложение.
Для получения более подробных сведений, включая где можно взять Zabbix Java gateway и как его настроить, смотрите этот раздел руководства.
Связь между Java gateway и наблюдаемым JMX приложением не должна быть закрыта брандмауэром.
Приложению 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] для получения более подробной информации.
Когда Java Gateway запущен, сервер знает где его искать и Java приложение запущено с поддержкой удаленного JMX мониторинга, самое время настроить интерфейсы и элементы данных в Веб-интерфейсе Zabbix.
Начнем с создания интерфейса JMX-типа у интересующего узла сети.
Для каждого интересующего вас счетчика JMX вам необходимо добавить элемент данных с типом JMX агент присоединенный к этому интерфейсу.
Ключ на снимке экрана ниже имеет следующий вид jmx["java.lang:type=Memory","HeapMemoryUsage.used"]
.
Все обязательные поля ввода отмечены красной звёздочкой.
Поля, требующие специфичной информации для JMX элементов данных:
Тип | Укажите здесь JMX агент. |
Ключ | Ключ элемента данных jmx[] состоит из двух параметров:имя объекта - имя объекта MBean; имя атрибута - имя атрибута MBean с опциональными составными данными имен полей, разделенных точками. Смотрите ниже для получения более подробных сведений о ключах элементов данных JMX. Начиная с Zabbix 3.4, вы можете обнаруживать MBeans и MBean атрибуты, используя элемент данных jmx.discovery[] низкоуровневого обнаружения. |
JMX endpoint | Вы можете указать пользовательский JMX endpoint. Убедитесь, что параметры подключения JMX endpoint совпадают с JMX интерфейсом. Это можно сделать при помощи макросов {HOST.*}, как это сделано в JMX endpoint по умолчанию. Это поле поддерживается начиная с 3.4.0. Поддерживаются макросы {HOST.*} и пользовательские макросы. |
Имя пользователя | Укажите имя пользователя, если вы настроили аутентификацию у вашего Java приложения. Поддерживаются пользовательские макросы. |
Пароль | Укажите пароль, если вы настроили аутентификацию у вашего Java приложения. Поддерживаются пользовательские макросы. |
Если вы хотите наблюдать за Логическим счетчиком, который может быть "true" или "false", вы должны указать тип информации "Числовой (целое положительное)" и "Логический" тип данных. Сервер будет записывать Логические значения как 1 или 0, соответственно.
Имя объекта MBean неважно, кроме строки, которую вы определили в вашем Java приложении. Имя атрибута, с другой стороны, может быть более сложным. В случае, если атрибут возвращает простой тип данных (число, строку и т.п.), то не стоит волноваться об этом, ключ будет выглядеть примерно так:
В этом примере именем объекта является "com.example:Type=Hello", именем атрибута будет являться "weight" и, скорее всего, тип возвращаемого значения должен быть "Числовой (с плавающей точкой)".
Ключ становится более сложным, когда ваш атрибут возвращает составные данные. Например: именем вашего атрибута является "apple" и он возвращает хэш представляющих его параметров, таких как "weight", "color" и прочее. Тогда ваш ключ может выглядеть примерно так:
Этот пример показывает как разделяются с помощью точки имя атрибута и ключ хэша. Точно также, если атрибут возвращает часть вложенных составных данных, их нужно снова разделить точкой:
Пока все хорошо. Но что, если имя атрибута или ключ хэша содержит символ точки? Вот пример:
Это проблема. Как сказать Zabbix'у, что имя атрибута "all.fruits", а не просто "all"? Как отличить точку, которая является частью имени, от точки которая разделяет имя атрибута и ключи хэшей?
До 2.0.4 Zabbix Java gateway был не способен справится с такими ситуациями и пользователи оставались с НЕПОДДЕРЖИВАЕМЫМИ элементами данных. Начиная с 2.0.4 проблема была исправлена, все что вам требуется сделать - экранировать точки, которые являются частью имени, обратной косой чертой:
Аналогично, если ваш ключ хэша содержит точку вам необходимо её экранировать:
Символ обратной косой черты тоже должен быть экранирован:
Для обработки любых других символов в ключе JMX элемента данных, пожалуйста, смотрите раздел формата ключа элементов данных.
На самом деле это все, что нужно сделать. Успешного мониторинга JMX!
Начиная с Zabbix 4.0.0 имеется возможность работы с пользовательскими MBean, которые возвращают непримитивные типы данных, которые переопределяют метод toString().
Пользовательские endpoint позволяют работать с различными транспортными протоколами, которые отличаются от протокола по умолчанию RMI.
Для иллюстрации этой возможности в качестве примера давайте попытаемся настроить JBoss EAP 6.4. Во-первых, давайте сделаем некоторые предположения:
Давайте выполним некоторые простые настройки в zabbix_server.conf:
И в файле конфигурации zabbix_java/settings.sh (или zabbix_java_gateway.conf):
Проверьте, что JBoss слушает свой стандартный порт управления:
Теперь давайте создадим в Zabbix узел сети с JMX интерфейсом 127.0.0.1:9999.
Как мы знаем эта версия JBoss использует протокол JBoss Remoting всесто RMI, мы можем использовать массовое обновление параметра JMX endpoint в нашем шаблоне JMX в соответствии:
Давайте обновим кэш конфигурации:
Обратите внимание, что сначала может возникнуть ошибка.
"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</pre>
и затем выполнив эту команду:
$ 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:
Custom endpoints allow working with different transport protocols other than the default RMI.
To illustrate this possibility, let's try to configure JBoss EAP 6.4 monitoring as an example. First, let's make some assumptions:
Let's make some simple settings in zabbix_server.conf:
And in the zabbix_java/settings.sh configuration file (or zabbix_java_gateway.conf):
Check that JBoss listens to its standard management port:
Now let's create a host with JMX interface 127.0.0.1:9999 in Zabbix.
As we know that this version of JBoss uses the the JBoss Remoting protocol instead of RMI, we may mass update the JMX endpoint parameter for items in our JMX template accordingly:
Let's update the configuration cache:
Note that you may encounter an error first.
"Unsupported protocol: remoting-jmx" means that Java gateway does not know how to work with the specified protocol. That can be fixed by creating a ~/needed_modules.txt file with the following content:
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</pre>
and then executing the command:
$ 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
Thus, Java gateway will have all the necessary modules for working with jmx-remoting. What's left is to restart the Java gateway, wait a bit and if you did everything right, see that JMX monitoring data begin to arrive in Zabbix: