エクスポーター

OpenTelemetryコレクターにテレメトリーを送信し、正しくエクスポートされることを確認してください。 本番環境でコレクターを使用することはベストプラクティスです。 テレメトリーを可視化するために、JaegerZipkinPrometheus、またはベンダー固有のようなバックエンドにエクスポートしてください。

使用可能なエクスポーター

レジストリには、.NET 用のエクスポーターのリストが含まれています。

エクスポーターの中でも、OpenTelemetry Protocol (OTLP)エクスポーターは、OpenTelemetryのデータモデルを考慮して設計されており、OTelデータを情報の損失なく出力します。 さらに、多くのテレメトリーデータを扱うツールがOTLPに対応しており(たとえば、PrometheusJaegerやほとんどのベンダー)、必要なときに高い柔軟性を提供します。 OTLPについて詳細に学習したい場合は、OTLP仕様を参照してください。

このページでは、主要なOpenTelemetry .NET エクスポーターとその設定方法について説明します。

OTLP

コレクターのセットアップ

OTLPエクスポーターを試し、検証するために、テレメトリーを直接コンソールに書き込むDockerコンテナでコレクターを実行できます。 空のディレクトリで、以下の内容でcollector-config.yamlというファイルを作成します。

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
exporters:
  debug:
    verbosity: detailed
service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [debug]
    metrics:
      receivers: [otlp]
      exporters: [debug]
    logs:
      receivers: [otlp]
      exporters: [debug]

次に、Docker コンテナでコレクターを実行します。

docker run -p 4317:4317 -p 4318:4318 --rm -v $(pwd)/collector-config.yaml:/etc/otelcol/config.yaml otel/opentelemetry-collector

このコレクターは、OTLPを介してテレメトリーを受け取ることができるようになりました。後で、テレメトリーを監視バックエンドに送信するためにコレクターを設定することもできます。

依存関係

テレメトリーデータを OTLP エンドポイント(OpenTelemetry CollectorJaegerPrometheus など)に送信したい場合、データの転送に使用するプロトコルを2つから選べます。

  • HTTP/protobuf
  • gRPC

まず、プロジェクトの依存関係として OpenTelemetry.Exporter.OpenTelemetryProtocol パッケージをインストールします。

dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol

ASP.NET Core を使用している場合は、OpenTelemetry.Extensions.Hosting パッケージもインストールしてください。

dotnet add package OpenTelemetry.Extensions.Hosting

使い方

ASP.NET Core

ASP.NET Core サービスでエクスポーターを設定します。

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddOpenTelemetry()
    .WithTracing(tracing => tracing
        // その他のセットアップコードはここに記述します
        .AddOtlpExporter())
    .WithMetrics(metrics => metrics
        // その他のセットアップコードはここに記述します
        .AddOtlpExporter());

builder.Logging.AddOpenTelemetry(logging => {
    // その他のセットアップコードはここに記述します
    logging.AddOtlpExporter();
});

デフォルトでは、gRPC を使用して http://localhost:4317 にテレメトリーを送信します。 HTTP と protobuf フォーマットを使用するようにカスタマイズするには、次のようにオプションを追加します。

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddOpenTelemetry()
    .WithTracing(tracing => tracing
        // その他のセットアップコードはここに記述します
        .AddOtlpExporter(options =>
        {
            options.Endpoint = new Uri("your-endpoint-here/v1/traces");
            options.Protocol = OtlpExportProtocol.HttpProtobuf;
        }))
    .WithMetrics(metrics => metrics
        // その他のセットアップコードはここに記述します
        .AddOtlpExporter(options =>
        {
            options.Endpoint = new Uri("your-endpoint-here/v1/metrics");
            options.Protocol = OtlpExportProtocol.HttpProtobuf;
        }));

builder.Logging.AddOpenTelemetry(logging => {
    // その他のセットアップコードはここに記述します
    logging.AddOtlpExporter(options =>
    {
        options.Endpoint = new Uri("your-endpoint-here/v1/logs");
        options.Protocol = OtlpExportProtocol.HttpProtobuf;
    });
});

非 ASP.NET Core

TracerProviderMeterProvider、または LoggerFactory を作成する際にエクスポーターを設定します。

var tracerProvider = Sdk.CreateTracerProviderBuilder()
    // リソースの設定など、その他のセットアップコードもここに記述します
    .AddOtlpExporter(options =>
    {
        options.Endpoint = new Uri("your-endpoint-here/v1/traces");
        options.Protocol = OtlpExportProtocol.HttpProtobuf;
    })
    .Build();

var meterProvider = Sdk.CreateMeterProviderBuilder()
    // リソースの設定など、その他のセットアップコードもここに記述します
    .AddOtlpExporter(options =>
    {
        options.Endpoint = new Uri("your-endpoint-here/v1/metrics");
        options.Protocol = OtlpExportProtocol.HttpProtobuf;
    })
    .Build();

var loggerFactory = LoggerFactory.Create(builder =>
{
    builder.AddOpenTelemetry(logging =>
    {
        logging.AddOtlpExporter(options =>
        {
            options.Endpoint = new Uri("your-endpoint-here/v1/logs");
            options.Protocol = OtlpExportProtocol.HttpProtobuf;
        })
    });
});

本番環境では、ヘッダーやエンドポイント URL などの値を設定するために環境変数を使用してください。

コンソール

依存関係

コンソールエクスポーターは開発やデバッグのタスクに便利で、最もセットアップが簡単です。 まず、プロジェクトの依存関係として OpenTelemetry.Exporter.Console パッケージをインストールします。

dotnet add package OpenTelemetry.Exporter.Console

ASP.NET Core を使用している場合は、OpenTelemetry.Extensions.Hosting パッケージもインストールしてください。

dotnet add package OpenTelemetry.Extensions.Hosting

使い方

ASP.NET Core

ASP.NET Core サービスでエクスポーターを設定します。

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddOpenTelemetry()
    .WithTracing(tracing => tracing
        // その他のセットアップコードはここに記述します
        .AddConsoleExporter()
    )
    .WithMetrics(metrics => metrics
        // その他のセットアップコードはここに記述します
        .AddConsoleExporter()
    );

builder.Logging.AddOpenTelemetry(logging => {
    // その他のセットアップコードはここに記述します
    logging.AddConsoleExporter();
});

非 ASP.NET Core

TracerProviderMeterProvider、または LoggerFactory を作成する際にエクスポーターを設定します。

var tracerProvider = Sdk.CreateTracerProviderBuilder()
    // その他のセットアップコードはここに記述します
    .AddConsoleExporter()
    .Build();

var meterProvider = Sdk.CreateMeterProviderBuilder()
    // その他のセットアップコードはここに記述します
    .AddConsoleExporter()
    .Build();

var loggerFactory = LoggerFactory.Create(builder =>
{
    builder.AddOpenTelemetry(logging =>
    {
        logging.AddConsoleExporter();
    });
});

Jaeger

バックエンドのセットアップ

Jaegerは、トレースデータを受信するためにOTLPをネイティブでサポートしています。UIがポート16686でアクセス可能で、OTLPがポート4317と4318で有効になったDockerコンテナでJaegerを実行できます。

docker run --rm \
  -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318 \
  -p 9411:9411 \
  jaegertracing/all-in-one:latest

使用方法

OTLPエクスポーターをセットアップするための手順に従ってください。

Prometheus

メトリクスデータを Prometheus に送信するには、以下のいずれかの方法を使用できます。

バックエンドのセットアップ

Prometheus サーバーバックエンドを実行してメトリクスのスクレイピングを開始するには、Prometheus 入門ガイドを参照してください。

OTLP レシーバーを有効にするには、OTLP レシーバーの有効化に関する Prometheus ガイドを参照してください。

以下のセクションでは、Prometheus エクスポーターの .NET 固有の設定手順を詳しく説明します。

メトリクスを Prometheus にエクスポートするには2つのアプローチがあります。

  1. OTLP エクスポーターの使用(プッシュ): OTLP プロトコルを使用してメトリクスを Prometheus にプッシュします。 これには Prometheus の OTLP レシーバーを有効にする必要があります。 このアプローチはエグゼンプラーをサポートし、安定しているため、本番環境に推奨されます。

  2. Prometheus エクスポーターの使用(プル/スクレイプ): アプリケーションに Prometheus がスクレイプできるスクレイピングエンドポイントを公開します。 これは従来の Prometheus のアプローチです。

OTLP エクスポーターの使用(プッシュ)

このアプローチは、OTLP エクスポーターを使用して Prometheus の OTLP レシーバーエンドポイントにメトリクスを直接プッシュします。 エグゼンプラーをサポートし、安定した OTLP プロトコルを使用するため、本番環境に推奨されます。

依存関係

プロジェクトの依存関係として OpenTelemetry.Exporter.OpenTelemetryProtocol パッケージをインストールします。

dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol

ASP.NET Core を使用している場合は、OpenTelemetry.Extensions.Hosting パッケージもインストールしてください。

dotnet add package OpenTelemetry.Extensions.Hosting
使い方
ASP.NET Core

Prometheus の OTLP レシーバーにメトリクスを送信するように OTLP エクスポーターを設定します。

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddOpenTelemetry()
    .WithMetrics(metrics => metrics
        // その他のセットアップコードはここに記述します
        .AddOtlpExporter(options =>
        {
            options.Endpoint = new Uri("http://localhost:9090/api/v1/otlp/v1/metrics");
            options.Protocol = OtlpExportProtocol.HttpProtobuf;
        }));
非 ASP.NET Core

MeterProvider を作成する際にエクスポーターを設定します。

var meterProvider = Sdk.CreateMeterProviderBuilder()
    // リソースの設定など、その他のセットアップコードもここに記述します
    .AddOtlpExporter(options =>
    {
        options.Endpoint = new Uri("http://localhost:9090/api/v1/otlp/v1/metrics");
        options.Protocol = OtlpExportProtocol.HttpProtobuf;
    })
    .Build();

Prometheus エクスポーターの使用(プル/スクレイプ)

このアプローチは、アプリケーション内にメトリクスエンドポイント(例: /metrics)を公開し、Prometheus が定期的にスクレイプします。

依存関係

プロジェクトの依存関係としてエクスポーターパッケージをインストールします。

dotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore --version 1.17.0-beta.1

ASP.NET Core を使用している場合は、OpenTelemetry.Extensions.Hosting パッケージもインストールしてください。

dotnet add package OpenTelemetry.Extensions.Hosting
使い方
ASP.NET Core

ASP.NET Core サービスでエクスポーターを設定します。

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddOpenTelemetry()
    .WithMetrics(metrics => metrics.AddPrometheusExporter());

次に、Prometheus がアプリケーションをスクレイプできるように、Prometheus スクレイピングミドルウェアを登録する必要があります。 IApplicationBuilderUseOpenTelemetryPrometheusScrapingEndpoint 拡張メソッドを使用します。

var builder = WebApplication.CreateBuilder(args);

// ... セットアップ

var app = builder.Build();

app.UseOpenTelemetryPrometheusScrapingEndpoint();

await app.RunAsync();

デフォルトでは、メトリクスエンドポイントは /metrics で公開されます。 エンドポイントパスをカスタマイズしたり、述語関数を使用してより高度な設定を行うことができます。

app.UseOpenTelemetryPrometheusScrapingEndpoint(
    context => context.Request.Path == "/internal/metrics"
        && context.Connection.LocalPort == 5067);
非 ASP.NET Core

ASP.NET Core を使用しないアプリケーションでは、別のパッケージで提供されている HttpListener バージョンを使用できます。

dotnet add package OpenTelemetry.Exporter.Prometheus.HttpListener --version 1.17.0-beta.1

この場合、MeterProviderBuilder 上で直接セットアップします。

var meterProvider = Sdk.CreateMeterProviderBuilder()
    .AddMeter(MyMeter.Name)
    .AddPrometheusHttpListener(
        options => options.UriPrefixes = new string[] { "http://localhost:9464/" })
    .Build();
Prometheus の設定(スクレイプ)

Prometheus エクスポーター(プル/スクレイプアプローチ)を使用する場合、アプリケーションをスクレイプするように Prometheus を設定する必要があります。 prometheus.yml に以下を追加してください。

scrape_configs:
  - job_name: 'your-app-name'
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:5000'] # アプリケーションの host:port

Prometheus エクスポーターの設定の詳細については、OpenTelemetry.Exporter.Prometheus.AspNetCore を参照してください。

Zipkin

バックエンドのセットアップ

以下のコマンドを実行して、ZipkinをDockerコンテナで実行できます。

docker run --rm -d -p 9411:9411 --name zipkin openzipkin/zipkin

依存関係

トレースデータを Zipkin に送信するには、プロジェクトの依存関係としてエクスポーターパッケージをインストールします。

dotnet add package OpenTelemetry.Exporter.Zipkin

ASP.NET Core を使用している場合は、OpenTelemetry.Extensions.Hosting パッケージもインストールしてください。

dotnet add package OpenTelemetry.Extensions.Hosting

使い方

ASP.NET Core

ASP.NET Core サービスでエクスポーターを設定します。

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddOpenTelemetry()
    .WithTracing(tracing => tracing
        // その他のセットアップコードはここに記述します
        .AddZipkinExporter(options =>
        {
            options.Endpoint = new Uri("your-zipkin-uri-here");
        }));

非 ASP.NET Core

トレーサープロバイダーを作成する際にエクスポーターを設定します。

var tracerProvider = Sdk.CreateTracerProviderBuilder()
    // その他のセットアップコードはここに記述します
    .AddZipkinExporter(options =>
    {
        options.Endpoint = new Uri("your-zipkin-uri-here");
    })
    .Build();