[comment]: # ({f8c9b9d8-627e4087})
# 13. JMX агент

[comment]: # ({/f8c9b9d8-627e4087})

[comment]: # ({c24e6196-e3fddc4c})
#### Обзор

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

Мониторинг JMX имеет в Zabbix встроенную поддержку в виде демона Zabbix, называемого «Zabbix Java gateway».

Когда Zabbix сервер хочет узнать значение конкретного счетчика JMX у узла сети, он опрашивает Zabbix **Java gateway**, который, в свою очередь, использует [API управления JMX \[en\]](http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/), чтобы удалённо опросить интересующее приложение.

Для получения более подробных сведений, включая настройку, смотрите раздел [Zabbix Java gateway](/manual/concepts/java).

::: notewarning
Подключения между Java gateway и наблюдаемым JMX приложением не должны быть закрыты брандмауэром.
:::

[comment]: # ({/c24e6196-e3fddc4c})

[comment]: # ({a779159e-7feef73e})
#### Включение удалённого 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 /полный/путь/приложение.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=$ВАШЕ_ХРАНИЛИЩЕ_КЛЮЧЕЙ \
    -Djavax.net.ssl.keyStorePassword=$ВАШ_ПАРОЛЬ_К_ХРАНИЛИЩУ_КЛЮЧЕЙ \
    -Djavax.net.ssl.trustStore=$ВАШЕ_ДОВЕРЕННОЕ_ХРАНИЛИЩЕ \
    -Djavax.net.ssl.trustStorePassword=$ВАШ_ПАРОЛЬ_К_ДОВЕРЕННОМУ_ХРАНИЛИЩУ \
    -Dcom.sun.management.jmxremote.ssl.need.client.auth=true \
    -jar /полный/путь/приложение.jar

Большинство (если не все) из этих настроек можно указать в `$JRE/lib/management/management.properties` (или там, где этот файл расположен на вашем компьютере).

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

Смотрите [Мониторинг и Управление с использованием JMX \[en\]](http://download.oracle.com/javase/1.5.0/docs/guide/management/agent.html) для получения более подробной информации.

[comment]: # ({/a779159e-7feef73e})

[comment]: # ({4b8fd32c-4b8fd32c})
#### Настройка JMX интерфейсов и элементов данных в веб-интерфейсе Zabbix

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

[comment]: # ({/4b8fd32c-4b8fd32c})

[comment]: # ({1b504993-01c1becc})
##### Настройка JMX интерфейса

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

![](../../../../../assets/en/manual/config/items/itemtypes/jmx_interface.png){width="600"}

Все обязательные поля ввода отмечены красной звёздочкой.

[comment]: # ({/1b504993-01c1becc})

[comment]: # ({80acb0d4-f55573f5})
##### Добавление элемента данных JMX агента

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

Ключ на снимке экрана ниже имеет следующий вид: `jmx["java.lang:type=Memory","HeapMemoryUsage.used"]`.

![](../../../../../assets/en/manual/config/items/itemtypes/jmx_item.png){width="600"}

Все обязательные поля ввода отмечены красной звёздочкой.

Поля, требующие информации, специфичной для JMX элементов данных:

|   |   |
|--|--------|
|*Тип (Type)*|Укажите здесь **JMX агент**.|
|*Ключ (Key)*|Ключ элемента данных `jmx[]` содержит три параметра:<br>**имя объекта** — имя объекта MBean;<br>**имя атрибута** — имя атрибута MBean с опциональными составными именами полей данных, разделённых точками.<br>**уникальное короткое описание** — уникальное описание, которое позволит создать на одном узле сети несколько JMX элементов данных с одинаковыми именем объекта и именем атрибута (опционально)<br>Подробнее о ключах JMX элементов данных смотрите ниже.<br>Вы можете обнаруживать MBeans и MBean атрибуты, используя элемент данных [низкоуровневого обнаружения](/manual/discovery/low_level_discovery/examples/jmx) `jmx.discovery[]`.|
|*JMX endpoint*|Вы можете указать пользовательский JMX endpoint. Убедитесь, что параметры подключения JMX endpoint совпадают с JMX интерфейсом. Это можно сделать при помощи макросов {HOST.\*}, как уже сделано в JMX endpoint по умолчанию.<br>Поддерживаются [макросы](/manual/appendix/macros/supported_by_location) {HOST.\*} и пользовательские макросы.|
|*Имя пользователя*<br>*(User name)*|Укажите имя пользователя (до 255 символов), если вы настроили аутентификацию у вашего Java приложения.<br>Поддерживаются пользовательские макросы.|
|*Пароль*<br>*(Password)*|Укажите пароль (до 255 символов), если вы настроили аутентификацию у вашего Java приложения.<br>Поддерживаются пользовательские макросы.|

Если вы хотите наблюдать за логическим счётчиком, который может иметь значение «true» или «false», укажите тип информации «Числовой (целое положительное)» и добавьте шаг предварительной обработки «Логический в десятичный» на вкладке Предобработка. Сервер будет сохранять логические значения как 1 или 0, соответственно.

[comment]: # ({/80acb0d4-f55573f5})

[comment]: # ({9430cb1d-9430cb1d})
#### Более подробно о ключах элементов данных JMX

[comment]: # ({/9430cb1d-9430cb1d})

[comment]: # ({2fbbf1c5-105cc785})
##### Простые атрибуты

Имя объекта MBean — это не что иное, как строка, которую вы определили в вашем Java приложении. Имя атрибута, с другой стороны, может быть более сложным. В случае, если атрибут возвращает простой тип данных (целое число, строку и т.п.), то беспокоиться не о чем, ключ будет выглядеть примерно так:

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

В этом примере именем объекта является «com.example:Type=Hello», именем атрибута будет «weight», а тип возвращаемого значения, скорее всего, должен быть «Числовой (с плавающей точкой)».

[comment]: # ({/2fbbf1c5-105cc785})

[comment]: # ({00e3fc9b-00e3fc9b})
##### Атрибуты, возвращающие составные данные

Ключ становится более сложным, когда ваш атрибут возвращает составные данные. Например: именем вашего атрибута является «apple», и он возвращает хеш представляющих его параметров, таких как «weight», «color» и прочее. Тогда ваш ключ может выглядеть примерно так:

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

Этот пример показывает, как разделяются с помощью точки имя атрибута и ключ хеша. Точно также, если атрибут возвращает вложенные составные данные, их части снова нужно разделять точкой:

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

[comment]: # ({/00e3fc9b-00e3fc9b})

[comment]: # ({ae61b0e7-ae61b0e7})
##### Атрибуты, возвращающие табличные данные

Атрибуты с табличными данными состоят из одного или нескольких составных атрибутов. Если такой атрибут указан в параметре имени атрибута, то значение этого элемента данных вернёт всю структуру атрибута в формате JSON. Значения отдельных элементов из табличных данных можно извлечь с помощью предобработки.

Пример атрибута с табличными данными:

     jmx[com.example:type=Hello,foodinfo]

Значение элемента данных:

``` {.javascript}
[
  {
    "a": "apple",
    "b": "banana",
    "c": "cherry"
  },
  {
    "a": "potato",
    "b": "lettuce",
    "c": "onion"
  }
]
```

[comment]: # ({/ae61b0e7-ae61b0e7})

[comment]: # ({1c76819e-3a5802d2})
##### Проблема с точками

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

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

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

Это возможно; всё, что вам требуется сделать — экранировать точки, которые являются частью имени, обратной косой чертой:

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

Аналогично, если ваш ключ хеша содержит точку, вам необходимо её экранировать:

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

[comment]: # ({/1c76819e-3a5802d2})

[comment]: # ({1fba2ed6-80aedcd9})
##### Другие проблемы

Символ обратной косой черты в имени атрибута также необходимо экранировать:

    jmx[com.example:type=Hello,c:\\documents]

Для обработки любых других символов в ключе JMX элемента данных, пожалуйста, обратитесь к [разделу](/manual/config/items/item/key#параметр--строка-заключённая-в-кавычки) формата ключа элементов данных.

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

[comment]: # ({/1fba2ed6-80aedcd9})

[comment]: # ({0a7df462-1813b2fc})
##### Непримитивные типы данных

Имеется возможность работы с пользовательскими MBean, возвращающими непримитивные типы данных, которые переопределяют метод **toString()**.

[comment]: # ({/0a7df462-1813b2fc})

[comment]: # ({f719c9d8-ffdec0f9})
#### Использование пользовательского endpoint с JBoss EAP 6.4

Пользовательские endpoint'ы позволяют работать с различными транспортными протоколами, отличными от протокола по умолчанию RMI.

Для иллюстрации этой возможности давайте попытаемся настроить мониторинг JBoss EAP 6.4 в качестве примера. Во-первых, давайте сделаем некоторые предположения:

-   У вас уже имеется установленный Zabbix Java gateway. Если нет, тогда вы можете его установить, руководствуясь [документацией](/manual/concepts/java).
-   Zabbix сервер и Java gateway установлены с префиксом `/usr/local/`.
-   JBoss уже установлен в `/opt/jboss-eap-6.4/` и запущен в автономном режиме.
-   Мы предположим, что все эти компоненты работают на одном и том же узле сети.
-   Брандмауэр и SELinux отключены (или настроены должным образом).

Давайте выполним некоторые простые настройки в zabbix\_server.conf:

    JavaGateway=127.0.0.1
    StartJavaPollers=5

И в файле конфигурации `zabbix_java/settings.sh` (или `zabbix_java_gateway.conf`):

    START_POLLERS=5

Удостоверьтесь, что JBoss слушает свой стандартный порт управления:

    $ netstat -natp | grep 9999
    tcp        0      0 127.0.0.1:9999          0.0.0.0:*               LISTEN      10148/java

Теперь давайте создадим в Zabbix узел сети с JMX интерфейсом 127.0.0.1:9999.

![](../../../../../assets/en/manual/config/items/itemtypes/jmx_jboss_example.png){width="600"}

Поскольку мы знаем, что эта версия JBoss использует протокол JBoss Remoting вместо RMI, то мы можем использовать массовое обновление параметра JMX endpoint в нашем шаблоне JMX соответствующим образом:

    service:jmx:remoting-jmx://{HOST.CONN}:{HOST.PORT}

![](../../../../../assets/en/manual/config/items/itemtypes/jmx_jboss_example_b.png)

Давайте обновим кэш конфигурации:

    /usr/local/sbin/zabbix_server -R config_cache_reload

Обратите внимание, что сначала может возникнуть ошибка.

![](../../../../../assets/en/manual/config/items/itemtypes/jmx_jboss_example4.png){width="600"}

«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

и затем выполнив эту команду:

    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 (смотрите также: [Последние данные](/manual/web_interface/frontend_sections/monitoring/latest_data)).

[comment]: # ({/f719c9d8-ffdec0f9})
