LibertyのDataSource使用量を見る

# 目的
Libertyと、Dbで環境を構築してDataSource の使用量をJMXで確認します。

# 環境構築

環境は前に書いた

https://qiita.com/keniooi/items/17867bc73dbfb991c08f

をもとにします。

# テスト接続

http://localhost:9080/db.connections/db

にアクセスして DataSource 接続を使用するようにします。

# JMXのオブジェクトを見つける

https://localhost:9443/IBMJMXConnectorREST/mbeans

|Key|Value|
|:--:|:--:|
|ユーザー名|wsadmin|
|パスワード|passw0rd|

でアクセスして DataSource MBeanを見つけます。
jndiNameなど定義をキーにして探せるようにします。今回は以下が見つけられると良いです。

```
{"objectName":"WebSphere:type=com.ibm.ws.jca.cm.mbean.ConnectionManagerMBean,jndiName=jdbc/derbyEmbedded,name=dataSource[DefaultDetaSource]/connectionManager[default-0]","className":"com.ibm.ws.jca.cm.mbean.ConnectionManagerMBean","URL":"/IBMJMXConnectorREST/mbeans/WebSphere%3AjndiName%3Djdbc%2FderbyEmbedded%2Cname%3DdataSource%5BDefaultDetaSource%5D%2FconnectionManager%5Bdefault-0%5D%2Ctype%3Dcom.ibm.ws.jca.cm.mbean.ConnectionManagerMBean"}
```

curl でアクセスする場合には以下にサンプルがあります。ACCESS_HOST (libertyのホスト名) の指定が必要です。

```
git clone https://github.com/pdprof/db-connections
cd db-connections/derby-docker/mustgather-jmx-1
export ACCESS_HOST=localhost
./getMBeans.sh
```


# MBeanのURLにアクセス

先に抜粋したJSONにURLが記載されているので、そこにアクセスします。

```
$ curl -s -k -u wsadmin:passw0rd https://localhost:9443/IBMJMXConnectorREST/mbeans/WebSphere%3AjndiName%3Djdbc%2FderbyEmbedded%2Cname%3DdataSource%5BDefaultDetaSource%5D%2FconnectionManager%5Bdefault-0%5D%2Ctype%3Dcom.ibm.ws.jca.cm.mbean.ConnectionManagerMBean | jq .
{
  "className": "com.ibm.ws.jca.cm.mbean.ConnectionManagerMBean",
  "description": "MBean for a Connection Manager",
  "descriptor": {
    "names": [],
    "values": []
  },
  "attributes": [],
  "attributes_URL": "/IBMJMXConnectorREST/mbeans/WebSphere%3AjndiName%3Djdbc%2FderbyEmbedded%2Cname%3DdataSource%5BDefaultDetaSource%5D%2FconnectionManager%5Bdefault-0%5D%2Ctype%3Dcom.ibm.ws.jca.cm.mbean.ConnectionManagerMBean/attributes",
  "constructors": [],
  "notifications": [],
  "operations": [
    {
      "name": "purgePoolContents",
      "description": "Purges the contents of the Connection Manager.",
      "descriptor": {
        "names": [],
        "values": []
      },
      "impact": "1",
      "returnType": "java.lang.Void",
      "signature": [
        {
          "name": "arg0",
          "type": "java.lang.String",
          "description": "Use 'abort' to abort all connections in the pool using Connection.abort(). Use 'immediate' to purge the pool contents immediately. Any other string value will purge the pool contents normally.",
          "descriptor": {
            "names": [],
            "values": []
          }
        }
      ],
      "URL": "/IBMJMXConnectorREST/mbeans/WebSphere%3AjndiName%3Djdbc%2FderbyEmbedded%2Cname%3DdataSource%5BDefaultDetaSource%5D%2FconnectionManager%5Bdefault-0%5D%2Ctype%3Dcom.ibm.ws.jca.cm.mbean.ConnectionManagerMBean/operations/purgePoolContents"
    },
    {
      "name": "showPoolContents",
      "description": "Displays the current contents of the Connection Manager in a human readable format.",
      "descriptor": {
        "names": [],
        "values": []
      },
      "impact": "0",
      "returnType": "java.lang.String",
      "signature": [],
      "URL": "/IBMJMXConnectorREST/mbeans/WebSphere%3AjndiName%3Djdbc%2FderbyEmbedded%2Cname%3DdataSource%5BDefaultDetaSource%5D%2FconnectionManager%5Bdefault-0%5D%2Ctype%3Dcom.ibm.ws.jca.cm.mbean.ConnectionManagerMBean/operations/showPoolContents"
    }
  ]
}
```

MBeanで使える operations などの情報が戻ります。



# showPoolContents

接続プールの情報を取得します。

https://localhost:9443/IBMJMXConnectorREST/api

にアクセスしてどうやってMBeanにアクセスするかを確認します。
MBean operation invocation を選択して確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/745fc4c5-1f85-4151-f672-004e34824804.png)

showPoolContents の signature から 0 params と分かるので POSTする引数はなしで以下のようにできます。

```
curl -s -k -u wsadmin:passw0rd -H "Content-Type: application/json" -d "{}" https://localhost:9443/IBMJMXConnectorREST/mbeans/WebSphere%3AjndiName%3Djdbc%2FderbyEmbedded%2Cname%3DdataSource%5BDefaultDetaSource%5D%2FconnectionManager%5Bdefault-0%5D%2Ctype%3Dcom.ibm.ws.jca.cm.mbean.ConnectionManagerMBean/operations/showPoolContents | jq -r ".value"

PoolManager@d8ee2952
name=WebSphere:type=com.ibm.ws.jca.cm.mbean.ConnectionManagerMBean,jndiName=jdbc/derbyEmbedded,name=dataSource[DefaultDetaSource]/connectionManager[default-0]
jndiName=jdbc/derbyEmbedded
maxPoolSize=5
size=1
waiting=0
unshared=0
shared=0
available=1
 ManagedConnection@37c92820=Reusable

Extended ConnLeakLogic information
JNDI name:jdbc/derbyEmbedded
PoolManager object:-548673331
Total number of connections: 1 (max/min 5/2, reap/unused/aged/maxInUseTime 180/1800/-1/-1, connectiontimeout/purge 30/EntirePool)
Shared Connection information (shared partitions 200)
  No shared connections

Free Connection information (free distribution table 100)
  (1)MCWrapper id 37c92820  Managed connection WSRdbManagedConnectionImpl@254d13f9  State:STATE_ACTIVE_FREE

  Total number of connection in free pool: 1
UnShared Connection information
  No unshared connections
```

以下のようにすることで動作するスクリプトも用意しました。SHOWPOOL_URLは環境にあわせて設定します。

```
export SHOWPOOL_URL='/IBMJMXConnectorREST/mbeans/WebSphere%3AjndiName%3Djdbc%2FderbyEmbedded%2Cname%3DdataSource%5BDefaultDetaSource%5D%2FconnectionManager%5Bdefault-0%5D%2Ctype%3Dcom.ibm.ws.jca.cm.mbean.ConnectionManagerMBean/operations/showPoolContents'
./showPoolContents.sh
```


# purgePoolContents

接続プールを破棄します。今回は abort.json を用意してあるので、それを使います。書き方は先の api のページを参考にします。

```abort.json
{
  "params":[
      {
        "value" : "abort",
        "type" : "java.lang.String"
      }
   ],
  "signature":[
      "java.lang.String"
   ]
}
```

```
curl -s -k -u wsadmin:passw0rd -H "Content-Type: application/json" -d '@abort.json' https://localhost:9443/IBMJMXConnectorREST/mbeans/WebSphere%3AjndiName%3Djdbc%2FderbyEmbedded%2Cname%3DdataSource%5BDefaultDetaSource%5D%2FconnectionManager%5Bdefault-0%5D%2Ctype%3Dcom.ibm.ws.jca.cm.mbean.ConnectionManagerMBean/operations/purgePoolContents
```

以下のようにすることで動作するスクリプトも用意しました。PURGEPOOL_URLは環境にあわせて設定します。
```
export PURGEPOOL_URL='/IBMJMXConnectorREST/mbeans/WebSphere%3AjndiName%3Djdbc%2FderbyEmbedded%2Cname%3DdataSource%5BDefaultDetaSource%5D%2FconnectionManager%5Bdefault-0%5D%2Ctype%3Dcom.ibm.ws.jca.cm.mbean.ConnectionManagerMBean/operations/purgePoolContents'
./purgePoolContents.sh
```

# まとめ

DataSourceの MBeanを参考に MBeanとAPIの確認と実行方法を紹介しました。
ここに書いたものだけでなく、ほかのMBeanにも使えるような情報になるといいと思って書いてみました。