Jaeger へのエクスポート

OpenTelemetry .NET でトレースを 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 のインストールと起動

  1. 公式ダウンロードページから Jaeger をダウンロードします。
  2. マシン上の任意の場所に展開します。
  3. OTLP を有効にして Jaeger の all-in-one 実行ファイルを起動します。
./jaeger-all-in-one --collector.otlp.enabled

これにより以下が起動します。

  • Jaeger UI(http://localhost:16686
  • OTLP レシーバー付き Jaeger コレクター(http://localhost:4317
  • Jaeger クエリサービスおよびその他のコンポーネント

Jaeger でトレースを表示する

  1. Web ブラウザを開き、http://localhost:16686 にアクセスします。
  2. .NET アプリケーションを実行します。
  3. 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();

このコードは以下を行います。

  1. サービス名とバージョンを持つリソースをセットアップします。
  2. アクティビティソースを登録します。
  3. HttpClient の自動計装を追加します。
  4. コンソールと OTLP のエクスポーターを設定します。

アクティビティの作成

アプリケーションは ActivitySource を使用してスパンを作成します。

private static readonly ActivitySource MyActivitySource = new("OpenTelemetry.Demo.Jaeger");

// 親スパンを作成する
using var parent = MyActivitySource.StartActivity("JaegerDemo");

// 子スパンを作成する
using (var slow = MyActivitySource.StartActivity("SomethingSlow"))
{
    // このブロック内の操作は "SomethingSlow" スパンの一部になる
}

トレースのエクスポートフロー

トレースデータは以下のコンポーネントを通じて流れます。

  1. アプリケーションが ActivitySource を使用してスパンを作成します。
  2. TracerProvider がスパンを収集し処理します。
  3. OTLP エクスポーターが OTLP プロトコルを通じてスパンを Jaeger に送信します。
  4. 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

さらに学ぶ