jolokiaとhawtioでJavaアプリケーションをモニタリングする

# はじめに

jolokiaとhawtioを使用して、JavaアプリケーションのMBeanの情報等を取得してみます。


## jolokiaとは

http経由でMBeanにアクセスをするためのJavaエージェントです。
httpでアクセスできるので、curlなどで簡単にMBeanの情報を採取できます。採取した情報はJSONで返ってきます。

## hawtioとは

hawtioはJavaアプリケーションをモニタリング・管理することができるWebコンソールです。標準で、Tomcat、Apache Camel、Apache ActiveMQなどに対応しています。そのほかのJavaアプリケーションでもJMXで取得したMBeanやJVMの情報を表示することができます。

JMXは、hawtioがアプリケーションとJMXで通信しているわけではなく、バックエンドのjolokiaとhttp通信してMBeanの情報を採取し、画面に表示しています。
つまり、hawtioとjolokiaを組み合わせれば、リモートの様々なJavaアプリケーションにJMXでアクセスることができます。

今回はモニタリング対象のJavaアプリケーションとして、たまたまサーバに起動していたkafkaを用いて動かしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/63e496f7-baa1-ff1c-e53f-f5f03d244060.png)

なお、手順は以下の記事を参考にしました。

[play + jolokia + hawtio](https://qiita.com/n_slender/items/3d4e03a6a8be5ecd2578)


# jolokia

## jolokiaをダウンロードする

以下のサイトからjolokiaのAgentをダウンロードします。

https://jolokia.org/download.html

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/d5735bf7-377c-75ba-8802-9bde6214f84f.png)

## jolokiaを実行する

jolokiaはスタンドアローンで実行する方法と、Javaアプリケーションに組み込む方法があります。

### (1) スタンドアローンでjolokiaを実行する

以下のコマンドを実行すると、Javaアプリケーションのプロセス一覧が表示されます。

```
# java -jar jolokia-jvm-1.6.0-agent.jar 
3906   kafka.Kafka ../config/server.properties
4229   jolokia-jvm-1.6.0-agent.jar
1039   org.apache.zookeeper.server.quorum.QuorumPeerMain /opt/kafka/config/zookeeper.properties
```

なお、コマンドのオプションは以下のとおりです。

```
Usage: java -jar jolokia-jvm-1.6.0-agent.jar [options] <command> <pid/regexp>
where <command> is one of
    start     -- Start a Jolokia agent for the process specified
    stop      -- Stop a Jolokia agent for the process specified
    status    -- Show status of an (potentially) attached agent
    toggle    -- Toggle between start/stop (default when no command is given)
    list      -- List all attachable Java processes (default when no argument is given at all)
    encrypt   -- Encrypt a password which is given as argument or read from standard input
```

次に、以下のように実行するとjolokiaが起動します。最後の"3906"がモニタリング対象のJavaアプリケーションのプロセスIDになります。
実行後に画面に表示されている「http://127.0.0.1:8778/jolokia/ 」がjolokiaへのアクセス先になります。
jolokiaの認証用のユーザIDとパスワードは「jolokia」にしています。

```
# java -jar jolokia-jvm-1.6.0-agent.jar --user jolokia --password jolokia start 3906
Started Jolokia for PID 3906
http://127.0.0.1:8778/jolokia/
```

### (2) Javaアプリケーションに組み込んでjolokiaを実行する

Javaの起動オプションに以下を追加します。
「jolokia-jvm-1.6.0-agent.jar」のパスは環境に合わせて変更します。

```
-javaagent:./jolokia-jvm-1.6.0-agent.jar=port=8778,host=localhost
```


## Jolokiaのバージョン確認

jolokiaにhttpでアクセスして、バージョン情報を取得してみます。

```
# curl http://localhost:8778/jolokia/version
{"request":{"type":"version"},"value":{"agent":"1.6.0","protocol":"7.2","config":{"listenForHttpService":"true","maxCollectionSize":"0","authIgnoreCerts":"false","agentId":"192.168.10.141-4698-5b480cf9-jvm","debug":"false","agentType":"jvm","policyLocation":"classpath:\/jolokia-access.xml","agentContext":"\/jolokia","serializeException":"false","mimeType":"text\/plain","maxDepth":"15","authMode":"basic","discoveryEnabled":"true","streaming":"true","canonicalNaming":"true","historyMaxEntries":"10","allowErrorDetails":"true","allowDnsReverseLookup":"true","realm":"jolokia","includeStackTrace":"true","maxObjects":"0","useRestrictorService":"false","debugMaxEntries":"100"},"info":{"product":"jetty","vendor":"Eclipse","version":"9.2.24.v20180105"}},"timestamp":1542198764,"status":200}[root@kafkaserver1 ~]# 
```

## メトリクスを取得してみる

次に、jolokiaにhttpでアクセスして、メトリクスを取得してみます。

```
# curl http://localhost:8778/jolokia/read/java.lang:type=Memory/NonHeapMemoryUsage
{"request":{"mbean":"java.lang:type=Memory","attribute":"NonHeapMemoryUsage","type":"read"},"value":{"init":2555904,"committed":53477376,"max":-1,"used":50092648},"timestamp":1542198810,"status":200}[root@kafkaserver1 ~]# 
```

## jolokiaを停止させる（スタンドアローンで起動していた場合）

Jolokiaを停止させる場合は以下のコマンドを実行します。

```
# java -jar jolokia-jvm-1.6.0-agent.jar stop 3906
Stopped Jolokia for PID 3906
```

# hawtioを実行する

## hawtioをダウンロードする

以下のサイトからhawtioのモジュールをダウンロードします。
今回は「hawtio-app-2.3.0.jar」をダウンロードしました。

https://github.com/hawtio/hawtio/releases

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/f1deaebc-4a78-9007-17ae-7a253700265a.png)


## hawtioを実行する

以下のコマンドでhawtioを実行します。
「--port 8090」でhawtioが使用するポートを指定しています。
※デフォルトだと8080を使用します。他のアプリケーションとかぶるので変更しました。

```
java -jar hawtio-app-2.3.0.jar --port 8090

hawtio: Don't cha wish your console was hawt like me!
=====================================================
```


## hawtioのWebコンソールにアクセスする

hawtioのWebコンソールのURLは以下になります。

http://localhost:8090/hawtio

ブラウザで開くと以下のような画面が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/0db2c05c-f79b-f813-072b-7ddec2e8d2c5.png)

早速、jolokiaに接続してみます。

まずは、「Add connection」ボタンをクリックする。
jolokia接続情報を入力するダイアログが表示されるので、画面のように入力する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/0a6e7dbd-1c35-6ef3-78fb-b4e76835eb48.png)

「Test Connection」をクリックするとjolokiaのユーザIDとパスワードの入力ダイアログが表示されるので、jolokia起動時に設定した「jolokia」を入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/f9b6034d-0d13-cf1c-b966-9549380e9124.png)

「Connected successfully」と表示されれば成功。
最後に「Add」ボタンを押下する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/65b2883c-389e-d0ea-ee12-9a09db192632.png)


# Kafkaを見てみる

「Connect」ボタンを押下すると、別ウィンドウが起動します。

JMXのタブを選択すると、kafkaのMBeanの情報を見ることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/2cf09b1e-f199-981c-fd68-e1d70aaed1a8.png)

RuntimeでJVMのSystem Properties、スレッド、Class Histogramなどの情報を見ることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/69c6bb8b-8106-0435-c272-4c7cbdf4bb25.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/838e0783-945d-bbc4-1f73-072676f31116.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/19347e13-7ea8-92a2-0e0f-608ecc969ba8.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/20bb22b5-408c-3cd6-de92-e0027bba95ca.png)


# 参考

- [play + jolokia + hawtio](https://qiita.com/n_slender/items/3d4e03a6a8be5ecd2578)

- [Tomcat9にデプロイしたCamelのWebアプリケーションをhawtioで可視化する](https://qiita.com/mkyz08/items/06af9940dc2a323fcea6)