Zabbix 2.4 и JMX мониторинг Java приложений

Многие кто использует Java приложение знают о такой полезной штуке как JMX. Мне как администратору больше интересен JMX для мониторинга Java-приложений. Мониторим Zabbix-ом, он имеет поддержку JMX в виде отдельного интерфейса, правда для получения данных использует Java Gateway. Что это такое, как настроить … я дальше опишу.
Схема получения данных Zabbix-Server-ом от Java-app в конечном итоге будет выглядеть вот так:

                              / -> Java App1
Zabbix-Server -> Java Gateway --> Java App2
                              \ -> Java App3

Все три компонента могут быть как на одном хосте, так и на разных.
Мне как администратору проще воспринимать Zabbix Java Gateway как некий прокси, который преобразует данные полученные от JMX в формат данных Zabbix и отдает их в Zabbix Server.

В моем случае задействованы 3 сервера, схема вот такая:

zbx-srv01.intranet (10.10.10.5) -> zbx-gw01.intranet (10.10.10.25) -> japp01.intranet (192.168.100.99)

Все описанное настраивалось на CentOS 6.6, но вполне повторимо и на других Linux дистрибутивах с минимальными отличиями. Zabbix-Server и агенты версии 2.4

Сначала настроим Java Gateway.
Идем по ssh на сервер zabbix-gw01.intranet и делаем вот что:
Добавим репозитарий Zabbix:

zbx-gw01:~$ sudo rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm

Установим необходимый пакет zabbix-java-gateway:

zbx-gw01:~$ sudo yum install zabbix-java-gateway

Правим основной конфиг java-gateway /etc/zabbix/zabbix_java_gateway.conf до такого состояния:

# This is a configuration file for Zabbix Java Gateway.
# It is sourced by startup.sh and shutdown.sh scripts.

### Option: zabbix.listenIP
#   IP address to listen on.
#
# Mandatory: no
# Default:
LISTEN_IP="10.10.10.25"

### Option: zabbix.listenPort
#   Port to listen on.
#
# Mandatory: no
# Range: 1024-32767
# Default:
LISTEN_PORT=10052

### Option: zabbix.pidFile
#   Name of PID file.
#   If omitted, Zabbix Java Gateway is started as a console application.
#
# Mandatory: no
# Default:
# PID_FILE=

PID_FILE="/var/run/zabbix/zabbix_java.pid"

### Option: zabbix.startPollers
#   Number of worker threads to start.
#
# Mandatory: no
# Range: 1-1000
# Default:
START_POLLERS=4

Также, если iptables включен, не забываем добавить правило которое позволит zabbix-server-у подключаться к java-gateway. Например у меня так:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 10052 -j ACCEPT

Запускаем сервис, прописываем автозагрузку и усе …

zbx-gw01:~$ sudo service zabbix-java-gateway start
zbx-gw01:~$ sudo chkconfig zabbix-java-gateway on

Дальше нужно настроить zabbix-server.
Открываем основной конфиг /etc/zabbix/zabbix_server.conf и в любое удобное вам место добавляем вот что:

JavaGateway=10.10.10.25
JavaGatewayPort=10052
# Количество поллеров можно подстраивать в зависимости от количества
# java-app, в моем случае предполагалось около 10, в итоге 4 процесса справляются нормально
StartJavaPollers=4

Теперь необходимо включить JMX в вашем java приложении. В некоторых приложениях есть отличия, смотрите конкретную документацию по приложению. Обычно для включения JMX в Java приложении необходимо добавить опции запуска (показываю на примере Hazelcast-server):

/usr/java/jre1.7.0_67/bin/java -server -Dhazelcast.config=/home/hazelcast-3.1.7/bin/hazelcast.xml -Dhazelcast.jmx=true -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.rmi.port=12345 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.100.99 -Xms2048m -Xmx6144m -Djava.library.path=/home/hazelcast-3.1.7/lib -classpath /home/hazelcast-3.1.7/lib/hazelcast-3.1.7.jar

Ну или если вы используете Java-Wrapper то опции для JMX будут выглядеть вот так:

# Java Additional Parameters
wrapper.java.additional.1=-server
wrapper.java.additional.2=-Dhazelcast.config=/home/hazelcast/bin/hazelcast.xml
wrapper.java.additional.3=-Dhazelcast.jmx=true
wrapper.java.additional.4=-Dcom.sun.management.jmxremote
wrapper.java.additional.5=-Dcom.sun.management.jmxremote.port=12345
wrapper.java.additional.6=-Dcom.sun.management.jmxremote.rmi.port=12345
wrapper.java.additional.7=-Dcom.sun.management.jmxremote.local.only=false
wrapper.java.additional.8=-Dcom.sun.management.jmxremote.authenticate=false
wrapper.java.additional.9=-Dcom.sun.management.jmxremote.ssl=false
wrapper.java.additional.10=-Djava.rmi.server.hostname=192.168.100.99

После правки опций запуска необходимо перегрузить приложение. После чего проверяем netstat-ом LISTEN порты, должен появиться TCP/12345.
Если на сервере с java-app есть фаервол, нужно добавить правило разрешающее zabbix-java-gateway подключаться на порт 12345:

# Zabbix Java GW Server IP - 10.10.10.25
-A INPUT -p tcp -s 10.10.10.25 -m state --state NEW -m tcp --dport 12345 -j ACCEPT

Ну и дальше в WEB-ке zabbix-а для хоста добавьте новый интерфейс JMX и необходимые шаблоны, например JMX Generic.

Хай щастить!

    • xlob
    • Май 28th, 2015 3:53пп

    а как рассказать забиксу или JavaGateway что им нужно тянуть данные с japp01.intranet (192.168.100.99) ?

  1. @xlob
    после установки, настройки и запуска zabbix-java-gateway
    в конфиге zabbix_server прописывается новый параметр JavaGateway=10.10.10.25

    таким образом zabbix-server узнает что все JMX Item-ы он должен получать через JavaGateway

    После этого в WEB-интерфейсе zabbix просто добавляйте шаблоны/элементы данных с параметром «Тип = JMX Агент», ключ = нужный вам JMX ключ и так далее …

    Подробнее можно глянуть оф доку, пункт 14.3
    https://www.zabbix.com/documentation/2.0/ru/manual/config/items/itemtypes/jmx_monitoring

    • xlob
    • Май 29th, 2015 12:28пп

    @admin
    Спасибо, очень помог.

  1. Трэкбэков пока нет.

Why ask?