C# 用 Jaeger クライアントは、メンテナンスが終了しました。代わりに OpenTelemetry SDK for .NET を使用してください。以下の手順は、既存の Jaeger ベースの実装にのみ適用されます。
Jaeger を使用して .NET アプリケーションのイベントトラッキングを行い、トレースデータを OpenTelemetry 向けマネージドサービスにレポートします。データが到着すると、コンソールにアプリケーションのトポロジー、トレース、異常および低速なトランザクション、SQL 分析が表示されます。
前提条件
開始する前に、以下が準備できていることを確認してください:
Jaeger 1.0.2
.NET 6.0 または .NET Core 3.1
OpenTelemetry 向けマネージドサービスコンソールから取得した Jaeger エンドポイント (下記の「Jaeger エンドポイントの取得」セクションをご参照ください)
ローカルにクローンされた dotnet-demo サンプルプロジェクト
レポートのアーキテクチャ
トレースデータをレポートするには、2つの方法があります:
直接レポート (Jaeger Agent なし):

エージェントベースのレポート (Jaeger Agent 経由):

背景情報
Jaeger は、Uber によって作成されたオープンソースの分散トレーシングシステムです。OpenTracing API と互換性があり、Cloud Native Computing Foundation (CNCF) のメンバーです。Jaeger は、さまざまな異種システムからリアルタイムモニタリングデータを収集します。
OpenTracing コミュニティは、以下の .NET フレームワークをサポートするコンポーネントを提供しています:
Jaeger エンドポイントの取得
OpenTelemetry 向けマネージドサービスコンソールにログインします。
左側のナビゲーションウィンドウで、[クラスター設定] をクリックし、次に [アクセスポイント情報] タブをクリックします。
上部のナビゲーションバーでリージョンを選択します。[クラスター情報] セクションで、[トークンの表示] をオンにします。
[クライアント] セクションで、[Jaeger] または [Zipkin] をクリックします。
[関連情報] 列からエンドポイントをコピーします。

アプリケーションが Alibaba Cloud の本番環境で実行されている場合は、VPC エンドポイントを使用してください。それ以外の場合は、パブリックエンドポイントを使用します。Zipkin の場合、v1 を使用する特別な理由がない限り、v2 エンドポイントを使用してください。
.NET 6.0 アプリケーションのインストルメンテーション
要件:
Jaeger 1.0.2
.NET 6.0
トレーサーの設定とサンプルの実行
ステップ 1: Jaeger トレーサーの設定
dotnet-demo/net6.0/Shared/JaegerServiceCollectionExtensions.cs を開き、Jaeger エンドポイントとアプリケーション名を設定します:
public static class JaegerServiceCollectionExtensions
{
// ご利用の Jaeger エンドポイントに置き換えます。上記の「Jaeger エンドポイントの取得」をご参照ください。
private static readonly Uri _jaegerUri = new Uri("http://tracing-analysis-dc-sz.aliyuncs.com/adapt_your_token/api/traces");
public static IServiceCollection AddJaeger(this IServiceCollection services)
{
if (services == null)
throw new ArgumentNullException(nameof(services));
services.AddSingleton<ITracer>(serviceProvider =>
{
// アセンブリ名をサービス名として使用します。
string serviceName = Assembly.GetEntryAssembly().GetName().Name;
ILoggerFactory loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
ISampler sampler = new ConstSampler(sample: true);
IReporter reporter = new RemoteReporter.Builder()
.WithSender(new HttpSender.Builder(_jaegerUri.ToString()).Build())
.Build();
ITracer tracer = new Tracer.Builder(serviceName)
.WithLoggerFactory(loggerFactory)
.WithSampler(sampler)
.WithReporter(reporter)
.Build();
GlobalTracer.Register(tracer);
return tracer;
});
// OpenTracing が Jaeger への HTTP リクエストを追跡する際の無限ループを防ぎます。
services.Configure<HttpHandlerDiagnosticOptions>(options =>
{
options.IgnorePatterns.Add(request => _jaegerUri.IsBaseOf(request.RequestUri));
});
return services;
}
}ステップ 2: サンプルアプリケーションの実行
cd dotnet-demo/net6.0/CustomersApi
dotnet run --framework:net6.0ステップ 3: トレースデータの生成
ブラウザで http://localhost:5001/health を開きます。
ステップ 4: 検証
下記の「トレースデータレポートの検証」セクションの手順に従います。
.NET Core 3.1 アプリケーションを計装する
要件:
Jaeger 1.0.2
.NET Core 3.1
.NET Core 3.1 では、3つのイベントトラッキング方法が利用可能です:
| メソッド | 使用するケース |
|---|---|
| ASP.NET Core ミドルウェア | ASP.NET Core 上に構築された Web アプリケーション |
| gRPC ミドルウェア | サービス間通信に gRPC を使用するアプリケーション |
| 手動でのイベントトラッキング | カスタムのトレーシング要件がある場合、または既存のプラグインがないフレームワーク |
ASP.NET Core を用いた自動インストルメンテーション
ステップ 1: Jaeger トレーサーの設定
dotnet-demo/netcoreapp3.1/Shared/JaegerServiceCollectionExtensions.cs を開き、Jaeger エンドポイントを設定します。設定は上記の .NET 6.0 バージョンと同じです。
ステップ 2: ASP.NET Core ミドルウェアのインストール
cd dotnet-demo/netcoreapp3.1/Shared
dotnet add package OpenTracing.Contrib.NetCoreステップ 3: アプリケーションプロジェクトにミドルウェアをインストールして実行
cd dotnet-demo/netcoreapp3.1/CustomersApi
dotnet add package OpenTracing.Contrib.NetCore
dotnet run --framework:netcoreapp3.1ステップ 4: トレースデータの生成
ブラウザで http://localhost:5001/health を開きます。
ステップ 5: 検証
下記の「トレースデータレポートの検証」セクションの手順に従います。
gRPC による自動計装
gRPC のイベントトラッキングは、gRPC 呼び出しのサーバー側とクライアント側の両方にトレーシングを追加します。
ステップ 1: NuGet パッケージのインストール
dotnet add package OpenTracing.Contrib.grpc
dotnet add package Jaegerステップ 2: トレーサーの初期化
public static Tracer InitTracer(string serviceName, ILoggerFactory loggerFactory)
{
Configuration.SamplerConfiguration samplerConfiguration = new Configuration.SamplerConfiguration(loggerFactory)
.WithType(ConstSampler.Type)
.WithParam(1);
Configuration.SenderConfiguration senderConfiguration = new Configuration.SenderConfiguration(loggerFactory)
// ご利用の Jaeger エンドポイントに置き換えます。上記の「Jaeger エンドポイントの取得」をご参照ください。
.WithEndpoint("http://tracing-analysis-dc-sz.aliyuncs.com/adapt_your_token/api/traces");
Configuration.ReporterConfiguration reporterConfiguration = new Configuration.ReporterConfiguration(loggerFactory)
.WithSender(senderConfiguration);
return (Tracer)new Configuration(serviceName, loggerFactory)
.WithSampler(samplerConfiguration)
.WithReporter(reporterConfiguration)
.GetTracer();
}ステップ 3: サーバー側のイベントトラッキングの追加
ServerTracingInterceptor をビルドし、gRPC サービスにバインドします:
ILoggerFactory loggerFactory = new LoggerFactory().AddConsole();
ITracer tracer = TracingHelper.InitTracer("dotnetGrpcClient", loggerFactory);
ClientTracingInterceptor tracingInterceptor = new ClientTracingInterceptor(tracer);
Channel channel = new Channel("127.0.0.1:50051", ChannelCredentials.Insecure);
var client = new Greeter.GreeterClient(channel.Intercept(tracingInterceptor));ステップ 4: クライアント側のイベントトラッキングの追加
ClientTracingInterceptor をビルドし、チャンネルにバインドします:
ILoggerFactory loggerFactory = new LoggerFactory().AddConsole();
ITracer tracer = TracingHelper.InitTracer("dotnetGrpcClient", loggerFactory);
ClientTracingInterceptor tracingInterceptor = new ClientTracingInterceptor(tracer);
Channel channel = new Channel("127.0.0.1:50051", ChannelCredentials.Insecure);
var client = new Greeter.GreeterClient(channel.Intercept(tracingInterceptor));ステップ 5: サーバーとクライアントの実行
1つのターミナルで gRPC サーバーを起動します:
cd dotnet-demo/netcoreapp3.1/GreeterClient
dotnet run --framework:netcoreapp3.1別のターミナルで gRPC クライアントを起動します:
cd dotnet-demo/netcoreapp3.1/GreeterClient
dotnet run --framework:netcoreapp3.1Greeting: Hello you が表示された場合、接続は正常です。dotnetGrpcServer と dotnetGrpcClient からのトレースデータがレポートされるようになります。
.NET アプリケーションの手動でのイベントトラッキング
既存のプラグインがユースケースをカバーしていない場合や、どの操作をトレースするかを詳細に制御する必要がある場合は、手動でのイベントトラッキングを使用します。
ステップ 1: NuGet パッケージのインストール
dotnet add package Microsoft.Extensions.Logging.Console
dotnet add package Jaegerステップ 2: ITracer オブジェクトのビルド
ITracer インターフェイスは OpenTracing によって定義されています。Jaeger ライブラリを使用して、エンドポイントとサンプリング構成を指定する実装を作成します:
public static ITracer InitTracer(string serviceName, ILoggerFactory loggerFactory)
{
Configuration.SamplerConfiguration samplerConfiguration = new Configuration.SamplerConfiguration(loggerFactory)
.WithType(ConstSampler.Type)
.WithParam(1);
Configuration.SenderConfiguration senderConfiguration = new Configuration.SenderConfiguration(loggerFactory)
// ご利用の Jaeger エンドポイントに置き換えます。上記の「Jaeger エンドポイントの取得」をご参照ください。
.WithEndpoint("http://tracing-analysis-dc-sz.aliyuncs.com/adapt_your_token/api/traces");
Configuration.ReporterConfiguration reporterConfiguration = new Configuration.ReporterConfiguration(loggerFactory)
.WithSender(senderConfiguration);
return (Tracer)new Configuration(serviceName, loggerFactory)
.WithSampler(samplerConfiguration)
.WithReporter(reporterConfiguration)
.GetTracer();
}ステップ 3: トレーサーのグローバル登録
GlobalTracer.Register(InitTracer("dotnetManualDemo", loggerFactory));ステップ 4: 操作を記録するためのスパンの作成
リクエストのルートスパンを作成します:
ITracer tracer = GlobalTracer.Instance;
ISpan span = tracer.BuildSpan("parentSpan").WithTag("mytag", "parentSpan").Start();
tracer.ScopeManager.Activate(span, false);
// ... ここにビジネスロジックを記述します
span.Finish();同じリクエスト内のネストされた操作を記録するには、AsChildOf を使用して子スパンを作成します:
ITracer tracer = GlobalTracer.Instance;
ISpan parentSpan = tracer.ActiveSpan;
ISpan childSpan = tracer.BuildSpan("childSpan").AsChildOf(parentSpan).WithTag("mytag", "spanSecond").Start();
tracer.ScopeManager.Activate(childSpan, false);
// ... ここにビジネスロジックを記述します
childSpan.Finish();ステップ 5 (任意): カスタムタグの追加
フィルタリングやデバッグのために、スパンにメタデータを添付します:
tracer.activeSpan().setTag("http.status_code", "200");ステップ 6: サービス間でのコンテキストの伝播
分散システムでは、トレースコンテキスト (TraceId、ParentSpanId、SpanId、Sampled) は各リモートプロシージャコール (RPC) リクエストと共に渡されます。クライアント側で Inject を、サーバー側で Extract を使用して、HTTP ヘッダーを介してコンテキストを渡します。

クライアント側でコンテキストを挿入します:
Tracer.Inject(span.Context, BuiltinFormats.HttpHeaders, new HttpHeadersInjectAdapter(request.Headers));サーバー側でコンテキストを抽出します:
ISpanContext extractedSpanContext = _tracer.Extract(BuiltinFormats.HttpHeaders, new RequestHeadersExtractAdapter(request.Headers));
ISpan childSpan = _tracer.BuildSpan(operationName).AsChildOf(extractedSpanContext);ステップ 7: サンプルの実行
cd dotnet-demo/netcoreapp3.1/ManualDemo
dotnet run --framework:netcoreapp3.1dotnetManualDemo からのトレースデータが OpenTelemetry 向けマネージドサービスコンソールに表示されます。
トレースデータレポートの検証
ARMS コンソールにログインします。
左側のナビゲーションウィンドウで、[アプリケーションモニタリング] > [アプリケーション] を選択します。
アプリケーション名で検索します。
[言語] 列に
アイコンが表示される場合、そのアプリケーションはアプリケーションモニタリングに接続されています。ハイフン ([-]) は、OpenTelemetry 向けマネージドサービスへの接続を示します。
よくある質問
デモ実行後にトレースデータが表示されない場合
senderConfiguration 内のエンドポイントが正しく、ご利用の環境から到達可能であることを確認してください:
Configuration.SenderConfiguration senderConfiguration = new Configuration.SenderConfiguration(loggerFactory)
// このエンドポイントがコンソールから取得したものと一致することを確認してください。
.WithEndpoint("http://tracing-analysis-dc-sz.aliyuncs.com/adapt_your_token/api/traces");アプリケーションが VPC 内で実行されている場合は、パブリックエンドポイントではなく VPC エンドポイントを使用していることを確認してください。
サンプルレートの設定方法
詳細については、jaeger-client-csharp サンプラードキュメントをご参照ください。
次のステップ
OpenTelemetry を使用して .NET アプリケーションのトレースデータを送信する -- 積極的にメンテナンスされている OpenTelemetry SDK への移行。