自動ディスカバリー (Automatic Discovery) ワークショップ

  • Spring PetClinic サンプルアプリケーションを使用して、Java アプリケーション向けの Splunk Observability Cloud の自動ディスカバリーおよび設定機能をデモンストレーションするハンズオンワークショップです。
  • Kubernetes で実行される Java ベースのアプリケーション向けの自動ディスカバリーおよび設定を有効にする方法を学びます。リアルタイムモニタリングを体験し、エンドツーエンドの可視性でアプリケーションの動作を最大限に活用しましょう。
Last Modified 2025/12/05

自動ディスカバリー (Automatic Discovery) ワークショップのサブセクション

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 への相関 (Correlation)
  • Splunk Log Observer (LO)

また、サンプル Java アプリケーション(Spring PetClinic)のクローン(ダウンロード)方法、およびアプリケーションのコンパイル、パッケージ化、実行方法についても説明します。

アプリケーションが起動して実行されると、Splunk APM 製品で使用される Java 2.x 向けの自動ディスカバリーおよび設定機能により、メトリクス、トレース、ログが即座に表示されるようになります。

その後、Splunk OpenTelemetry Javascript Libraries (RUM) を使用して PetClinic のエンドユーザーインターフェース(アプリケーションがレンダリングする HTML ページ)を計装します。これにより、エンドユーザーが実行するすべてのクリックやページ読み込みに対して RUM トレースが生成されます。

最後に、PetClinic アプリケーションログへのトレースメタデータの自動インジェクション (injection) によって生成されたログを確認します。

前提条件
  • ポート 2222 へのアウトバウンド SSH アクセス
  • ポート 8083 へのアウトバウンド HTTP アクセス
  • bash シェルおよび vi/vim エディタの基本的な知識

PetClinic Exercise PetClinic Exercise

Last Modified 2025/12/05

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 コンポーネントの作業を開始する準備が整いました。

Last Modified 2025/12/05

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 アドレスを取得する必要があります。以下のコマンドを実行して取得できます:

curl http://ifconfig.me

IP アドレスが返されます。アプリケーションが実行されていることを確認するために必要になるので、この IP アドレスをメモしておいてください。

Last Modified 2025/12/05

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 nameEnvironment を入力します:

  • <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 トレースに移動します。

Last Modified 2025/12/05

Java 向け自動ディスカバリーおよび設定

以下のコマンドでアプリケーションを起動できます。mysql プロファイルをアプリケーションに渡していることに注目してください。これにより、先ほど起動した MySQL データベースを使用するようアプリケーションに指示します。また、otel.service.nameotel.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=mysql

http://<IP_ADDRESS>:8083<IP_ADDRESS> を先ほど取得した IP アドレスに置き換えてください)にアクセスして、アプリケーションが実行されていることを確認できます。

Collector をインストールした際、AlwaysOn ProfilingMetrics を有効にするように設定しました。これにより、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=mysql

Splunk APM UI に戻り、最近のトレースをドリルダウンすると、スパン内に新しい version 属性が表示されます。

Last Modified 2025/12/05

4. Log Observer

Splunk Log Observer コンポーネントでは、Splunk OpenTelemetry Collector が Spring PetClinic アプリケーションからログを自動的に収集し、OTLP エクスポーターを使用して Splunk Observability Cloud に送信します。その際、ログイベントに trace_idspan_id、トレースフラグを付与します。

Log Observer は、アプリケーションとインフラストラクチャからのログをリアルタイムで表示します。ログの検索、フィルタリング、分析を行って、問題のトラブルシューティングや環境の監視が可能です。

PetClinic Web アプリケーションに戻り、Error リンクを数回クリックしてください。これにより、PetClinic アプリケーションログにいくつかのログメッセージが生成されます。

PetClinic Error PetClinic Error

左側のメニューから Log Observer をクリックし、Indexsplunk4rookies-workshop に設定されていることを確認してください。

次に、Add Filter をクリックし、フィールド service.name を検索して、値 <INSTANCE>-petclinic-service を選択し、=(include)をクリックします。これで、PetClinic アプリケーションからのログメッセージのみが表示されるはずです。

PetClinic アプリケーションの Error リンクをクリックして生成されたログエントリの1つを選択してください。ログメッセージと、ログメッセージに自動的にインジェクションされたトレースメタデータが表示されます。また、APM と Infrastructure の Related Content が利用可能であることにも注目してください。

Log Observer Log Observer

これでワークショップは終了です。多くの内容をカバーしました。この時点で、メトリクス、トレース(APM と RUM)、ログ、データベースクエリパフォーマンス、コードプロファイリングが Splunk Observability Cloud に報告されているはずです。しかも、PetClinic アプリケーションのコードを変更することなく実現できました(RUM を除く)。

おめでとうございます!

Last Modified 2025/12/05

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 は少し寂しそうですが、他のワークショップでカバーしています

Last Modified 2025/12/05

PetClinic Kubernetes ワークショップのサブセクション

アーキテクチャ

5 minutes  

Spring PetClinic Java アプリケーションは、フロントエンドとバックエンドのサービスで構成されるシンプルなマイクロサービスアプリケーションです。フロントエンドサービスは、バックエンドサービスと対話するための Web インターフェースを提供する Spring Boot アプリケーションです。バックエンドサービスは、MySQL データベースと対話するための RESTful API を提供する Spring Boot アプリケーションです。

このワークショップを終えるころには、Kubernetes で実行される Java ベースのアプリケーション向けの自動ディスカバリーおよび設定を有効にする方法をより深く理解できるようになります。

以下の図は、Splunk OpenTelemetry Operator と自動ディスカバリーおよび設定を有効にした状態で Kubernetes 上で実行される Spring PetClinic Java アプリケーションのアーキテクチャを詳しく示しています。

Splunk Otel Architecture Splunk Otel Architecture


Josh Voravong が作成したサンプルに基づいています。

Last Modified 2025/12/05

ワークショップインスタンスの準備

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
Last Modified 2025/12/05

2. 準備のサブセクション

Splunk OpenTelemetry Collector のデプロイ

オブザーバビリティシグナル(メトリクス、トレースログ)を Splunk Observability Cloud に送信するには、Kubernetes クラスターに Splunk OpenTelemetry Collector をデプロイする必要があります。

このワークショップでは、Splunk OpenTelemetry Collector Helm Chart を使用します。まず、Helm chart リポジトリを Helm に追加し、helm repo update を実行して最新バージョンを確認します:

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.yaml
LAST 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 | 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
Last Modified 2025/12/05

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
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 アドレスを取得する必要があります。以下のコマンドを実行して取得できます:

curl http://ifconfig.me

http://<IP_ADDRESS>:81<IP_ADDRESS> を上記で取得した IP アドレスに置き換えてください)にアクセスして、アプリケーションが実行されていることを確認してください。PetClinic アプリケーションが実行されているのが確認できるはずです。アプリケーションはポート 80443 でも実行されているので、これらを使用するか、ポート 81 に到達できない場合はそちらを使用してください。

Pet shop Pet shop

All Owners (1) タブと Veterinarians (2) タブにアクセスして、各ページに名前のリストが表示されることを確認し、アプリケーションが正しく動作していることを確認してください。

Owners Owners

Last Modified 2025/12/05

Kubernetes クラスターメトリクスの確認

10 minutes  

インストールが完了したら、Splunk Observability Cloud にログインして、Kubernetes クラスターからメトリクスが流れてきていることを確認できます。

左側のメニューから Infrastructure をクリックし、Kubernetes を選択してから、Kubernetes nodes タイルを選択します。

NavigatorList NavigatorList

Kubernetes nodes の概要画面に入ったら、Time フィルタを -1h から過去15分 (-15m) に変更して最新のデータに焦点を当て、次に Table を選択してメトリクスを報告しているすべてのノードをリスト表示します。

次に、Refine by: パネルで Cluster name を選択し、リストからご自身のクラスターを選択します。

Tip

特定のクラスターを識別するには、セットアップ中に実行したシェルスクリプト出力の INSTANCE 値を使用してください。この一意の識別子により、リスト内の他のノードの中からワークショップクラスターを見つけることができます。

これにより、ご自身のクラスターのノードのみを表示するようにリストがフィルタリングされます。

K8s Nodes K8s Nodes

K8s node logs ビューに切り替えて、ノードからのログを確認します。

Logs Logs

Last Modified 2025/12/05

APMの自動検出と設定のセットアップ

10分  

このセクションでは、Kubernetes上で実行されているJavaサービスに対して自動検出と設定を有効化します。これにより、OpenTelemetry CollectorがPodアノテーションを検索し、JavaアプリケーションにSplunk OpenTelemetry Javaエージェントでインストゥルメンテーション (instrumentation) を行う必要があることを示します。これにより、クラスター上で実行されているJavaサービスからトレース (trace)、スパン (span)、およびプロファイリング (profiling) データを取得できるようになります。

自動検出と設定

自動検出と設定は、コード変更や再コンパイルを必要とせずにアプリケーションからトレース、スパン、およびプロファイリングデータを取得するように設計されていることを理解することが重要です。

これはAPMを始めるための優れた方法ですが、手動インストゥルメンテーション (manual instrumentation) の代替ではありません。手動インストゥルメンテーションでは、カスタムスパン、タグ、ログをアプリケーションに追加でき、トレースにより多くのコンテキストと詳細を提供できます。

Javaアプリケーションの場合、OpenTelemetry Collectorはinstrumentation.opentelemetry.io/inject-javaというアノテーションを検索します。

このアノテーションの値はtrueに設定するか、OpenTelemetry Collectorのnamespace/daemonset(例:default/splunk-otel-collector)に設定できます。これにより、名前空間をまたいで動作することができ、このワークショップではこれを使用します。

deployment.yamlの使用

Podが自動的にトレースを送信するようにしたい場合は、以下に示すようにdeployment.yamlにアノテーションを追加できます。これにより、初期デプロイメント (deployment) 時にインストゥルメンテーションライブラリが追加されます。時間を節約するために、以下の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"
Last Modified 2025/12/05

4. 自動検出と設定のサブセクション

デプロイメントのパッチ適用

自動検出と設定を構成するには、デプロイメント (deployment) にインストゥルメンテーションアノテーションを追加するためのパッチを適用する必要があります。パッチが適用されると、OpenTelemetry Collectorが自動検出と設定ライブラリを注入し、Podが再起動されてトレース (trace) とプロファイリング (profiling) データの送信が開始されます。まず、以下を実行してapi-gatewaysplunk-otel-javaイメージがないことを確認します:

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に注入します:

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-serverdiscovery-serveradmin-serverについては、すでにパッチが適用されているため変更はありません。

api-gateway Podのコンテナイメージを再度確認するには、以下のコマンドを実行します:

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がオペレーターによって再起動され、自動検出と設定コンテナが追加されることが確認できます。以下のスクリーンショットのような表示になります:

restart restart

Kubernetes NavigatorでPodが緑色になるまで待ってから、次のセクションに進んでください。

Last Modified 2025/12/05

Splunk APMでのデータの表示

左側のメニューでAPMをクリックして、新しくインストゥルメンテーション (instrumentation) されたサービスからのトレース (trace) によって生成されたデータを確認します。

ドロップダウンボックスでEnvironmentフィルター (1) をワークショップインスタンスの名前に変更します。

メモ

これは**<INSTANCE>-workshopになります。ここでINSTANCE**は、先ほど実行したシェルスクリプトの値です。これのみが選択されていることを確認してください。

apm apm

Service Map (2) ペインをクリックして、次のセクションの準備をします。

Last Modified 2025/12/05

APM Features

15 minutes  

前のセクションで見てきたように、サービスで自動検出と設定 (automatic discovery and configuration) を有効にすると、トレース (trace) がSplunk Observability Cloudに送信されます。

これらのトレースにより、Splunkは自動的にService MapsRED Metricsを生成します。これらは、サービスの動作とサービス間の相互作用を理解するための最初のステップです。

次のセクションでは、トレース自体と、コードに触れることなくサービスの動作を理解するのに役立つ情報を詳しく見ていきます。

Last Modified 2025/12/05

5. APM Featuresのサブセクション

APM Service Map

apm map apm map

上記のマップは、すべてのサービス間のすべての相互作用を示しています。PetClinic Microserviceアプリケーションが起動して完全に同期するまで数分かかるため、マップはまだ中間状態にある可能性があります。時間フィルタを**-2mと入力してカスタム時間の2分に減らすと役立ちます。画面右上のRefreshボタン(1)**をクリックできます。赤い円で示される初期起動関連のエラーは最終的に消えます。

次に、各サービスで利用可能なメトリクス (metric) を調べるために、リクエスト、エラー、期間(RED)メトリクスダッシュボード (dashboard) を見てみましょう。

この演習では、サービスオペレーション (operation) が高いレイテンシ (latency) やエラー (error) を示している場合に使用する一般的なシナリオを使用します。

依存関係マップでcustomers-serviceをクリックし、Servicesドロップダウンボックス**(1)customers-serviceが選択されていることを確認します。次に、サービス名に隣接するOperationsドロップダウン(2)**からGET /ownersを選択します。

これにより、以下に示すようにGET /ownersでフィルタリングされたワークフロー (workflow) が表示されます:

select a trace select a trace

Last Modified 2025/12/05

APM Trace

トレース (trace) を選択するには、Service Requests & Errorsチャート**(1)**の線を選択します。関連するトレースの選択肢が表示されます。

関連するトレースのリストが表示されたら、青い**(2)** Trace ID Linkをクリックします。選択するトレースがServicesカラムに記載されている3つのサービスと同じものであることを確認してください。

workflow-trace-pick workflow-trace-pick

これにより、ウォーターフォール (Waterfall) ビュー (view) で選択されたトレースが表示されます:

ここにはいくつかのセクションがあります:

  • Waterfall Pane (1):トレースとスパン (span) として表示されるすべてのインストルメント (instrument) された関数が、その期間表示と順序/関係とともに表示されます。
  • Trace Info Pane (2):選択されたスパン情報が表示されます(Waterfall Pane内でスパンの周りにボックスでハイライトされています)。
  • Span Pane (3):選択されたスパンで送信されたすべてのタグ (tag) を見つけることができます。下にスクロールしてすべてを確認できます。
  • Process Pane:スパンを作成したプロセス (process) に関連するタグが表示されます(スクリーンショットに含まれていないため、下にスクロールして確認してください)。
  • Trace Properties:ペインの右上にあり、デフォルトでは折りたたまれています。

waterfall waterfall

Last Modified 2025/12/05

APM Span

スパン (span) を調べる際、トレーシング (tracing) の上で自動検出と設定 (automatic discovery and configuration) を使用すると、コード変更なしで得られるいくつかの標準機能を見てみましょう:

まず、Waterfall Paneで、以下のスクリーンショットに示すようにcustomers-service:SELECT petclinicまたは類似のスパンが選択されていることを確認してください:

DB-query DB-query

  • 基本的なレイテンシ (latency) 情報は、インストルメント (instrument) された関数または呼び出しのバーとして表示されます。上記の例では、17.8ミリ秒かかりました。
  • いくつかの類似したスパン**(1)**は、スパンが複数回繰り返される場合にのみ表示されます。この場合、例では10回の繰り返しがあります。10xをクリックすると、すべてのスパンが順番に表示されるように表示/非表示を切り替えることができます。
  • Inferred Services:インストルメントされていない外部システムへの呼び出しは、グレーの「推測された (inferred)」スパンとして表示されます。この例のInferred Serviceまたはスパンは、上記に示すようにMysqlデータベース (Database) mysql:petclinic SELECT petclinic **(2)**への呼び出しです。
  • Span Tags:Tag Paneには、自動検出と設定によって生成された標準タグが表示されます。この場合、スパンはデータベースを呼び出しているため、db.statementタグ**(3)**が含まれています。このタグは、このスパン中に実行されたデータベース呼び出しで使用されるDBクエリ (query) ステートメント (statement) を保持します。これはDB-Query Performance機能で使用されます。DB-Query Performanceについては次のセクションで見ていきます。
  • Always-on Profiling:システムがスパンのライフサイクル (life cycle) 中にプロファイリング (Profiling) データをキャプチャ (capture) するように設定されている場合、スパンのタイムライン (timeline) でキャプチャされたコールスタック (Call Stack) の数が表示されます。上記の例では、customer-service:GET /ownersスパンに対して18個のコールスタックがあることがわかります。(4)

次のセクションでプロファイリングを見ていきます。

Last Modified 2025/12/05

Service Centric View

Splunk APMは、エンジニア (engineer) に1つの集中ビュー (view) でサービスパフォーマンス (performance) の深い理解を提供するService Centric Viewsを提供します。すべてのサービスにわたって、エンジニアはサービスの基盤となるインフラストラクチャ (infrastructure) からのエラー (error) やボトルネック (bottleneck) を迅速に特定し、新しいデプロイ (deploy) によるパフォーマンス低下を特定し、すべてのサードパーティ依存関係の健全性を可視化できます。

api-gatewayのこのダッシュボード (dashboard) を表示するには、左側のメニューからAPMをクリックし、リストのapi-gatewayサービスをクリックします。これにより、Service Centric Viewダッシュボードが表示されます:

service_maps service_maps

インストルメント (instrument) された各サービスで利用可能なこのビューは、Service metricsError breakdownRuntime metrics (Java)Infrastructure metricsの概要を提供します。

Last Modified 2025/12/05

Always-On Profiling & DB Query Performance

15 minutes  

前の章で見てきたように、APMを使用して、コードに触れることなく、さまざまなサービス間のインタラクション (interaction) をトレース (trace) することができ、問題をより迅速に特定できます。

トレーシング (tracing) に加えて、automatic discovery and configurationは、問題をさらに迅速に発見するのに役立つ追加機能を最初から提供します。このセクションでは、そのうちの2つを見ていきます:

  • Always-on Profiling and Java Metrics
  • Database Query Performance

Always-on ProfilingまたはDB-Queryパフォーマンス (performance) についてさらに深く学びたい場合は、Debug Problems in Microservicesという別のNinja Workshopがありますので、そちらをご覧ください。

Last Modified 2025/12/05

6. Advanced Featuresのサブセクション

Always-On Profiling & Metrics

先ほどHelmチャート (chart) を使用してSplunk Distribution of the OpenTelemetry Collectorをインストール (install) した際、AlwaysOn ProfilingMetricsを有効にするように設定しました。これにより、OpenTelemetry Javaはアプリケーション (application) のCPUとメモリ (memory) のプロファイリング (profiling) を自動的に生成し、Splunk Observability Cloudに送信します。

PetClinicアプリケーションをデプロイ (deploy) してアノテーション (annotation) を設定すると、collectorは自動的にアプリケーションを検出し、トレース (trace) とプロファイリング (profiling) のためにインストルメント (instrument) します。これを確認するために、次のスクリプト (script) を実行して、インストルメント (instrument) しているJavaコンテナ (container) の1つの起動ログ (log) を調べることができます:

ログ (log) には、Javaの自動検出と設定によって取得されたフラグ (flag) が表示されます:

.  ~/workshop/petclinic/scripts/get_logs.sh
2024/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など、制御できるさまざまな設定を確認できます。これは、エージェント (agent) がSplunkに送信する前にコールスタック (call stack) を書き込む場所です。(これは、コンテナ (container) の設定方法によって異なる場合があります。)

変更したいもう1つのパラメータ (parameter) はsplunk.profiler.call.stack.intervalです。これは、システム (system) がCPU Stack traceをキャプチャ (capture) する頻度です。Pet Clinicアプリケーションのような短いスパン (span) がある場合は、このインターバル (interval) 設定を短くすることをお勧めします。デモ (demo) アプリケーションでは、デフォルト (default) のインターバル (interval) 値を変更しなかったため、スパン (span) に常にCPU Call Stackが関連付けられているとは限りません。

これらのパラメータ (parameter) を設定する方法はこちらで確認できます。以下の例では、deployment.yamlでコールスタック (call stack) のより高い収集レート (rate) を設定する方法を示しています。これは、JAVA_OPTIONS configセクション (section) でこの値を設定することで行います。

env:
- name: JAVA_OPTIONS
  value: "-Xdebug -Dsplunk.profiler.call.stack.interval=150"
Last Modified 2025/12/05

Trace Waterfall内のAlways-On Profiling

APM Waterfall ビューでオリジナルの Trace & Span (1)(または類似のもの)を選択し、右側のペイン (pane) から**Memory Stack Traces (2)**を選択してください:

profiling from span profiling from span

ペイン (pane) に Memory Stack Trace Flame Graph **(3)**が表示されます。スクロール (scroll) するか、ペイン (pane) の右側をドラッグ (drag) して拡大できます。

AlwaysOn Profiling は、アプリケーション (application) のコード (code) のスナップショット (snapshot)、つまりスタックトレース (stack trace) を常に取得しています。何千ものスタックトレース (stack trace) を読まなければならないことを想像してみてください!それは現実的ではありません。これを支援するために、AlwaysOn Profiling はプロファイリング (profiling) データ (data) を集約して要約し、Flame Graphと呼ばれるビュー (view) で Call Stacks を探索する便利な方法を提供します。これは、アプリケーション (application) からキャプチャ (capture) されたすべてのスタックトレース (stack trace) の要約を表します。Flame Graph を使用して、パフォーマンス (performance) の問題を引き起こしている可能性のあるコード (code) の行を発見し、コード (code) に加えた変更が意図した効果を持っているかどうかを確認できます。

Always-on Profiling をさらに詳しく調べるには、Memory Stack Tracesの下の Profiling Pane で上の画像で参照されている Span **(3)**を選択してください。これにより、Always-on Profiling のメイン (main) 画面が開き、Memory ビュー (view) があらかじめ選択されています:

Profiling main Profiling main

  • Time フィルタ (filter) は、選択したスパン (span) の時間枠に設定されます (1)
  • Java Memory Metric Charts **(2)**では、Heap Memoryのモニター (monitor)Memory Allocation RateGarbage Collecting Metrics などのApplication Activityを確認できます。
  • スパン (span) **(3)**に関連するメトリクス (metrics) と Stack Traces のみにフォーカス/表示する機能。これにより、必要に応じて Java アプリケーション (application) で実行されているバックグラウンド (background) アクティビティ (activity) をフィルタ (filter) で除外できます。
  • 識別された Java Function calls **(4)**により、その関数から呼び出されたメソッド (method) にドリルダウン (drill down) できます。
  • プロファイル (profile) されたサービス (service) のスタックトレース (stack trace) に基づく階層の視覚化を持つ Flame Graph (5)
  • サービス (service) が複数のバージョン (version) を起動する場合に備えて、Service instance **(6)**を選択する機能。

さらなる調査のために、UI ではスタックトレース (stack trace) をクリックして、呼び出された関数と、フレームチャート (flame chart) から関連する行を確認できます。これを使用して、コーディング (coding) プラットフォーム (platform) で実際のコード (code) の行を表示できます(もちろん、お好みのコーディング (coding) プラットフォーム (platform) によって異なります)。

Last Modified 2025/12/05

Database Query Performance

Database Query Performanceを使用すると、Splunk APMで直接、データベース (database) クエリ (query) がサービス (service) の可用性に与える影響をモニター (monitor) できます。これにより、データベース (database) をインストルメント (instrument) することなく、長時間実行されるクエリ (query)、最適化されていないクエリ (query)、または重いクエリ (query) を迅速に特定し、それらが引き起こしている可能性のある問題を軽減できます。

データベース (database) クエリ (query) のパフォーマンス (performance) を確認するには、ブラウザ (browser) で戻るか、メニュー (menu) バー (bar) のAPMセクション (section) に移動してAPMのService Mapページ (page) に移動し、Service Mapタイル (tile) をクリックします。

Dependency mapで推論されたデータベース (database) サービス (service) mysql:petclinic Inferred Database serverを選択し (1)、次に右側のペイン (pane) をスクロール (scroll) してDatabase Query Performance Pane **(2)**を見つけます。

DB-query from map DB-query from map

マップ (map) で選択したサービス (service) が実際に(推論された)データベース (database) サーバー (server) である場合、このペイン (pane) には期間に基づく上位90%(P90)のデータベース (database) コール (call) が表示されます。db-queryパフォーマンス (performance) 機能をさらに詳しく調べるには、ペイン (pane) の上部にあるDatabase Query Performanceという単語のどこかをクリックします。

これにより、DB-query Performanceの概要画面が表示されます:

DB-query full DB-query full

Database Query Normalization

デフォルト (default) では、Splunk APMインストルメンテーション (instrumentation) はデータベース (database) クエリ (query) をサニタイズ (sanitize) して、db.statementsからシークレット (secret) や個人を特定できる情報(PII)などの機密データ (data) を削除またはマスク (mask) します。データベース (database) クエリ (query) の正規化 (normalization) をオフにする方法はこちらで確認できます。

この画面には、Splunk Observability Cloudに送信されたTraces & Spansに基づいて、アプリケーション (application) からデータベース (database) に対して実行されたすべてのDatabase queries **(1)**が表示されます。時間ブロック (block) 間で比較したり、Total Time、P90 Latency & Requests **(2)**でソート (sort) したりできることに注意してください。

リスト (list) 内の各Database queryについて、時間ウィンドウ (window) 中の最高レイテンシ (latency)、コール (call) の総数、および1秒あたりのリクエスト (request) 数 **(3)**が表示されます。これにより、クエリ (query) を最適化できる場所を特定できます。

右側のペイン (pane) **(5)**の2つのチャート (chart) を使用して、Database Callsを含むトレース (trace) を選択できます。Tag Spotlightペイン (pane) **(6)**を使用して、エンドポイント (endpoint) やタグ (tag) に基づいて、データベース (database) コール (call) に関連するタグ (tag) を確認します。

クエリ (query) の詳細ビュー (view) を表示する必要がある場合:

details details

特定のQuery **(1)**をクリックします。これにより、Query Details pane **(2)**が開き、より詳細な調査に使用できます。

Last Modified 2025/12/05

Log Observer

10 minutes  

この時点まで、コード変更は一切なく、トレース (tracing)、プロファイリング (profiling)、データベースクエリパフォーマンス (Database Query Performance) のデータが Splunk Observability Cloud に送信されています。

次に、Splunk Log Observer を使用して Spring PetClinic アプリケーションからログデータ (log data) を取得します。

Splunk OpenTelemetry Collector は、Spring PetClinic アプリケーションからログを自動的に収集し、OTLP エクスポーター (exporter) を使用して Splunk Observability Cloud に送信します。その際、ログイベントには trace_idspan_id、トレースフラグ (trace flags) が付与されます。

Splunk Log Observer を使用してログを表示し、ログ情報をサービス (services) やトレース (traces) と自動的に関連付けます。

この機能は Related Content と呼ばれています。

Last Modified 2025/12/05

7. Log Observerのサブセクション

ログを確認する

ログを表示するには、左側のメニューで Logo Logo Log Observer をクリックします。Log Observer に入ったら、フィルターバー (filter bar) の Indexsplunk4rookies-workshop に設定されていることを確認してください。(1)

次に、Add Filter をクリックし、Fields (2) オプションを使用して deployment.environment フィールド (3) を検索します。ドロップダウンリストから、あなたのワークショップインスタンスを選択し (4)= (含める) をクリックします。これで、PetClinic アプリケーションからのログメッセージのみが表示されます。

Log Observer sort Log Observer sort

次に、service.name フィールドを検索し、値 customers-service を選択して = (含める) をクリックします。これがフィルターバー (1) に表示されます。次に、Run Search ボタン (2) をクリックします。

Log Observer run Log Observer run

これによりログエントリがリフレッシュされ、customers-service からのエントリのみが表示されるように絞り込まれます。

Log Observer Log Observer

“Saving pet” で始まるエントリ (1) をクリックします。サイドペーンが開き、関連するトレース ID (trace ID) やスパン ID (span ID) (2) を含む詳細情報を確認できます。

Last Modified 2025/12/05

Related Content

下部のペインには、関連するコンテンツが表示されます。以下のスクリーンショットでは、APM がこのログ行に関連するトレースを見つけたことがわかります (1):

RC RC

Trace for 960432ac9f16b98be84618778905af50 (2) をクリックすると、このログ行が生成された特定のトレースの APM ウォーターフォール (waterfall) に移動します:

waterfall logs waterfall logs

ログに関する Related Content ペーンが表示されていることに注意してください (1)。これをクリックすると、Log Observer に戻り、このトレースの一部であるすべてのログ行が表示されます。

Last Modified 2025/12/05

Real User Monitoring

10 minutes  

アプリケーションに Real User Monitoring (RUM) インストルメンテーション (instrumentation) を有効にするには、コードベースに Open Telemetry Javascript https://github.com/signalfx/splunk-otel-js-web スニペット (snippet) を追加する必要があります。

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 -->
Last Modified 2025/12/05

8. Real User Monitoringのサブセクション

Select the RUM view for the Petclinic App

左側のメニューで RUM をクリックして、RUM の簡単な概要ツアーを始めましょう。次に、Environment フィルター (1) をドロップダウンボックスから変更し、ワークショップインスタンスの名前 <INSTANCE>-workshop (1) を選択します (ここで INSTANCE は、以前に実行したシェルスクリプトの値です)。これのみが選択されていることを確認してください。

次に、App (2) ドロップダウンボックスをアプリの名前に変更します。これは <INSTANCE>-store になります。

rum select rum select

EnvironmentApp を選択すると、アプリケーションの RUM ステータスを示す概要ページが表示されます。(Summary Dashboard が単一行の数値だけの場合は、縮小表示になっています。アプリケーション名の前にある > (1) をクリックして展開できます)。JavaScript エラーが発生した場合は、以下のように表示されます:

rum overview rum overview

続けるには、青いリンク (ワークショップ名) をクリックして詳細ページに移動します。これにより、UX Metrics、Front-end Health、Back-end Health、Custom Events によるインタラクションの内訳が表示され、過去のメトリクス (metrics) (デフォルトでは 1 時間) と比較される新しいダッシュボードビューが表示されます。

rum  main rum  main 通常、最初のチャートには 1 つの線のみがあります。Petclinic ショップに関連するリンクをクリックしてください。 この例では http://198.19.249.202:81 です:

これにより、Tag Spotlight ページに移動します。

Last Modified 2025/12/05

RUM trace Waterfall view & linking to APM

TAG Spotlight ビューでは、RUM データに関連付けられたすべてのタグ (tags) が表示されます。タグは、データを識別するために使用されるキーバリューペア (key-value pairs) です。この場合、タグは OpenTelemetry インストルメンテーションによって自動的に生成されます。タグは、データをフィルタリングし、チャートやテーブルを作成するために使用されます。Tag Spotlight ビューでは、動作の傾向を検出し、ユーザーセッション (user session) にドリルダウンできます。

RUM TAG RUM TAG

User Sessions (1) をクリックすると、タイムウィンドウ (time window) 中に発生したユーザーセッションのリストが表示されます。

セッションの 1 つを見たいので、Duration (2) をクリックして期間でソートし、長いものの 1 つのリンク (3) をクリックしてください:

User sessions User sessions

Last Modified 2025/12/05

RUM trace Waterfall view & linking to APM

RUM トレースウォーターフォール (waterfall) を見ています。これは、ユーザーが petclinic アプリケーションのページにアクセスしたときに、ユーザーデバイス上で何が起こったかを示します。

ウォーターフォールを下にスクロールして、右側の #!/owners/details セグメント (1) を見つけてクリックすると、Vets リクエストの処理中に発生したアクションのリストが表示されます。HTTP リクエストには、リターンコードの前に青い APM リンクがあることに注意してください。1 つを選択し、APM リンクをクリックします。これにより、Kubernetes でホストされているこのバックエンドサービスコールの APM 情報が表示されます。

rum apm link rum apm link

リクエストで何が起こったかを確認するためにドリルダウンしたい場合は、Trace ID の URL をクリックしてください。

これにより、RUM からのリクエストに関連するトレースが表示されます:

RUm-apm linked RUm-apm linked

サービスへのエントリーポイントに RUM (1) 関連コンテンツリンクが追加されており、バックエンドサービスで何が起こったかを確認した後、RUM セッションに戻ることができるようになっていることがわかります。

Last Modified 2025/12/05

Workshop Wrap-up 🎁

おめでとうございます。Get the Most Out of Your Existing Kubernetes Java Applications Using Automatic Discovery and Configuration With OpenTelemetry ワークショップを完了しました。

今日、既存の Kubernetes 上の Java アプリケーションにトレース (Tracing)、コードプロファイリング (Code Profiling)、データベースクエリパフォーマンス (Database Query Performance) を追加することがいかに簡単かを学びました。

Automatic Discovery and Configuration を使用して、コードや設定に一切触れることなく、アプリケーションとインフラストラクチャの可観測性を即座に向上させました。

また、シンプルな設定変更により、さらに多くの可観測性 (loggingRUM) をアプリケーションに追加して、エンドツーエンドの可観測性を提供できることも学びました。

Champagne Champagne