Skip to content

Обзор 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).

image

Рисунок 1 — Создание подходящего узла сети

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

Теперь необходимо создать элемент данных с типом "JMX-агент" и указать следующие поля (Рисунок 2):

Название Определение
Тип Выбирается тип элемента данных
Ключ jmx[] Ключ элемента данных содержит три параметра: ▶ имя объекта - имя объекта MBean; ▶ имя атрибута — имя атрибута MBean с необязательными именами составных полей данных, разделёнными точками; ▶ уникальное краткое описание — уникальное описание, позволяющее использовать несколько элементов данных JMX с одним и тем же именем объекта и именем атрибута на узле сети.
JMX endpoint Вы можете указать пользовательскую конечную точку JMX. Убедитесь, что параметры подключения к конечной точке JMX соответствуют интерфейсу JMX. Этого можно добиться с помощью макросов {HOST.*}, как в конечной точке JMX по умолчанию.
Имя пользователя Укажите имя пользователя, если вы настроили аутентификацию в своём Java-приложении.
Пароль Укажите пароль, если вы настроили аутентификацию в своём Java-приложении.

image

Рисунок 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"
  }
]