Application: "Zabbix v3.4", "Zabbix Java Gateway v3.4".
Задача: обеспечить техническую возможность посредством системы мониторинга "Zabbix" отслеживать текущее состояния Java приложений, запущенных к контейнеризаторах "Tomcat" и "WildFly", путём обращений к JMX (Java Management eXtensions).
Специально для мониторинга Java-приложений разработчиками "Zabbix" был создан инструмент "Zabbix Java Gateway", запускаемый в виде отдельного сервиса - с точки зрения пользователя системы мониторинга представляющий собой один из компонентов сервера мониторинга, вроде тех, что отрабатывают обращения к "Zabbix Agent"-ам, SNMP и IPMI - точно также все JMX-запросы будут отправлены сервису "Zabbix Java Gateway", который по специализированному протоколу свяжется с "Tomcat" или "WildFly", запросит и получит требуемое значение , после чего перенаправит его серверу мониторинга.
Предварительная подготовка.
Сервис "Zabbix Java Gateway" написан на "Java" и требует для работы наличия соответствующего интерпретатора - достаточно "OpenJDK v9 Headless":
# aptitude install openjdk-9-jre-headless
Проверяем, та ли версия Java используется для запуска приложений "по умолчанию":
# update-alternatives --display java
# java -version
openjdk version "9-internal"
....
....
Установка "Zabbix Java Gateway".
По состоянию на 2018-й год инструментарий мониторинга Java-приложений в "Zabbix" явно не выведен на уровень полной готовности, так что в публичных репозиториях Linux-ов его пока нет. Достаточно просто подключить репозиторий разработчиков и загрузить необходимый пакет ПО оттуда:
# vi /etc/apt/sources.list.d/zabbix.list
# For Ubuntu Xenial
deb http://repo.zabbix.com/zabbix/3.4/ubuntu xenial main
deb-src http://repo.zabbix.com/zabbix/3.4/ubuntu xenial main
deb http://repo.zabbix.com/zabbix/3.4/ubuntu xenial main
deb-src http://repo.zabbix.com/zabbix/3.4/ubuntu xenial main
# aptitude update
# aptitude install zabbix-java-gateway
# systemctl enable zabbix-java-gateway
# aptitude install zabbix-java-gateway
# systemctl enable zabbix-java-gateway
Ради одного пакета можно не подключаться к репозиторию, а скачать его напрямую (ссылка на ПО для "Linux Ubuntu"), но тогда потеряется возможность его простого обновления.
Настройка спарки "Zabbix Server" и "Zabbix Java Gateway".
Настроек режима запуска "шлюза" немного, и параметры по умолчанию меня полностью устроили - разве что есть смысл немного увеличить количество процессов, обрабатывающих потоки запросов мониторинга (по умолчанию: 5):
# vi /etc/zabbix/zabbix_java_gateway.conf
....
START_POLLERS=15
....
START_POLLERS=15
....
Запускаем или перезапускаем сервис "шлюза":
# /etc/init.d/zabbix-java-gateway restart
Удостоверяемся, что сервис запущен успешно и в журнале событий нет сообщений о критичных сбоях (пример для Systemd):
# service zabbix-java-gateway status
* zabbix-java-gateway.service - Zabbix Java Gateway
Loaded: loaded (/lib/systemd/system/zabbix-java-gateway.service; enabled; vendor preset: enabled)
Active: active (running) since ...
....
zabbix systemd[1]: Starting Zabbix Java Gateway...
zabbix systemd[1]: Started Zabbix Java Gateway.
Loaded: loaded (/lib/systemd/system/zabbix-java-gateway.service; enabled; vendor preset: enabled)
Active: active (running) since ...
....
zabbix systemd[1]: Starting Zabbix Java Gateway...
zabbix systemd[1]: Started Zabbix Java Gateway.
Также проверяем, слушает ли сервис "шлюза" заданные сетевые интерфейс и порт:
# netstat -anp | grep 10052
tcp4 ... 0.0.0.0:10052 0.0.0.0:* LISTEN 31356/java
Серверу мониторинга достаточно лишь указать точку входа для обращений к "шлюзу" и количество одновременно обслуживаемых потоков запросов:
# vi /etc/zabbix/zabbix_server.conf
....
JavaGateway=127.0.0.1
JavaGatewayPort=10052
StartJavaPollers=15
....
JavaGateway=127.0.0.1
JavaGatewayPort=10052
StartJavaPollers=15
....
Применение параметров требует перезапуска сервиса сервера мониторинга:
# /etc/init.d/zabbix-server restart
Настройка клиента мониторинга, на примере "WildFly".
По умолчанию подсистема JMX в "WildFly" отвечает на запросы только с "локальной сетевой петли". Для доступа к JMX снаружи придётся это явно разрешить - например так:
# vi /opt/wildfly/standalone/configuration/standalone-modeshape.xml
....
<interfaces>
<interface name="management">
<!-- inet-address value="${jboss.bind.address.management:127.0.0.1}"/ -->
<inet-address value="${jboss.bind.address.management:0.0.0.0}"/>
</interface>
....
</interfaces>
....
<interfaces>
<interface name="management">
<!-- inet-address value="${jboss.bind.address.management:127.0.0.1}"/ -->
<inet-address value="${jboss.bind.address.management:0.0.0.0}"/>
</interface>
....
</interfaces>
....
Применение изменений такого рода потребует перезапуска "WildFly":
# systemctl restart wildfly
Как вариант, вместо внесения правок в конфигурационный файл можно запускать "WildFly" с параметром "-Djboss.bind.address.management=0.0.0.0".
Кроме разрешения доступа извне потребуется завести соответствующего пользователя ("zbx-jmx", например), от имени которого "Zabbix Java Gateway" будет аутентифицироваться при подключении к JMX-интерфейсу:
# /opt/wildfly/bin/add-user.sh -u zbx-jmx -p strongPas#word
Added user 'zbx-jmx' to file '/opt/wildfly/standalone/configuration/mgmt-users.properties'
Added user 'zbx-jmx' to file '/opt/wildfly/domain/configuration/mgmt-users.properties'
Added user 'zbx-jmx' to file '/opt/wildfly/domain/configuration/mgmt-users.properties'
Есть смысл сразу проверить, доступен ли порт, выделенный для удалённого мониторинга WildFly-сервера, со стороны сервера мониторинга:
$ telnet wildfly.example.net 9990
Trying wildfly.example.net...
Escape character is '^]'.
qwerty
HTTP/1.1 400 Bad Request
....
Escape character is '^]'.
qwerty
HTTP/1.1 400 Bad Request
....
Наверняка подключение к "WildFly" будет блокироваться защитным экраном несущей системы, и его придётся явно разрешить, например так (помним о необходимости как-то сохранять Iptables-правила):
# iptables -A INPUT -s IP-Zabbix-Java-Gateway/32 -p TCP --dport 9990 -j ACCEPT -m comment --comment "Zabbix JMX"
Решение проблемы поддержки протокола JMX-соединений.
Первое, что нужно делать, когда что-то не работает - идти читать журналы событий:
# tail -1000 /var/log/zabbix/zabbix_java_gateway.log
# tail -1000 /var/log/zabbix/zabbix_server.log | grep -i jmx
# tail -1000 /var/log/zabbix/zabbix_server.log | grep -i jmx
Возможные следующие сообщения об ошибках означают, что "Zabbix Java Gateway" не имеет соответствующих библиотек для работы с указанным протоколом:
....
java.net.MalformedURLException: Unsupported protocol: remote+http
java.net.SocketTimeoutException: connection timed out: service:jmx:remote+http://wildfly.example.net:9990
....
java.net.MalformedURLException: Unsupported protocol: remote+http
java.net.SocketTimeoutException: connection timed out: service:jmx:remote+http://wildfly.example.net:9990
....
Это легко исправить, взяв таковые из дистрибутива "JBoss AS/WildFly", который мы собираемся мониторить.
Всё, что требуется "Zabbix Java Gateway", ожидается им в его домашней директории, путь к которой можно подсмотреть в стартовом скрипте:
# cat /usr/sbin/zabbix_java_gateway | grep -i "home="
GATEWAY_HOME="/usr/share/zabbix-java-gateway"
Попросту находим все Java-библиотеки поддержки клиентских протоколов и укладываем их в домашнюю директорию "Zabbix Java Gateway":
# find /opt/wildfly/ -iname jboss-cli-client*.jar -print0 | xargs --null --no-run-if-empty -I {} cp {} /usr/share/zabbix-java-gateway/lib/
Перезапускаем сервис, чтобы он загрузил все обнаруженные библиотеки:
# /etc/init.d/zabbix-java-gateway restart
Костыль перезагрузки.
Как я выше отмечал, служба "Zabbix Java Gateway" очевидно ещё не доросла до уровня стабильно работающего приложения. Иногда она попросту перестаёт работать. Не зависает в привычном понимании этого слова, не останавливается - просто перестаёт отвечать на запросы, с периодичностью в одну-две недели. Среди нас не обнаружилось специалистов по Java-приложениям, и лучшее решение, которое мы смогли найти - перезапуск пару раз в день с плывущим графиком:
# vi /etc/crontab
....
# Preventive restart, overlapping slurred errors "Zabbix Java Gateway"
01 */11 * * * root /etc/init.d/zabbix-java-gateway restart &
# Preventive restart, overlapping slurred errors "Zabbix Java Gateway"
01 */11 * * * root /etc/init.d/zabbix-java-gateway restart &
Нюанс указания на JMX-интерфейс в GUI "Zabbix Server".
Как я упоминал выше, сервис "Zabbix Java Gateway" с точки зрения пользователя представляет собой один из системных компонентов, прозрачно обрабатывающих специфичные запросы к подсистемам вроде "Zabbix Agent", SNMP или IPMI. Вспомогательного сервиса "шлюза" на пути к JMX-интерфейсам узлов мониторинга для пользователя будто не существует, а в параметрах "IP", "FQDN" и "TCP port" описания узла сети (в web-интерфейсе "Zabbix Server") следует указывать данные точки приёма JMX-запросов на стороне объекта мониторинга.