LoginSignup
2
0

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

Last updated at Posted at 2023-08-21

OCIの運用管理サービスにあるApplication Performace Monitoringは、Javaまたは.NETのアプリケーション等のサーバー側とクライアント側の両面で監視し、パフォーマンスに関する問題特定を効率化するサービスです。主な特徴は、以下のスライドをご覧ください。
image.png

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

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

アプリケーションは、Spring Boot、Helidon、Node.jsでそれぞれ動作するように構成されており、Spring Bootには、APM Java Agent、HelidonにはAPM Java Tracer、Node.jsにはOpenTelemetryを用いてAPMにモニタリング情報がアップロードされます。
image.png

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

APMドメインの作成

  • OCIメニューから監視及び管理 -> アプリケーション・パフォーマンス・モニタリング -> 管理 -> APMドメインの作成をする
    image.png

  • 作成したAPMドメインのリソース詳細にあるデータ・アップロード・エンドポイントをメモする
    image.png

  • 同様にリソースにあるプライベートとパブリックのデータ・キーもメモする
    image.png

  • APM Java Agentをダウンロードしておく
    APM -> 管理 -> APMエージェントのダウンロードから、最新のAPM Java Agentをダウンロードする
    image.png

アプリケーションのデプロイ & APM Java Agentのインストール

  • コンピュート・インスタンスを作成。最小構成でOK
    例えば、Oracle Linux 8、VM.Standard.E4 1core、パブリックIP有
#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

  • いくつか画面を操作後、APMホームに情報が更新されていればOK
    image.png

  • トレース・エクスプローラからは、ページを構成するサーブレットやJDBCのスパン・実行時間等が確認できる
    image.png
    image.png

  • ダッシュボード -> アプリケーション・サーバーからはAPサーバの実行環境の情報が参照可能
    image.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に記録する機能です。ドキュメントに記載のあるJava Scriptのフォーマットに従って、記録したいHTMLに追記します。
ヘッダーやフッターのようにアプリケーションのWEBフォーマットに共通のHTMLがあれば記述は一か所のみですべてのページに反映させることも可能です。このサンプルアプリでも一か所の修正ですべてのページに反映するようになっています。

  • springboot-mysql-demo/src/main/resources/static/js/browseragent.jsのファイルにブラウザ・エージェントのJavaScriptを追記する
#追加内容は以下
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

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

次回は、Helidonのアプリケーションのデプロイ方法について紹介します。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0