Jaeger へのエクスポート
このガイドでは、OpenTelemetry .NET のトレースを Jaeger にエクスポートして可視化・分析する方法を説明します。
前提条件
- .NET SDK がコンピューターにインストールされていること
- Jaeger がダウンロードされていること(このガイドでインストール方法を説明します)
- OpenTelemetry の基本的な概念に精通していること(コンソールで始めるを参照)
OTLP エクスポートを使用した .NET アプリケーションの作成
新しいコンソールアプリケーションを作成します。
dotnet new console --output getting-started-jaeger
cd getting-started-jaeger
必要な OpenTelemetry パッケージをインストールします。
dotnet add package OpenTelemetry.Exporter.Console
dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
dotnet add package OpenTelemetry.Instrumentation.Http
Program.cs ファイルを以下のコードで更新します。
using System.Diagnostics;
using OpenTelemetry;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
namespace GettingStartedJaeger;
internal static class Program
{
private static readonly ActivitySource MyActivitySource = new("OpenTelemetry.Demo.Jaeger");
public static async Task Main()
{
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(
serviceName: "DemoApp",
serviceVersion: "1.0.0"))
.AddSource("OpenTelemetry.Demo.Jaeger")
.AddHttpClientInstrumentation()
.AddConsoleExporter()
.AddOtlpExporter()
.Build();
using var parent = MyActivitySource.StartActivity("JaegerDemo");
using (var client = new HttpClient())
{
using (var slow = MyActivitySource.StartActivity("SomethingSlow"))
{
await client.GetStringAsync(new Uri("https://httpstat.us/200?sleep=1000")).ConfigureAwait(false);
await client.GetStringAsync(new Uri("https://httpstat.us/200?sleep=1000")).ConfigureAwait(false);
}
using (var fast = MyActivitySource.StartActivity("SomethingFast"))
{
await client.GetStringAsync(new Uri("https://httpstat.us/301")).ConfigureAwait(false);
}
}
}
}
このアプリケーションを実行すると、ConsoleExporter を通じてトレースがコンソールに出力され、同時に OtlpExporter を使用して Jaeger へのトレース送信も試みます。
Jaeger がまだセットアップされていないため、それらのトレースは最初はドロップされます。
Jaeger のセットアップ
Jaeger はオープンソースの分散トレーシングシステムで、マイクロサービスベースのアプリケーションの監視とトラブルシュートに役立ちます。
Jaeger のインストールと起動
- 公式ダウンロードページから Jaeger をダウンロードします。
- マシン上の任意の場所に展開します。
- OTLP を有効にして Jaeger の all-in-one 実行ファイルを起動します。
./jaeger-all-in-one --collector.otlp.enabled
これにより以下が起動します。
- Jaeger UI(
http://localhost:16686) - OTLP レシーバー付き Jaeger コレクター(
http://localhost:4317) - Jaeger クエリサービスおよびその他のコンポーネント
Jaeger でトレースを表示する
- Web ブラウザを開き、http://localhost:16686 にアクセスします。
- .NET アプリケーションを実行します。
- Jaeger UI で以下を行います。
- 「Service」ドロップダウンから「DemoApp」を選択します。
- 「Find Traces」をクリックします。
Jaeger UI にアプリケーションのトレースが表示されるはずです。 トレースをクリックすると、トレース内のすべてのスパンの詳細なガントチャートビューが表示されます。
コードの理解
トレーサープロバイダーの設定
アプリケーションは以下のように OpenTelemetry を設定します。
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(
serviceName: "DemoApp",
serviceVersion: "1.0.0"))
.AddSource("OpenTelemetry.Demo.Jaeger")
.AddHttpClientInstrumentation()
.AddConsoleExporter()
.AddOtlpExporter()
.Build();
このコードは以下を行います。
- サービス名とバージョンを持つリソースをセットアップします。
- アクティビティソースを登録します。
- HttpClient の自動計装を追加します。
- コンソールと OTLP のエクスポーターを設定します。
アクティビティの作成
アプリケーションは ActivitySource を使用してスパンを作成します。
private static readonly ActivitySource MyActivitySource = new("OpenTelemetry.Demo.Jaeger");
// 親スパンを作成する
using var parent = MyActivitySource.StartActivity("JaegerDemo");
// 子スパンを作成する
using (var slow = MyActivitySource.StartActivity("SomethingSlow"))
{
// このブロック内の操作は "SomethingSlow" スパンの一部になる
}
トレースのエクスポートフロー
トレースデータは以下のコンポーネントを通じて流れます。
- アプリケーションが ActivitySource を使用してスパンを作成します。
- TracerProvider がスパンを収集し処理します。
- OTLP エクスポーターが OTLP プロトコルを通じてスパンを Jaeger に送信します。
- Jaeger がトレースを保存し、クエリと可視化を可能にします。
本番環境での使用
本番環境では、コンソールエクスポーターを削除して OTLP エクスポーターのみを使用してください。
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(
serviceName: "DemoApp",
serviceVersion: "1.0.0"))
.AddSource("OpenTelemetry.Demo.Jaeger")
.AddHttpClientInstrumentation()
// コンソールエクスポーターを削除
// .AddConsoleExporter()
.AddOtlpExporter()
.Build();
コンソールエクスポーターのパッケージも削除できます。
dotnet remove package OpenTelemetry.Exporter.Console
さらに学ぶ
フィードバック
このページは役に立ちましたか?
Thank you. Your feedback is appreciated!
Please let us know how we can improve this page. Your feedback is appreciated!