Мониторинг Java-Приложений В Zabbix, Настройка Javagateway Для Jmx Lld



Введение &nbsp&nbsp&nbsp&nbspВ этой статье я расскажу вам, как его можно немного настроить Zabbix Java-шлюз для наиболее удобного обнаружения низкого уровня JMX метрики здесь github.com/mfocuz/zabbix_plugins/tree/master/jmx_discovery Можете взять патч для версии 2.0.11 и посмотреть примеры внешних скриптов.

Но обо всем по порядку.

&nbsp&nbsp&nbsp&nbspНачиная с версии 2.0, Zabbix теперь имеет встроенную поддержку мониторинга.

Джава приложения через JMX .

Но, возможно, не все знают, что помимо сбора метрик мы также можем обнаружить их в Zabbix из коробки.

В документации этот момент либо упустили, либо посчитали возможность не совсем готовой (хотя, может быть, я просто не нашел ее в документации?), но эта возможность есть, и, на мой взгляд, она действительно не совсем готова.

Хотя я не уверен, что это вообще работает, я не удосужился это проверить.

&nbsp&nbsp&nbsp&nbspВ исходниках zabbix_javagw в классе JMXItemChecker.java для версии 2.0.11 строка 157 и выше:

  
  
  
   

else if (item.getKeyId().

equals("jmx.discovery”)) { … for (ObjectName name : mbsc.queryNames(null, null)) { logger.trace("discovered object '{}'", name); for (MBeanAttributeInfo attrInfo : mbsc.getMBeanInfo(name).

getAttributes()) { logger.trace("discovered attribute '{}'", attrInfo.getName()); if (!attrInfo.isReadable()) { logger.trace("attribute not readable, skipping"); continue; } try { logger.trace("looking for attributes of primitive types"); String descr = (attrInfo.getName().

equals(attrInfo.getDescription()) ? null : attrInfo.getDescription()); findPrimitiveAttributes(counters, name, descr, attrInfo.getName(), mbsc.getAttribute(name, attrInfo.getName())); } catch (Exception e) { Object[] logInfo = {name, attrInfo.getName(), e}; logger.trace("processing '{},{}' failed", logInfo); } } } }

&nbsp&nbsp&nbsp&nbspAs можно увидеть из кода, если в конфигурации правил обнаружения указать ключ с именем «jmx.discovery» , то будет выполнено обнаружение, которое вернет все атрибуты для всех найденных mbeans .

&nbsp&nbsp&nbsp&nbspЗдесь, прежде всего, хотелось бы отметить, что в таком запросе нет особой необходимости.

Во-первых, такой запрос работает не очень быстро, потому что запрос атрибутов каждого бина обрабатывается как отдельный запрос, а бинов может быть довольно много.

Во-вторых, ключ правила обнаружения является уникальным значением в Zabbix, а это означает, что использование jmx.discovery мы можем создать одно единственное правило обнаружения для JMX метрики в пределах одного хоста, что совершенно непригодно для большинства задач.

И в-третьих, атрибуты для всех Java-мбин Как правило, они не меняются, то есть их количество и назначение в пределах одного бункера постоянны.

Это означает, что лучше устанавливать сами атрибуты в прототипах элементов и в части кода, что на самом деле является самым большим препятствием:

for (MBeanAttributeInfo attrInfo : mbsc.getMBeanInfo(name).

getAttributes()) { .

try { (attrInfo.getName().

equals(attrInfo.getDescription()) ? null : attrInfo.getDescription()); findPrimitiveAttributes(counters, name, descr, attrInfo.getName(), mbsc.getAttribute(name, attrInfo.getName())); .



становится ненужным.

И вот количество mbeans может быть переменным.

Например Когерентность Oracle создает определенное количество бункеров для каждого узла в кластере.

В результате мы имеем бины, имена которых различаются лишь идентификатор узла .

И например, при перезапуске кластера все nodeId меняются.

То есть Джава метрики имеют динамические имена mbeans .

Здесь мы используем доктор юридических наук , Но: 1. Нам нужны только сами mbeans, без атрибутов (их мы тоже можем обнаружить, но ИМХО это ненужно).

2. Нам важно иметь возможность создать несколько правил обнаружения для одного хоста.

3. Нам нужна возможность кодировать различную логику для обнаружения правил.

&nbsp&nbsp&nbsp&nbspНе так давно появилась статья о JMX открытие www.zabbix.org/wiki/Docs/howto/jmx_discovery .

Я использую подобное решение в течение прошлого года.

Вкратце: суть этого решения заключается в запуске .

jar-файла как внешнего скрипта.

Его огромным недостатком является то, что Java не предназначена для многократного запуска, как это обычно делается для интерпретируемых языков, таких как Python или Perl. Этот минус делает решение практически неработоспособным.

Допустим, на виртуальной машине с 2 ядрами для запуска около 20 правил обнаружения зашкаливала загрузка ЦП, в результате внешние проверки просто отваливались по таймауту.

На железе, на котором был 8кор, вроде работало нормально.

Но в любом случае запуск пачки JVM раз в N минут — не красивое решение и может рассматриваться лишь как костыль.



Как будет работать новый функционал

&nbsp&nbsp&nbsp&nbspВо-первых, давайте посмотрим, как взаимодействуют сервер Zabbix и JavaGateway. Коллекционировать JMX Сервер метрик Zabbix подключается к JavaGateway по TCP, после чего делает запрос необходимых данных по протоколу Zabbix. На сайте есть общее описание протокола, опишу немного подробнее, так как он нам нужен для доктор юридических наук .

Сообщение серверу и ответ от него состоит из 3-х частей: 1. Заголовок ZBXD\1 2. Длина сообщения 3. Сообщение в формате JSON. Это выглядит примерно так:

Мониторинг Java-приложений в Zabbix, настройка JavaGateway для JMX LLD

&nbsp&nbsp&nbsp&nbspЯ хотел внести минимум изменений в код Zabbix, поэтому код Zabbix сервера не трогаем; на схеме выше мы заменяем Zabbix-сервер на externalscript, который будет осуществлять такое же соединение.

И в код JavaGateway добавим нужную нам функцию.

И теперь общение с JavaGateway для LLD выглядит так:

Мониторинг Java-приложений в Zabbix, настройка JavaGateway для JMX LLD

То есть добавлено поле regexp и новый тип request="java jmx lld".



Изменение кода JavaGateway

&nbsp&nbsp&nbsp&nbspЧто нужно закончить JMX Discovery стал удобным и быстрым? По словам разработчиков, JavaGateway имеет два возможных варианта.

запрос запрос, их можно найти в коде ItemChecker.java , это константы JSON_REQUEST_INTERNAL собрать пару внутренних метрик JavaGateway и JSON_REQUEST_JMX — который является основным запросом и служит для сбора метрик JMX. В коде СокетПроцессор.

java мы видим:

if (request.getString(ItemChecker.JSON_TAG_REQUEST).

equals(ItemChecker.JSON_REQUEST_INTERNAL)) checker = new InternalItemChecker(request); else if (request.getString(ItemChecker.JSON_TAG_REQUEST).

equals(ItemChecker.JSON_REQUEST_JMX)) checker = new JMXItemChecker(request); ….

JSONArray values = checker.getValues();

&nbsp&nbsp&nbsp&nbspТо есть определяется, какого типа это будет шашка .

Добавим 3-й тип запроса - JSON_JMX_LLD .

И соответственно еще одно условие нашего запроса в SocketProcessor.java:

….

else if (request.getString(ItemChecker.JSON_TAG_REQUEST).

equals(ItemChecker.JSON_JMX_LLD)) checker = new JMXItemDiscoverer(request); …… JSONArray values = checker.getValues();

&nbsp&nbsp&nbsp&nbspТеперь, когда сервер получит запрос на JSON_JMX_LLD , будет создан экземпляр класса JMXItemDiscoverer и метод называется получить значения .

Осталось добавить класс JMXItemDiscoverer, который будет составлять правило обнаружения так, как нам будет удобно, а именно делать запрос на все доступные бины и на выходе будет возвращать список бинов по указанному регулярному выражению.

Код нового класса можно увидеть в патче.



Настройка нового шлюза Java

&nbsp&nbsp&nbsp&nbsp Есть два варианта: можно заменить сам JavaGateway, а можно поднять другой, который будет работать только для LLD. Если я поменяю шлюз на PRO, то: &nbsp&nbsp&nbsp&nbsp1. На стороне Zabbix необходимо изменить только JavaGateway. По ссылке в начале статьи вы можете найти патч для java-шлюза zabbix версии 2.0.11. Я немного разногласил по коду 2.2 и 2.0.11, да и java-шлюз там мало чем отличается, так что думаю при базовых знаниях Java не составит труда перенести патч на последнюю версию.

&nbsp&nbsp&nbsp&nbsp2.Далее развертываем патч и собираем JavaGateway для установленной версии Java. &nbsp&nbsp&nbsp&nbsp3. Ставим полученный .

jar на место старого, все остальные файлы java-шлюза, включая конфиг, библиотеки и т.д., оставляем как есть.

&nbsp&nbsp&nbsp&nbsp4. Давайте начнем.

Мы получаем тот же Java-шлюз, но теперь он может обрабатывать еще один тип запроса.

&nbsp&nbsp&nbsp&nbsp5. Для самих запросов пишем скрипт, который будет подключаться к серверу по TCP и собственно сам делать запрос.

Я набросал простой модуль JMXDiscovery.pm для Perl, чтобы упростить написание сценария обнаружения, а также пример сценария обнаружения.

jmx_discovery.pl и с помощью модуля (можно найти там по ссылке в начале).

&nbsp&nbsp&nbsp&nbsp6. И наконец, создаём правила обнаружения, указывая в типе externalscript. Передаваемые в скрипт параметры обеспечат уникальность ключа, что позволит создавать любое количество правил.

&nbsp&nbsp&nbsp&nbspЕсли вы хотите поднять отдельный сервер для доктор юридических наук , тогда пропускаем шаг 3 и после сборки вместе с патчем просто устанавливаем JavaGateway отдельная услуга.



Заключение

Работает быстро и стабильно.

Теги: #zabbix #perl #java #jmx #программирование

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.