ワークショップ概要
OBI ワークショップの目標、前提条件、アーキテクチャについて説明します。
学習内容 #
このワークショップを完了すると、以下のことができるようになります
- eBPF が Linux カーネルレベルでゼロコード計装をどのように実現するかを理解する
- ベアホスト上で OBI バイナリを使用して実行中のアプリケーションを計装する
- Docker Compose でポリグロット(複数言語)マイクロサービススタックをデプロイし、1つのコンテナで分散トレーシングを追加する
- Splunk OTel Collector Helm chart を使用して同じスタックを Kubernetes にデプロイし、1つのフラグで OBI を有効化する
- Splunk APM で分散トレース、サービスマップ、リクエストフローを確認する
前提条件 #
ワークショップインスタンスには必要なものがすべて事前設定されています
| 要件 | ワークショップインスタンスでの状態 |
|---|---|
| Linux host | 提供済み (Ubuntu) |
| Python 3.9+ | インストール済み |
| Docker & Docker Compose | インストール済み |
| K3s (Kubernetes) | インストール済み |
| kubectl | インストール済み |
| Helm 3 | インストール済み |
| ワークショップアセット | ~/workshop/obi/ にデプロイ済み |
以下も必要です
| 要件 | 取得方法 |
|---|---|
| Splunk Observability Cloud アカウント | インストラクターから提供されます |
| Splunk Access Token (Ingest) | インスタンスで env と入力し ACCESS_TOKEN を確認してください |
Splunk Realm (例: us0, us1, eu0) | インスタンスで env と入力し REALM を確認してください |
ユニークな名前 (例: shw-2c74) | env で INSTANCE を確認してください。host.name として使用されます |
アーキテクチャ #
このワークショップでは、リクエストチェーンを形成する3つのシンプルなマイクロサービスを使用します
Frontend (Node.js :3000) → Order-Processor (Go :8080) → Payment-Service (Go :8081)これらのサービスにはオブザーバビリティコードが一切ありません — OpenTelemetry SDK も、トレーシングヘッダーも、いかなる種類の計装もありません。OBI は eBPF プローブを使用してカーネルからこれらを計装し、OpenTelemetry 互換のトレースを生成して、Splunk OTel Collector に送信します。Splunk OTel Collector はそれを Splunk Observability Cloud に転送します。
OBI とは? #
OBI (OpenTelemetry eBPF Instrumentation) は、Linux カーネルの eBPF プローブを使用してアプリケーションを流れる HTTP/gRPC トラフィックを観測するスタンドアロンエージェントです。カーネルからプロセスにアタッチするため、SDK もコード変更も再コンパイルも不要です。リクエストを検出し、OpenTelemetry 互換のトレーススパンを生成して、コレクターに送信します。
これは SDK で計装できない、またはしたくない組織にとって価値があります
- ソースアクセスのないレガシーシステム
- 再コンパイルが選択肢にないコンパイル言語
- 開発者の抵抗(「計装を追加する時間がない」)
- コード変更によって完全な監査サイクルが発生する規制上の制約
価値提案 #
多くの組織には、OpenTelemetry SDK で計装できない、またはしたくないアプリケーションがあります
- レガシーシステム: COBOL から Java への移行、10年以上前の .NET Framework アプリ、ソースアクセスのないベンダー提供バイナリ
- コンパイル言語: 再コンパイルが選択肢にない、またはチームが離れてしまった Go、Rust、C++ サービス
- 開発者の抵抗: 「時間がない」、「スプリントに入っていない」、「動いているコードは変えない」
- 規制上の制約: コード変更によって完全な監査・認証サイクルが発生する
OBI はコード変更なしで完全な分散トレーシングを提供します
- SDK 統合不要: インポートなし、依存関係なし、コンパイル時の変更なし
- アプリケーション再起動不要: OBI は eBPF を介して実行中のプロセスにアタッチします
- 言語非依存: Go、Node.js、Python、Java、Rust、C++ など、HTTP または gRPC を使用するあらゆるものに対応
- 1つのコンテナまたは1つの Helm フラグ: compose に追加するか、Helm chart で
obi.enabled=trueを有効にするだけで完了
OBI と従来のゼロコード計装の比較 #
OBI と既存の従来型言語固有ゼロコード計装(Java、JS、.NET、Python、Go、PHP)は、オブザーバビリティ戦略において補完的な役割を果たします。違いを理解することで、各アプローチをいつ使用すべきかを判断できます。
1. 計装モデル #
| 項目 | OBI | 従来のゼロコード計装 |
|---|---|---|
| 実行モデル | プロセス外 | プロセス内 |
| 計装レイヤー | Linux カーネル / ネットワーク | アプリケーションランタイム |
| コード変更の必要性 | なし | なし、または最小限 |
| アプリケーション再起動の必要性 | なし | あり |
| セキュリティプロファイル | 分離 | アプリケーションと同じ権限プロファイル |
2. 可視性のレベル #
| 機能 | OBI | 従来のゼロコード計装 |
|---|---|---|
| 分散トレーシング | プロトコルレベル | フルフィデリティ |
| RED メトリクス | あり | あり |
| アプリケーションログ収集 | なし | あり |
| アプリケーションログとトレースの相関 | あり | あり |
| アプリケーション内部(フレームワーク、関数) | なし(部分的、主に Go) | あり |
| カスタムスパン / ビジネス属性 | なし | あり |
| ランタイムメトリクス(JVM、メモリ、スレッド) | 現時点ではなし | あり |
3. カバレッジと互換性 #
| シナリオ | OBI | 従来のゼロコード計装 |
|---|---|---|
| マルチ言語環境 | 強い(プロトコルベース) | 言語固有 |
| サードパーティアプリケーション | サポート | 限定的、contrib リポジトリ |
| レガシーシステム | サポート | 限定的 |
| コンパイル言語 (C/C++/Rust) | サポート(非同期に一部制限あり) | 限定的 |
| 非同期 / 複雑なフレームワーク | 一部のケースで限定的 | 強い |
4. 運用特性 #
| 項目 | OBI | 従来のゼロコード計装 |
|---|---|---|
| デプロイの手間 | 低い(ドロップイン) | 中程度(エージェントアタッチ) |
| 最初の可視化までの時間 | 数分 | 「もう少し」かかる |
| アプリケーションライフサイクルへの変更 | なし | あり |
| パフォーマンスオーバーヘッド | 最小限で分離されている | 言語/ランタイムにより異なる |
5. Splunk ディストリビューション機能 #
| 機能 | OBI | 従来のゼロコード計装 |
|---|---|---|
| Always-on Profiling | なし(将来 eBPF プロファイラーとバンドルされる可能性あり) | ほとんどで CPU、一部で Memory |
| コールグラフ | なし | ほとんどで CPU、一部で Memory |
| ファイルベース設定 | 対応予定 | Java、Node.js、.NET、Python(対応予定) |
| No-code instrumentation | N/A | あり |
