[Dynatrace] Dynatrace の Extension を使ってみよう（IBM WebSphere Liberty編）

## 12月4日に続き、Advent Calendarに参加してみる
最近、いろいろとIBM WebSphere Libertyのモニタリングについて調べることがあり、今回このテーマでブログを書くことにしました。DynatraceのOneAgentは、Javaのアプリであればコードを一切変更せずに、フルスタックの監視（サーバサイドの監視やWebアプリケーションの監視）を始めることができます。Javaのアプリケーションはありとあらゆるところで動いていると思いますが、大きな企業などではSIerさんが中心となってJavaアプリを作り、運用することが多いと思います。大手SIerさんの中で、IBMさんがその役割を担っている場合、Javaアプリケーションのプラットフォームとして、[IBM WebSphere Liberty](https://www.ibm.com/docs/en/was-liberty/base?topic=liberty-overview)がよく使われていると思います（私見です）。今回はこのプラットフォーム上で動くサンプルのJavaアプリケーションのパフォーマンスメトリクスをJMX経由で取得する方法をまとめようと思います。

## Extension、って何？
DynatraceはOneAgentと呼ばれるエージェント経由で、インフラからWebアプリケーションに至るまでの全ての情報を収集します。このシナリオの前提は、OneAgentがホストにインストールできることが条件になります。しかしながら、実際の監視の現場では、OneAgentがインストール出来ない環境もあると思います。そのようなケースでも、監視対象のデータが収集できるようにするための、Dynatraceのソリューションのことを「Extension」と呼びます。Extensionには2種類あり、
- Dynatrace社が提供するもの
    - [Dynatrace Hub](https://www.dynatrace.com/hub/)から自由にダウンロードできます（ただし、データの収集には相応のライセンスが必要）
- 自由に自分で作成できるもの
    - ユーザが自由にExtensionを作成することができ、それらは「Custom Extension」と呼ばれます（ただし、データの収集には相応のライセンスが必要）

今回は、前者のカテゴリーに属する「[IBM WebSphere Liberty](https://www.dynatrace.com/hub/detail/ibm-websphere-liberty-1/?query=liberty&filter=all)」のWebパフォーマンスメトリクスを取得するExtensionを紹介しようと思います。

### IBM WebSphere Liberty Extensionで取得できるデータとWebSphere側の事前準備
このExtensionを使うと取得できるメトリクスは、全部で「14」個あります。
- [Servlet](https://www.ibm.com/docs/en/was-liberty/base?topic=10-web-application-monitoring) (2)
    - Request count
    - Response time
- [Request timing](https://www.ibm.com/docs/en/was-liberty/base?topic=10-request-monitoring) (3)
    - Active requests
    - Slow requests
    - Hung requests
- [Thread pool](https://www.ibm.com/docs/en/was-liberty/base?topic=10-threadpool-monitoring) (2)
    - Active threads
    - Pool size
- [JVM](https://www.ibm.com/docs/en/was-liberty/base?topic=10-jvm-monitoring) (7)
    - JVM Heap size
    - JVM Heap available
    - JVM Heap used
    - JVM CPU usage
    - JVM Garbage collection
    - JVM Garbage collection time
    - JVM uptime
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/a93b2631-3bac-8662-7704-18a054f210c8.png)

これらのデータは、ホストにインストールされた OneAgnet のEEC（Extension Execustion Controller）を介して、JavaのJMXインターフェイス経由で取得されます。そのため、事前にEECの機能がOneAgentがインストールされたホスト上で有効になっているか確認しましょう。下記の場合、"docker" というホストのSettingsでEECを有効にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/25f172ae-dbff-4e0e-2f78-672cd96a4cec.png)

先ほど説明した IBM WebSphere liberty のメトリクスに関する詳細情報は、IBM社のWebSphere libertyのヘルプガイドに細かく記載されていますので、合わせて確認しましょう（リンクを埋め込んでおきました）。

あと、これらのデータ収集は、JavaのJMXインターフェイスを介して行われるため、WebSphereのJavaアプリを立ち上げる際に `server.xml`ファイルの \<feature\> セクションで JMXとローカルで接続できる `localConnector-1.0` Feature を有効にしておく必要があります。この内容についても、IBM社のWebSphereの "Connecting to Liberty by using JMX" [ガイド](https://www.ibm.com/docs/en/was-liberty/base?topic=manually-connecting-liberty-by-using-jmx)を見るとよいと思います。

さらに、個別にWebSphere libertyの14個のメトリクスを取得するためには、追加で下記2つの Feature も \<feature\>に追加しておく必要があります。IBM社のマニュアルを読むと、`monitor-1.0`が定義されていれば14個全てのメトリクスが取れそうですが、テストしたところ明示的に `requestTimging-1.0`を追加しておかないと、Request timing のメトリクスは取れませんでした。。。以下、私のテスト環境の `server.xml` の抜粋です。
```xml
<server description="Sample Liberty server">

  <featureManager>
      <feature>microProfile-3.3</feature>
      <feature>localConnector-1.0</feature>  <<<< これ
      <feature>monitor-1.0</feature>  <<<< これ
      <feature>requestTiming-1.0</feature>  <<<< これ
  </featureManager>
```
### IBM WebSphere liberty extension のインストール
では、ここからDynatrace側のExtensionインストールに関するパートになります。順番にみていきましょう。

1. Extensionのインストール
まずは、自身のテナント（もしくは、ManagedのEnvironment）の `Infrastructure Observability > Extensions` に飛び、右上の `Add to environment`をボタンをクリックし、当該Extensionをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/37d7328a-39fc-0222-d54b-60c30d8845de.png)
2. Extensionの設定の投入
Extensionのインストールが終わったら、設定を投入しましょう。Versionsと書かれたセクションの右側にある`Add monitoring configuration`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/662e2232-bd7a-e220-d1f1-d28dce29bdda.png)
次のページに遷移すると、どのホストで動いているOneAgent経由で IBM WebSphere Libertyのメトリクスを取るか、候補が現れますので自分が取りたい対象のホストをクリックします。その際、一番右側に表示される `Extension Execusion Controller`が `Enabled` になっていることを確認して下さい。ここでは「podman」というホストを選択しています。で、「Next step」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/44ab75d2-6d50-ecdd-325c-1f0c41a10b02.png)
そうすると設定した内容が、JSONファイルで表示されます。ここはその表示のみのページですので、そのまま「Next step」ボタンをクリックして、次のページに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/9dde1abb-a9b2-db63-ce61-872758a15779.png)
このページでは、Extesionに名称を設定するだけです。分かりやすい名称を付けてください。ここでは「IBM WebSphere Liberty for Podman」と入力しています。画面青枠部分が取得対象のメトリクスになりますが、ここで全てのメトリクスグループに「チェック」が入っていることを確認しておきましょう（デフォルトで全てにチェックが入っています）。終わったら、Extensionの設定を有効化する「Activate」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/c3078aaf-4fa6-98f6-80e5-6cbe90d2df1f.png)
そうすると、最初の設定画面に戻り、今投入した設定がOneAgent側に伝わりその間は「Status」が `Pending` と表示されています。その処理が終わり、データが取れるようになると `OK` に変わります。しばらくここで待ちましょう（画面は自動更新されないため、適宜ブラウザのリロードボタンをクリックして、画面を再ロードして下さい）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/7ace5404-399f-84cb-36d5-610b10a7bf9e.png)
しばらくして、ブラウザをリロードすると、このようにStatusが「OK」に変わります。こうなったら、データ取得OKという状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/167596d5-f2f4-eae0-82bd-0c105bc50645.png)
3. トラブルシューティング
もしステータスが「Pending」状態の場合は、OneAgentのJavaのcode modueleのログを確認してみて下さい。デフォルトでは、`/var/log/dynatrace/oneagent/java` 配下にあります。ファイル名はJavaアプリを起動する際の `IBM WebSphere Liberty server name`やPIDに依存するため、これと全く同じという訳ではありませんので、ご注意ください。
```shell
ubuntu@podman:/var/log/dynatrace/oneagent/java$ ls -la
total 68
drwxrwxrwt  2 101000 ubuntu  4096 Dec  6 09:57 .
drwxrwxrwt 13 root   dtuser  4096 Dec  6 09:57 ..
-rw-------  1 101000 ubuntu 61410 Dec  6 12:58 ruxitagent_WebSphere_Liberty_defaultServer_1.0.log
```
このログに対して、検索を行い「Installing」という文字列が出ていれば、このExtensionが正しくインストールされている状態です。もし、「Uninstalling」という文字列も同時にあった場合は、上手くいっていない状態なのでサポートチケットを上げてください。2行目のログが今回のインストール作業で表示されたものです。
```shell
ubuntu@podman:/var/log/dynatrace/oneagent/java$ sudo less ruxitagent_WebSphere_Liberty_defaultServer_1.0.log | grep Installing
2024-12-06 01:03:47.563 UTC [00000021] info    [java  ] [metrics   ] Installing monitoring config of JMX extension 'com.dynatrace.extension.jmx-ws-liberty' (version 2.0.0)        
2024-12-06 03:58:45.439 UTC [00000021] info    [java  ] [metrics   ] Installing monitoring config of JMX extension 'com.dynatrace.extension.jmx-ws-liberty' (version 2.0.0) 
```
### JMXメトリクスの確認
1. WebSphere Libertyのメトリクス取得状況の確認
実際にJMX経由でLibertyのメトリクスが取得できているか、Dynatraceの「Metrics」を開いて確認しましょう。Tag=JMXでフィルタ可能です。ここで14個のメトリクスが表示されれば完璧です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/ab26a6f6-1066-4d1a-84c3-1e4014efb39c.png)
2. ダッシュボードとプロセスグループインスタンスでの取得メトリクスを確認
Extensionをインストールすると、デフォルトで関連するメトリクスを表示するダッシュボードも合わせてインストールされます（ここで言うダッシュボードは、Dashboard Classicです）いいですね、ダッシュボードも、OKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/bdd45b7f-1aec-fb03-d6ab-248f986b02e9.png)
3. ホスト配下のプロセス画面での確認
プロセス画面では、直接今回取得したLibertyのメトリクスは見えません。プロセス名の右側にある「...」をクリックして、「Metrics and logs analysys」に飛んでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/bcc87e01-efc7-4fa1-fb7d-16c5d115b6a7.png)
ここをクリックすると、プロセスのUnified Viewに飛ぶことができ、ここで今回のExtensionを通じて取得したメトリクスがキレイに描画される実装になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778724/9671a704-b734-2287-a7a0-54ce427414f7.png)
パチパチ、お疲れ様でした。

## まとめ
いかがだったでしょうか？DynatraceのOneAgentはとてもパワフルで、Javaアプリであれば自動的にフルスタック監視が始められ、JVMの情報もすべて吸い上げてくれます。それだけでも十分すごいのですが、やはりプロダクト独自の内部メトリクス（今回の場合であれば、IBM WebSphere Liberty内のパフォーマンスメトリクス）も活用したうえで性能をきちんと把握したいというニーズもあります。このようなニーズにお応えすべく、Dynatraceでは誰もが簡単に使えるExtensionと呼ばれるシステムを持ち合わせていますので、是非活用してみてください！！

## 参考情報
今回の検証で使用したアプリ情報をまとめておきます。
- OS
    - Ubuntu 24.04
```shell
ubuntu@podman:~/Scalable-web-app-liberty$ cat /etc/os-release 
PRETTY_NAME="Ubuntu 24.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.1 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo
ubuntu@podman:~/Scalable-web-app-liberty$
```
- Javaアプリ
    - https://github.com/IBM-Cloud/Scalable-web-app-liberty
    - Dockerファイルを編集し、OpenLiberty.ioからイメージをダウンロードするのではなく、icr.ioから websphere-libertyイメージをダウンロードして、コンテナを build しました
```docker
ubuntu@podman:~/Scalable-web-app-liberty$ cat Dockerfile
# Package the application as a war file
FROM docker.io/maven:3.6.3-ibmjava-8-alpine AS builder
LABEL maintainer="IBM Java Engineering at IBM Cloud"
COPY pom.xml ./
COPY src src/
RUN mvn clean package

# Copy the war file over to the open liberty image
#FROM openliberty/open-liberty:kernel-java8-openj9-ubi
FROM icr.io/appcafe/websphere-liberty:kernel-java8-openj9-ubi  <<< ここ

COPY --from=builder --chown=1001:0 src/main/liberty/config/ /config/
COPY --from=builder --chown=1001:0 target/*.war /config/apps/

RUN configure.sh
ubuntu@podman:~/Scalable-web-app-liberty$
```
- Container
    - Podman
    - runtime = crun
```shell
ubuntu@podman:~/Scalable-web-app-liberty$ podman version
Client:       Podman Engine
Version:      4.9.3
API Version:  4.9.3
Go Version:   go1.22.2
Built:        Thu Jan  1 09:00:00 1970
OS/Arch:      linux/amd64
ubuntu@podman:~/Scalable-web-app-liberty$
```

まだ、Dynatraceを触ったことがない方、このブログを見てやってみたいと思われた方は、下記フリートライアルにてお試し下さい。↓↓↓

Dynatraceフリートライアル → https://www.dynatrace.com/ja/trial/