Обзор JMX агента
Для контроля параметров JMX в приложении Java можно применять мониторинг JMX. В Glaber он реализован в виде демона Glaber, который называется «Glaber Java gateway».
Для того чтобы узнать значение конкретного счётчика JMX на узле сети, сервер Glaber обращается к шлюзу Java Glaber. Шлюз использует API управления JMX для удалённого запроса к нужному приложению.
Для получения более подробной информации смотрите раздел "Java-шлюз".
Необходимо обеспечить беспрепятственное взаимодействие между Java-шлюзом и отслеживаемым приложением 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 /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 \
-Dcom.sun.management.jmxremote.registry.ssl=true \
-Djavax.net.ssl.keyStore=$YOUR_KEY_STORE \
-Djavax.net.ssl.keyStorePassword=$YOUR_KEY_STORE_PASSWORD \
-Djavax.net.ssl.trustStore=$YOUR_TRUST_STORE \
-Djavax.net.ssl.trustStorePassword=$YOUR_TRUST_STORE_PASSWORD \
-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-шлюзе нужно добавить параметры -Djavax.net.ssl.* для указания расположения хранилищ ключей и доверенных сертификатов.
После запуска Java-шлюза, когда сервер знает, где его найти, и запуска Java-приложения с поддержкой удалённого мониторинга JMX, можно приступать к настройке интерфейсов и элементов данных в графическом интерфейсе Glaber.
Настройка интерфейсов и элементов данных JMX в интерфейсе Glaber
Настройка интерфейса JMX
Для начала необходимо создать интерфейс JMX-типа на интересующем узле сети (Рисунок 1).
Рисунок 1 — Создание подходящего узла сети
Добавление элемента данных JMX-агент
Теперь необходимо создать элемент данных с типом "JMX-агент" и указать следующие поля (Рисунок 2):
Название | Определение |
---|---|
Тип | Выбирается тип элемента данных |
Ключ | jmx[] Ключ элемента данных содержит три параметра: ▶ имя объекта - имя объекта MBean; ▶ имя атрибута — имя атрибута MBean с необязательными именами составных полей данных, разделёнными точками; ▶ уникальное краткое описание — уникальное описание, позволяющее использовать несколько элементов данных JMX с одним и тем же именем объекта и именем атрибута на узле сети. |
JMX endpoint | Вы можете указать пользовательскую конечную точку JMX. Убедитесь, что параметры подключения к конечной точке JMX соответствуют интерфейсу JMX. Этого можно добиться с помощью макросов {HOST.*}, как в конечной точке JMX по умолчанию. |
Имя пользователя | Укажите имя пользователя, если вы настроили аутентификацию в своём Java-приложении. |
Пароль | Укажите пароль, если вы настроили аутентификацию в своём Java-приложении. |
Рисунок 2 — Создание и настройка элемента данных типа "JMX-агент"
Подробнее о ключах элементов данных JMX
Простые атрибуты
Имя объекта MBean — это идентификатор, который вы задаёте в своём Java-приложении. С другой стороны, имя атрибута может быть более сложным. Если атрибут возвращает примитивный тип данных (целое число, строку и т. д.), то ключ будет выглядеть следующим образом:
jmx[com.example:Type=Hello,weight]
В данном случае объект имеет имя «com.example:Type=Hello», атрибут — «weight», а тип возвращаемого значения, скорее всего, будет Числовое (с плавающей точкой).
Атрибуты, возвращающие составные данные
Ситуация становится более сложной, когда ваш атрибут возвращает комплексные данные. Допустим, ваш атрибут называется «яблоко», и он возвращает хэш, который содержит информацию о его характеристиках, таких как вес, цвет и другие параметры. Ваш ключ может выглядеть следующим образом:
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"
}
]