Open Libertyの性能値をREST APIで取得する


## はじめに
LibertyではJVMのリソース使用状況、アプリの応答時間やリクエスト数といった監視対象としたい性能値などの情報をREST APIで取得できます。レスポンスデータはJSONなので、好みの言語やツールで利用することができます。というわけで料理の材料となる性能情報データを取得するまでの流れを整理しました。

## 前提
* Open Liberty 18.0.0.2
* Java8
* macOS 10.13.6

## 手順
１.Open Libertyは導入済み・server1が作成済み・サンプルアプリは導入済みとします。手順は[こちら](https://qiita.com/rinaxsumomo/items/7485af55d04088b8055d)や[こちら](https://qiita.com/rinaxsumomo/items/d871534208e4fe5975bd)を参考に。

２. server.xmlを編集して、RESTで接続して監視情報を取得できるようにします。具体的にはmonitor-1.0とrestConnector-2.0 フィーチャーを有効にし、この情報にアクセスできるための管理ユーザー（jmxadmin）を設定します。

```server.xml
<?xml version="1.0" encoding="UTF-8"?>
<server description="new server">

    <!-- Enable features -->
    <featureManager>
        <feature>jsp-2.3</feature>
        <feature>javaee-7.0</feature>
        <feature>monitor-1.0</feature>
        <feature>restConnector-2.0</feature>
    </featureManager>

    <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
    <httpEndpoint id="defaultHttpEndpoint"
                  httpPort="9080"
                  httpsPort="9443"
                  host="*" />

    <basicRegistry id="basic" realm="BasicRealm"> 
        <user password="password" name="jmxadmin"/>
    </basicRegistry>

    <administrator-role>
        <user>jmxadmin</user>
    </administrator-role>

    <!-- Automatically expand WAR files and EAR files -->
    <applicationManager autoExpand="true"/>
</server>

```

この時ssl-1.0フィーチャーが暗黙的に有効化されてデフォルトのSSL構成が初期化されます。明示的に構成したい場合は[こちら](https://www.ibm.com/support/knowledgecenter/ja/SSD28V_9.0.0/com.ibm.websphere.wlp.core.doc/ae/twlp_sec_ssl.html)をご参照ください。
またサンプルアプリはdropinsディレクトリに入れているため、server.xmlでは定義していません。

３. 以下のようなログがmessages.logに出力されることを確認します。

```messages.log
(略)
[8/23/18 13:21:25:810 JST] 00000014 com.ibm.ws.ssl.config.WSKeyStore                             A CWPKI0820A: デフォルトの鍵ストアは'keystore_password' 環境変数を使用して作成されました。
[8/23/18 13:21:25:958 JST] 00000011 ibm.ws.security.authentication.internal.jaas.JAASServiceImpl I CWWKS1123I: クラス名が NullCollectiveAuthenticationPlugin である集合認証プラグインがアクティブ化されました。 
[8/23/18 13:21:25:977 JST] 00000020 com.ibm.ws.tcpchannel.internal.TCPChannel                    I CWWKO0219I: TCP チャネル defaultHttpEndpoint-ssl が開始され、現在、ホスト *  (IPv6)、ポート 9443 の要求を listen しています。
(略)
[8/23/18 13:21:38:666 JST] 00000055 com.ibm.ws.jmx.connector.server.rest.RESTAppListener         I CWWKX0103I: JMX REST コネクターが稼働し、以下のサービス URLから利用できます: service:jmx:rest://192.168.100.1:9443/IBMJMXConnectorREST
[8/23/18 13:21:40:179 JST] 00000019 com.ibm.ws.kernel.feature.internal.FeatureManager            A CWWKF0012I: サーバーは次のフィーチャーをインストールしました。[servlet-3.1, beanValidation-1.1, ssl-1.0, jndi-1.0, jca-1.7, jms-2.0, ejbPersistentTimer-3.2, appSecurity-2.0, j2eeManagement-1.1, jdbc-4.1, wasJmsServer-1.0, jaxrs-2.0, javaMail-1.5, restConnector-2.0, monitor-1.0, cdi-1.2, webProfile-7.0, jcaInboundSecurity-1.0, jpa-2.1, jsp-2.3, ejbLite-3.2, managedBeans-1.0, jsf-2.2, ejbHome-3.2, jaxws-2.2, jsonp-1.0, el-3.0, jaxrsClient-2.0, concurrent-1.0, appClientSupport-1.0, ejbRemote-3.2, javaee-7.0, jaxb-2.2, mdb-3.2, jacc-1.5, batch-1.0, ejb-3.2, json-1.0, jaspic-1.1, jpaContainer-2.1, distributedMap-1.0, websocket-1.1, wasJmsSecurity-1.0, wasJmsClient-2.0]。
[8/23/18 13:21:40:181 JST] 00000019 com.ibm.ws.kernel.feature.internal.FeatureManager            I CWWKF0008I: フィーチャー更新が 20.963 秒で完了しました。
[8/23/18 13:21:40:181 JST] 00000019 com.ibm.ws.kernel.feature.internal.FeatureManager            A CWWKF0011I: サーバー server1 は、Smarter Planet に対応する準備ができました。
[8/23/18 13:21:40:293 JST] 00000053 com.ibm.ws.webcontainer.servlet                              I SRVE0242I: [com.ibm.ws.jmx.connector.server.rest] [/IBMJMXConnectorREST] [JMXRESTProxyServlet]: 初期化が成功しました。
(略)
```

４. JVM情報を確認します。以下のURLに対してRestlet Clientからリクエストすると、Heap, FreeMemory, UsedMemory, ProcessCPU, GcCount, GcTime, UpTimeといった情報が返ります。jmxadminのBasic認証情報を入れるのを忘れないように。

```URL
https://localhost:9443/IBMJMXConnectorREST/mbeans/WebSphere%3Atype%3DJvmStats/attributes
```

![Kobito.E43DKv.png](https://qiita-image-store.s3.amazonaws.com/0/129662/5af3a6b9-a1a0-0621-afa0-6f92f840949f.png "Kobito.E43DKv.png")

![Kobito.i8ytzJ.png](https://qiita-image-store.s3.amazonaws.com/0/129662/f3992246-b564-6721-2f8c-5089d16736b5.png "Kobito.i8ytzJ.png")


５. サーブレット情報を確認します。ここでInfraTestWLPWebというのがアプリ名（war）で、SnoopServletというのがサーブレット名で、アプリ名.サーブレット名のフォーマットでnameを指定します。以下のURLに対してRestlet Clientからリクエストすると、AppName, ServletName, RequestCount, ResponseTime, Description, RequestCountDetails, ResponseTimeDetailsといった情報が返ります。

```URL
https://localhost:9443/IBMJMXConnectorREST/mbeans/WebSphere%3Atype%3DServletStats%2Cname%3DInfraTestForWLPWeb.SnoopServlet/attributes
```

![Kobito.rycvvg.png](https://qiita-image-store.s3.amazonaws.com/0/129662/37416de5-8928-0f96-f9b4-ec74e48f170e.png "Kobito.rycvvg.png")

![Kobito.R4vEJi.png](https://qiita-image-store.s3.amazonaws.com/0/129662/40d7ce9a-6fe4-7d2b-51d2-752fefe03480.png "Kobito.R4vEJi.png")


６. スレッドプール情報を確認します。ここではプール名はデフォルトのexecutor名をnameに入れています。以下のURLに対してRestlet Clientからリクエストすると、ActiveThreads, PoolSize, PoolNameといった情報が返ります。

```URL
https://localhost:9443/IBMJMXConnectorREST/mbeans/WebSphere%3atype%3dThreadPoolStats%2cname%3dDefault%20Executor/attributes
```

![Kobito.QT5BUr.png](https://qiita-image-store.s3.amazonaws.com/0/129662/f61e2ba1-d1fb-fe41-4c32-9697b5a71fb9.png "Kobito.QT5BUr.png")

![Kobito.hij0m0.png](https://qiita-image-store.s3.amazonaws.com/0/129662/29ef9e9d-9584-4940-61ea-5c94422a6d32.png "Kobito.hij0m0.png")

７. ここでREST APIへアクセスするURLのルールを整理すると、以下のようになります。MXBeanオブジェクト名や属性名は参考資料に記載されています。最後の属性名をつけずに、/attributesで終わると4-6のように全情報が一気に取得されます。

```URL
https://ホスト名:ポート番号/IBMJMXConnectorREST/mbeans/MXBeanオブジェクト名/attributes/属性名
```

８. 使用メモリ量を個別に取得して見ます。

```URL
https://localhost:9443/IBMJMXConnectorREST/mbeans/WebSphere%3Atype%3DJvmStats/attributes/UsedMemory
```
![Kobito.daYOte.png](https://qiita-image-store.s3.amazonaws.com/0/129662/43f88591-2270-e18f-eb35-b6b9ad4ab46c.png "Kobito.daYOte.png")

![Kobito.ptDsHQ.png](https://qiita-image-store.s3.amazonaws.com/0/129662/b959a013-cdd9-d56c-c5c1-8c62d9ecf182.png "Kobito.ptDsHQ.png")

９. 応答時間を個別に取得して見ます。

```URL
https://localhost:9443/IBMJMXConnectorREST/mbeans/WebSphere%3Atype%3DServletStats%2Cname%3DInfraTestForWLPWeb.SnoopServlet/attributes/ResponseTime
```

![Kobito.1gN15N.png](https://qiita-image-store.s3.amazonaws.com/0/129662/b1917920-a725-e3db-0bd4-61096f003e33.png "Kobito.1gN15N.png")

![Kobito.l7V6Fq.png](https://qiita-image-store.s3.amazonaws.com/0/129662/3b7aff04-8810-8622-b7ff-e1150e87470b.png "Kobito.l7V6Fq.png")


## まとめ
以上でOpen Libertyが提供するREST APIで性能値を取得するまでの手順を整理しました。
上記以外にもセッション情報やコネクションプール情報も取得できるようです。

## 参考資料
* https://www.ibm.com/support/knowledgecenter/en/SSEQTP_liberty/com.ibm.websphere.wlp.doc/ae/twlp_monitor10.html
* https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_liberty/com.ibm.websphere.wlp.doc/ae/rwlp_mbeans_list.html#rwlp_mbeans_list__ServletStatsMXBean