Application Performance MonitoringでWEBアプリを監視する①

OCIの運用管理サービスにあるApplication Performace Monitoringは、Javaまたは.NETのアプリケーション等のサーバー側とクライアント側の両面で監視し、パフォーマンスに関する問題特定を効率化するサービスです。主な特徴は、以下のスライドをご覧ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/a0eb7ff7-0923-c221-a553-e92ee7c126f4.png)

仕組みとしては、アプリケーションからAPMのエンドポイントに対して、メトリックやスパンなどのテレメトリデータを随時アップロードするのですが、アプリケーションが動作するアーキテクチャに応じてエージェントかトレーサ、オープンソースの方式から選択することになります。

それぞれの設定や動作を理解するには、実際に試してみるのが手っ取り早いのですが、そのためにはアプリケーションが必要です。なので、今回は簡単なサンプル・アプリケーションを用意したので、これを用いながら、APMを使用するための設定手順を紹介していきます。

アプリケーションは、Spring Boot、Helidon、Node.jsでそれぞれ動作するように構成されており、Spring Bootには、<b>APM Java Agent</b>、Helidonには<b>APM Java Tracer</b>、Node.jsには<b>OpenTelemetry</b>を用いてAPMにモニタリング情報がアップロードされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/068a7775-72f3-e13c-18bd-4153b5633704.png)

まずは、APMドメインを作成し、Spring BootのアプリケーションのデプロイとAPM Java Agentを設定するところを説明します。

## APMドメインの作成
- OCIメニューから監視及び管理 -> アプリケーション・パフォーマンス・モニタリング -> 管理 -> APMドメインの作成をする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/d8ec6cca-b3a8-1768-b2f9-9f7c326c60d2.png)

- 作成したAPMドメインのリソース詳細にあるデータ・アップロード・エンドポイントをメモする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/2739fe88-c70b-3818-b8ab-fd4d54fe4f2d.png)

- 同様にリソースにあるプライベートとパブリックのデータ・キーもメモする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/80969c8d-8d88-bc37-1126-e15b11dc9d81.png)

- APM Java Agentをダウンロードしておく
APM -> 管理 -> APMエージェントのダウンロードから、最新のAPM Java Agentをダウンロードする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/94eb042e-a433-173d-3db0-6a58277d7eab.png)


## アプリケーションのデプロイ & APM Java Agentのインストール
- コンピュート・インスタンスを作成。最小構成でOK
例えば、Oracle Linux 8、VM.Standard.E4 1core、パブリックIP有

```shell
#Firewall停止
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service

#JDKのインストール
sudo dnf install -y java-17-openjdk-devel
java -version

#MySQLのインストール
sudo dnf install -y mysql-server
sudo systemctl start mysqld.service
sudo systemctl enable mysqld.service
mysql --version

#MySQLにテストデータを作成
mysql -u root
create database springbootmysqldemo;
use springbootmysqldemo;
create table product(productname varchar(100) primary key, unitprice varchar(100), unit varchar(100));
insert into product values('Application Performance Monitoring Service - Synthetic Usage - Free', '¥0.00', '10 monitor runs per hour');
insert into product values('Application Performance Monitoring Service - Tracing Data - Free*', '¥0.00', '1,000 events per hour');
commit;

#サンプルアプリをダウンロードし解凍
wget https://github.com/western24/apmdemo/raw/main/springboot-mysql-demo.zip
unzip springboot-mysql-demo.zip

#APM Java Agentを/home/opcにコピー
 
#APM Java Agentをインストール
java -jar ./apm-java-agent-installer-xxxxxx.jar provision-agent -service-name=springboot-mysql-demo -destination=/home/opc -private-data-key=xxxxxxxxxxxxxxxxx -data-upload-endpoint=https://xxxxx.apm-agt.us-ashburn-1.oci.oraclecloud.com

#パッケージングしてSpring Bootを起動
cd springboot-mysql-demo
./mvnw package
java -javaagent:/home/opc/oracle-apm-agent/bootstrap/ApmAgent.jar -jar ./target/springboot.jar

```

- ブラウザでアクセス(※VCNのセキュリティ・リストで8181をオープンしておく)
http://VMのPublic IP:8181
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/37ed8afe-2245-60ed-9b2e-4d3579467f2d.png)

- いくつか画面を操作後、APMホームに情報が更新されていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/0ce2a9eb-05d2-9bb0-8e38-a105ba308f22.png)


- トレース・エクスプローラからは、ページを構成するサーブレットやJDBCのスパン・実行時間等が確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/e3e82ff1-3b1b-f003-b7cf-8895bd588d08.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/9d2c3b69-a348-5269-fd69-010ce20f22eb.png)

- ダッシュボード -> アプリケーション・サーバーからはAPサーバの実行環境の情報が参照可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/1f1f7010-8b32-47fe-a0d9-1e750e2afa9f.png)

このAPM Java Agentの方法は、OMCの頃からある一番ベーシックな方法です。APサーバが対応していれば、既存アプリケーションのコード修正する必要はなく、エージェントのインストールとAPサーバの再起動という最小限の影響でAPMを使用することができます。
また、2023年8月時点でのAPM Java Agentが対応しているAPサーバは、Weblogic、Tomcat、Spring Boot、Jboss、Jetty、最近追加されたAPM .NETエージェントでは.NET Frameworkのアプリケーションも対応しています。

APM Java Agentは、サーバー側の情報取集が主な役割ですが、エンド・ユーザー側の情報収集には次のブラウザ・エージェントを使用します。

## ブラウザ・エージェントの設定
ブラウザ・エージェントはアプリケーションにJava Scriptを埋め込んで、ユーザー操作やページビューにかかった時間をAPMに記録する機能です。[ドキュメント](https://docs.oracle.com/ja-jp/iaas/application-performance-monitoring/doc/deploy-browser-agent-your-application.html#GUID-4EFE2DA6-2D91-4150-B1BF-48B61C399830)に記載のあるJava Scriptのフォーマットに従って、記録したいHTMLに追記します。
ヘッダーやフッターのようにアプリケーションのWEBフォーマットに共通のHTMLがあれば記述は一か所のみですべてのページに反映させることも可能です。このサンプルアプリでも一か所の修正ですべてのページに反映するようになっています。

- springboot-mysql-demo/src/main/resources/static/js/browseragent.jsのファイルにブラウザ・エージェントのJavaScriptを追記する

```shell
#追加内容は以下
document.write('<script>\n');
document.write('window.apmrum = (window.apmrum || {});\n');
document.write("window.apmrum.serviceName='<APM Browser>';\n")     
document.write("window.apmrum.webApplication='<Web App Name>';\n");
document.write("window.apmrum.ociDataUploadEndpoint='<データ・アップロード・エンドポイント>';\n");
document.write("window.apmrum.OracleAPMPublicDataKey='<auto_generated_public_datakey>';\n");
document.write('</script>\n');
document.write('<script async crossorigin="anonymous" src="<データ・アップロード・エンドポイント>/static/jslib/apmrum.min.js"></script>');

ex)実際の設定例
document.write('<script>\n');
document.write('window.apmrum = (window.apmrum || {});\n');
document.write("window.apmrum.serviceName='apmdemo';\n")
document.write("window.apmrum.webApplication='springboot-mysql-demo';\n");
document.write("window.apmrum.ociDataUploadEndpoint='https://xxxx.apm-agt.us-ashburn-1.oci.oraclecloud.com';\n");
document.write("window.apmrum.OracleAPMPublicDataKey='xxxxxx';\n");
document.write('</script>\n');
document.write('<script async crossorigin="anonymous" src="https://xxxx.apm-agt.us-ashburn-1.oci.oraclecloud.com/static/jslib/apmrum.min.js"></script>');

#再パッケージングしてSpring Bootを起動
./mvnw package
java -javaagent:/home/opc/oracle-apm-agent/bootstrap/ApmAgent.jar -jar ./target/springboot.jar

```

- アプリケーションを操作後、APM -> ダッシュボード -> リアル・ユーザー・モニタリングに情報が更新されればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/6ef1ee81-2aee-1d12-b0ad-3dcb01cb8d22.png)


以上が、APM Java Agentとブラウザ・エージェントによるアプリケーションのパフォーマンス監視の設定の流れです。設定自体は、難しくないと思いますので、設定後にサンプル・アプリケーションの操作とそれに応じたトレース・エクスプローラの情報を見比べながら色々試してみるとAPMの見方は理解できるのではないかと思います。

[次回](https://qiita.com/western24/items/60a2251e57d736319c14)は、Helidonのアプリケーションのデプロイ方法について紹介します。