Open Libertyで問題判別ハンズオン


## はじめに
従来のWebSphere Application Server（以下WAS)時代に、[PD職人](https://www.ibm.com/developerworks/community/wikis/home?lang=ja#!/wiki/PD%20Professional/page/PD%E8%81%B7%E4%BA%BA%20%E3%81%B8%E3%82%88%E3%81%86%E3%81%93%E3%81%9D) というIBMのWikiにWASの問題判別スキルをつけるためのハンズオンがまとまめられています。
今回は上記ハンズオンで使っているサンプルアプリとライブラリをOpen Liberty環境に入れて稼動確認をしたので、その際のメモです。

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

## 導入手順
１. Open LibertyとJavaはすでに導入され、server1が構成されているものとします。手順は[こちら](https://qiita.com/rinaxsumomo/items/7485af55d04088b8055d)をご参照ください。
２. 上記のWikiからearファイルとネイティブ・ライブラリを入手します。
３. server1/appsディレクトリにearファイルをコピーします。
![Kobito.jNSaBl.png](https://qiita-image-store.s3.amazonaws.com/0/129662/f354e9fc-be29-5db2-7d27-87c4be4fbdc6.png "Kobito.jNSaBl.png")
４. server1/libsディレクトリをmkdirします。
５. 上記libsディレクトリにネイティブ・ライブラリをコピーします。
![Kobito.jt0J0t.png](https://qiita-image-store.s3.amazonaws.com/0/129662/8d01ca1d-c5b4-db13-5d39-9036dc99270a.png "Kobito.jt0J0t.png")
６. server.xmlファイルを更新します。

```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="*" />
                  
    <!-- Not releavant to this topic, never mind -->
    <basicRegistry id="basic" realm="BasicRealm"> 
        <user password="password" name="jmxuser"/>
    </basicRegistry>
   
    <!-- Not releavant to this topic, never mind -->
    <administrator-role>
        <user>jmxuser</user>
    </administrator-role>

   <library id="pdProLib">
    <folder dir="${server.config.dir}/libs" />
    <file name="${server.config.dir}/libs/pdpro.native.dll" />
   </library>

   <application location ="pdpro.20110516.ear">
   <classloader commonLibraryRef="pdProLib" />
   </application>

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

```

７. server1を開始します。

```start
./server start server1
```

アプリが開始していることがわかります

```messages.log
[8/22/18 15:01:02:519 JST] 00000001 com.ibm.ws.kernel.launch.internal.FrameworkManager           A CWWKE0001I: サーバー server1 が起動されました。
(略)
[8/22/18 15:01:20:733 JST] 0000001e com.ibm.ws.app.manager.AppMessageHelper                      A CWWKZ0001I: アプリケーション pdpro.20110516 が 2.307 秒で開始しました。
```

## 稼動確認
１. 以下のようにtopページが確認できます。
![Kobito.y52mmy.png](https://qiita-image-store.s3.amazonaws.com/0/129662/a3999a18-06d3-59e2-29d4-f40c396a5ff6.png "Kobito.y52mmy.png")

２. Hangを試してみます。ここではCall Sleep Servletで10秒スリープさせてみます。
![Kobito.C6eE5y.png](https://qiita-image-store.s3.amazonaws.com/0/129662/63172cad-8c62-c533-8b84-fcc210408361.png "Kobito.C6eE5y.png")

３. 10秒スリープして結果が戻りました。
![Kobito.5hB8IU.png](https://qiita-image-store.s3.amazonaws.com/0/129662/8dd58f77-82b2-b523-3189-45076094e0cf.png "Kobito.5hB8IU.png")

４. message.logにも出力されています。

```messages.log
[8/22/18 15:01:32:548 JST] 0000001d com.ibm.ws.webcontainer.servlet                              I SRVE0242I: [pdpro.20110516] [/hang] [MySleepServlet]: 初期化が成功しました。
[8/22/18 15:01:32:549 JST] 0000001d SystemOut                                                    O > MySleepServet.doTask()
[8/22/18 15:01:32:551 JST] 0000001d SystemOut                                                    O D MySleepServet.doTask() request.getParamter("sleeptime")
[8/22/18 15:01:32:561 JST] 0000001d SystemOut                                                    O D MySleepServet.doTask() looptime is 10000 milliseconds
[8/22/18 15:01:32:565 JST] 0000001d SystemOut                                                    O > MyLoop.doLoop() - sleep 10000 milliseconds
[8/22/18 15:01:42:570 JST] 0000001d SystemOut                                                    O < MyLoop.doLoop()
[8/22/18 15:01:42:572 JST] 0000001d SystemOut                                                    O < MySleepServet.doTask()
[8/22/18 15:16:20:315 JST] 00000331 SystemOut                                                    O > MySleepServet.doTask()
[8/22/18 15:16:20:324 JST] 00000331 SystemOut                                                    O D MySleepServet.doTask() request.getParamter("sleeptime")
[8/22/18 15:16:20:325 JST] 00000331 SystemOut                                                    O D MySleepServet.doTask() looptime is 10000 milliseconds
[8/22/18 15:16:20:326 JST] 00000331 SystemOut                                                    O > MyLoop.doLoop() - sleep 10000 milliseconds
[8/22/18 15:16:30:328 JST] 00000331 SystemOut                                                    O < MyLoop.doLoop()
[8/22/18 15:16:30:332 JST] 00000331 SystemOut                                                    O < MySleepServet.doTask()
```

## まとめ
以上でPD職人で提供されているサンプルアプリを動かし、問題判別ハンズオンの準備を行いました。
なお全てのケースを試しているわけではないことにご注意ください。

## 追記 2018/8/31 
ふとライブラリをよく見たらWindows用のdllでした。。（確認漏れです。。）
なので今回のMac/Linux環境では読み込めないため、Native Libraryを呼び出すCrashケースとNative heapを枯渇させるOutOfMemoeryErrorケースはここでは使えません。Java heapのOOMEやHangやExceptionケースが使えます。Windowsでしたら全ケース可能のはずです。

## 参考資料
https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_liberty/com.ibm.websphere.wlp.doc/ae/cwlp_sharedlibrary.html