PetClinic モノリスワークショップ 30 minutes
Author
Robert Castley このワークショップの目的は、Splunk Observability Cloud プラットフォームの以下のコンポーネントを設定するための基本的な手順を説明することです
Splunk Infrastructure Monitoring (IM) Splunk Automatic Discovery for Java (APM)Database Query Performance AlwaysOn Profiling Splunk Real User Monitoring (RUM) RUMからAPMへの相関 Splunk Log Observer (LO) また、サンプルJavaアプリケーション(Spring PetClinic)のクローン(ダウンロード)方法、およびアプリケーションのコンパイル、パッケージ化、実行方法についても説明します。
アプリケーションが起動して実行されると、Splunk APM 製品で使用されるJava 2.x向けの自動ディスカバリーおよび設定 機能により、メトリクス、トレース、ログが即座に表示されるようになります。
その後、Splunk OpenTelemetry Javascript Libraries (RUM) を使用してPetClinicのエンドユーザーインターフェース(アプリケーションがレンダリングするHTMLページ)を計装します。これにより、エンドユーザーが実行するすべてのクリックやページ読み込みに対してRUMトレースが生成されます。
最後に、PetClinicアプリケーションログへのトレースメタデータの自動インジェクションによって生成されたログを確認します。
前提条件ポート 2222 へのアウトバウンドSSHアクセス ポート 8083 へのアウトバウンドHTTPアクセス bash シェルおよび vi/vim エディタの基本的な知識
PetClinic モノリスワークショップのサブセクション OpenTelemetry Collector のインストール Splunk OpenTelemetry Collectorは、インフラストラクチャとアプリケーションの計装における中核コンポーネントです。その役割は以下のデータを収集して送信することです
インフラストラクチャメトリクス(ディスク、CPU、メモリなど) Application Performance Monitoring (APM) トレース プロファイリングデータ ホストおよびアプリケーションのログ
既存のOpenTelemetry Collectorの削除Splunk IMワークショップを完了している場合は、続行する前にKubernetesで実行中のCollectorを削除してください。以下のコマンドを実行して削除できます
helm delete splunk-otel-collector EC2インスタンスには、古いバージョンのCollectorがすでにインストールされている場合があります。Collectorをアンインストールするには、以下のコマンドを実行してください
curl -sSL https://dl.signalfx.com/splunk-otel-collector.sh > /tmp/splunk-otel-collector.sh
sudo sh /tmp/splunk-otel-collector.sh --uninstall インスタンスが正しく設定されていることを確認するために、このワークショップに必要な環境変数が正しく設定されているか確認する必要があります。ターミナルで以下のコマンドを実行してください
. ~/workshop/petclinic/scripts/check_env.sh 出力で、以下のすべての環境変数が存在し、値が設定されていることを確認してください。不足している場合は、インストラクターに連絡してください
ACCESS_TOKEN
REALM
RUM_TOKEN
HEC_TOKEN
HEC_URL
INSTANCE これでCollectorのインストールに進むことができます。インストールスクリプトには、いくつかの追加パラメータが渡されます
--with-instrumentation - SplunkディストリビューションのOpenTelemetry Javaからエージェントをインストールします。これにより、PetClinic Javaアプリケーションの起動時に自動的にロードされます。設定は不要です!--deployment-environment - リソース属性 deployment.environment を指定された値に設定します。これはUIでビューをフィルタリングするために使用されます。--enable-profiler - Javaアプリケーションのプロファイラを有効にします。これによりアプリケーションのCPUプロファイルが生成されます。--enable-profiler-memory - Javaアプリケーションのプロファイラを有効にします。これによりアプリケーションのメモリプロファイルが生成されます。--enable-metrics - Micrometerメトリクスのエクスポートを有効にします--hec-token - Collectorが使用するHECトークンを設定します--hec-url - Collectorが使用するHEC URLを設定しますcurl -sSL https://dl.signalfx.com/splunk-otel-collector.sh > /tmp/splunk-otel-collector.sh && \
sudo sh /tmp/splunk-otel-collector.sh --realm $REALM -- $ACCESS_TOKEN --mode agent --without-fluentd --with-instrumentation --deployment-environment $INSTANCE -petclinic --enable-profiler --enable-profiler-memory --enable-metrics --hec-token $HEC_TOKEN --hec-url $HEC_URL 次に、Collectorにパッチを適用して、AWSインスタンスIDではなくインスタンスのホスト名を公開するようにします。これにより、UIでのデータのフィルタリングが容易になります
sudo sed -i 's/gcp, ecs, ec2, azure, system/system, gcp, ecs, ec2, azure/g' /etc/otel/collector/agent_config.yaml agent_config.yaml にパッチを適用したら、Collectorを再起動する必要があります
sudo systemctl restart splunk-otel-collector インストールが完了したら、Hosts with agent installed ダッシュボードに移動して、ホストからのデータを確認できます。Dashboards → Hosts with agent installed の順に移動してください。
ダッシュボードフィルタを使用して host.name を選択し、ワークショップインスタンスのホスト名を入力または選択してください(これはターミナルセッションのコマンドプロンプトから取得できます)。ホストのデータが流れていることを確認したら、APMコンポーネントの作業を開始する準備が整いました。
Spring PetClinic アプリケーションのビルド APMをセットアップするために最初に必要なのは…そう、アプリケーションです。この演習では、Spring PetClinicアプリケーションを使用します。これは、Springフレームワーク(Springboot)で構築された非常に人気のあるサンプルJavaアプリケーションです。
まず、PetClinicのGitHubリポジトリをクローンし、その後アプリケーションのコンパイル、ビルド、パッケージ化、テストを行います
git clone https://github.com/spring-projects/spring-petclinic spring-petclinic ディレクトリに移動します
cd spring-petclinic
git checkout b26f235250627a235a2974a22f2317dbef27338d Dockerを使用して、PetClinicが使用するMySQLデータベースを起動します
docker run -d -e MYSQL_USER = petclinic -e MYSQL_PASSWORD = petclinic -e MYSQL_ROOT_PASSWORD = root -e MYSQL_DATABASE = petclinic -p 3306:3306 docker.io/biarms/mysql:5.7 次に、PetClinicアプリケーションにシンプルなトラフィックを生成するLocustを実行する別のコンテナを起動します。Locustは、Webアプリケーションにトラフィックを生成するために使用できるシンプルな負荷テストツールです。
docker run --network= "host" -d -p 8090:8090 -v ~/workshop/petclinic:/mnt/locust docker.io/locustio/locust -f /mnt/locust/locustfile.py --headless -u 1 -r 1 -H http://127.0.0.1:8083 次に、maven を使用してPetClinicをコンパイル、ビルド、パッケージ化します
./mvnw package -Dmaven.test.skip= true
情報初回実行時は数分かかり、アプリケーションをコンパイルする前に多くの依存関係をダウンロードします。以降のビルドはより高速になります。
ビルドが完了したら、実行しているインスタンスのパブリックIPアドレスを取得する必要があります。以下のコマンドを実行して取得できます
IPアドレスが返されます。アプリケーションが実行されていることを確認するために必要になるので、このIPアドレスをメモしておいてください。
3. Real User Monitoring Real User Monitoring (RUM) の計装では、ページにOpenTelemetry Javascriptスニペット https://github.com/signalfx/splunk-otel-js-web を追加します。ウィザードを使用して Data Management → Add Integration → RUM Instrumentation → Browser Instrumentation の順に進みます。
インストラクターがドロップダウンから使用するトークンを指示します。Next をクリックしてください。以下の形式で App name と Environment を入力します
<INSTANCE>-petclinic-service - <INSTANCE> を先ほどメモした値に置き換えてください。<INSTANCE>-petclinic-env - <INSTANCE> を先ほどメモした値に置き換えてください。ウィザードは、ページの <head> セクションの先頭に配置する必要があるHTMLコードスニペットを表示します。以下は例です(このスニペットは使用せず、ウィザードが生成したものを使用してください)
/*
IMPORTANT: Replace the < version > placeholder in the src URL with a
version from https://github.com/signalfx/splunk-otel-js-web/releases
*/
< script src = "https://cdn.signalfx.com/o11y-gdi-rum/latest/splunk-otel-web.js" crossorigin = "anonymous" ></ script >
< script >
SplunkRum . init ({
realm : "eu0" ,
rumAccessToken : "<redacted>" ,
applicationName : "petclinic-1be0-petclinic-service" ,
deploymentEnvironment : "petclinic-1be0-petclinic-env"
});
</ script > Spring PetClinicアプリケーションは、アプリケーションのすべてのページで再利用される単一のHTMLページを「レイアウト」ページとして使用しています。Splunk RUM計装ライブラリを挿入するには、すべてのページで自動的に読み込まれるため、この場所が最適です。
それでは、レイアウトページを編集しましょう
vi src/main/resources/templates/fragments/layout.html 次に、上記で生成したスニペットをページの <head> セクションに挿入します。コメントは含めず、ソースURLの <version> を latest に置き換えてください
<!doctype html>
< html th:fragment = "layout (template, menu)" >
< head >
< script src = "https://cdn.signalfx.com/o11y-gdi-rum/latest/splunk-otel-web.js" crossorigin = "anonymous" ></ script >
< script >
SplunkRum . init ({
realm : "eu0" ,
rumAccessToken : "<redacted>" ,
applicationName : "petclinic-1be0-petclinic-service" ,
deploymentEnvironment : "petclinic-1be0-petclinic-env"
});
</ script >
... コード変更が完了したら、アプリケーションを再ビルドして再度実行する必要があります。maven コマンドを実行してPetClinicをコンパイル/ビルド/パッケージ化します
./mvnw package -Dmaven.test.skip= true java \
-Dserver.port= 8083 \
-Dotel.service.name= $INSTANCE -petclinic-service \
-Dotel.resource.attributes= deployment.environment= $INSTANCE -petclinic-env,version= 0.314 \
-jar target/spring-petclinic-*.jar --spring.profiles.active= mysql次に、ブラウザを使用してアプリケーション http://<IP_ADDRESS>:8083 にアクセスし、実際のユーザートラフィックを生成します。
RUMで、上記のRUMスニペットで定義された環境にフィルタリングし、ダッシュボードをクリックして開きます。
RUMトレースをドリルダウンすると、スパン内にAPMへのリンクが表示されます。トレースIDをクリックすると、現在のRUMトレースに対応するAPMトレースに移動します。
Java 向け自動ディスカバリーおよび設定 以下のコマンドでアプリケーションを起動できます。mysql プロファイルをアプリケーションに渡していることに注目してください。これにより、先ほど起動したMySQLデータベースを使用するようアプリケーションに指示します。また、otel.service.name と otel.resource.attributes をインスタンス名を使用した論理名に設定しています。これらはUIでのフィルタリングにも使用されます
java \
-Dserver.port= 8083 \
-Dotel.service.name= $INSTANCE -petclinic-service \
-Dotel.resource.attributes= deployment.environment= $INSTANCE -petclinic-env \
-jar target/spring-petclinic-*.jar --spring.profiles.active= mysqlhttp://<IP_ADDRESS>:8083(<IP_ADDRESS> を先ほど取得したIPアドレスに置き換えてください)にアクセスして、アプリケーションが実行されていることを確認できます。
Collectorをインストールした際、AlwaysOn Profiling と Metrics を有効にするように設定しました。これにより、CollectorはアプリケーションのCPUおよびメモリプロファイルを自動的に生成し、Splunk Observability Cloudに送信します。
PetClinicアプリケーションを起動すると、Collectorがアプリケーションを自動的に検出し、トレースとプロファイリングのために計装するのが確認できます。
Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/lib/splunk-instrumentation/splunk-otel-javaagent.jar
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
[otel.javaagent 2024-08-20 11:35:58:970 +0000] [main] INFO io.opentelemetry.javaagent.tooling.VersionLogger - opentelemetry-javaagent - version: splunk-2.6.0-otel-2.6.0
[otel.javaagent 2024-08-20 11:35:59:730 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - -----------------------
[otel.javaagent 2024-08-20 11:35:59:730 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - Profiler configuration:
[otel.javaagent 2024-08-20 11:35:59:730 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.enabled : true
[otel.javaagent 2024-08-20 11:35:59:731 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.directory : /tmp
[otel.javaagent 2024-08-20 11:35:59:731 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.recording.duration : 20s
[otel.javaagent 2024-08-20 11:35:59:731 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.keep-files : false
[otel.javaagent 2024-08-20 11:35:59:732 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.logs-endpoint : null
[otel.javaagent 2024-08-20 11:35:59:732 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - otel.exporter.otlp.endpoint : null
[otel.javaagent 2024-08-20 11:35:59:732 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.memory.enabled : true
[otel.javaagent 2024-08-20 11:35:59:732 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.memory.event.rate : 150/s
[otel.javaagent 2024-08-20 11:35:59:732 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.call.stack.interval : PT10S
[otel.javaagent 2024-08-20 11:35:59:733 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.include.internal.stacks : false
[otel.javaagent 2024-08-20 11:35:59:733 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.tracing.stacks.only : false
[otel.javaagent 2024-08-20 11:35:59:733 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - -----------------------
[otel.javaagent 2024-08-20 11:35:59:733 +0000] [main] INFO com.splunk.opentelemetry.profiler.JfrActivator - Profiler is active. Splunk APM UIにアクセスして、アプリケーションコンポーネント、トレース、プロファイリング、DB Queryパフォーマンス、メトリクスを確認できます。左側のメニューから APM をクリックし、Environment ドロップダウンをクリックして、ご自身の環境(例:<INSTANCE>-petclinic、<INSTANCE> は先ほどメモした値に置き換えてください)を選択します。
検証が完了したら、Ctrl-c を押してアプリケーションを停止できます。
リソース属性は、報告されるすべてのスパンに追加できます。例えば version=0.314 のように指定します。カンマ区切りのリソース属性リストも定義できます(例:key1=val1,key2=val2)。
新しいリソース属性を使用してPetClinicを再度起動しましょう。実行コマンドにリソース属性を追加すると、Collectorのインストール時に定義された内容が上書きされることに注意してください。新しいリソース属性 version=0.314 を追加しましょう
java \
-Dserver.port= 8083 \
-Dotel.service.name= $INSTANCE -petclinic-service \
-Dotel.resource.attributes= deployment.environment= $INSTANCE -petclinic-env,version= 0.314 \
-jar target/spring-petclinic-*.jar --spring.profiles.active= mysqlSplunk APM UIに戻り、最近のトレースをドリルダウンすると、スパン内に新しい version 属性が表示されます。
4. Log Observer Splunk Log Observerコンポーネントでは、Splunk OpenTelemetry CollectorがSpring PetClinicアプリケーションからログを自動的に収集し、OTLPエクスポーターを使用してSplunk Observability Cloudに送信します。その際、ログイベントに trace_id、span_id、トレースフラグを付与します。
Log Observerは、アプリケーションとインフラストラクチャからのログをリアルタイムで表示します。ログの検索、フィルタリング、分析を行って、問題のトラブルシューティングや環境の監視が可能です。
PetClinic Webアプリケーションに戻り、Error リンクを数回クリックしてください。これにより、PetClinicアプリケーションログにいくつかのログメッセージが生成されます。
左側のメニューから Log Observer をクリックし、Index が splunk4rookies-workshop に設定されていることを確認してください。
次に、Add Filter をクリックし、フィールド service.name を検索して、値 <INSTANCE>-petclinic-service を選択し、=(include)をクリックします。これで、PetClinicアプリケーションからのログメッセージのみが表示されるはずです。
PetClinicアプリケーションの Error リンクをクリックして生成されたログエントリの1つを選択してください。ログメッセージと、ログメッセージに自動的にインジェクションされたトレースメタデータが表示されます。また、APMとInfrastructureのRelated Contentが利用可能であることにも注目してください。
これでワークショップは終了です。多くの内容をカバーしました。この時点で、メトリクス、トレース(APMとRUM)、ログ、データベースクエリパフォーマンス、コードプロファイリングがSplunk Observability Cloudに報告されているはずです。しかも、PetClinicアプリケーションのコードを変更することなく実現できました(RUMを除く)。
おめでとうございます!
Kubernetes 上の Spring PetClinic SpringBoot ベースのマイクロサービス 90 minutes
Author
Pieter Hagen このワークショップの目的は、Java向けのSplunk 自動ディスカバリーおよび設定 機能を紹介することです。
ワークショップのシナリオは、Kubernetesにシンプルな(計装されていない )Javaマイクロサービスアプリケーションをインストールすることで作成されます。
既存のJavaベースのデプロイメント向けに自動ディスカバリー機能付きのSplunk OpenTelemetry Collectorをインストールする簡単な手順に従うことで、メトリクス、トレース、ログを Splunk Observability Cloud に送信することがいかに簡単かを確認できます。
前提条件ポート 2222 へのアウトバウンド SSH アクセス ポート 81 へのアウトバウンド HTTP アクセス Linux コマンドラインの基本的な知識 このワークショップでは、以下のコンポーネントをカバーします
Splunk Infrastructure Monitoring (IM ) Splunk automatic discovery and configuration for Java (APM )Database Query Performance AlwaysOn Profiling Splunk Log Observer (LO ) Splunk Real User Monitoring (RUM ) Splunk Synthetics は少し寂しそうですが、他のワークショップでカバーしています
PetClinic Kubernetes ワークショップのサブセクション アーキテクチャ 5 minutes
Spring PetClinic Javaアプリケーションは、フロントエンドとバックエンドのサービスで構成されるシンプルなマイクロサービスアプリケーションです。フロントエンドサービスは、バックエンドサービスと対話するためのWebインターフェースを提供するSpring Bootアプリケーションです。バックエンドサービスは、MySQLデータベースと対話するためのRESTful APIを提供するSpring Bootアプリケーションです。
このワークショップを終えるころには、Kubernetesで実行されるJavaベースのアプリケーション向けの自動ディスカバリーおよび設定 を有効にする方法をより深く理解できるようになります。
以下の図は、Splunk OpenTelemetry Operatorと自動ディスカバリーおよび設定を有効にした状態でKubernetes上で実行されるSpring PetClinic Javaアプリケーションのアーキテクチャを詳しく示しています。
Josh Voravong が作成したサンプル に基づいています。
ワークショップインスタンスの準備 15 minutes
インストラクターが、このワークショップで使用するインスタンスのログイン情報を提供します。
インスタンスに初めてログインすると、以下のようなSplunkロゴが表示されます。ワークショップインスタンスへの接続に問題がある場合は、インストラクターにお問い合わせください。
$ ssh -p 2222 splunk@<IP-ADDRESS>
███████╗██████╗ ██╗ ██╗ ██╗███╗ ██╗██╗ ██╗ ██╗
██╔════╝██╔══██╗██║ ██║ ██║████╗ ██║██║ ██╔╝ ╚██╗
███████╗██████╔╝██║ ██║ ██║██╔██╗ ██║█████╔╝ ╚██╗
╚════██║██╔═══╝ ██║ ██║ ██║██║╚██╗██║██╔═██╗ ██╔╝
███████║██║ ███████╗╚██████╔╝██║ ╚████║██║ ██╗ ██╔╝
╚══════╝╚═╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═╝
Last login: Mon Feb 5 11:04:54 2024 from [Redacted]
splunk@show-no-config-i-0d1b29d967cb2e6ff ~ $ インスタンスが正しく設定されていることを確認するために、このワークショップに必要な環境変数が正しく設定されているか確認する必要があります。ターミナルで以下のスクリプトを実行し、環境変数が存在し、実際の有効な値が設定されていることを確認してください
. ~/workshop/petclinic/scripts/check_env.sh ACCESS_TOKEN = <redacted>
REALM = <e.g. eu0, us1, us2, jp0, au0 etc.>
RUM_TOKEN = <redacted>
HEC_TOKEN = <redacted>
HEC_URL = https://<...>/services/collector/event
INSTANCE = <instance_name>INSTANCE 環境変数の値をメモしておいてください。後で Splunk Observability Cloud でデータをフィルタリングする際に使用します。
このワークショップでは、上記の環境変数がすべて 必要です。値が不足しているものがある場合は、インストラクターに連絡してください。
既存の OpenTelemetry Collector の削除この EC2 インスタンスを使用して以前に Splunk Observability ワークショップを完了している場合は、
既存の Splunk OpenTelemetry Collector のインストールが削除されていることを確認する必要があります。
これは以下のコマンドを実行することで行えます
helm delete splunk-otel-collector 2. 準備のサブセクション Splunk OpenTelemetry Collector のデプロイ オブザーバビリティシグナル(メトリクス、トレース 、ログ )を Splunk Observability Cloud に送信するには、KubernetesクラスターにSplunk OpenTelemetry Collectorをデプロイする必要があります。
このワークショップでは、Splunk OpenTelemetry Collector Helm Chartを使用します。まず、Helm chartリポジトリをHelmに追加し、helm repo update を実行して最新バージョンを確認します
Install Helm Chart
Output helm repo add splunk-otel-collector-chart https://signalfx.github.io/splunk-otel-collector-chart && helm repo update Using ACCESS_TOKEN={REDACTED}
Using REALM=eu0
"splunk-otel-collector-chart" has been added to your repositories
Using ACCESS_TOKEN={REDACTED}
Using REALM=eu0
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "splunk-otel-collector-chart" chart repository
Update Complete. ⎈Happy Helming!⎈ Splunk Observability Cloud では、Kubernetes上でのOpenTelemetry Collectorのセットアップを案内するUIウィザードが提供されていますが、時間の都合上、以下のHelm installコマンドを使用します。自動ディスカバリーおよび設定とコードプロファイリング用のオペレーターを有効にするための追加パラメータが設定されています。
--set="operator.enabled=true" - 自動ディスカバリーおよび設定を処理するためのOpenTelemetryオペレーターをインストールします。--set="splunkObservability.profilingEnabled=true" - オペレーター経由でコードプロファイリングを有効にします。Collectorをインストールするには、以下のコマンドを実行してください。これを編集しないでください
helm install splunk-otel-collector --version 0.136.0 \
--set= "operatorcrds.install=true" , \
--set= "operator.enabled=true" , \
--set= "splunkObservability.realm= $REALM " \
--set= "splunkObservability.accessToken= $ACCESS_TOKEN " \
--set= "clusterName= $INSTANCE -k3s-cluster" \
--set= "splunkObservability.profilingEnabled=true" \
--set= "agent.service.enabled=true" \
--set= "environment= $INSTANCE -workshop" \
--set= "splunkPlatform.endpoint= $HEC_URL " \
--set= "splunkPlatform.token= $HEC_TOKEN " \
--set= "splunkPlatform.index=splunk4rookies-workshop" \
splunk-otel-collector-chart/splunk-otel-collector \
-f ~/workshop/k3s/otel-collector.yamlLAST DEPLOYED: Fri Apr 19 09:39:54 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
Splunk OpenTelemetry Collector is installed and configured to send data to Splunk Platform endpoint "https://http-inputs-o11y-workshop-eu0.splunkcloud.com:443/services/collector/event".
Splunk OpenTelemetry Collector is installed and configured to send data to Splunk Observability realm eu0.
[INFO] You've enabled the operator's auto-instrumentation feature (operator.enabled=true)! The operator can automatically instrument Kubernetes hosted applications.
- Status: Instrumentation language maturity varies. See `operator.instrumentation.spec` and documentation for utilized instrumentation details.
- Splunk Support: We offer full support for Splunk distributions and best-effort support for native OpenTelemetry distributions of auto-instrumentation libraries. 続行する前に、Podが Running として報告されていることを確認してください(通常約30秒かかります)。
kubectl get pods
Output kubectl get pods | grep splunk-otel splunk-otel-collector-k8s-cluster-receiver-6bd5567d95-5f8cj 1/1 Running 0 10m
splunk-otel-collector-agent-tspd2 1/1 Running 0 10m
splunk-otel-collector-operator-69d476cb7-j7zwd 2/2 Running 0 10m Splunk OpenTelemetry Collectorからエラーが報告されていないことを確認してください(ctrl + c で終了)。または、インストール済みの素晴らしい k9s ターミナルUIを使用するとボーナスポイントです!
kubectl logs -l app = splunk-otel-collector -f --container otel-collector 2021-03-21T16:11:10.900Z INFO service/service.go:364 Starting receivers...
2021-03-21T16:11:10.900Z INFO builder/receivers_builder.go:70 Receiver is starting... {"component_kind": "receiver", "component_type": "prometheus", "component_name": "prometheus"}
2021-03-21T16:11:11.009Z INFO builder/receivers_builder.go:75 Receiver started. {"component_kind": "receiver", "component_type": "prometheus", "component_name": "prometheus"}
2021-03-21T16:11:11.009Z INFO builder/receivers_builder.go:70 Receiver is starting... {"component_kind": "receiver", "component_type": "k8s_cluster", "component_name": "k8s_cluster"}
2021-03-21T16:11:11.009Z INFO k8sclusterreceiver@v0.21.0/watcher.go:195 Configured Kubernetes MetadataExporter {"component_kind": "receiver", "component_type": "k8s_cluster", "component_name": "k8s_cluster", "exporter_name": "signalfx"}
2021-03-21T16:11:11.009Z INFO builder/receivers_builder.go:75 Receiver started. {"component_kind": "receiver", "component_type": "k8s_cluster", "component_name": "k8s_cluster"}
2021-03-21T16:11:11.009Z INFO healthcheck/handler.go:128 Health Check state change {"component_kind": "extension", "component_type": "health_check", "component_name": "health_check", "status": "ready"}
2021-03-21T16:11:11.009Z INFO service/service.go:267 Everything is ready. Begin running and processing data.
2021-03-21T16:11:11.009Z INFO k8sclusterreceiver@v0.21.0/receiver.go:59 Starting shared informers and wait for initial cache sync. {"component_kind": "receiver", "component_type": "k8s_cluster", "component_name": "k8s_cluster"}
2021-03-21T16:11:11.281Z INFO k8sclusterreceiver@v0.21.0/receiver.go:75 Completed syncing shared informer caches. {"component_kind": "receiver", "component_type": "k8s_cluster", "component_name": "k8s_cluster"}
失敗したインストールの削除OpenTelemetry Collector のインストールでエラーが発生した場合は、
以下のコマンドでインストールを削除してやり直すことができます
helm delete splunk-otel-collector PetClinic アプリケーションのデプロイ アプリケーションの最初のデプロイメントでは、ビルド済みのコンテナを使用して、観測を開始したいKubernetesで実行される通常のJavaマイクロサービスベースのアプリケーションという基本シナリオを作成します。それでは、アプリケーションをデプロイしましょう
kubectl apply -f ~/workshop/petclinic/deployment.yaml deployment.apps/config-server created
service/config-server created
deployment.apps/discovery-server created
service/discovery-server created
deployment.apps/api-gateway created
service/api-gateway created
service/api-gateway-external created
deployment.apps/customers-service created
service/customers-service created
deployment.apps/vets-service created
service/vets-service created
deployment.apps/visits-service created
service/visits-service created
deployment.apps/admin-server created
service/admin-server created
service/petclinic-db created
deployment.apps/petclinic-db created
configmap/petclinic-db-initdb-config created
deployment.apps/petclinic-loadgen-deployment created
configmap/scriptfile created この時点で、Podが実行されていることを確認してデプロイメントを検証できます。コンテナのダウンロードと起動が必要なため、数分かかる場合があります。
kubectl get pods
Output NAME READY STATUS RESTARTS AGE
splunk-otel-collector-k8s-cluster-receiver-655dcd9b6b-dcvkb 1/1 Running 0 114s
splunk-otel-collector-agent-dg2vj 1/1 Running 0 114s
splunk-otel-collector-operator-57cbb8d7b4-dk5wf 2/2 Running 0 114s
petclinic-db-64d998bb66-2vzpn 1/1 Running 0 58s
api-gateway-d88bc765-jd5lg 1/1 Running 0 58s
visits-service-7f97b6c579-bh9zj 1/1 Running 0 58s
admin-server-76d8b956c5-mb2zv 1/1 Running 0 58s
customers-service-847db99f79-mzlg2 1/1 Running 0 58s
vets-service-7bdcd7dd6d-2tcfd 1/1 Running 0 58s
petclinic-loadgen-deployment-5d69d7f4dd-xxkn4 1/1 Running 0 58s
config-server-67f7876d48-qrsr5 1/1 Running 0 58s
discovery-server-554b45cfb-bqhgt 1/1 Running 0 58s kubectl get pods の出力が、上記のOutputタブに示されている出力と一致することを確認してください。すべてのサービスが Running と表示されていることを確認してください(または k9s を使用してステータスを継続的に監視できます)。
アプリケーションをテストするには、インスタンスのパブリックIPアドレスを取得する必要があります。以下のコマンドを実行して取得できます
http://<IP_ADDRESS>:81 (<IP_ADDRESS> を上記で取得したIPアドレスに置き換えてください)にアクセスして、アプリケーションが実行されていることを確認してください。PetClinicアプリケーションが実行されているのが確認できるはずです。アプリケーションはポート 80 と 443 でも実行されているので、これらを使用するか、ポート 81 に到達できない場合はそちらを使用してください。
All Owners (1) タブと Veterinarians (2) タブにアクセスして、各ページに名前のリストが表示されることを確認し、アプリケーションが正しく動作していることを確認してください。
Kubernetes クラスターメトリクスの確認 10 minutes
インストールが完了したら、Splunk Observability Cloud にログインして、Kubernetesクラスターからメトリクスが流れてきていることを確認できます。
左側のメニューから Infrastructure をクリックし、Kubernetes を選択してから、Kubernetes nodes タイルを選択します。
Kubernetes nodes の概要画面に入ったら、Time フィルタを -1h から過去15分 (-15m) に変更して最新のデータに焦点を当て、次に Table を選択してメトリクスを報告しているすべてのノードをリスト表示します。
次に、Refine by: パネルで Cluster name を選択し、リストからご自身のクラスターを選択します。
Tip特定のクラスターを識別するには、セットアップ中に実行したシェルスクリプト出力の INSTANCE 値を使用してください。この一意の識別子により、リスト内の他のノードの中からワークショップクラスターを見つけることができます。
これにより、ご自身のクラスターのノードのみを表示するようにリストがフィルタリングされます。
K8s node logs ビューに切り替えて、ノードからのログを確認します。
APMの自動検出と設定のセットアップ 10分
このセクションでは、Kubernetes上で実行されているJavaサービスに対して自動検出と設定 を有効化します。これにより、OpenTelemetry CollectorがPodアノテーションを検索し、JavaアプリケーションにSplunk OpenTelemetry Javaエージェントで計装を行う必要があることを示します。これにより、クラスター上で実行されているJavaサービスからトレース、スパン、およびプロファイリングデータを取得できるようになります。
自動検出と設定自動検出と設定は、コード変更や再コンパイルを必要とせず にアプリケーションからトレース、スパン、およびプロファイリング データを取得するように設計されていることを理解することが重要です。
これはAPMを始めるための優れた方法ですが、手動計装の代替ではありません 。手動計装では、カスタムスパン、タグ、ログをアプリケーションに追加でき、トレースにより多くのコンテキストと詳細を提供できます。
Javaアプリケーションの場合、OpenTelemetry Collectorは instrumentation.opentelemetry.io/inject-java というアノテーションを検索します。
このアノテーションの値は true に設定するか、OpenTelemetry Collectorの namespace/daemonset(例:default/splunk-otel-collector)に設定できます。これにより、名前空間をまたいで動作することができ、このワークショップではこれを使用します。
deployment.yamlの使用Podが自動的にトレースを送信するようにしたい場合は、以下に示すように deployment.yaml にアノテーションを追加できます。これにより、初期デプロイメント時に計装ライブラリが追加されます。時間を節約するために、以下のPodに対してこれを実施済みです
admin-server config-server discovery-server apiVersion : apps/v1
kind : Deployment
metadata :
name : admin-server
labels :
app.kubernetes.io/part-of : spring-petclinic
spec :
selector :
matchLabels :
app : admin-server
template :
metadata :
labels :
app : admin-server
annotations :
instrumentation.opentelemetry.io/inject-java : "default/splunk-otel-collector" 4. 自動検出と設定のサブセクション デプロイメントのパッチ適用 自動検出と設定 を構成するには、デプロイメントに計装アノテーションを追加するためのパッチを適用する必要があります。パッチが適用されると、OpenTelemetry Collectorが自動検出と設定ライブラリを注入し、Podが再起動されてトレースとプロファイリングデータの送信が開始されます。まず、以下を実行して api-gateway に splunk-otel-java イメージがないことを確認します
Describe api-gateway
Describe Output kubectl describe pods api-gateway | grep Image: Image: quay.io/phagen/spring-petclinic-api-gateway:0.0.2 次に、デプロイメントにアノテーションを追加して、すべてのサービスのJava自動検出と設定を有効にします。以下のコマンドは、すべてのデプロイメントにパッチを適用します。これにより、OpenTelemetry Operatorが splunk-otel-java イメージをPodに注入します
Patch all PetClinic services
Patch Output kubectl get deployments -l app.kubernetes.io/part-of= spring-petclinic -o name | xargs -I % kubectl patch % -p "{\"spec\": {\"template\":{\"metadata\":{\"annotations\":{\"instrumentation.opentelemetry.io/inject-java\":\"default/splunk-otel-collector\"}}}}}" deployment.apps/config-server patched (no change)
deployment.apps/admin-server patched (no change)
deployment.apps/customers-service patched
deployment.apps/visits-service patched
deployment.apps/discovery-server patched (no change)
deployment.apps/vets-service patched
deployment.apps/api-gateway patched config-server 、discovery-server 、admin-server については、すでにパッチが適用されているため変更はありません。
api-gateway Podのコンテナイメージを再度確認するには、以下のコマンドを実行します
Describe api-gateway
Describe Output kubectl describe pods api-gateway | grep Image: Image: ghcr.io/signalfx/splunk-otel-java/splunk-otel-java:v1.30.0
Image: quay.io/phagen/spring-petclinic-api-gateway:0.0.2 api-gateway に新しいイメージが追加され、ghcr.io から splunk-otel-java がプルされます(注:2つの api-gateway コンテナが表示される場合、元のコンテナがまだ終了処理中の可能性があるため、数秒待ってください)。
Splunk Observability Cloud のKubernetes Navigatorに戻ります。数分後、Podがオペレーターによって再起動され、自動検出と設定コンテナが追加されることが確認できます。以下のスクリーンショットのような表示になります
Kubernetes NavigatorでPodが緑色になるまで待ってから、次のセクションに進んでください。
Splunk APMでのデータの表示 左側のメニューでAPM をクリックして、新しく計装されたサービスからのトレースによって生成されたデータを確認します。
ドロップダウンボックスでEnvironment フィルター (1) をワークショップインスタンスの名前に変更します。
メモこれは**<INSTANCE>-workshopになります。ここで INSTANCE**は、先ほど実行したシェルスクリプトの値です。これのみが選択されていることを確認してください。
Service Map (2) ペインをクリックして、次のセクションの準備をします。
APM Features 15 minutes
前のセクションで見てきたように、サービスで自動検出と設定 を有効にすると、トレースがSplunk Observability Cloud に送信されます。
これらのトレースにより、Splunkは自動的にService Maps とRED Metrics を生成します。これらは、サービスの動作とサービス間の相互作用を理解するための最初のステップです。
次のセクションでは、トレース自体と、コードに触れることなくサービスの動作を理解するのに役立つ情報を詳しく見ていきます。
5. APM Featuresのサブセクション APM Service Map
上記のマップは、すべてのサービス間のすべての相互作用を示しています。PetClinic Microserviceアプリケーションが起動して完全に同期するまで数分かかるため、マップはまだ中間状態にある可能性があります。時間フィルタを**-2mと入力してカスタム時間の 2分に減らすと役立ちます。画面右上の Refreshボタン (1)**をクリックできます。赤い円で示される初期起動関連のエラーは最終的に消えます。
次に、各サービスで利用可能なメトリクスを調べるために、リクエスト、エラー、期間(RED)メトリクスダッシュボードを見てみましょう。
この演習では、サービスオペレーションが高いレイテンシやエラーを示している場合に使用する一般的なシナリオを使用します。
依存関係マップでcustomers-service をクリックし、Services ドロップダウンボックス**(1)で customers-service が選択されていることを確認します。次に、サービス名に隣接するOperationsドロップダウン (2)**から GET /owners を選択します。
これにより、以下に示すように GET /owners でフィルタリングされたワークフローが表示されます
APM Trace トレースを選択するには、Service Requests & Errors チャート**(1)**の線を選択します。関連するトレースの選択肢が表示されます。
関連するトレースのリストが表示されたら、青い**(2)** Trace ID Linkをクリックします。選択するトレースがServicesカラムに記載されている3つのサービスと同じものであることを確認してください。
これにより、ウォーターフォールビューで選択されたトレースが表示されます
ここにはいくつかのセクションがあります
Waterfall Pane (1) :トレースとスパンとして表示されるすべてのインストルメントされた関数が、その期間表示と順序/関係とともに表示されます。 Trace Info Pane (2) :選択されたスパン情報が表示されます(Waterfall Pane内でスパンの周りにボックスでハイライトされています)。 Span Pane (3) :選択されたスパンで送信されたすべてのタグを見つけることができます。下にスクロールしてすべてを確認できます。 Process Pane:スパンを作成したプロセスに関連するタグが表示されます(スクリーンショットに含まれていないため、下にスクロールして確認してください)。 Trace Properties:ペインの右上にあり、デフォルトでは折りたたまれています。
APM Span スパンを調べる際、トレーシングの上で自動検出と設定 を使用すると、コード変更なし で得られるいくつかの標準機能を見てみましょう
まず、Waterfall Paneで、以下のスクリーンショットに示すように customers-service:SELECT petclinic または類似のスパンが選択されていることを確認してください
基本的なレイテンシ情報は、インストルメントされた関数または呼び出しのバーとして表示されます。上記の例では、17.8ミリ秒かかりました。 いくつかの類似したスパン**(1)**は、スパンが複数回繰り返される場合にのみ表示されます。この場合、例では10回の繰り返しがあります。10x をクリックすると、すべてのスパンが順番に表示されるように表示/非表示を切り替えることができます。 Inferred Services :インストルメントされていない外部システムへの呼び出しは、グレーの「推測された」スパンとして表示されます。この例のInferred Serviceまたはスパンは、上記に示すようにMysqlデータベース mysql:petclinic SELECT petclinic **(2)**への呼び出しです。Span Tags :Tag Paneには、自動検出と設定によって生成された標準タグが表示されます。この場合、スパンはデータベースを呼び出しているため、db.statement タグ**(3)**が含まれています。このタグは、このスパン中に実行されたデータベース呼び出しで使用されるDBクエリステートメントを保持します。これはDB-Query Performance機能で使用されます。DB-Query Performanceについては次のセクションで見ていきます。Always-on Profiling :システムがスパンのライフサイクル中にプロファイリングデータをキャプチャするように設定されている場合 、スパンのタイムラインでキャプチャされたコールスタックの数が表示されます。上記の例では、customer-service:GET /owners スパンに対して18個のコールスタックがあることがわかります。(4) 次のセクションでプロファイリングを見ていきます。
Service Centric View Splunk APMは、エンジニアに1つの集中ビューでサービスパフォーマンスの深い理解を提供するService Centric Views を提供します。すべてのサービスにわたって、エンジニアはサービスの基盤となるインフラストラクチャからのエラーやボトルネックを迅速に特定し、新しいデプロイによるパフォーマンス低下を特定し、すべてのサードパーティ依存関係の健全性を可視化できます。
api-gateway のこのダッシュボードを表示するには、左側のメニューからAPM をクリックし、リストの api-gateway サービスをクリックします。これにより、Service Centric Viewダッシュボードが表示されます
インストルメントされた各サービスで利用可能なこのビューは、Service metrics 、Error breakdown 、Runtime metrics (Java) 、Infrastructure metrics の概要を提供します。
15 minutes
前の章で見てきたように、APMを使用して、コードに触れることなく、さまざまなサービス間のインタラクションをトレースすることができ、問題をより迅速に特定できます。
トレーシングに加えて、automatic discovery and configuration は、問題をさらに迅速に発見するのに役立つ追加機能を最初から提供します。このセクションでは、そのうちの2つを見ていきます
Always-on Profiling and Java Metrics Database Query Performance Always-on Profiling またはDatabase Query Performance についてさらに深く学びたい場合は、Debug Problems in Microservices という別のNinja Workshopがありますので、そちらをご覧ください。
6. Advanced Featuresのサブセクション Always-On Profiling & Metrics 先ほどHelmチャートを使用してSplunk Distribution of the OpenTelemetry Collectorをインストールした際、AlwaysOn Profiling とMetrics を有効にするように設定しました。これにより、OpenTelemetry JavaはアプリケーションのCPUとメモリのプロファイリングを自動的に生成し、Splunk Observability Cloudに送信します。
PetClinicアプリケーションをデプロイしてアノテーションを設定すると、collectorは自動的にアプリケーションを検出し、トレースとプロファイリングのためにインストルメントします。これを確認するために、次のスクリプトを実行して、インストルメントしているJavaコンテナの1つの起動ログを調べることができます
ログには、Javaの自動検出と設定によって取得されたフラグが表示されます
Run the script
Example output . ~/workshop/petclinic/scripts/get_logs.sh2024/02/15 09:42:00 Problem with dial: dial tcp 10.43.104.25:8761: connect: connection refused. Sleeping 1s
2024/02/15 09:42:01 Problem with dial: dial tcp 10.43.104.25:8761: connect: connection refused. Sleeping 1s
2024/02/15 09:42:02 Connected to tcp://discovery-server:8761
Picked up JAVA_TOOL_OPTIONS: -javaagent:/otel-auto-instrumentation-java/javaagent.jar
Picked up _JAVA_OPTIONS: -Dspring.profiles.active=docker,mysql -Dsplunk.profiler.call.stack.interval=150
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
[otel.javaagent 2024-02-15 09:42:03:056 +0000] [main] INFO io.opentelemetry.javaagent.tooling.VersionLogger - opentelemetry-javaagent - version: splunk-1.30.1-otel-1.32.1
[otel.javaagent 2024-02-15 09:42:03:768 +0000] [main] INFO com.splunk.javaagent.shaded.io.micrometer.core.instrument.push.PushMeterRegistry - publishing metrics for SignalFxMeterRegistry every 30s
[otel.javaagent 2024-02-15 09:42:07:478 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - -----------------------
[otel.javaagent 2024-02-15 09:42:07:478 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - Profiler configuration:
[otel.javaagent 2024-02-15 09:42:07:480 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.enabled : true
[otel.javaagent 2024-02-15 09:42:07:505 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.directory : /tmp
[otel.javaagent 2024-02-15 09:42:07:505 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.recording.duration : 20s
[otel.javaagent 2024-02-15 09:42:07:506 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.keep-files : false
[otel.javaagent 2024-02-15 09:42:07:510 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.logs-endpoint : http://10.13.2.38:4317
[otel.javaagent 2024-02-15 09:42:07:513 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - otel.exporter.otlp.endpoint : http://10.13.2.38:4317
[otel.javaagent 2024-02-15 09:42:07:513 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.memory.enabled : true
[otel.javaagent 2024-02-15 09:42:07:515 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.tlab.enabled : true
[otel.javaagent 2024-02-15 09:42:07:516 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.memory.event.rate : 150/s
[otel.javaagent 2024-02-15 09:42:07:516 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.call.stack.interval : PT0.15S
[otel.javaagent 2024-02-15 09:42:07:517 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.include.internal.stacks : false
[otel.javaagent 2024-02-15 09:42:07:517 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - splunk.profiler.tracing.stacks.only : false
[otel.javaagent 2024-02-15 09:42:07:517 +0000] [main] INFO com.splunk.opentelemetry.profiler.ConfigurationLogger - -----------------------
[otel.javaagent 2024-02-15 09:42:07:518 +0000] [main] INFO com.splunk.opentelemetry.profiler.JfrActivator - Profiler is active. 私たちが注目しているのは、com.splunk.opentelemetry.profiler.ConfigurationLogger によって書き込まれたセクション、つまりProfiling Configuration です。splunk.profiler.directory など、制御できるさまざまな設定を確認できます。これは、エージェントがSplunkに送信する前にコールスタックを書き込む場所です。(これは、コンテナの設定方法によって異なる場合があります。)
変更したいもう1つのパラメータは splunk.profiler.call.stack.interval です。これは、システムがCPU Stack traceをキャプチャする頻度です。Pet Clinicアプリケーションのような短いスパンがある場合は、このインターバル設定を短くすることをお勧めします。デモアプリケーションでは、デフォルトのインターバル値を変更しなかったため、スパンに常にCPU Call Stackが関連付けられているとは限りません。
これらのパラメータを設定する方法はこちら で確認できます。以下の例では、deployment.yaml でコールスタックのより高い収集レートを設定する方法を示しています。これは、JAVA_OPTIONS configセクションでこの値を設定することで行います。
env :
- name : JAVA_OPTIONS
value : "-Xdebug -Dsplunk.profiler.call.stack.interval=150" Trace Waterfall内のAlways-On Profiling APM WaterfallビューでオリジナルのTrace & Span (1) (または類似のもの)を選択し、右側のペインから**Memory Stack Traces (2)**を選択してください
ペインにMemory Stack Trace Flame Graph **(3)**が表示されます。スクロールするか、ペインの右側をドラッグして拡大できます。
AlwaysOn Profilingは、アプリケーションのコードのスナップショット、つまりスタックトレースを常に取得しています。何千ものスタックトレースを読まなければならないことを想像してみてください!それは現実的ではありません。これを支援するために、AlwaysOn Profilingはプロファイリングデータを集約して要約し、Flame Graph と呼ばれるビューでCall Stacksを探索する便利な方法を提供します。これは、アプリケーションからキャプチャされたすべてのスタックトレースの要約を表します。Flame Graphを使用して、パフォーマンスの問題を引き起こしている可能性のあるコードの行を発見し、コードに加えた変更が意図した効果を持っているかどうかを確認できます。
Always-on Profilingをさらに詳しく調べるには、Memory Stack Traces の下のProfiling Paneで上の画像で参照されているSpan **(3)**を選択してください。これにより、Always-on Profilingのメイン画面が開き、Memoryビューがあらかじめ選択されています
Timeフィルタは、選択したスパンの時間枠に設定されます (1) Java Memory Metric Charts **(2)**では、Heap Memoryのモニター、Memory Allocation Rate や Garbage Collecting Metricsなどの Application Activity を確認できます。 スパン **(3)**に関連するメトリクスとStack Tracesのみにフォーカス/表示する機能。これにより、必要に応じてJavaアプリケーションで実行されているバックグラウンドアクティビティをフィルタで除外できます。 識別されたJava Function calls **(4)**により、その関数から呼び出されたメソッドにドリルダウンできます。 プロファイルされたサービスのスタックトレースに基づく階層の視覚化を持つFlame Graph (5) 。 サービスが複数のバージョンを起動する場合に備えて、Service instance **(6)**を選択する機能。 さらなる調査のために、UIではスタックトレースをクリックして、呼び出された関数と、フレームチャートから関連する行を確認できます。これを使用して、コーディングプラットフォームで実際のコードの行を表示できます(もちろん、お好みのコーディングプラットフォームによって異なります)。
Database Query Performanceを使用すると、Splunk APMで直接、データベースクエリがサービスの可用性に与える影響をモニターできます。これにより、データベースをインストルメントすることなく、長時間実行されるクエリ、最適化されていないクエリ、または重いクエリを迅速に特定し、それらが引き起こしている可能性のある問題を軽減できます。
データベースクエリのパフォーマンスを確認するには、ブラウザで戻るか、メニューバーのAPMセクションに移動してAPMのService Map ページに移動し、Service Map タイルをクリックします。
Dependency mapで推論されたデータベースサービス mysql:petclinic Inferred Database serverを選択し (1) 、次に右側のペインをスクロールしてDatabase Query Performance Pane **(2)**を見つけます。
マップで選択したサービスが実際に(推論された)データベースサーバーである場合、このペインには期間に基づく上位90%(P90)のデータベースコールが表示されます。db-queryパフォーマンス機能をさらに詳しく調べるには、ペインの上部にあるDatabase Query Performance という単語のどこかをクリックします。
これにより、DB-query Performanceの概要画面が表示されます
Database Query Normalizationデフォルトでは、Splunk APMインストルメンテーションはデータベースクエリをサニタイズして、db.statements からシークレットや個人を特定できる情報(PII)などの機密データを削除またはマスクします。データベースクエリの正規化をオフにする方法はこちら で確認できます。
この画面には、Splunk Observability Cloudに送信されたTraces & Spansに基づいて、アプリケーションからデータベースに対して実行されたすべてのDatabase queries **(1)**が表示されます。時間ブロック間で比較したり、Total Time、P90 Latency & Requests **(2)**でソートしたりできることに注意してください。
リスト内の各Database queryについて、時間ウィンドウ中の最高レイテンシ、コールの総数、および1秒あたりのリクエスト数 **(3)**が表示されます。これにより、クエリを最適化できる場所を特定できます。
右側のペイン **(5)**の2つのチャートを使用して、Database Callsを含むトレースを選択できます。Tag Spotlightペイン **(6)**を使用して、エンドポイントやタグに基づいて、データベースコールに関連するタグを確認します。
クエリの詳細ビューを表示する必要がある場合
特定のQuery **(1)**をクリックします。これにより、Query Details pane **(2)**が開き、より詳細な調査に使用できます。
Log Observer 10 minutes
この時点まで、コード変更は一切なく 、トレーシング、プロファイリング、データベースクエリパフォーマンスのデータがSplunk Observability Cloudに送信されています。
次に、Splunk Log Observer を使用してSpring PetClinicアプリケーションからログデータを取得します。
Splunk OpenTelemetry Collector は、Spring PetClinicアプリケーションからログを自動的に収集し、OTLPエクスポーターを使用してSplunk Observability Cloudに送信します。その際、ログイベントには trace_id、span_id、トレースフラグが付与されます。
Splunk Log Observer を使用してログを表示し、ログ情報をサービスやトレースと自動的に関連付けます。
この機能は Related Content と呼ばれています。
7. Log Observerのサブセクション ログを確認する ログを表示するには、左側のメニューで
Log Observer をクリックします。Log Observerに入ったら、フィルターバーの Index が splunk4rookies-workshop に設定されていることを確認してください。(1)
次に、Add Filter をクリックし、Fields (2) オプションを使用して deployment.environment フィールド (3) を検索します。ドロップダウンリストから、あなたのワークショップインスタンスを選択し (4) 、= (含める) をクリックします。これで、PetClinicアプリケーションからのログメッセージのみが表示されます。
次に、service.name フィールドを検索し、値 customers-service を選択して = (含める) をクリックします。これがフィルターバー (1) に表示されます。次に、Run Search ボタン (2) をクリックします。
これによりログエントリがリフレッシュされ、customers-service からのエントリのみが表示されるように絞り込まれます。
“Saving pet” で始まるエントリ (1) をクリックします。サイドペーンが開き、関連するトレースIDやスパンID (2) を含む詳細情報を確認できます。
Related Content 下部のペインには、関連するコンテンツが表示されます。以下のスクリーンショットでは、APMがこのログ行に関連するトレースを見つけたことがわかります (1) :
Trace for 960432ac9f16b98be84618778905af50 (2) をクリックすると、このログ行が生成された特定のトレースのAPMウォーターフォールに移動します:
ログに関する Related Content ペーンが表示されていることに注意してください (1) 。これをクリックすると、Log Observerに戻り、このトレースの一部であるすべてのログ行が表示されます。
Real User Monitoring 10 minutes
アプリケーションにReal User Monitoring (RUM) インストルメンテーションを有効にするには、コードベースにOpen Telemetry Javascript https://github.com/signalfx/splunk-otel-js-web スニペットを追加する必要があります。
Spring PetClinicアプリケーションは、アプリケーションのすべてのビューで再利用される単一の index HTMLページを使用しています。これは、Splunk RUMインストルメンテーションライブラリを挿入するのに最適な場所です。すべてのページで自動的に読み込まれるためです。
api-gateway サービスはすでにインストルメンテーションを実行しており、RUMトレースをSplunk Observability Cloudに送信しています。次のセクションでデータを確認します。
スニペットを確認したい場合は、ブラウザでページを右クリックして View Page Source を選択することで、ページソースを表示できます。
< script src = "/env.js" ></ script >
< script src = "https://cdn.signalfx.com/o11y-gdi-rum/latest/splunk-otel-web.js" crossorigin = "anonymous" ></ script >
< script src = "https://cdn.signalfx.com/o11y-gdi-rum/latest/splunk-otel-web-session-recorder.js" crossorigin = "anonymous" ></ script >
< script >
var realm = env . RUM_REALM ;
console . log ( 'Realm:' , realm );
var auth = env . RUM_AUTH ;
var appName = env . RUM_APP_NAME ;
var environmentName = env . RUM_ENVIRONMENT
if ( realm && auth ) {
SplunkRum . init ({
realm : realm ,
rumAccessToken : auth ,
applicationName : appName ,
deploymentEnvironment : environmentName ,
version : '1.0.0' ,
});
SplunkSessionRecorder . init ({
applicationName : appName ,
realm : realm ,
rumAccessToken : auth ,
recorder : "splunk" ,
features : {
video : true ,
}
});
const Provider = SplunkRum . provider ;
var tracer = Provider . getTracer ( 'appModuleLoader' );
} else {
// Realm or auth is empty, provide default values or skip initialization
console . log ( "Realm or auth is empty. Skipping Splunk Rum initialization." );
}
</ script >
<!-- Section added for RUM --> 8. Real User Monitoringのサブセクション Select the RUM view for the Petclinic App 左側のメニューで RUM をクリックして、RUMの簡単な概要ツアーを始めましょう。次に、Environment フィルター (1) をドロップダウンボックスから変更し、ワークショップインスタンスの名前 <INSTANCE>-workshop (1) を選択します (ここで INSTANCE は、以前に実行したシェルスクリプトの値です)。これのみが選択されていることを確認してください。
次に、App (2) ドロップダウンボックスをアプリの名前に変更します。これは <INSTANCE>-store になります。
Environment と App を選択すると、アプリケーションのRUMステータスを示す概要ページが表示されます。(Summary Dashboardが単一行の数値だけの場合は、縮小表示になっています。アプリケーション名の前にある > (1) をクリックして展開できます)。JavaScriptエラーが発生した場合は、以下のように表示されます:
続けるには、青いリンク (ワークショップ名) をクリックして詳細ページに移動します。これにより、UX Metrics、Front-end Health、Back-end Health、Custom Eventsによるインタラクションの内訳が表示され、過去のメトリクス (デフォルトでは1時間) と比較される新しいダッシュボードビューが表示されます。
通常、最初のチャートには1つの線のみがあります。Petclinicショップに関連するリンクをクリックしてください。
この例では http://198.19.249.202:81 です:
これにより、Tag Spotlightページに移動します。
RUM trace Waterfall view & linking to APM TAG Spotlightビューでは、RUMデータに関連付けられたすべてのタグが表示されます。タグは、データを識別するために使用されるキーバリューペアです。この場合、タグはOpenTelemetryインストルメンテーションによって自動的に生成されます。タグは、データをフィルタリングし、チャートやテーブルを作成するために使用されます。Tag Spotlightビューでは、動作の傾向を検出し、ユーザーセッションにドリルダウンできます。
User Sessions (1) をクリックすると、タイムウィンドウ中に発生したユーザーセッションのリストが表示されます。
セッションの1つを見たいので、Duration (2) をクリックして期間でソートし、長いものの1つのリンク (3) をクリックしてください:
RUM trace Waterfall view & linking to APM RUMトレースウォーターフォールを見ています。これは、ユーザーがpetclinicアプリケーションのページにアクセスしたときに、ユーザーデバイス上で何が起こったかを示します。
ウォーターフォールを下にスクロールして、右側の #!/owners/details セグメント (1) を見つけてクリックすると、Vetsリクエストの処理中に発生したアクションのリストが表示されます。HTTPリクエストには、リターンコードの前に青い APM リンクがあることに注意してください。1つを選択し、APMリンクをクリックします。これにより、KubernetesでホストされているこのバックエンドサービスコールのAPM情報が表示されます。
リクエストで何が起こったかを確認するためにドリルダウンしたい場合は、Trace IDのURLをクリックしてください。
これにより、RUMからのリクエストに関連するトレースが表示されます:
サービスへのエントリーポイントに RUM (1) 関連コンテンツリンクが追加されており、バックエンドサービスで何が起こったかを確認した後、RUMセッションに戻ることができるようになっていることがわかります。
Workshop Wrap-up 🎁 おめでとうございます。Get the Most Out of Your Existing Kubernetes Java Applications Using Automatic Discovery and Configuration With OpenTelemetry ワークショップを完了しました。
今日、既存のKubernetes上のJavaアプリケーションにトレース、コードプロファイリング、データベースクエリパフォーマンスを追加することがいかに簡単かを学びました。
Automatic Discovery and Configuration を使用して、コードや設定に一切触れることなく、アプリケーションとインフラストラクチャの可観測性を即座に向上させました。
また、シンプルな設定変更により、さらに多くの可観測性 (logging や RUM ) をアプリケーションに追加して、エンドツーエンドの可観測性を提供できることも学びました。