По аналогии с примером из этой статьи, вы сможете внедрить консоль hawtio в свое jvm приложение без его пересборки и перекомпиляции. А также в случае с DEV/QA хостами внедрить в java процесс SQL веб консоль из проекта H2
Прежде чем перейти к практике, небольшое теоретическое отступление.
В экосистеме jvm огромное количество библиотек, фреймворков и проектов доступно в maven репозитариях: maven central и jcenter. В этой публикации нас будет интересовать только io.hawt:hawtio-app и com.h2database:h2.
Обе консоли работают без отдельного сервера, запуская встроенный веб сервер.
Но для ваших проектов вы можете использовать почти любой подходящий maven артефакт из репозиториев.
А работать мы будем над SonarQube при помощи java агента AspectJ-Scripting:
Агент активируется двумя дополнительными параметрами при старте jvm и выполняет всю «магию» из конфигурации. Странно, что в повседневной работе разработчики редко используют технологию java agent, хотя многие проприетарные решения для трассировки и DevOps активно используют javaagent: например takipi, plumbr, new relic.
Итак, возвращаемся к модификации java процессов только за счет конфигурирования параметров jvm на примере SonarQube и внедрения веб консолей.
Скачиваем zip архив с сайта проекта и распаковываем его в локальную директорию.
Скачиваем aspectj-scripting java агент.
Также для примера нам нужны будут 3 файла конфигурации для агента:
Чтобы aspectj-scripting агент мог работать, его надо передать в качестве параметра -javaagent:aspectj-scripting-1.0-agent.jar при старте jvm, а конфигурацию через свойство -Dorg.aspectj.weaver.loadtime.configuration=config:file: ПУТЬ_К_КОНФИГУРАЦИИ. Через system property параметры можно передать maven прокси репозиторий и путь к локальному maven репозиторию.
Все это для SonarQube настраивается в файле conf/sonar.properties в свойстве sonar.web.javaAdditionalOpts
На видео видно как конфигурируется SonarQube для запуска совместно с hawtio_console.xml и hawt.io консоль запускается
Следующий скринкаст показывает как агент запускается с параметром database_console.xml и стартует SQL консоль
И наконец, обе консоли стартуют в процессе SonarQube за счет конфигурации h2_hawtio.xml, для примера мы импортируем метрики проекта mvel в Sonar и смотрим с помощью консоли на таблицы внутри базы данных сонара
Выполнение запросов к базе SonarQube из H2 консоли
Доступ к статистике базы H2 во вкладке JMX hawtio можно получить, если добавить «JMX=TRUE» к свойству sonar.jdbc.url в файле conf/sonar.properties: sonar.jdbc.url=jdbc:h2:tcp://localhost:9092/sonar;JMX=TRUE
Обзор графиков для JMX java.lang.OperatingSystem:
Итак, мы смогли модифицировать существующее приложение SonarQube так чтобы при старте скачивались hawtio и h2 из maven репозитария и веб консоли запускались в нужный момент при старте сонара.
В следующей публикации, покажу как внедрить с помощью aspectj-scripting интерактивную ssh консоль в существующее java приложение. А также рассмотрим пару вариантов как логировать jdbc запросы и их параметры в приложении, при разработке которого не задумывались о такой функциональности.
Для желающих посетить 9 сентября доклад на тему «Аспектно-ориентированное программирование в распределенных системах для java разработчиков и QA» регистрируйтесь
Удачи вам в анализе работы и мониторинге java приложенией
Прежде чем перейти к практике, небольшое теоретическое отступление.
В экосистеме jvm огромное количество библиотек, фреймворков и проектов доступно в maven репозитариях: maven central и jcenter. В этой публикации нас будет интересовать только io.hawt:hawtio-app и com.h2database:h2.
- hawtio — это универсальная веб консоль для мониторинга и управлени java процессом с множеством плагинов и возможностью расширения плагинами пользователя.
- Что содержиться внутри h2 сложно перечислить в рамках даже одной статьи. Но нас сейчас интересует что это встраиваемая база данных, которая может работать также в режиме сервера и содержит внутри веб приложение для работы с SQL базами данных у которых есть jdbc драйвер. Это достаточно удобная консоль с браузером схемы базы данных, автодополнением SQL запросов при их написании и локализацией для русского языка.
Обе консоли работают без отдельного сервера, запуская встроенный веб сервер.
Но для ваших проектов вы можете использовать почти любой подходящий maven артефакт из репозиториев.
А работать мы будем над SonarQube при помощи java агента AspectJ-Scripting:
- SonarQube в этой публикации будет нашим подопытным процессом — это одна из ведущих систем для инспекции качества кода проектов с множеством плагинов для разных языков и технологий.
- AspectJ-Scripting — модифицированный aspectj агент, который инструментирует классы во время из загрузки в jvm, а также скачивает артефакты из maven репозитарев и позволяет описывать аспекты в виде MVEL2 скриптов и выполнять код из maven зависимостей.
Агент активируется двумя дополнительными параметрами при старте jvm и выполняет всю «магию» из конфигурации. Странно, что в повседневной работе разработчики редко используют технологию java agent, хотя многие проприетарные решения для трассировки и DevOps активно используют javaagent: например takipi, plumbr, new relic.
Итак, возвращаемся к модификации java процессов только за счет конфигурирования параметров jvm на примере SonarQube и внедрения веб консолей.
Скачиваем zip архив с сайта проекта и распаковываем его в локальную директорию.
Скачиваем aspectj-scripting java агент.
Также для примера нам нужны будут 3 файла конфигурации для агента:
database_console.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
<aspects>
<name>com.github.igorsuhorukov.H2Console</name>
<type>AFTER</type>
<pointcut>execution(* org.sonar.server.app.WebServer.start(..))</pointcut>
<artifacts>
<artifact>com.h2database:h2:1.3.176</artifact>
<classRefs>
<variable>Console</variable>
<className>org.h2.tools.Console</className>
</classRefs>
</artifacts>
<process>
<expression>
Console.main("-web","-browser","-url","jdbc:h2:tcp://localhost:9092/sonar","-driver","org.h2.Driver","-user","sonar","-password","sonar");
</expression>
</process>
</aspects>
</configuration>
hawtio_console.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
<aspects>
<name>com.github.igorsuhorukov.HawtIo</name>
<type>BEFORE</type>
<pointcut>execution(* org.sonar.server.app.WebServer.start(..))</pointcut>
<artifacts>
<artifact>io.hawt:hawtio-app:jar:2.0.0</artifact>
<classRefs>
<variable>App</variable>
<className>io.hawt.app.App</className>
</classRefs>
</artifacts>
<process>
<expression>
cl = java.lang.Thread.currentThread().getContextClassLoader();
java.lang.Thread.currentThread().setContextClassLoader(App.getClassLoader());
App.main({"--port","10090"});
java.lang.Thread.currentThread().setContextClassLoader(cl);
</expression>
</process>
</aspects>
</configuration>
h2_hawtio.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
<aspects>
<name>com.github.igorsuhorukov.H2Console</name>
<type>AFTER</type>
<pointcut>execution(* org.sonar.server.app.WebServer.start(..))</pointcut>
<artifacts>
<artifact>com.h2database:h2:1.3.176</artifact>
<classRefs>
<variable>Console</variable>
<className>org.h2.tools.Console</className>
</classRefs>
</artifacts>
<process>
<expression>
Console.main("-web","-browser","-url","jdbc:h2:tcp://localhost:9092/sonar","-driver","org.h2.Driver","-user","sonar","-password","sonar");
</expression>
</process>
</aspects>
<aspects>
<name>com.github.igorsuhorukov.HawtIo</name>
<type>BEFORE</type>
<pointcut>execution(* org.sonar.server.app.WebServer.start(..))</pointcut>
<artifacts>
<artifact>io.hawt:hawtio-app:jar:2.0.0</artifact>
<classRefs>
<variable>App</variable>
<className>io.hawt.app.App</className>
</classRefs>
</artifacts>
<process>
<expression>
cl = java.lang.Thread.currentThread().getContextClassLoader();
java.lang.Thread.currentThread().setContextClassLoader(App.getClassLoader());
App.main({"--port","10090"});
java.lang.Thread.currentThread().setContextClassLoader(cl);
</expression>
</process>
</aspects>
</configuration>
Чтобы aspectj-scripting агент мог работать, его надо передать в качестве параметра -javaagent:aspectj-scripting-1.0-agent.jar при старте jvm, а конфигурацию через свойство -Dorg.aspectj.weaver.loadtime.configuration=config:file: ПУТЬ_К_КОНФИГУРАЦИИ. Через system property параметры можно передать maven прокси репозиторий и путь к локальному maven репозиторию.
Все это для SonarQube настраивается в файле conf/sonar.properties в свойстве sonar.web.javaAdditionalOpts
На видео видно как конфигурируется SonarQube для запуска совместно с hawtio_console.xml и hawt.io консоль запускается
Следующий скринкаст показывает как агент запускается с параметром database_console.xml и стартует SQL консоль
И наконец, обе консоли стартуют в процессе SonarQube за счет конфигурации h2_hawtio.xml, для примера мы импортируем метрики проекта mvel в Sonar и смотрим с помощью консоли на таблицы внутри базы данных сонара
Выполнение запросов к базе SonarQube из H2 консоли
Для метрик в SonarQube для библиотеки MVEL
Доступ к статистике базы H2 во вкладке JMX hawtio можно получить, если добавить «JMX=TRUE» к свойству sonar.jdbc.url в файле conf/sonar.properties: sonar.jdbc.url=jdbc:h2:tcp://localhost:9092/sonar;JMX=TRUE
Обзор графиков для JMX java.lang.OperatingSystem:
Итак, мы смогли модифицировать существующее приложение SonarQube так чтобы при старте скачивались hawtio и h2 из maven репозитария и веб консоли запускались в нужный момент при старте сонара.
В следующей публикации, покажу как внедрить с помощью aspectj-scripting интерактивную ssh консоль в существующее java приложение. А также рассмотрим пару вариантов как логировать jdbc запросы и их параметры в приложении, при разработке которого не задумывались о такой функциональности.
Для желающих посетить 9 сентября доклад на тему «Аспектно-ориентированное программирование в распределенных системах для java разработчиков и QA» регистрируйтесь
Удачи вам в анализе работы и мониторинге java приложенией
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.