Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ weight: 1

## Python 環境のセットアップ

Phase 0 ディレクトリに移動し、仮想環境を作成します
Phase 0 のディレクトリに移動し、仮想環境を作成します:

{{< tabs >}}
{{% tab title="Script" %}}
Expand All @@ -31,12 +31,12 @@ Successfully installed flask-3.x.x ...

## Splunk 認証情報の設定

認証情報を環境変数としてエクスポートします。各プレースホルダーを実際の値に置き換えてください
認証情報を環境変数としてエクスポートします。各プレースホルダーを実際の値に置き換えてください:

{{% notice title="Exercise" style="green" icon="running" %}}
`env` と入力すると、環境には `ACCESS_TOKEN`、`REALM`、`INSTANCE` の値が設定されているはずです
`env` と入力したときに、`ACCESS_TOKEN`、`REALM`、`INSTANCE` の値が環境に設定されている必要があります。

**存在しない場合は、以下のようにエクスポートしてください**
**値が存在しない場合は、以下のようにエクスポートしてください**

``` bash
export ACCESS_TOKEN="<YOUR_TOKEN>"
Expand All @@ -48,28 +48,30 @@ export INSTANCE="<YOUR_IDENTIFIER>"

## アプリの実行

Flask アプリをバックグラウンドで起動します
Flask アプリをバックグラウンドで起動します:

``` bash
python3 app.py &
```

起動時に、アプリは単一の `app.heartbeat` メトリクスを直接 Splunk Ingest API に送信します。以下のように表示されるはずです
起動時にアプリは `app.heartbeat` メトリクスを Splunk Ingest API に直接送信します。以下のように表示されるはずです:

``` text
Heartbeat sent to Splunk (200)
* Running on http://0.0.0.0:5150
```

エンドポイントにアクセスして、動作していることを確認します
まず Enter キーを押してプロンプトに戻ります。
次にエンドポイントにアクセスして、動作を確認します:

``` bash
curl http://localhost:5150/hello
curl -s http://localhost:5150/hello | jq
```

以下のレスポンスが返ってくるはずです
以下のレスポンスが返されるはずです:

``` json
127.0.0.1 - - [04/May/2026 13:10:16] "GET /hello HTTP/1.1" 200 -
{
"host": "<YOUR_INSTANCE>",
"message": "Hello from the OBI Workshop warm-up!"
Expand All @@ -78,11 +80,11 @@ curl http://localhost:5150/hello

## Splunk での確認

1. [Splunk Observability Cloud UI](http://app.us1.signalfx.com) を開き(URL はワークショップの場所によって異なります)、Metric Finder で `app.heartbeat` を検索します(または[チャートを作成](https://app.us1.signalfx.com/#/chart/new?template=default&filters=sf_metric%3Aapp.heartbeat)します
1. [Splunk Observability Cloud UI](http://app.us1.signalfx.com)(URL はワークショップの開催場所によって異なります)を開き、Metric Finder で `app.heartbeat` を検索します(または[チャートを作成](https://app.us1.signalfx.com/#/chart/new?template=default&filters=sf_metric%3Aapp.heartbeat)してください
2. 設定した値と一致する `host.name` 属性を持つメトリクスが表示されるはずです。

![app.heartbeat](./images/heartbeat.png)

{{% notice title="Note" style="info" %}}
この時点で、アプリが動作しており、Splunk がデータを受信できることが確認できました。しかし、**トレースはゼロ**で APM は空です。アプリにはインストルメンテーションコードがまったくありません
この時点で、アプリは稼働しており、Splunk がデータを受信できることが確認できています。しかし、**トレースはゼロ**でAPM は空です。アプリにはインストルメンテーションコードが一切含まれていません
{{% /notice %}}
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
---
title: 2. OBI でインストルメントする
title: 2. OBI による計装
weight: 2
---

実行中のアプリに**コードを一行も変更せずに** APM トレーシングを追加します。

## OBI のダウンロード

[GitHub リリースページ](https://github.com/open-telemetry/opentelemetry-ebpf-instrumentation/releases)からビルド済みの OBI バイナリをダウンロードします
[GitHub リリースページ](https://github.com/open-telemetry/opentelemetry-ebpf-instrumentation/releases)からビルド済みの OBI バイナリをダウンロードします

{{< tabs >}}
{{% tab title="Script" %}}

```bash
VERSION=0.6.0
VERSION=0.8.0
ARCH=amd64
wget "https://github.com/open-telemetry/opentelemetry-ebpf-instrumentation/releases/download/v$VERSION/obi-v$VERSION-linux-$ARCH.tar.gz"
wget "https://github.com/open-telemetry/opentelemetry-ebpf-instrumentation/releases/download/v$VERSION/SHA256SUMS"
Expand All @@ -37,7 +37,7 @@ obi-v0.6.0-linux-amd64.tar.gz: OK

{{% notice title="Exercise" style="green" icon="running" %}}

**別のターミナル**で、`sudo` を使って OBI を実行します。3つのプレースホルダーを前のステップで確認した realm、token、hostname に置き換えてください(完了まで1〜2分かかる場合があります)
**別のターミナル**で、`sudo` を使って OBI を実行します。3つのプレースホルダーを前のステップで取得した realm、token、hostname に置き換えてください(完了までに1〜2分かかる場合があります)

{{< tabs >}}
{{% tab title="Script" %}}
Expand Down Expand Up @@ -71,27 +71,27 @@ time=2026-02-27T19:29:58.278Z level=INFO msg="Launching p.Tracer" component=gene

{{% /notice %}}

### 各変数の説明
### これらの変数の役割

| 変数 | 目的 |
|---|---|
| `sudo` | eBPF プローブには root/カーネルアクセスが必要です |
| `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` | Splunk の OTLP トレース取り込み用の完全な URL です。シグナルごとの環境変数はこの URL にそのまま送信します。ベースの `OTEL_EXPORTER_OTLP_ENDPOINT` は `/v1/traces` を付加しますが、Splunk のパスとは一致しません |
| `sudo` | eBPF プローブにはroot/カーネルアクセスが必要です |
| `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` | Splunk の OTLP トレースインジェスト用の完全な URL です。シグナルごとの環境変数はこの URL にそのまま送信します。ベースの `OTEL_EXPORTER_OTLP_ENDPOINT` は `/v1/traces` を追加しますが、Splunk のパスと一致しません |
| `OTEL_EXPORTER_OTLP_HEADERS` | Splunk の認証ヘッダーです |
| `OTEL_SERVICE_NAME` | Splunk APM に表示されるサービス名です |
| `OTEL_RESOURCE_ATTRIBUTES` | すべてのトレースに `deployment.environment` と `host.name` を設定し、自分のデータでフィルタリングできるようにします |
| `OTEL_EBPF_OPEN_PORT` | ポート 5150 でリッスンしているプロセスをインストルメントするよう OBI に指示します |
| `OTEL_RESOURCE_ATTRIBUTES` | すべてのトレースに `deployment.environment` と `host.name` を設定し、自分のデータをフィルタリングできるようにします |
| `OTEL_EBPF_OPEN_PORT` | ポート 5150 でリッスンしているプロセスを計装するよう OBI に指示します |

{{% notice title="Note" style="info" %}}
OBI のログに `failed to upload metrics: 404 Not Found` のような警告が表示される場合があります。これは想定どおりです。Splunk の直接取り込みには標準的な OTLP メトリクスエンドポイントがありません。トレースは正常にエクスポートされます。Phase 2 では、Collector がトレースとメトリクスの両方を適切に処理します
OBI のログに `failed to upload metrics: 404 Not Found` のような警告が表示される場合があります。これは想定どおりの動作です。Splunk のダイレクトインジェストには標準的な OTLP メトリクスエンドポイントがありません。トレースは正常にエクスポートされます。フェーズ2では、コレクターがトレースとメトリクスの両方を適切に処理します
{{% /notice %}}

## トラフィックの生成

最初のターミナルに戻り、いくつかのリクエストを生成します
最初のターミナルに戻り、いくつかのリクエストを生成します

```bash
for i in $(seq 1 20); do curl -s "http://localhost:5150/hello"; sleep 1; done
```

***注意:*** 404 エラーが発生した場合は、curl している URL の末尾に `\` が付加されていないか確認してください。一部のターミナルでは `;` がエスケープされ、無効な URL になることがあります
***NOTE:*** 404 エラーが発生した場合は、curl で指定している URL の末尾に `\` が付加されていないか確認してください。一部のターミナルでは `;` がエスケープされ、無効な URL になることがあります
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,22 @@ weight: 1

## Splunk 認証情報の追加

{{% notice title="演習" style="green" icon="running" %}}
{{% notice title="Exercise" style="green" icon="running" %}}

**:** 環境で `env` コマンドを使用して `ACCESS_TOKEN`、`REALM`、`INSTANCE` を取得してください。これらを設定ファイルに貼り付ける必要があります
**注意:** 環境内の `ACCESS_TOKEN`、`REALM`、`INSTANCE` を確認してください。これらの値を設定ファイルに貼り付ける必要があります

Phase 1/2 ディレクトリに移動し、エディタで `docker-compose.yaml` を開きます:
``` bash
echo $ACCESS_TOKEN; echo $REALM; echo $INSTANCE
```

Phase 1/2 のディレクトリに移動し、エディタで `docker-compose.yaml` を開きます

``` bash
cd ~/workshop/obi/02-obi-docker
vim docker-compose.yaml #or editor of choice
```

`splunk-otel-collector` サービスを見つけ、4つのプレースホルダー値を実際の認証情報に置き換えます:
`splunk-otel-collector` サービスを見つけ、4つのプレースホルダー値を実際の認証情報に置き換えます

``` yaml
environment:
Expand All @@ -30,21 +34,21 @@ vim docker-compose.yaml #or editor of choice

{{% /notice %}}

{{% notice title="ヒント" style="primary" icon="lightbulb" %}}
**なぜ `WORKSHOP_HOST_NAME` と `WORKSHOP_ENVIRONMENT` が必要なのか?** ワークショップの参加者全員が同じ Splunk 組織にテレメトリを送信します。これらの値はすべてのメトリクスとトレースの `host.name` および `deployment.environment` 属性になるため、Splunk で**自分の**データをフィルタリングできます。
{{% notice title="Tip" style="primary" icon="lightbulb" %}}
**なぜ `WORKSHOP_HOST_NAME` と `WORKSHOP_ENVIRONMENT` が必要なのですか?** ワークショップの参加者全員が同じ Splunk 組織にテレメトリを送信します。これらの値はすべてのメトリクスとトレースの `host.name` および `deployment.environment` 属性になるため、Splunk で**自分の**データをフィルタリングできます。
{{% /notice %}}

## スタックの起動

{{< tabs >}}
{{% tab title="スクリプト" %}}
{{% tab title="Script" %}}

``` bash
docker-compose up --build -d
```

{{% /tab %}}
{{% tab title="出力例" %}}
{{% tab title="Example Output" %}}

``` text
[+] Building 12.3s (24/24) FINISHED
Expand All @@ -59,10 +63,10 @@ docker-compose up --build -d
{{% /tab %}}
{{< /tabs >}}

これにより、ソースから3つのアプリケーションイメージがビルドされ、以下が起動します:
このコマンドの完了には数分かかります。3つのアプリケーションイメージをソースからビルドし、以下を起動します

- **frontend**: [http://localhost:3000](http://localhost:3000)
- **order-processor**: ポート 8080
- **payment-service**: ポート 8081
- **splunk-otel-collector**: ポート 4317/4318 でテレメトリを受信
- **load-generator**: 2秒ごとに `/create-order` に自動リクエスト
- **frontend** - [http://localhost:3000](http://localhost:3000)
- **order-processor** - ポート 8080
- **payment-service** - ポート 8081
- **splunk-otel-collector** - ポート 4317/4318 でテレメトリを受信
- **load-generator** - 2秒ごとに `/create-order` に自動的にリクエストを送信
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@ title: 2. トラフィックの生成
weight: 2
---

## フロントエンドへのアクセス
## フロントエンドにアクセスする

{{% notice title="演習" style="green" icon="running" %}}
{{% notice title="Exercise" style="green" icon="running" %}}

curlを使用してトラフィックを生成します:
curl を使用してトラフィックを生成します:

``` bash
curl -s http://localhost:3000/create-order | python3 -m json.tool
curl -s http://localhost:3000/create-order | jq
```

{{% /notice %}}

以下のようなJSONレスポンスが表示されます:
次のような JSON レスポンスが表示されるはずです:

``` json
{
Expand All @@ -28,13 +28,13 @@ curl -s http://localhost:3000/create-order | python3 -m json.tool
}
```

リクエストは3つのサービスすべてを通過しました。しかし、現時点では誰も監視していません
リクエストは3つのサービスすべてを通過しました。しかし現時点では、誰も監視していません

## コードの確認
## コードを確認する

ソースコードを確認し、計装がまったく行われていないことを確認してください:
ソースコードを確認して、計装がまったく存在しないことを確認しましょう:

{{% notice title="演習" style="green" icon="running" %}}
{{% notice title="Exercise" style="green" icon="running" %}}

``` bash
grep -r "opentelemetry\|otel\|tracing\|instrument" ~/workshop/obi/02-obi-docker/frontend/
Expand All @@ -44,4 +44,4 @@ grep -r "opentelemetry\|otel\|tracing\|instrument" ~/workshop/obi/02-obi-docker/

{{% /notice %}}

3つのコマンドはすべて何も返しません。アプリケーションコードには**トレースヘッダー、SDK、計装が一切ありません**。
3つのコマンドはすべて何も返しません。アプリケーションコードのどこにも **トレーシングヘッダー、SDK、計装は一切ありません**。
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ weight: 3

## クイック検証

まず、すべてが正常に動作していることを確認します
まず、すべてが正常に動作していることを確認します:

{{< tabs >}}
{{% tab title="Script" %}}

``` bash
docker-compose ps
curl -s localhost:3000/create-order | python3 -m json.tool
curl -s localhost:3000/create-order | jq
docker-compose logs obi | head -30
```

Expand All @@ -28,41 +28,41 @@ docker-compose logs obi | head -30
{{% /tab %}}
{{< /tabs >}}

OBIのログで、次のような行を探してください:
OBI のログで、以下のような行を探してください:

``` text
level=INFO msg="instrumenting process" cmd=/usr/local/bin/payment-service service=payment-service
level=INFO msg="instrumenting process" cmd=/usr/local/bin/order-processor service=order-processor
level=INFO msg="instrumenting process" cmd=node service=frontend
```

## Splunk APM を確認する
## Splunk APM の確認

トレースが流れるまで30〜60秒待ってから、Splunk APMを確認します
トレースが流れるまで 30〜60 秒待ってから、Splunk APM を確認します

{{% notice title="Exercise" style="green" icon="running" %}}

1. **Service Map**: APMに移動し、ご自身の環境でフィルタリングします。3つのサービスが表示されるはずです: `frontend` -> `order-processor` -> `payment-service`。
2. **Traces**: 任意のトレースをクリックします。3つのサービスすべてにまたがる完全な分散トレースと、各ホップのタイミングが表示されます
3. **フェーズ 1 との比較**: 数分前は完全に空だったAPMダッシュボードに、完全なサービストポロジーが表示されるようになりました。
1. **Service Map**: APM に移動し、ご自身の環境でフィルタリングします。`frontend` -> `order-processor` -> `payment-service` の3つのサービスが表示されるはずです
2. **Traces**: 任意のトレースをクリックします。3つのサービスすべてにまたがる分散トレースが、各ホップのタイミングとともに表示されます
3. **Phase 1 との比較**: 数分前には完全に空だった APM ダッシュボードに、完全なサービストポロジーが表示されるようになりました。

{{% /notice %}}

**compose ファイルにコンテナを 1 つ追加しただけです。アプリケーションコードは 1 行も変更していません。これで完全な分散トレーシングが実現しました。**
**compose ファイルにコンテナを1つ追加しただけです。アプリケーションコードの変更はゼロ行です。これで完全な分散トレーシングが実現しました。**

## 解答
## 解答例

途中で詰まった場合は、すべての変更が適用された最終的な `docker-compose.yaml` を以下で確認できます:
途中で行き詰まった場合、すべての変更が適用された最終版の `docker-compose.yaml` は以下で確認できます:

``` bash
cat ~/workshop/obi/02-obi-docker/docker-compose.final.yaml
```

ご自身の `docker-compose.yaml` と比較して、違いを確認してください
ご自身の `docker-compose.yaml` と比較して、差分を確認してください

## Docker のクリーンアップ

Kubernetesフェーズに進む前に、Dockerスタックを停止します:
Kubernetes フェーズに進む前に、Docker スタックを停止します:

``` bash
docker-compose down
Expand Down
Loading