Instana で ApacheトレーシングとEnd User Monitoring の自動有効化を試してみる

これまで Instanaで End User Monitoringを実施する場合、Webアプリケーション側に小さなJavaScriptを埋込む必要があり、業務チームにお願いしないといけないので、ちょっとだけ敷居が高い状況でした。フロントにApache HTTPサーバーがある場合、HTTPサーバーがこの埋込み作業を代替してくれる機能 [Webサイト自動インスツルメンテーション](https://www.ibm.com/docs/ja/instana-observability/current?topic=websites-automatic-instrumentation) が機能追加されました

以下のような典型的なWeb３層の構成で稼働しているシステムも、いまでも多くあるのはでないでしょうか。
　[ IBM HTTP Server ] --- [ WebSphereAS / Liberty ] --- [ Db2 / Oracle ] 

このような構成のお客様は今回の機能が使えます。
せっかくなので、IHSの分散トレーシングの設定含めて、一気に試してみたいと思います。

 # 1. IBM HTTP Server監視の設定（トレーシング、メトリック）
### 1.1 IBM HTTP Server での メトリックの有効化
IBM HTTP Server で メトリックを有効化する方法は簡単です。
httpd.confにおいて server_statusを有効化してください。InstanaとしてはローカルからアクセスできればOKです。
```
LoadModule status_module modules/mod_status.so
<IfModule mod_status.c>
ExtendedStatus On
</IfModule>

<IfModule mod_status.c>
    <Location /server-status>
        SetHandler server-status
        Require ip 127.0.0.1
        Require all denied
    #   To allow access from a specific IP:
    #   Require ip 192.168.1
    </Location>
</IfModule>
```

### 1.2 IBM HTTP Server での トレーシングの有効化（自動）
トレーシングの有効化も簡単です。Instanaエージェントの構成ファイル configuration.yamlにおいて、以下をコメントアウトするだけです。
```
# Apache Httpd
com.instana.plugin.httpd:
  tracing:
    enabled: true
    autoRestart: true 　　　　#自動再起動を許可（任意）
```

###  1.3 [ オプション ] IBM HTTP Server での トレーシングの有効化（手動）
外部接続が制限されている環境においては、以下のように手動で実施します。
##### a. トレーシング・モジュールの取得
製品ドキュメント に従い、環境に応じた ２つのモジュールをダウンロードします。
mod_dem_x86_64-1.0.14.so  
tracelibrary_x86_64-1.0.14.so
##### b. トレーシング・モジュールの配置
今回の RHELの環境では、IHSが /opt/IBM/HTTPServer に導入されていますので、この下の modulesディレクトリに配置し、他と同様 755のアクセス権を設定します。
```
# pwd
/opt/IBM/HTTPServer/modules
# cp -p /tmp/mod_dem_x86_64-1.0.14.so .
# cp -p /tmp/tracelibrary_x86_64-1.0.14.so .
# chmod 755 mod_dem_x86_64-1.0.14.so  
# chmod 755 tracelibrary_x86_64-1.0.14.so
# ls -ltr
 (中略）
-rwxr-xr-x 1 root root   51736 Dec 14 01:49 mod_dem_x86_64-1.0.16.so
-rwxr-xr-x 1 root root 9344304 Dec 14 01:49 tracelibrary_x86_64-1.0.16.so
```
##### c. トレーシング・モジュールの有効化
httpd.confの最後に、以下の一行を追加します
```
LoadModule dem_module /opt/IBM/HTTPServer/modules/mod_dem_x86_64-1.0.14.so
```

 # 2. Instanaでの メトリックと分散トレーシング稼働確認
 Instana で稼働確認を行います。 サンプルアプリとして、Libertyで稼働する ModResort というアプリケーションを利用します。 
 Libertyで稼働していますが、フロントエンドは JavaScriptで選択に応じて表示が切り替わります。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/9650fde0-1f47-3aca-3b1a-1f3189574788.png)

### 2-1. Instanaでのトレーシングの稼働確認
実際にアクセスしてみると、IHSと Libertyのトレーシングが行われているのが分かります。
(Apacheの 分散トレーシングを設定していない場合、IHSは依存関係ビューに表れません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/ca5e3752-d5b6-eb80-9e79-e5c22e60b8f2.png)
IBM HTTP Server側の解析画面です。単発リクエストしか飛ばしていないのでシンプルですが、Apache httpdに届いた要求が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/256b08c7-4022-f2f9-7b0d-b3fc09d8da92.png)
Liberty側の解析画面です。IHSからフォワードされLibertyに届いた要求が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/f616c97e-0f46-0e07-3eb9-5e4b52b309bb.png)
要求の解析画面を開くと、IHSから Libertyに対してフォワードされた処理のシーケンスが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/187c3cfb-6dcc-0651-67a8-88f599110c5f.png)

これで、バックエンド側は Instanaで監視できるようになりました。
続いて、このアプリケーションに対して、エンドユーザー・モニタリングも設定してみましょう。

# 3. IBM HTTP Server での 自動 End User Monitoring の設定

### 3-1. End User Monitoring 監視対象の定義
まず、End User Monitoring の定義に必要な情報を確認します。
End User Monitoringの画面（Webサイトおよびモバイル・アプリケーション）にいおいて、Webサイトの追加を選択し、監視定義名（今回は Resorts）を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/fd550412-87d4-0a7c-c4b1-202e140df330.png)
つぎのページで 以下のように End User Monitoringに必要なすべての情報が生成されます。
これまでは、これを Webページの < head > に組込んでいました。このなかで記載されている 小さなJavaScriptモジュールが、ブラウザのAPIなどを叩きながら 必要な情報をInstanaに送信します。
今回は、そのアプリケーション改修を行わず、Instnaエージェントの設定だけで、このモジュール組込みを実現します。ここにある内容は、Instanaエージェント側で設定が必要となりますので、 メモを取っておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/2c7166ca-d445-fded-3a95-db09bc3bbb1d.png)


### 3-2. Insana エージェントの構成ファイル更新
さきほど確認した内容を、Instanaエージェントの構成ファイルの com.instana.plugin.eum に反映します。構成ファイルには、コメントによる注釈が大量に入っていますが、必要な定義は以下のとおりです。なお、システムに入ってくる要求すべてを対象としたい場合も selector の記載が必要となります。
```
#EUM
com.instana.plugin.eum:
  instrumentation:
    websites:
       - name: Resorts
         key: rxxxxxxxxxxxxxxxQg
         enalebd: true
         reporingUrl: https://eum-<region>-saas.instana.io
         selector:
           matchExpressions:
             - key: 'url/hostname'
               operator: 'Equals'
               values:
                 - 'myresort-site.com'
```

configuration.yaml へ変更を保存したら、特に Instana Agent を再起動する必要はありません。自動的に変更が反映されます。

### ４. Instanaでの End User Monitoringの結果確認

Instana で稼働確認を行います。先ほどと同じ ModResort というサンプル・アプリケーションに対し、実際に要求を投げます。

### 4-1. End User Monitoringの結果
アプリケーションに手を入れずに End User Monitoringのデータが取得できていることがわかります。Webアプリケーションの初期ロード(onLoad)時間や、様々なリソースの取得時間、キャッチされていないJavaScriptエラーなどを拾うことが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/36a5a13f-3605-bdb6-5960-295f8ea28efe.png)

ブラウザ側での個々の画像やCSSの取得タイミングや、ボタン操作のタイミングでの処理（今回の場合 最後の GET /resorts/weather?selectedCity=Cork など) が把握できます。
ユーザーが利用しているブラウザやOSの情報も分かりますので、問題判別に役立つかもしれませんね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/c9dff07e-cdc6-daa8-da3a-c30bccdcd9fc.png)


# まとめ
アプリケーションに手をいれずに、基盤の設定だけで エンド・ユーザーのブラウザー側の挙動が把握できるようになるのは非常に便利です。とくにIHS(apahce) - APサーバーという構成で使えるこの機能は、多くのお客様環境で活かせる機能だと考えています。