New RelicでカスタムJMX YAMLを使ってみた

## New RelicでのJMX取得方法

New Relicでは、基本的なメトリクスについては、デフォルトでJMXの値を取得しています。
デフォルトで取得できるメトリクスは[こちら](https://docs.newrelic.com/jp/docs/apm/agents/java-agent/features/jvms-page-java-view-app-server-metrics-jmx/)を参照してください。

<details><summary>補足：JMXとは？</summary>

JMX（Java Management Extensions）とは、Javaアプリケーションで動作状況をモニタリングし、管理するための標準的なフレームワークです。JMXを使用すると、リソース（アプリケーション、システムオブジェクト、デバイスなど）を管理するためのツールを開発および統合することが容易になります。
</details>

記載されていないメトリクスについても、カスタムJMX YAMLを作成することで、New Relicに連携できます。

## カスタムJMX YAMLを使ってNew Relicに連携してみた
今回は、[公式手順](https://docs.newrelic.com/jp/docs/apm/agents/java-agent/custom-instrumentation/java-agent-custom-jmx-instrumentation-yaml/#file_location
)に従って、AWS上に構築したWebLogicサーバから、New Relicがデフォルトで取得していないJMXである`Pending Requests`をカスタムJMX YAMLを使ってNew Relicに連携してみました。

<details><summary>補足：WebLogicのPending Requestsとは？</summary>

WebLogicの優先度キューにある、保留中のユーザー・リクエストの数です。優先度キューには、内部サブシステムやユーザーからのリクエストが含まれています。これはユーザー・リクエストのみの数です。

WebLogicの管理画面では、以下から確認できます。

```確認方法
Environment > Servers > Monitoring > Threads > Pending Requests
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928777/21fa691a-cf53-ad27-9dd7-2d6a12d40306.png)

</details>



### 環境
- クラウド：AWS
- サーバ：EC2
- OS：Red Hat Enterprise Linux 9.3
- ミドルウェア：WebLogic 12.2.1.4.0
- 取得するJMXパラメタ：PendingUserRequestCount

### 前提
- WebLogicのインストールが完了していること
- New Relic側にWebLogicのIntegrationが完了していること

# ステップ1. ディレクトリ作成
対象のアプリのagent（`newrelic.jar`）が保存されているフォルダに`extensions`というディレクトリを作成します。

```bash:例
mkdir /opt/newrelic/extensions
```

# ステップ2. カスタムJMX YAML作成
ステップ1で作成したディレクトリの配下にyaml形式のファイルを配置します。
ファイル名は拡張子が.ymlであれば任意です。今回は`weblogic.yml`とします。

```yaml:例：/opt/newrelic/extensions/weblogic.yml
name: WebLogicCustom
version: 1.0
enabled: true
jmx: 
  - object_name: com.bea:ServerRuntime=AdminServer,Name=ThreadPoolRuntime,Type=ThreadPoolRuntime
    metrics:
      - attributes: PendingUserRequestCount
        type: simple
```
それぞれのパラメタの設定方法を説明します。

| key         | value            | 補足                                             |
| ----------- | ---------------- | ----------------------------------------------- |
| name        | `WebLogicCustom` | 任意                                             |
| version     | `1.0`            | 任意                                             |
| enabled     | `true`           | true(有効) or false(無効)から選択                  |
| object_name | (Object名)　　　  | JConsoleなどを使って確認                           |
| attributes  | (属性名)     　　　| JConsoleなどを使って確認                           |
| type        | `simple`         | `simple`(値)と`monotonically_increasing`(増分値)の2つから選択　|

object_nameとattributesはJConsoleから確認しましょう。

https://newrelic.com/jp/blog/how-to-relic/custom-jmx-yaml


:::note info
補足：各パラメタの設定の仕方の詳細は、[公式ドキュメント](https://docs.newrelic.com/jp/docs/apm/agents/java-agent/custom-instrumentation/java-agent-custom-jmx-instrumentation-yaml/#properties
)を参照してください。
:::

</details>

# ステップ3. カスタムJMX YAMLファイルの読み込み確認
### ログレベルの変更
エージェントがYAMLファイルを読み込んでいることを確認するため、`newrelic.yml`の`log_level`を`info`から`finer`に変更します。

```diff_yaml: /opt/newrelic/newrelic.yml
# The agent uses its own log file to keep its logging
# separate from that of your application.  Specify the log level here.
# This setting is dynamic, so changes do not require restarting your application.
# The levels in increasing order of verboseness are:
#   off, severe, warning, info, fine, finer, finest
# Default is info.
- log_level: info
+ log_level: finer
```
:::note warn
警告
`finer`はより詳細なログを出力するログレベルです。YAMLファイルが読み込まれていることが確認できたら、`info`にログレベルを戻しておきましょう。
:::

### アプリケーションの再起動
設定変更を反映するため、WebLogicを起動します。
※既にに起動している場合は、停止して起動してください。

```bash:起動
sh $DOMAIN_HOME/startWebLogic.sh
```

### YAMLファイルの読み込み確認

`newrelic_agent.log`ファイルに、ファイルが読み込まれたことを示す以下が含まれていることを確認します。

```Bash: weblogic.ymlが読み込まれていることを確認
Reading custom extension file /opt/newrelic/extensions/weblogic.yml
```

:::note info
補足
もし、このステートメントが見つからない場合は、YAMLファイルの場所を確認しましょう。また、プロセスにファイルに対する読み取りアクセス権があることも確認しましょう。
:::

ファイルに以下のステートメントが含まれることを確認します。

```Bash: WebLogicCustomがextentionとして追加されたことを確認
Adding extension with name WebLogicCustom and version 1.0
```

:::note info
補足
このステートメントが見つからない場合は、ドキュメントが正しく解析されていることを確認しましょう。より高いバージョン番号で、同じ名前の別の拡張ファイルがあるかどうかも確認しましょう。
:::

# ステップ4. New Relic側での確認
APM & Services > (App Name) > Metrics Explorer を選択し、Metricで"jmx"と検索すると、追加したJMXがメトリクスとして連携されていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928777/519e1817-bbf1-59bf-3798-a59c8b147fa0.png)

Add To dashboardからダッシュボードに追加することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928777/079a5609-ea13-287e-67b6-f0e3b8408770.png)

その他のメトリクスも同様にカスタムJMX YAMLファイルにAttributeを追加し、Dashboardにまとめるとこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928777/c0d3012d-ce2c-2cea-e43a-f1f711899a0f.png)

# まとめ
今回は、カスタムJMX YAMLを使って、New Relicへのメトリクス追加を試してみました。
YAMLファイルを作成することで、簡単にNew Relicでデータが確認できるようになりました。

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::

:::note info
New Relic株式会社の[X(旧Twitter)](https://x.com/NewRelicJapan)や [Qiita Organization](https://qiita.com/organizations/newrelic)では、新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::