すべてのプロダクト
Search
ドキュメントセンター

Application Real-Time Monitoring Service:Jaeger を使用した .NET トレースデータのレポート

最終更新日:Mar 12, 2026
重要

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 Agent 経由):

通过Jaeger Agent上报数据

背景情報

Jaeger は、Uber によって作成されたオープンソースの分散トレーシングシステムです。OpenTracing API と互換性があり、Cloud Native Computing Foundation (CNCF) のメンバーです。Jaeger は、さまざまな異種システムからリアルタイムモニタリングデータを収集します。

OpenTracing コミュニティは、以下の .NET フレームワークをサポートするコンポーネントを提供しています:

Jaeger エンドポイントの取得

  1. OpenTelemetry 向けマネージドサービスコンソールにログインします。

  2. 左側のナビゲーションウィンドウで、[クラスター設定] をクリックし、次に [アクセスポイント情報] タブをクリックします。

  3. 上部のナビゲーションバーでリージョンを選択します。[クラスター情報] セクションで、[トークンの表示] をオンにします。

  4. [クライアント] セクションで、[Jaeger] または [Zipkin] をクリックします。

  5. [関連情報] 列からエンドポイントをコピーします。

Jaeger/Zipkin access point information
説明

アプリケーションが 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.1

Greeting: Hello you が表示された場合、接続は正常です。dotnetGrpcServerdotnetGrpcClient からのトレースデータがレポートされるようになります。

.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 ヘッダーを介してコンテキストを渡します。

Context propagation flow

クライアント側でコンテキストを挿入します:

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.1

dotnetManualDemo からのトレースデータが OpenTelemetry 向けマネージドサービスコンソールに表示されます。

トレースデータレポートの検証

  1. ARMS コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、[アプリケーションモニタリング] > [アプリケーション] を選択します。

  3. アプリケーション名で検索します。

説明

[言語] 列に Java图标 アイコンが表示される場合、そのアプリケーションはアプリケーションモニタリングに接続されています。ハイフン ([-]) は、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 サンプラードキュメントをご参照ください。

次のステップ