From dc3c1b3a84de4e603960c0471474c39111caf1d9 Mon Sep 17 00:00:00 2001 From: Kazunori Otani Date: Fri, 31 Mar 2023 22:37:50 +0900 Subject: [PATCH 01/10] in progress --- content/ja/other/_index.md | 7 + content/ja/other/pet-clinic/_index.md | 32 +++++ content/ja/other/pet-clinic/docs/apm.md | 97 ++++++++++++++ content/ja/other/pet-clinic/docs/imt.md | 79 +++++++++++ .../pet-clinic/docs/manual_instrumentation.md | 101 ++++++++++++++ content/ja/other/pet-clinic/docs/rum.md | 125 ++++++++++++++++++ .../pet-clinic/images/petclinic-exercise.png | Bin 0 -> 56899 bytes 7 files changed, 441 insertions(+) create mode 100644 content/ja/other/_index.md create mode 100644 content/ja/other/pet-clinic/_index.md create mode 100644 content/ja/other/pet-clinic/docs/apm.md create mode 100644 content/ja/other/pet-clinic/docs/imt.md create mode 100644 content/ja/other/pet-clinic/docs/manual_instrumentation.md create mode 100644 content/ja/other/pet-clinic/docs/rum.md create mode 100644 content/ja/other/pet-clinic/images/petclinic-exercise.png diff --git a/content/ja/other/_index.md b/content/ja/other/_index.md new file mode 100644 index 0000000000..28f511f1b3 --- /dev/null +++ b/content/ja/other/_index.md @@ -0,0 +1,7 @@ +--- +archetype: "home" +title: Other Workshops +weight: 19 +--- + +{{%children containerstyle="div" style="h3" description="true" %}} diff --git a/content/ja/other/pet-clinic/_index.md b/content/ja/other/pet-clinic/_index.md new file mode 100644 index 0000000000..ec93e5107b --- /dev/null +++ b/content/ja/other/pet-clinic/_index.md @@ -0,0 +1,32 @@ +--- +title: PetClinic Java Workshop +alwaysopen: false +weight: 1 +description: JavaアプリケーションをつかったSplunk Oservabilityのワークショップです +--- + +このワークショップでは、Splunk Observabilityプラットフォームの以下のコンポーネントを構成するための、基本的なステップを体験できます: + +* Splunk Infrastructure Monitoring (IM) +* Splunk APM + * Endpoint Performance + * Database Query Performance + * AlwaysOn Profiling +* Splunk Real User Monitoring (RUM) + +ワークショップの中では、Javaのサンプルアプリケーション(Spring PetClinic)をクローン(ダウンロード)し、アプリケーションのコンパイル、パッケージ、実行していきます。 + +アプリケーションを起動すると、OpenTelemetry Javaエージェントを通じて、Splunk APMでメトリクスとトレースが即座に表示されるようになります。 + +その後、Splunk OpenTelemetry Javascript Libraries (RUM)を使用して、Pet Clinicのエンドユーザーインターフェース(アプリケーションによってレンダリングされるHTMLページ)を計装し、エンドユーザーが実行する個々のクリックとページロードのすべてについて、RUMトレースを生成していきます。 + +{{% notice title="前提条件" style="info" %}}。 +このワークショップは、ホスト/インスタンスが提供されるSplunk実行ワークショップ **または** 自前のホスト/[Multipassインスタンス](https://github.com/splunk/observability-workshop/tree/main/multipass) で行う、自己主導型のワークショップです。 + +ご自身のシステムには、以下のものがインストールされ、有効になっている必要があります: + +1. JDK 17 +2. ポート `8080` が開いていること(インバウンド/アウトバウンド) +{{% /notice %}} + +![PetClinic Exercise](images/petclinic-exercise.png) diff --git a/content/ja/other/pet-clinic/docs/apm.md b/content/ja/other/pet-clinic/docs/apm.md new file mode 100644 index 0000000000..9518b10032 --- /dev/null +++ b/content/ja/other/pet-clinic/docs/apm.md @@ -0,0 +1,97 @@ +--- +title: Install OpenTelemetry Java Agent +linkTitle: 2. OpenTelemetry Java Agent +weight: 2 +--- + +## 1. Spring PetClinic アプリケーションを動かす + +APMをセットアップするためにまず必要なのは...そう、アプリケーションです!この演習では、Spring PetClinicアプリケーションを使用します。これはSpringフレームワーク(Spring Boot)で作られた、非常に人気のあるサンプルJavaアプリケーションです。 + +まずはPetClinicリポジトリをクローンし、そして、アプリケーションをコンパイル、ビルド、パッケージ、テストしていきます。 + +```bash +git clone https://github.com/spring-projects/spring-petclinic +``` + +`spring-petclinic` ディレクトリに移動します: + +```bash +cd spring-petclinic +``` + +PetClinic が使用する MySQL データベースを起動します: + +```bash +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/mysql:5.7.8 +``` + +そして、Splunk版のOpenTelemetry Java APMエージェントをダウンロードしておきましょう。 + +```bash +curl -L https://github.com/signalfx/splunk-otel-java/releases/latest/download/splunk-otel-javaagent.jar \ +-o splunk-otel-javaagent.jar +``` + +次に、mavenコマンドを実行してPetClinicをコンパイル/ビルド/パッケージ化します: + +```bash +./mvnw package -Dmaven.test.skip=true +``` + +{{% notice title="情報" style="info" %}} +実際にアプリをコンパイルする前に、mavenが多くの依存ライブラリをダウンロードするため、初回実行時には数分かかるでしょう。2回目以降の実行はもっと短くなります。 +{{% /notice %}} + +そして、以下のコマンドでアプリケーションを実行することができます: + +```bash +java -javaagent:./splunk-otel-javaagent.jar \ +-Dotel.service.name=$(hostname)-petclinic.service \ +-jar target/spring-petclinic-*.jar --spring.profiles.active=mysql +``` + + +アプリケーションが動作しているかどうかは、`http://:8080` にアクセスして確認することができます。次に、トラフィックを生成し、クリックしまくり、エラーを生成し、ペットを追加するなどしてください。その後、Splunk APM UIからExploreを開き、、アプリケーションのコンポーネントやトレースなどを調べることができます。 + +検証が完了したら、ターミナルで **`Ctrl-c`** を押すと、アプリケーションを停止することができます。 + + +## 2. プロファイリングとJVMメトリクスを有効にする + +CPU とメモリのプロファイリングを有効にするには `splunk.profiler.enabled=true` を、メモリやGC等のJVMメトリクスを有効にする `splunk.metrics.enabled=true` をアプリケーションの起動時に渡します。アプリケーションが停止していることを確認し、メトリクスとプロファイリングを有効にするために以下のコマンドを実行します。 + +```bash +java -javaagent:./splunk-otel-javaagent.jar \ +-Dotel.service.name=$(hostname)-petclinic.service \ +-Dsplunk.profiler.enabled=true \ +-Dsplunk.metrics.enabled=true \ +-jar target/spring-petclinic-*.jar --spring.profiles.active=mysql +``` + + +トラフィックを発生させるために、`http://:8080` を開いてアプリケーションにアクセスしてみましょう。クリックしまくり、エラーを発生させ、ペットを追加する、などなど。その後、Splunk APM UIにアクセスして、アプリケーションのコンポーネント、Traces、Profiling、Database Query Performance, Endpoint Performansや、DashboardからJVMメトリクスを調べることができます。 + +検証が完了したら、ターミナルで **`Ctrl-c`** を押すと、アプリケーションを停止することができます。 + + +## 3. スパンにリソース属性を追加する + +リソース属性は、報告されたすべてのスパンに追加することができます。例えば、 `version=0.314` のように。また、リソース属性のカンマ区切りリストも定義することができます。 + +新しいリソース属性を使用して、PetClinicを再び起動してみましょう。実行コマンドにリソース属性を追加すると、コレクタをインストールしたときに定義されたものが上書きされることに注意してください。そのため、新しいリソース属性と一緒に `deployment.environment` リソース属性も指定する必要があります。以下では `deployment.environment=$(hostname)-petclinic` と `version=0.314` を指定していることがわかると思います。 + + +```bash +java -javaagent:./splunk-otel-javaagent.jar \ +-Dotel.service.name=$(hostname).service \ +-Dsplunk.profiler.enabled=true \ +-Dsplunk.metrics.enabled=true \ +-Dotel.resource.attributes=deployment.environment=$(hostname)-petclinic,version=0.314 \ +-jar target/spring-petclinic-*.jar --spring.profiles.active=mysql +``` + + +アプリケーションに戻り、さらにトラフィックを発生させます。そして Splunk APM UI に戻って、最近のトレースをドリルダウンし、スパンの新しい属性 `version` を見ることができます。 + +次のセクションではカスタム計装を追加して、OpenTelemetryでは何ができるのか、さらに見ていきます。 diff --git a/content/ja/other/pet-clinic/docs/imt.md b/content/ja/other/pet-clinic/docs/imt.md new file mode 100644 index 0000000000..d048c9f673 --- /dev/null +++ b/content/ja/other/pet-clinic/docs/imt.md @@ -0,0 +1,79 @@ +--- +title: Installing the OpenTelemetry Collector +linkTitle: 1. OpenTelemetry Collector +weight: 1 +--- + +## 1. はじめに + +OpenTelemetry Collectorは、インフラストラクチャーとアプリケーションを計装するためのコアコンポーネントです。 その役割は収集と送信です: + +* インフラストラクチャーのメトリクス(ディスク、CPU、メモリなど) +* アプリケーションパフォーマンスモニタリング(APM)のトレース情報 +* プロファイリングに関するデータ +* ホストおよびアプリケーションのログ + +Splunk Observability Cloudでは、インフラストラクチャーとアプリケーションの両方で Collector のセットアップを案内するウィザードを提供しています。デフォルトでは、ウィザードはコレクターのインストールのみを行うコマンドのみを提供します。 + +## 2. 環境変数を設定する + +すでに **Splunk IM** ワークショップを終了している場合は、既存の環境変数を利用することができます。そうでない場合は、`ACCESS_TOKEN`と`REALM`の環境変数を設定して、OpenTelemetry Collectorのインストールコマンドを実行していきます。 + +例えば、Realmが `us1` の場合、`export REALM=us1` と入力し、`eu0` の場合は `export REALM=eu0` と入力します。 + +{{< tabs >}} +{{% tab name="ACCESS TOKENを環境変数に設定する" %}} + +``` bash +export ACCESS_TOKEN="" +``` + +{{% /tab %}} +{{< /tabs >}} + +{{< tabs >}} +{{% tab name="REALMを環境変数に設定する" %}} + +``` bash +export REALM="" +``` + +{{% /tab %}} +{{< /tabs >}} + +{{% notice title="既存のOpenTelemetryコレクターをすべて削除する" style="warning" %}} +同じVMインスタンスにSplunk IM ワークショップのセットアップをしている場合、Otel Collectorをインストールする前に Kubernetes で実行中の Collector を削除していることを確認してください。これは、以下のコマンドを実行することで行うことができます: + +``` bash +helm delete splunk-otel-collector +``` + +{{% /notice %}} + +## 3. OpenTelemetry Collectorをインストールする + +次に、Collectorをインストールします。インストールスクリプトに渡される追加のパラメータは `--deployment-environment` です。 + +``` bash +curl -sSL https://dl.signalfx.com/splunk-otel-collector.sh > /tmp/splunk-otel-collector.sh && \ +sudo sh /tmp/splunk-otel-collector.sh --deployment-environment $(hostname)-petclinic --realm $REALM -- $ACCESS_TOKEN +``` + +{{% notice style="info" title="AWS/EC2インスタンスの場合" %}}。 +AWS/EC2インスタンス上でこのワークショップを行う場合、インスタンスのホスト名を公開するためにコレクターにパッチを適用する必要があります: + +``` bash +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 を再起動してください: + +``` bash +sudo systemctl restart splunk-otel-collector +``` + +{{% /notice %}} + +インストールが完了したら、Splunk Observabilityの **Hosts with agent installed** ダッシュボードに移動して、**Dashboards → Hosts with agent installed** からホストのデータを確認してみましょう。 + +ダッシュボードのフィルタを使用して `host.name`を選択し、仮想マシンのホスト名を入力または選択します。ホストのデータが表示されたら、APMコンポーネントを使用する準備が整いました。 diff --git a/content/ja/other/pet-clinic/docs/manual_instrumentation.md b/content/ja/other/pet-clinic/docs/manual_instrumentation.md new file mode 100644 index 0000000000..239f761f41 --- /dev/null +++ b/content/ja/other/pet-clinic/docs/manual_instrumentation.md @@ -0,0 +1,101 @@ +--- +title: Manual Instrumentation +linkTitle: 3. Manual Instrumentation +weight: 3 +--- + +## 1. 依存ライブラリを追加する + +前のセクション足したような、プロセス全体に渡る属性は便利なのですが、ときにはさらに、リクエストの内容に応じた状況を知りたくなるかもしれません。心配ありません、OpenTelemetryのAPIを通じてそれらを計装し、データを送り、Splunk Observabilityで分析できるようになります。 + +最初に、JavaアプリケーションがOpenTelemetryのAPIを使えるように、ライブラリの依存を追加していきます。もちろん、vimなどのお好みのエディタをお使い頂いても大丈夫です! + +```bash +nano pom.xml +``` + +そして、`` セクションの中(33行目)に↓をたしてください: + + +``` + + io.opentelemetry + opentelemetry-api + +``` + +念の為、コンパイルできるか確かめてみましょう: + +``` +./mvnw package -Dmaven.test.skip=true +``` + +{{% notice title="Tips: nanoの使い方と壊れたファイルの直し方" style="info" %}} +nanoはLinux環境でよく使われる、シンプルなエディタの一つです。 + +* `ctrl-_` のあとに数字を入力すると、指定した行数にジャンプします。 +* `ctrl-O` のあとに `Enter` で、ファイルを保存します。 +* `ctrl-X` で、nanoを終了します。 + +もしファイルをどうしようもなく壊してしまって元に戻したい場合は、gitを使って次のようにするとよいでしょう。 + +```bash +git checkout pom.xml +``` + +{{% /notice %}} + +これで、JavaのアプリケーションでOpenTelemetryのAPIが使う準備ができました。 + +## 2. Javaのコードにマニュアル計装を追加する + +では、アプリケーションコードをちょっと変更して、リクエストのコンテキストのデータをスパン属性に追加してみましょう。 + +ここではPetClinicアプリケーションの中で `Find Owners` が使われたときに、どのような検索文字列が指定されたのかを調査できるようにしていきます。検索条件によってパフォーマンスが劣化してしまうケース、よくありませんか?そんなときは `OwnerController` に計装を追加していきましょう! + +```bash +nano src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java +``` + +このコードを **変更するのは2箇所** です。 + +まず、`import jakarta.validation.Valid;` の下、37行目付近に↓を足します: + +```java +import io.opentelemetry.api.trace.Span; +``` + +次に、 `// find owners by last name` のコメントがある箇所(おそらく95行目付近にあります)の下に、次のコードを足していきましょう: + +```java + Span span = Span.current(); + span.setAttribute("lastName", owner.getLastName()); +``` + + +このコードで、Last Nameとして指定された検索条件が、スパン属性 `lastName` としてSplunk Observabilityに伝えるようになりました。 + +アプリケーションをコンパイルし直して... + +```bash +./mvnw spring-javaformat:apply package -Dmaven.test.skip=true +``` + + +アプリケーションを起動します。せっかくなので、バージョンを一つあげて `version=0.315` としましょう。 + +```bash +java -javaagent:./splunk-otel-javaagent.jar \ +-Dotel.service.name=$(hostname).service \ +-Dsplunk.profiler.enabled=true \ +-Dsplunk.metrics.enabled=true \ +-Dotel.resource.attributes=deployment.environment=$(hostname)-petclinic,version=0.315 \ +-jar target/spring-petclinic-*.jar --spring.profiles.active=mysql +``` + + +`http://:8080` にアクセスして、オーナー検索をいくつか試してましょう。そしてSplunk APM UIからExploreを開き、アプリケーションのトレースを見ていきます。 + +検証が完了したら、ターミナルで **`Ctrl-c`** を押すと、アプリケーションを停止することができます。 + +次のセクションでは、RUMを使ってブラウザ上のパフォーマンスデータを収集してみましょう。 diff --git a/content/ja/other/pet-clinic/docs/rum.md b/content/ja/other/pet-clinic/docs/rum.md new file mode 100644 index 0000000000..00c42ee01e --- /dev/null +++ b/content/ja/other/pet-clinic/docs/rum.md @@ -0,0 +1,125 @@ +--- +title: 4. Real User Monitoring +weight: 4 +--- + +## 1. RUMを有効にする + +Real User Monitoring (RUM)計装のために、Open Telemetry Javascript [https://github.com/signalfx/splunk-otel-js-web](https://github.com/signalfx/splunk-otel-js-web) スニペットをページ内に追加します。再度ウィザードを使用します **Data Management → Add Integration → RUM Instrumentation → Browser Instrumentation**. + +ドロップダウンから設定済みの **RUM ACCESS TOKEN** を選択し、**Next** をクリックします。以下の構文で**アプリ名**と**環境**を入力します: + +- ホスト名]-petclinic-service` - [ホスト名]`を実際のホスト名で置き換えます。 +- hostname]-petclinic-env` - `[hostname]`を実際のホスト名に置き換えてください。 + +次に、ワークショップのRUMトークンを選択し、アプリケーション名と環境名を定義する必要があります。ウィザードでは、ページ上部の `` セクションに配置する必要のある HTML コードの断片が表示されます。この例では、次のように記述します: + +- アプリケーション名 アプリケーション名: `<ホスト名>-petclinic-service`。 +- 環境:`<ホスト名>-petclinic-env`。 + +ウィザードで編集済みコードスニペットをコピーするか、以下のスニペットをコピーして適宜編集してください: + +``` html + です。 + +``` + +Spring PetClinicアプリケーションでは、1つのHTMLページを「レイアウト」ページとして使用し、アプリケーションのすべてのページで再利用しています。これは、Splunk RUM計装ライブラリを挿入するのに最適な場所であり、すべてのページで自動的に読み込まれます。 + +では、レイアウトページを編集してみましょう: + +を編集してみましょう:``bash +vi src/main/resources/templates/fragments/layout.html +``` + +そして、上で生成したスニップをページの `` セクションに挿入してみましょう。さて、アプリケーションを再構築して、再び実行する必要があります: + +## 2. PetClinicをリビルドする + +mavenコマンドを実行して、PetClinicをコンパイル/ビルド/パッケージ化します: + +バッシュ +./mvnw パッケージ -Dmaven.test.skip=true +``` + +(`・ω・´)バシッ +ジャバ +-Dotel.service.name=$(hostname)-petclinic.service \ +-Dsplunk.profiler.enabled=true◎。 +-Dsplunk.メトリクス.enabled=true ㊤。 +-jar target/spring-petclinic-*.jar --spring.profiles.active=mysql +``` + +次に、より多くのトラフィックを生成するために、アプリケーションに再度アクセスしてみましょう。http://:8080`、今度はRUMトレースが報告されるはずです。 + +RUMにアクセスして、トレースとメトリクスのいくつかを見てみましょう **Hamburger Menu → RUM** すると、UIに表示されるSpring PetClinicのURLのいくつかが表示されます。 + +--- +title: 4. Real User Monitoring +weight: 4 +--- + +## 1. Enable RUM + +For the Real User Monitoring (RUM) instrumentation, we will add the Open Telemetry Javascript [https://github.com/signalfx/splunk-otel-js-web](https://github.com/signalfx/splunk-otel-js-web) snippet in the pages, we will use the wizard again **Data Management → Add Integration → RUM Instrumentation → Browser Instrumentation**. + +Select the preconfigured **RUM ACCESS TOKEN** from the dropdown, click **Next**. Enter **App name** and **Environment** using the following syntax: + +- `[hostname]-petclinic-service` - replacing `[hostname]` with your actual hostname. +- `[hostname]-petclinic-env` - replacing `[hostname]` with your actual hostname. + +Then you'll need to select the workshop RUM token and define the application and environment names. The wizard will then show a snipped of HTML code that needs to be place at the top at the pages in the `` section. In this example we are using: + +- Application Name: `-petclinic-service` +- Environment: `-petclinic-env` + +Copy the generated code snippet in the wizard or copy and edit the snippet below accordingly: + +``` html + + +``` + +The Spring PetClinic application uses a single HTML page as the "layout" page, that is reused across all pages of the application. This is the perfect location to insert the Splunk RUM Instrumentation Library as it will be loaded in all pages automatically. + +Let's then edit the layout page: + +```bash +vi src/main/resources/templates/fragments/layout.html +``` + +and let's insert the snipped we generated above in the `` section of the page. Now we need to rebuild the application and run it again: + +## 2. Rebuild PetClinic + +run the maven command to compile/build/package PetClinic: + +```bash +./mvnw package -Dmaven.test.skip=true +``` + +```bash +java \ +-Dotel.service.name=$(hostname)-petclinic.service \ +-Dsplunk.profiler.enabled=true \ +-Dsplunk.metrics.enabled=true \ +-jar target/spring-petclinic-*.jar --spring.profiles.active=mysql +``` + +Then let's visit the application again to generate more traffic `http://:8080`, now we should see RUM traces being reported + +Let's visit RUM and see some of the traces and metrics **Hamburger Menu → RUM** and you will see some of the Spring PetClinic URLs showing up in the UI. diff --git a/content/ja/other/pet-clinic/images/petclinic-exercise.png b/content/ja/other/pet-clinic/images/petclinic-exercise.png new file mode 100644 index 0000000000000000000000000000000000000000..caebe8c6c0d4647b1981dea168d64bd4ed6ba379 GIT binary patch literal 56899 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 V`v-Vr7=}y@P4z2k`6{;_{y)#x1D5~* literal 0 HcmV?d00001 From 6e51da9289a9f24dea8a668de99ec78aa3ba0b9d Mon Sep 17 00:00:00 2001 From: Kazunori Otani Date: Mon, 3 Apr 2023 10:23:45 +0900 Subject: [PATCH 02/10] ... --- content/ja/other/pet-clinic/docs/rum.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/ja/other/pet-clinic/docs/rum.md b/content/ja/other/pet-clinic/docs/rum.md index 00c42ee01e..b2601b958a 100644 --- a/content/ja/other/pet-clinic/docs/rum.md +++ b/content/ja/other/pet-clinic/docs/rum.md @@ -35,8 +35,8 @@ Spring PetClinicアプリケーションでは、1つのHTMLページを「レ では、レイアウトページを編集してみましょう: -を編集してみましょう:``bash -vi src/main/resources/templates/fragments/layout.html +```bash +nano src/main/resources/templates/fragments/layout.html ``` そして、上で生成したスニップをページの `` セクションに挿入してみましょう。さて、アプリケーションを再構築して、再び実行する必要があります: From 3933f30f08d95a73d96e0d3e5c17878c8c861958 Mon Sep 17 00:00:00 2001 From: Kazunori Otani Date: Mon, 3 Apr 2023 18:16:18 +0900 Subject: [PATCH 03/10] rum --- content/ja/other/pet-clinic/docs/rum.md | 91 ++++--------------------- 1 file changed, 15 insertions(+), 76 deletions(-) diff --git a/content/ja/other/pet-clinic/docs/rum.md b/content/ja/other/pet-clinic/docs/rum.md index b2601b958a..e5f9e471d1 100644 --- a/content/ja/other/pet-clinic/docs/rum.md +++ b/content/ja/other/pet-clinic/docs/rum.md @@ -7,80 +7,17 @@ weight: 4 Real User Monitoring (RUM)計装のために、Open Telemetry Javascript [https://github.com/signalfx/splunk-otel-js-web](https://github.com/signalfx/splunk-otel-js-web) スニペットをページ内に追加します。再度ウィザードを使用します **Data Management → Add Integration → RUM Instrumentation → Browser Instrumentation**. -ドロップダウンから設定済みの **RUM ACCESS TOKEN** を選択し、**Next** をクリックします。以下の構文で**アプリ名**と**環境**を入力します: +ドロップダウンから設定済みの **RUM ACCESS TOKEN** を選択し、**Next** をクリックします。以下の構文で **App name** と**Environment** を入力します: -- ホスト名]-petclinic-service` - [ホスト名]`を実際のホスト名で置き換えます。 -- hostname]-petclinic-env` - `[hostname]`を実際のホスト名に置き換えてください。 +- `[hostname]-petclinic-service` - `[hostname]` をお使いのホスト名に書き換えてください +- `[hostname]-petclinic-env` - `[hostname]` をお使いのホスト名に書き換えてください -次に、ワークショップのRUMトークンを選択し、アプリケーション名と環境名を定義する必要があります。ウィザードでは、ページ上部の `` セクションに配置する必要のある HTML コードの断片が表示されます。この例では、次のように記述します: - -- アプリケーション名 アプリケーション名: `<ホスト名>-petclinic-service`。 -- 環境:`<ホスト名>-petclinic-env`。 - -ウィザードで編集済みコードスニペットをコピーするか、以下のスニペットをコピーして適宜編集してください: - -``` html - です。 - -``` - -Spring PetClinicアプリケーションでは、1つのHTMLページを「レイアウト」ページとして使用し、アプリケーションのすべてのページで再利用しています。これは、Splunk RUM計装ライブラリを挿入するのに最適な場所であり、すべてのページで自動的に読み込まれます。 - -では、レイアウトページを編集してみましょう: - -```bash -nano src/main/resources/templates/fragments/layout.html -``` - -そして、上で生成したスニップをページの `` セクションに挿入してみましょう。さて、アプリケーションを再構築して、再び実行する必要があります: - -## 2. PetClinicをリビルドする - -mavenコマンドを実行して、PetClinicをコンパイル/ビルド/パッケージ化します: - -バッシュ -./mvnw パッケージ -Dmaven.test.skip=true -``` - -(`・ω・´)バシッ -ジャバ --Dotel.service.name=$(hostname)-petclinic.service \ --Dsplunk.profiler.enabled=true◎。 --Dsplunk.メトリクス.enabled=true ㊤。 --jar target/spring-petclinic-*.jar --spring.profiles.active=mysql -``` - -次に、より多くのトラフィックを生成するために、アプリケーションに再度アクセスしてみましょう。http://:8080`、今度はRUMトレースが報告されるはずです。 - -RUMにアクセスして、トレースとメトリクスのいくつかを見てみましょう **Hamburger Menu → RUM** すると、UIに表示されるSpring PetClinicのURLのいくつかが表示されます。 - ---- -title: 4. Real User Monitoring -weight: 4 ---- - -## 1. Enable RUM - -For the Real User Monitoring (RUM) instrumentation, we will add the Open Telemetry Javascript [https://github.com/signalfx/splunk-otel-js-web](https://github.com/signalfx/splunk-otel-js-web) snippet in the pages, we will use the wizard again **Data Management → Add Integration → RUM Instrumentation → Browser Instrumentation**. - -Select the preconfigured **RUM ACCESS TOKEN** from the dropdown, click **Next**. Enter **App name** and **Environment** using the following syntax: - -- `[hostname]-petclinic-service` - replacing `[hostname]` with your actual hostname. -- `[hostname]-petclinic-env` - replacing `[hostname]` with your actual hostname. - -Then you'll need to select the workshop RUM token and define the application and environment names. The wizard will then show a snipped of HTML code that needs to be place at the top at the pages in the `` section. In this example we are using: +次に、ワークショップのRUMトークンを選択し、 App nameとEnvironmentを定義する必要があります。ウィザードでは、ページ上部の `` セクションに配置する必要のある HTML コードの断片が表示されます。この例では、次のように記述していますが、ウィザードでは先程入力した値が反映されてるはずです。 - Application Name: `-petclinic-service` - Environment: `-petclinic-env` -Copy the generated code snippet in the wizard or copy and edit the snippet below accordingly: +ウィザードで編集済みコードスニペットをコピーするか、以下のスニペットをコピーして適宜編集してください: ``` html @@ -94,19 +31,20 @@ SplunkRum.init({ ``` -The Spring PetClinic application uses a single HTML page as the "layout" page, that is reused across all pages of the application. This is the perfect location to insert the Splunk RUM Instrumentation Library as it will be loaded in all pages automatically. +Spring PetClinicアプリケーションでは、1つのHTMLページを「レイアウト」ページとして使用し、アプリケーションのすべてのページで再利用しています。これは、Splunk RUM計装ライブラリを挿入するのに最適な場所であり、すべてのページで自動的に読み込まれます。 -Let's then edit the layout page: +では、レイアウトページを編集してみましょう: ```bash -vi src/main/resources/templates/fragments/layout.html +nano src/main/resources/templates/fragments/layout.html ``` -and let's insert the snipped we generated above in the `` section of the page. Now we need to rebuild the application and run it again: -## 2. Rebuild PetClinic +そして、上で生成したスニップをページの `` セクションに挿入してみましょう。さて、アプリケーションを再構築して、再び実行する必要があります。 + +## 2. PetClinicを再ビルドする -run the maven command to compile/build/package PetClinic: +mavenコマンドを実行して、PetClinicをコンパイル/ビルド/パッケージ化します: ```bash ./mvnw package -Dmaven.test.skip=true @@ -120,6 +58,7 @@ java \ -jar target/spring-petclinic-*.jar --spring.profiles.active=mysql ``` -Then let's visit the application again to generate more traffic `http://:8080`, now we should see RUM traces being reported -Let's visit RUM and see some of the traces and metrics **Hamburger Menu → RUM** and you will see some of the Spring PetClinic URLs showing up in the UI. +次に、より多くのトラフィックを生成するために、アプリケーションに再度アクセスしてみましょう。 `http://:8080` にアクセスすると、今度はRUMトレースが報告されるはずです。 + +RUMにアクセスして、トレースとメトリクスのいくつかを見てみましょう **Hamburger Menu → RUM** すると、UIに表示されるSpring PetClinicのURLのいくつかが表示されます。 From bf036e30d2c902c861584bfe458d53d685f22564 Mon Sep 17 00:00:00 2001 From: Kazunori Otani Date: Mon, 3 Apr 2023 18:19:35 +0900 Subject: [PATCH 04/10] fix title --- content/ja/other/pet-clinic/docs/rum.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/ja/other/pet-clinic/docs/rum.md b/content/ja/other/pet-clinic/docs/rum.md index e5f9e471d1..1cbfaefef7 100644 --- a/content/ja/other/pet-clinic/docs/rum.md +++ b/content/ja/other/pet-clinic/docs/rum.md @@ -1,5 +1,6 @@ --- -title: 4. Real User Monitoring +title: Real User Monitoring +linkTitle: 4. Real User Monitoring weight: 4 --- From d13a87d716db79a870e28df64ad697180cbbd2df Mon Sep 17 00:00:00 2001 From: Kazunori Otani Date: Tue, 4 Apr 2023 08:59:33 +0900 Subject: [PATCH 05/10] fix --- content/ja/other/pet-clinic/docs/rum.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/content/ja/other/pet-clinic/docs/rum.md b/content/ja/other/pet-clinic/docs/rum.md index 1cbfaefef7..0aa1806a2c 100644 --- a/content/ja/other/pet-clinic/docs/rum.md +++ b/content/ja/other/pet-clinic/docs/rum.md @@ -51,15 +51,24 @@ mavenコマンドを実行して、PetClinicをコンパイル/ビルド/パッ ./mvnw package -Dmaven.test.skip=true ``` + +そして、アプリケーションを動かしてみましょう。バージョンを `version=0.316` とするのをお忘れなく。 + ```bash -java \ --Dotel.service.name=$(hostname)-petclinic.service \ +java -javaagent:./splunk-otel-javaagent.jar \ +-Dotel.service.name=$(hostname).service \ -Dsplunk.profiler.enabled=true \ -Dsplunk.metrics.enabled=true \ +-Dotel.resource.attributes=deployment.environment=$(hostname)-petclinic,version=0.316 \ -jar target/spring-petclinic-*.jar --spring.profiles.active=mysql ``` +{{% notice title="versionを自動で設定する" style="info" %}} +ここまできて `version` を毎回変えるためにコマンドラインを修正するのは大変だと思うことでしょう。実際、修正が漏れた人もいるかもしれません。 +本番環境では、環境変数でアプリケーションバージョンを与えたり、コンテナイメージの作成時にビルドIDを与えたりすることになるはずです。 +{{% /notice %}} + 次に、より多くのトラフィックを生成するために、アプリケーションに再度アクセスしてみましょう。 `http://:8080` にアクセスすると、今度はRUMトレースが報告されるはずです。 RUMにアクセスして、トレースとメトリクスのいくつかを見てみましょう **Hamburger Menu → RUM** すると、UIに表示されるSpring PetClinicのURLのいくつかが表示されます。 From 86a4d794ff071f57d467f7013dd12ba4203b1d1d Mon Sep 17 00:00:00 2001 From: Kazunori Otani Date: Tue, 4 Apr 2023 15:13:02 +0900 Subject: [PATCH 06/10] add LogO --- content/ja/other/pet-clinic/_index.md | 1 + .../ja/other/pet-clinic/docs/logobserver.md | 122 ++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 content/ja/other/pet-clinic/docs/logobserver.md diff --git a/content/ja/other/pet-clinic/_index.md b/content/ja/other/pet-clinic/_index.md index ec93e5107b..42feb85ba3 100644 --- a/content/ja/other/pet-clinic/_index.md +++ b/content/ja/other/pet-clinic/_index.md @@ -13,6 +13,7 @@ description: JavaアプリケーションをつかったSplunk Oservabilityの * Database Query Performance * AlwaysOn Profiling * Splunk Real User Monitoring (RUM) +* Splunk LogObserver ワークショップの中では、Javaのサンプルアプリケーション(Spring PetClinic)をクローン(ダウンロード)し、アプリケーションのコンパイル、パッケージ、実行していきます。 diff --git a/content/ja/other/pet-clinic/docs/logobserver.md b/content/ja/other/pet-clinic/docs/logobserver.md new file mode 100644 index 0000000000..736147d1f2 --- /dev/null +++ b/content/ja/other/pet-clinic/docs/logobserver.md @@ -0,0 +1,122 @@ +--- +title: 5. Log Observer +weight: 5 +--- + +このセクションでは、Spring PetClinicアプリケーションをファイルシステムのファイルにログを書き込むように設定し、 +Splunk OpenTelemetry Collectorがそのログファイルを読み取り(tail)、Splunk Observability Platformに情報を報告するように設定していきます。 + +## 1. FluentDの設定 + +Splunk OpenTelemetry Collectorを、Spring PetClinicのログファイルをtailし +Splunk Observability Cloudエンドポイントにデータを報告するように設定する必要があります。 + +Splunk OpenTelemetry Collectorは、FluentDを使用してログの取得/報告を行い、 +Spring PetClinicのログを報告するための適切な設定を行うには、 +デフォルトディレクトリ(`/etc/otel/collector/fluentd/conf.d/`)にFluentDの設定ファイルを追加するだけです。 + +以下は、サンプルのFluentD設定ファイル(`petclinic.conf`、ファイル`/tmp/spring-petclinic.log`を読み取り)です。 + +``` + + @type tail + @label @SPLUNK + tag petclinic.app + path /tmp/spring-petclinic.log + pos_file /tmp/spring-petclinic.pos_file + read_from_head false + + @type none + + +``` + +したがって、ファイルを作成する必要があります。 + +```bash +sudo nano /etc/otel/collector/fluentd/conf.d/petclinic.conf +``` + +また、petclinic.confファイルのアクセス権と所有権を変更する必要があります。 + +```bash +sudo chown td-agent:td-agent /etc/otel/collector/fluentd/conf.d/petclinic.conf +sudo chmod 755 /etc/otel/collector/fluentd/conf.d/petclinic.conf +``` + +そして、上のスニペットからコンテンツを貼り付けます。ファイルが作成されたら、FluentDプロセスを再起動する必要があります。 + +```bash +sudo systemctl restart td-agent +``` + +## 3. Logbackの設定 + +Spring PetClinicアプリケーションは、いくつかの異なるJavaログライブラリを使用して設定できます。 +このシナリオでは、logbackを使用しています。以下は、サンプルのlogback設定ファイルです。 + +```xml + + + + + true + + + + /tmp/spring-petclinic.log + + springLogFile.%d{yyyy-MM-dd}.log + 5 + 1GB + + + + %d{yyyy-MM-dd HH:mm:ss} - %logger{36} - %msg trace_id=%X{trace_id} span_id=%X{span_id} trace_flags=%X{trace_flags} service.name=%property{otel.resource.service.name}, deployment.environment=%property{otel.resource.deployment.environment} %n + + + + + + + +``` + +設定フォルダにlogback.xmlという名前のファイルを作成するだけです。 + +```bash +nano src/main/resources/logback.xml +``` + +そして、上のスニペットからXMLコンテンツを貼り付けます。 +その後、アプリケーションを再構築して再度実行する必要があります。 + + +```bash +./mvnw package -Dmaven.test.skip=true +``` + +```bash +java -javaagent:./splunk-otel-javaagent.jar \ +-Dotel.service.name=$(hostname).service \ +-Dsplunk.profiler.enabled=true \ +-Dsplunk.metrics.enabled=true \ +-Dotel.resource.attributes=deployment.environment=$(hostname)-petclinic,version=0.317 \ +-jar target/spring-petclinic-*.jar --spring.profiles.active=mysql +``` + + +次に、アプリケーションを再度アクセスしてもっと多くのトラフィックを生成し、 +`http://:8080` でログメッセージが報告されるようになります(遠慮なくナビゲートしてクリックしてください)。 + +左側のLog Observerアイコンをクリックして +ホストとSpring PetClinicアプリケーションからのログメッセージのみを選択するためのフィルタを追加できます。 + +1. フィルタを追加 → フィールド → host.name → <あなたのホスト名> +2. フィルタを追加 → フィールド → service.name → <あなたのホスト名>-petclinic.service + +## 4. まとめ + +これでワークショップは終了です。 +これまでに、Splunk Observability Cloudにメトリクス、トレース、ログ、データベースクエリのパフォーマンス、コードプロファイリングが報告されるようになりました。 +おめでとうございます! From 44b15510be5c913d319c31047dd7f3e4fcc22d0f Mon Sep 17 00:00:00 2001 From: Kazunori Otani Date: Wed, 5 Apr 2023 09:06:23 +0900 Subject: [PATCH 07/10] fix --- content/ja/other/_index.md | 2 +- content/ja/other/pet-clinic/_index.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/ja/other/_index.md b/content/ja/other/_index.md index 28f511f1b3..f9da4bf9a6 100644 --- a/content/ja/other/_index.md +++ b/content/ja/other/_index.md @@ -1,6 +1,6 @@ --- archetype: "home" -title: Other Workshops +title: さらなるワークショップ weight: 19 --- diff --git a/content/ja/other/pet-clinic/_index.md b/content/ja/other/pet-clinic/_index.md index 42feb85ba3..aa3c8bb7b9 100644 --- a/content/ja/other/pet-clinic/_index.md +++ b/content/ja/other/pet-clinic/_index.md @@ -1,5 +1,5 @@ --- -title: PetClinic Java Workshop +title: Pet Clinic Java ワークショップ alwaysopen: false weight: 1 description: JavaアプリケーションをつかったSplunk Oservabilityのワークショップです @@ -15,13 +15,13 @@ description: JavaアプリケーションをつかったSplunk Oservabilityの * Splunk Real User Monitoring (RUM) * Splunk LogObserver -ワークショップの中では、Javaのサンプルアプリケーション(Spring PetClinic)をクローン(ダウンロード)し、アプリケーションのコンパイル、パッケージ、実行していきます。 +ワークショップの中では、Javaのサンプルアプリケーション(Spring Pet Clinic)をクローン(ダウンロード)し、アプリケーションのコンパイル、パッケージ、実行していきます。 アプリケーションを起動すると、OpenTelemetry Javaエージェントを通じて、Splunk APMでメトリクスとトレースが即座に表示されるようになります。 その後、Splunk OpenTelemetry Javascript Libraries (RUM)を使用して、Pet Clinicのエンドユーザーインターフェース(アプリケーションによってレンダリングされるHTMLページ)を計装し、エンドユーザーが実行する個々のクリックとページロードのすべてについて、RUMトレースを生成していきます。 -{{% notice title="前提条件" style="info" %}}。 +{{% notice title="前提条件" style="info" %}} このワークショップは、ホスト/インスタンスが提供されるSplunk実行ワークショップ **または** 自前のホスト/[Multipassインスタンス](https://github.com/splunk/observability-workshop/tree/main/multipass) で行う、自己主導型のワークショップです。 ご自身のシステムには、以下のものがインストールされ、有効になっている必要があります: From a8ff2e8450d214818ef6dafdc489f0f03e737e53 Mon Sep 17 00:00:00 2001 From: Kazunori Otani Date: Mon, 10 Apr 2023 09:14:27 +0900 Subject: [PATCH 08/10] fix --- content/ja/other/pet-clinic/docs/apm.md | 48 ++++++++-------- .../ja/other/pet-clinic/docs/logobserver.md | 55 ++++++++++--------- .../pet-clinic/docs/manual_instrumentation.md | 14 +++-- content/ja/other/pet-clinic/docs/rum.md | 21 +++---- 4 files changed, 72 insertions(+), 66 deletions(-) diff --git a/content/ja/other/pet-clinic/docs/apm.md b/content/ja/other/pet-clinic/docs/apm.md index 9518b10032..eb4f372db1 100644 --- a/content/ja/other/pet-clinic/docs/apm.md +++ b/content/ja/other/pet-clinic/docs/apm.md @@ -47,51 +47,49 @@ curl -L https://github.com/signalfx/splunk-otel-java/releases/latest/download/sp ```bash java -javaagent:./splunk-otel-javaagent.jar \ --Dotel.service.name=$(hostname)-petclinic.service \ +-Dotel.service.name=$(hostname).service \ -jar target/spring-petclinic-*.jar --spring.profiles.active=mysql ``` -アプリケーションが動作しているかどうかは、`http://:8080` にアクセスして確認することができます。次に、トラフィックを生成し、クリックしまくり、エラーを生成し、ペットを追加するなどしてください。その後、Splunk APM UIからExploreを開き、、アプリケーションのコンポーネントやトレースなどを調べることができます。 +アプリケーションが動作しているかどうかは、`http://:8080` にアクセスして確認することができます。 +次に、トラフィックを生成し、クリックしまくり、エラーを生成し、ペットを追加するなどしてください。その後、Splunk APM UIからExploreを開き、アプリケーションのコンポーネントやトレースなどを調べることができます。 + -検証が完了したら、ターミナルで **`Ctrl-c`** を押すと、アプリケーションを停止することができます。 +## 2. いくつかのオプションを追加する +CPUとメモリのプロファイリングを有効にするには `splunk.profiler.enabled=true` と `splunk.profiler.memory.enabled=true` 、 +メモリやGC等のJVMメトリクスを有効にする `splunk.metrics.enabled=true` をアプリケーションの起動時に渡します。 -## 2. プロファイリングとJVMメトリクスを有効にする +また、例えば `version=0.314` のように、リソース属性を報告されたすべてのスパンに追加することができます。。 +リソース属性のカンマ区切りリストで定義していきます。 +新しいリソース属性を使用して、PetClinicを再び起動してみましょう。 +以下では `deployment.environment=$(hostname).service` と同時に `version=0.314` を指定しています。。 -CPU とメモリのプロファイリングを有効にするには `splunk.profiler.enabled=true` を、メモリやGC等のJVMメトリクスを有効にする `splunk.metrics.enabled=true` をアプリケーションの起動時に渡します。アプリケーションが停止していることを確認し、メトリクスとプロファイリングを有効にするために以下のコマンドを実行します。 +アプリケーションが停止していることを確認し(ターミナルで **`Ctrl-c`** を押すと、停止することができます)、これらのオプションを有効にして、再びアプリケーションを動かしてみましょう。 ```bash java -javaagent:./splunk-otel-javaagent.jar \ --Dotel.service.name=$(hostname)-petclinic.service \ +-Dotel.service.name=$(hostname).service \ +-Dotel.resource.attributes=deployment.environment=$(hostname),version=0.314 \ -Dsplunk.profiler.enabled=true \ +-Dsplunk.profiler.memory.enabled=true \ -Dsplunk.metrics.enabled=true \ -jar target/spring-petclinic-*.jar --spring.profiles.active=mysql ``` -トラフィックを発生させるために、`http://:8080` を開いてアプリケーションにアクセスしてみましょう。クリックしまくり、エラーを発生させ、ペットを追加する、などなど。その後、Splunk APM UIにアクセスして、アプリケーションのコンポーネント、Traces、Profiling、Database Query Performance, Endpoint Performansや、DashboardからJVMメトリクスを調べることができます。 - -検証が完了したら、ターミナルで **`Ctrl-c`** を押すと、アプリケーションを停止することができます。 - - -## 3. スパンにリソース属性を追加する - -リソース属性は、報告されたすべてのスパンに追加することができます。例えば、 `version=0.314` のように。また、リソース属性のカンマ区切りリストも定義することができます。 - -新しいリソース属性を使用して、PetClinicを再び起動してみましょう。実行コマンドにリソース属性を追加すると、コレクタをインストールしたときに定義されたものが上書きされることに注意してください。そのため、新しいリソース属性と一緒に `deployment.environment` リソース属性も指定する必要があります。以下では `deployment.environment=$(hostname)-petclinic` と `version=0.314` を指定していることがわかると思います。 +トラフィックを発生させるために、`http://:8080` を開いてアプリケーションにアクセスしてみましょう。 +クリックしまくり、エラーを発生させ、ペットを追加する、などなど。 +その後、Splunk APM UIにアクセスして、アプリケーションのコンポーネント、Traces、Profiling、Database Query Performance, Endpoint Performansや、DashboardからJVMメトリクスを調べることができます。 +スパンの新しい属性 `version` はトレースをドリルダウンするとを見ることができます。さらに、サービスマップでも Breakdown の機能で分析したり、Tag Spotlightを開くと `version` 毎のパフォーマンス分析が使えます。 -```bash -java -javaagent:./splunk-otel-javaagent.jar \ --Dotel.service.name=$(hostname).service \ --Dsplunk.profiler.enabled=true \ --Dsplunk.metrics.enabled=true \ --Dotel.resource.attributes=deployment.environment=$(hostname)-petclinic,version=0.314 \ --jar target/spring-petclinic-*.jar --spring.profiles.active=mysql -``` +{{% notice title="Troubleshooting MetricSetsを追加する" style="info" %}} +サービスマップやTab Spotlightで、 `version` などのカスタム属性で分析できるようにするためには、Troubleshooting MetricSetsの設定をあらかじめ追加する必要があります。 +左メニューの **Settings → APM MetricSets** で、設定を管理することができます。 もしお使いのアカウントで分析できなければ、設定を追加してみましょう。 +{{% /notice %}} -アプリケーションに戻り、さらにトラフィックを発生させます。そして Splunk APM UI に戻って、最近のトレースをドリルダウンし、スパンの新しい属性 `version` を見ることができます。 次のセクションではカスタム計装を追加して、OpenTelemetryでは何ができるのか、さらに見ていきます。 diff --git a/content/ja/other/pet-clinic/docs/logobserver.md b/content/ja/other/pet-clinic/docs/logobserver.md index 736147d1f2..8b79e44c23 100644 --- a/content/ja/other/pet-clinic/docs/logobserver.md +++ b/content/ja/other/pet-clinic/docs/logobserver.md @@ -15,7 +15,14 @@ Splunk OpenTelemetry Collectorは、FluentDを使用してログの取得/報告 Spring PetClinicのログを報告するための適切な設定を行うには、 デフォルトディレクトリ(`/etc/otel/collector/fluentd/conf.d/`)にFluentDの設定ファイルを追加するだけです。 -以下は、サンプルのFluentD設定ファイル(`petclinic.conf`、ファイル`/tmp/spring-petclinic.log`を読み取り)です。 +以下は、サンプルのFluentD設定ファイル `petclinic.conf` を新たに作成し、 + +```bash +sudo nano /etc/otel/collector/fluentd/conf.d/petclinic.conf +``` + + +ファイル `/tmp/spring-petclinic.log`を読み取るよう設定を記述します。 ``` @@ -31,29 +38,34 @@ Spring PetClinicのログを報告するための適切な設定を行うには ``` -したがって、ファイルを作成する必要があります。 -```bash -sudo nano /etc/otel/collector/fluentd/conf.d/petclinic.conf -``` - -また、petclinic.confファイルのアクセス権と所有権を変更する必要があります。 +このとき、ファイル `petclinic.conf` のアクセス権と所有権を変更する必要があります。 ```bash sudo chown td-agent:td-agent /etc/otel/collector/fluentd/conf.d/petclinic.conf sudo chmod 755 /etc/otel/collector/fluentd/conf.d/petclinic.conf ``` -そして、上のスニペットからコンテンツを貼り付けます。ファイルが作成されたら、FluentDプロセスを再起動する必要があります。 +ファイルが作成されたら、FluentDプロセスを再起動しましょう。 ```bash sudo systemctl restart td-agent ``` + ## 3. Logbackの設定 -Spring PetClinicアプリケーションは、いくつかの異なるJavaログライブラリを使用して設定できます。 -このシナリオでは、logbackを使用しています。以下は、サンプルのlogback設定ファイルです。 +Spring Pet Clinicアプリケーションは、いくつかのJavaログライブラリを使用することができます。 +このシナリオでは、logbackを使ってみましょう。 + +リソースフォルダに `logback.xml` という名前のファイルを作成して… + +```bash +nano src/main/resources/logback.xml +``` + + +以下の設定を保存しましょう: ```xml @@ -82,14 +94,7 @@ Spring PetClinicアプリケーションは、いくつかの異なるJavaログ ``` -設定フォルダにlogback.xmlという名前のファイルを作成するだけです。 - -```bash -nano src/main/resources/logback.xml -``` - -そして、上のスニペットからXMLコンテンツを貼り付けます。 -その後、アプリケーションを再構築して再度実行する必要があります。 +その後、アプリケーションを再構築して再度実行していきます。 ```bash @@ -99,21 +104,21 @@ nano src/main/resources/logback.xml ```bash java -javaagent:./splunk-otel-javaagent.jar \ -Dotel.service.name=$(hostname).service \ +-Dotel.resource.attributes=deployment.environment=$(hostname),version=0.317 \ -Dsplunk.profiler.enabled=true \ +-Dsplunk.profiler.memory.enabled=true \ -Dsplunk.metrics.enabled=true \ --Dotel.resource.attributes=deployment.environment=$(hostname)-petclinic,version=0.317 \ -jar target/spring-petclinic-*.jar --spring.profiles.active=mysql ``` -次に、アプリケーションを再度アクセスしてもっと多くのトラフィックを生成し、 -`http://:8080` でログメッセージが報告されるようになります(遠慮なくナビゲートしてクリックしてください)。 +これまで通り、アプリケーション `http://:8080` にアクセスしてトラフィックを生成すると、ログメッセージが報告されるようになります。 + +左側のLog Observerアイコンをクリックして、ホストとSpring PetClinicアプリケーションからのログメッセージのみを選択するためのフィルタを追加できます。 -左側のLog Observerアイコンをクリックして -ホストとSpring PetClinicアプリケーションからのログメッセージのみを選択するためのフィルタを追加できます。 +1. Add Filter → Field → host.name → <あなたのホスト名> +2. Add Filter → Field → service.name → <あなたのホスト名>.service -1. フィルタを追加 → フィールド → host.name → <あなたのホスト名> -2. フィルタを追加 → フィールド → service.name → <あなたのホスト名>-petclinic.service ## 4. まとめ diff --git a/content/ja/other/pet-clinic/docs/manual_instrumentation.md b/content/ja/other/pet-clinic/docs/manual_instrumentation.md index 239f761f41..7643624c1c 100644 --- a/content/ja/other/pet-clinic/docs/manual_instrumentation.md +++ b/content/ja/other/pet-clinic/docs/manual_instrumentation.md @@ -18,10 +18,10 @@ nano pom.xml ``` - - io.opentelemetry - opentelemetry-api - + + io.opentelemetry + opentelemetry-api + ``` 念の為、コンパイルできるか確かめてみましょう: @@ -33,6 +33,7 @@ nano pom.xml {{% notice title="Tips: nanoの使い方と壊れたファイルの直し方" style="info" %}} nanoはLinux環境でよく使われる、シンプルなエディタの一つです。 +* `Alt-U` で、アンドゥができます。Macの場合は `Esc` キーを押したあとに `U` を押してください! * `ctrl-_` のあとに数字を入力すると、指定した行数にジャンプします。 * `ctrl-O` のあとに `Enter` で、ファイルを保存します。 * `ctrl-X` で、nanoを終了します。 @@ -75,7 +76,7 @@ import io.opentelemetry.api.trace.Span; このコードで、Last Nameとして指定された検索条件が、スパン属性 `lastName` としてSplunk Observabilityに伝えるようになりました。 -アプリケーションをコンパイルし直して... +アプリケーションをコンパイルし直ししますが、Javaコードを多少汚してしまったかもしれません。 `spring-javaformat:apply` を指定しながらコンパイルしてみましょう。 ```bash ./mvnw spring-javaformat:apply package -Dmaven.test.skip=true @@ -87,9 +88,10 @@ import io.opentelemetry.api.trace.Span; ```bash java -javaagent:./splunk-otel-javaagent.jar \ -Dotel.service.name=$(hostname).service \ +-Dotel.resource.attributes=deployment.environment=$(hostname),version=0.315 \ -Dsplunk.profiler.enabled=true \ +-Dsplunk.profiler.memory.enabled=true \ -Dsplunk.metrics.enabled=true \ --Dotel.resource.attributes=deployment.environment=$(hostname)-petclinic,version=0.315 \ -jar target/spring-petclinic-*.jar --spring.profiles.active=mysql ``` diff --git a/content/ja/other/pet-clinic/docs/rum.md b/content/ja/other/pet-clinic/docs/rum.md index 0aa1806a2c..1dc9ed523f 100644 --- a/content/ja/other/pet-clinic/docs/rum.md +++ b/content/ja/other/pet-clinic/docs/rum.md @@ -21,15 +21,15 @@ Real User Monitoring (RUM)計装のために、Open Telemetry Javascript [https: ウィザードで編集済みコードスニペットをコピーするか、以下のスニペットをコピーして適宜編集してください: ``` html - - + + ``` Spring PetClinicアプリケーションでは、1つのHTMLページを「レイアウト」ページとして使用し、アプリケーションのすべてのページで再利用しています。これは、Splunk RUM計装ライブラリを挿入するのに最適な場所であり、すべてのページで自動的に読み込まれます。 @@ -57,9 +57,10 @@ mavenコマンドを実行して、PetClinicをコンパイル/ビルド/パッ ```bash java -javaagent:./splunk-otel-javaagent.jar \ -Dotel.service.name=$(hostname).service \ +-Dotel.resource.attributes=deployment.environment=$(hostname),version=0.316 \ -Dsplunk.profiler.enabled=true \ +-Dsplunk.profiler.memory.enabled=true \ -Dsplunk.metrics.enabled=true \ --Dotel.resource.attributes=deployment.environment=$(hostname)-petclinic,version=0.316 \ -jar target/spring-petclinic-*.jar --spring.profiles.active=mysql ``` @@ -71,4 +72,4 @@ java -javaagent:./splunk-otel-javaagent.jar \ 次に、より多くのトラフィックを生成するために、アプリケーションに再度アクセスしてみましょう。 `http://:8080` にアクセスすると、今度はRUMトレースが報告されるはずです。 -RUMにアクセスして、トレースとメトリクスのいくつかを見てみましょう **Hamburger Menu → RUM** すると、UIに表示されるSpring PetClinicのURLのいくつかが表示されます。 +RUMにアクセスして、トレースとメトリクスのいくつかを見てみましょう。左のメニューから **RUM** を選ぶと、Spring Pet Clinicでのユーザー(あなたです!)が体験したパフォーマンスが表示されます。 From 6f05ebd313cb3a5aa8bc1783d4086957762600a6 Mon Sep 17 00:00:00 2001 From: Kazunori Otani Date: Mon, 10 Apr 2023 12:24:03 +0900 Subject: [PATCH 09/10] fine tune --- content/ja/other/pet-clinic/docs/apm.md | 40 ++++++------------- content/ja/other/pet-clinic/docs/imt.md | 2 +- .../ja/other/pet-clinic/docs/logobserver.md | 3 +- .../pet-clinic/docs/manual_instrumentation.md | 10 ++++- 4 files changed, 23 insertions(+), 32 deletions(-) diff --git a/content/ja/other/pet-clinic/docs/apm.md b/content/ja/other/pet-clinic/docs/apm.md index eb4f372db1..ded198f0bb 100644 --- a/content/ja/other/pet-clinic/docs/apm.md +++ b/content/ja/other/pet-clinic/docs/apm.md @@ -1,6 +1,6 @@ --- -title: Install OpenTelemetry Java Agent -linkTitle: 2. OpenTelemetry Java Agent +title: OpenTelemetry Javaエージェントをインストールする +linkTitle: 2. Javaエージェント weight: 2 --- @@ -45,28 +45,6 @@ curl -L https://github.com/signalfx/splunk-otel-java/releases/latest/download/sp そして、以下のコマンドでアプリケーションを実行することができます: -```bash -java -javaagent:./splunk-otel-javaagent.jar \ --Dotel.service.name=$(hostname).service \ --jar target/spring-petclinic-*.jar --spring.profiles.active=mysql -``` - - -アプリケーションが動作しているかどうかは、`http://:8080` にアクセスして確認することができます。 -次に、トラフィックを生成し、クリックしまくり、エラーを生成し、ペットを追加するなどしてください。その後、Splunk APM UIからExploreを開き、アプリケーションのコンポーネントやトレースなどを調べることができます。 - - -## 2. いくつかのオプションを追加する - -CPUとメモリのプロファイリングを有効にするには `splunk.profiler.enabled=true` と `splunk.profiler.memory.enabled=true` 、 -メモリやGC等のJVMメトリクスを有効にする `splunk.metrics.enabled=true` をアプリケーションの起動時に渡します。 - -また、例えば `version=0.314` のように、リソース属性を報告されたすべてのスパンに追加することができます。。 -リソース属性のカンマ区切りリストで定義していきます。 -新しいリソース属性を使用して、PetClinicを再び起動してみましょう。 -以下では `deployment.environment=$(hostname).service` と同時に `version=0.314` を指定しています。。 - -アプリケーションが停止していることを確認し(ターミナルで **`Ctrl-c`** を押すと、停止することができます)、これらのオプションを有効にして、再びアプリケーションを動かしてみましょう。 ```bash java -javaagent:./splunk-otel-javaagent.jar \ @@ -79,11 +57,17 @@ java -javaagent:./splunk-otel-javaagent.jar \ ``` -トラフィックを発生させるために、`http://:8080` を開いてアプリケーションにアクセスしてみましょう。 -クリックしまくり、エラーを発生させ、ペットを追加する、などなど。 -その後、Splunk APM UIにアクセスして、アプリケーションのコンポーネント、Traces、Profiling、Database Query Performance, Endpoint Performansや、DashboardからJVMメトリクスを調べることができます。 +アプリケーションが動作しているかどうかは、`http://:8080` にアクセスして確認することができます。 +次に、トラフィックを生成し、クリックしまくり、エラーを生成し、ペットを追加するなどしてください。 + +* `-Dotel.service.name=$(hostname).service` では、アプリケーションの名前を定義しています。サービスマップ上のアプリケーションの名前等に反映されます。 +* `-Dotel.resource.attributes=deployment.environment=$(hostname),version=0.314` では、Environmentと、versionを定義しています。 + - `deployment.environment=$(hostname)` は、Splunk APM UIの上部「Environment」に反映されます。 + - `version=0.314` はここでは、アプリケーションのバージョンを示しています。トレースをドリルダウンしたり、サービスマップの Breakdown の機能で分析したり、Tag Spotlightを開くと `version` 毎のパフォーマンス分析が使えます。 +* `-Dsplunk.profiler.enabled=true` および `splunk.profiler.memory.enabled=true` では、CPUとメモリのプロファイリングを有効にしています。Splunk APM UIから、AlwaysOn Profilingを開いてみてください。 +* `-Dsplunk.metrics.enabled=true` では、メモリやスレッドなどJVMメトリクスの送信を有効にしています。Dashboardsから、APM java servicesを開いてみてください。 -スパンの新しい属性 `version` はトレースをドリルダウンするとを見ることができます。さらに、サービスマップでも Breakdown の機能で分析したり、Tag Spotlightを開くと `version` 毎のパフォーマンス分析が使えます。 +その後、Splunk APM UIにアクセスして、それぞれのテレメトリーデータを確認してみましょう! {{% notice title="Troubleshooting MetricSetsを追加する" style="info" %}} diff --git a/content/ja/other/pet-clinic/docs/imt.md b/content/ja/other/pet-clinic/docs/imt.md index d048c9f673..1f900c81a0 100644 --- a/content/ja/other/pet-clinic/docs/imt.md +++ b/content/ja/other/pet-clinic/docs/imt.md @@ -1,5 +1,5 @@ --- -title: Installing the OpenTelemetry Collector +title: OpenTelemetry Collectorをインストールする linkTitle: 1. OpenTelemetry Collector weight: 1 --- diff --git a/content/ja/other/pet-clinic/docs/logobserver.md b/content/ja/other/pet-clinic/docs/logobserver.md index 8b79e44c23..b3b81a069b 100644 --- a/content/ja/other/pet-clinic/docs/logobserver.md +++ b/content/ja/other/pet-clinic/docs/logobserver.md @@ -1,5 +1,6 @@ --- -title: 5. Log Observer +title: Log Observer +linktitle: 5. Log Observer weight: 5 --- diff --git a/content/ja/other/pet-clinic/docs/manual_instrumentation.md b/content/ja/other/pet-clinic/docs/manual_instrumentation.md index 7643624c1c..20261edff4 100644 --- a/content/ja/other/pet-clinic/docs/manual_instrumentation.md +++ b/content/ja/other/pet-clinic/docs/manual_instrumentation.md @@ -1,6 +1,6 @@ --- -title: Manual Instrumentation -linkTitle: 3. Manual Instrumentation +title: マニュアル計装 +linkTitle: 3. マニュアル計装 weight: 3 --- @@ -10,6 +10,8 @@ weight: 3 最初に、JavaアプリケーションがOpenTelemetryのAPIを使えるように、ライブラリの依存を追加していきます。もちろん、vimなどのお好みのエディタをお使い頂いても大丈夫です! +アプリケーションが起動中であれば、一旦停止しましょう。ターミナルで **`Ctrl-c`** を押すと、停止することができます。 + ```bash nano pom.xml ``` @@ -98,6 +100,10 @@ java -javaagent:./splunk-otel-javaagent.jar \ `http://:8080` にアクセスして、オーナー検索をいくつか試してましょう。そしてSplunk APM UIからExploreを開き、アプリケーションのトレースを見ていきます。 +{{% notice title="さらなる情報: マニュアル計装について" style="info" %}} +マニュアル計装で何ができるか、他の言語でのやり方などは、OpenTelemetryの公式ウェブサイトにある [Instrumentation](https://opentelemetry.io/docs/instrumentation/) ページをご覧ください。 +{{% /notice %}} + 検証が完了したら、ターミナルで **`Ctrl-c`** を押すと、アプリケーションを停止することができます。 次のセクションでは、RUMを使ってブラウザ上のパフォーマンスデータを収集してみましょう。 From f290fadf458161e921214e9ba597621eaec7f519 Mon Sep 17 00:00:00 2001 From: Kazunori Otani Date: Tue, 11 Apr 2023 16:18:18 +0900 Subject: [PATCH 10/10] fix --- .../pet-clinic/docs/manual_instrumentation.md | 15 ++++++++++----- content/ja/other/pet-clinic/docs/rum.md | 12 ++++++------ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/content/ja/other/pet-clinic/docs/manual_instrumentation.md b/content/ja/other/pet-clinic/docs/manual_instrumentation.md index 20261edff4..7ff114cf3e 100644 --- a/content/ja/other/pet-clinic/docs/manual_instrumentation.md +++ b/content/ja/other/pet-clinic/docs/manual_instrumentation.md @@ -6,9 +6,11 @@ weight: 3 ## 1. 依存ライブラリを追加する -前のセクション足したような、プロセス全体に渡る属性は便利なのですが、ときにはさらに、リクエストの内容に応じた状況を知りたくなるかもしれません。心配ありません、OpenTelemetryのAPIを通じてそれらを計装し、データを送り、Splunk Observabilityで分析できるようになります。 +前のセクション足したような、プロセス全体に渡る属性は便利なのですが、ときにはさらに、リクエストの内容に応じた状況を知りたくなるかもしれません。 +心配ありません、OpenTelemetryのAPIを通じてそれらを計装し、データを送り、Splunk Observabilityで分析できるようになります。 -最初に、JavaアプリケーションがOpenTelemetryのAPIを使えるように、ライブラリの依存を追加していきます。もちろん、vimなどのお好みのエディタをお使い頂いても大丈夫です! +最初に、JavaアプリケーションがOpenTelemetryのAPIを使えるように、ライブラリの依存を追加していきます。 +もちろん、vimなどのお好みのエディタをお使い頂いても大丈夫です! アプリケーションが起動中であれば、一旦停止しましょう。ターミナルで **`Ctrl-c`** を押すと、停止することができます。 @@ -16,7 +18,9 @@ weight: 3 nano pom.xml ``` -そして、`` セクションの中(33行目)に↓をたしてください: + +そして、`` セクションの中(33行目)に↓を追加してください。 +ファイル修正後、 **`ctrl-O`** のあとに **`Enter`** で、ファイルを保存します。次に **`ctrl-X`** で、nanoを終了します。 ``` @@ -26,7 +30,7 @@ nano pom.xml ``` -念の為、コンパイルできるか確かめてみましょう: +念のため、コンパイルできるか確かめてみましょう: ``` ./mvnw package -Dmaven.test.skip=true @@ -54,7 +58,8 @@ git checkout pom.xml では、アプリケーションコードをちょっと変更して、リクエストのコンテキストのデータをスパン属性に追加してみましょう。 -ここではPetClinicアプリケーションの中で `Find Owners` が使われたときに、どのような検索文字列が指定されたのかを調査できるようにしていきます。検索条件によってパフォーマンスが劣化してしまうケース、よくありませんか?そんなときは `OwnerController` に計装を追加していきましょう! +ここでは Pet Clinic アプリケーションの中で `Find Owners` が使われたときに、どのような検索文字列が指定されたのかを調査できるようにしていきます。 +検索条件によってパフォーマンスが劣化してしまうケース、よくありませんか?そんなときは `OwnerController` に計装を追加していきましょう! ```bash nano src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java diff --git a/content/ja/other/pet-clinic/docs/rum.md b/content/ja/other/pet-clinic/docs/rum.md index 1dc9ed523f..e68c1cdb4f 100644 --- a/content/ja/other/pet-clinic/docs/rum.md +++ b/content/ja/other/pet-clinic/docs/rum.md @@ -6,19 +6,19 @@ weight: 4 ## 1. RUMを有効にする -Real User Monitoring (RUM)計装のために、Open Telemetry Javascript [https://github.com/signalfx/splunk-otel-js-web](https://github.com/signalfx/splunk-otel-js-web) スニペットをページ内に追加します。再度ウィザードを使用します **Data Management → Add Integration → RUM Instrumentation → Browser Instrumentation**. +Real User Monitoring (RUM)計装のために、Open Telemetry Javascript [https://github.com/signalfx/splunk-otel-js-web](https://github.com/signalfx/splunk-otel-js-web) スニペットをページ内に追加します。再度ウィザードを使用します **Data Management → Add Integrationボタン → Monitor user experience(画面上部タブ) → Browser Instrumentation**を開きます。 ドロップダウンから設定済みの **RUM ACCESS TOKEN** を選択し、**Next** をクリックします。以下の構文で **App name** と**Environment** を入力します: -- `[hostname]-petclinic-service` - `[hostname]` をお使いのホスト名に書き換えてください -- `[hostname]-petclinic-env` - `[hostname]` をお使いのホスト名に書き換えてください - -次に、ワークショップのRUMトークンを選択し、 App nameとEnvironmentを定義する必要があります。ウィザードでは、ページ上部の `` セクションに配置する必要のある HTML コードの断片が表示されます。この例では、次のように記述していますが、ウィザードでは先程入力した値が反映されてるはずです。 +次に、ワークショップのRUMトークンを選択し、 App nameとEnvironmentを定義します。ウィザードでは、ページ上部の `` セクションに配置する必要のある HTML コードの断片が表示されます。この例では、次のように記述していますが、ウィザードでは先程入力した値が反映されてるはずです。 - Application Name: `-petclinic-service` - Environment: `-petclinic-env` -ウィザードで編集済みコードスニペットをコピーするか、以下のスニペットをコピーして適宜編集してください: +ウィザードで編集済みコードスニペットをコピーするか、以下のスニペットをコピーして適宜編集してください。ただし: + +- `[hostname]-petclinic-service` - `[hostname]` をお使いのホスト名に書き換えてください +- `[hostname]-petclinic-env` - `[hostname]` をお使いのホスト名に書き換えてください ``` html