
実践に移る前に、小さな理論的余談。
jvmエコシステムでは、mavenリポジトリーで膨大な数のライブラリー、フレームワーク、およびプロジェクトが使用可能です:maven centralおよびjcenter。 この出版物では、io.hawt:hawtio-appおよびcom.h2database:h2のみに関心があります。
- hawtioは、多くのプラグインとユーザープラグインによって拡張できる機能を備えたjavaプロセスを監視および制御するためのユニバーサルWebコンソールです。
- h2の中に含まれているものは、1つの記事の中にさえリストするのが困難です。 しかし、これはサーバーモードでも機能する組み込みデータベースであり、jdbcドライバーを持つデータベース内のSQLデータベースを操作するためのWebアプリケーションが含まれていることに興味があります。 これは、データベーススキーマブラウザー、書き込み時のSQLクエリの自動補完、およびロシア語のローカライズを備えた非常に便利なコンソールです。
両方のコンソールは、別個のサーバーなしで機能し、組み込みWebサーバーを起動します。
ただし、プロジェクトでは、リポジトリから適切なほぼすべてのMavenアーティファクトを使用できます。
そして、JavaエージェントAspectJ-Scriptingを使用してSonarQubeで作業します。
- この出版物のSonarQubeは、私たちの実験プロセスです。これは、さまざまな言語とテクノロジーの多くのプラグインを備えたプロジェクトコードの品質を検査するための主要なシステムの1つです。
- AspectJ-Scriptingは修正されたaspectjエージェントであり、jvmからのロード中にクラスを指示し、mavenリポジトリからアーティファクトをダウンロードし、MVEL2スクリプトの形式でアスペクトを記述し、maven依存関係からコードを実行できます。
エージェントは、jvmの起動時に2つの追加パラメーターによってアクティブ化され、構成からすべての「魔法」を実行します。 日々の作業で、開発者がJavaエージェントテクノロジーを使用することはめったにありませんが、トレースおよびDevOpsの多くの独自のソリューションは、takipi、plumbr、new relicなど、javaagentを積極的に使用します。
したがって、例としてSonarQubeを使用してjvmパラメーターを構成し、Webコンソールを実装することによってのみ、Javaプロセスの変更に戻ります。
プロジェクトサイトから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エージェントが機能するためには、jvmの起動時に-javaagent:aspectj-scripting-1.0-agent.jarパラメーターとして渡され、-Dorg.aspectj.weaver.loadtime.configuration = config:ファイルプロパティ:PATH_C_CONFIGURATIONを介した設定が渡される必要があります。 。 システムプロパティパラメータを使用して、mavenプロキシリポジトリとローカルmavenリポジトリへのパスを渡すことができます。
SonarQubeのこのすべては、 sonar.web.javaAdditionalOptsプロパティのconf / sonar.propertiesファイルで構成されます。
このビデオは、コンソールが起動するhawtio_console.xmlおよびhawt.ioとともにSonarQubeが実行されるように構成されている方法を示しています
次のスクリーンキャストは、 database_console.xmlパラメーターを使用してエージェントを起動し、SQLコンソールを起動する方法を示しています
最後に、両方のコンソールは、 h2_hawtio.xml構成によりSonarQubeプロセスで起動します。たとえば、mvelプロジェクトメトリックをSonarにインポートし、コンソールを使用してソナーデータベース内のテーブルを確認します。
H2コンソールからSonarQubeを照会する
MVELライブラリーのSonarQubeのメトリックの場合



conf / sonar.propertiesファイルの sonar.jdbc.urlプロパティに「JMX = TRUE」を追加することにより、JMX hawtioタブのH2ベース統計にアクセスできます。sonar.jdbc.url = jdbc:h2:tcp:// localhost: 9092 /ソナー; JMX = TRUE

JMX java.lang.OperatingSystemのグラフの概要:

そのため、既存のSonarQubeアプリケーションを変更して、開始時にhawtioとh2がmavenリポジトリからダウンロードされ、ソナーが開始された適切なタイミングでWebコンソールが起動されるようにしました。
次の出版物では、アスペクトスクリプトを使用して対話型sshコンソールを既存のJavaアプリケーションに実装する方法を示します。 また、開発中にjdbcリクエストとそのパラメーターをアプリケーションでログに記録する方法のいくつかのオプションを検討してください。
「Java開発者とQA向けの分散システムでのアスペクト指向プログラミング」に関する9月9日のレポートをご覧になりたい方は、 登録してください。
作業の分析とJavaアプリケーションの監視で幸運を