エクスポーター
OpenTelemetryコレクターにテレメトリーを送信し、正しくエクスポートされることを確認してください。 本番環境でコレクターを使用することはベストプラクティスです。 テレメトリーを可視化するために、Jaeger、Zipkin、 Prometheus、またはベンダー固有のようなバックエンドにエクスポートしてください。
使用可能なエクスポーター
レジストリには、.NET 用のエクスポーターのリストが含まれています。
エクスポーターの中でも、OpenTelemetry Protocol (OTLP)エクスポーターは、OpenTelemetryのデータモデルを考慮して設計されており、OTelデータを情報の損失なく出力します。 さらに、多くのテレメトリーデータを扱うツールがOTLPに対応しており(たとえば、Prometheus、Jaegerやほとんどのベンダー)、必要なときに高い柔軟性を提供します。 OTLPについて詳細に学習したい場合は、OTLP仕様を参照してください。
このページでは、主要なOpenTelemetry .NET エクスポーターとその設定方法について説明します。
OTLP
コレクターのセットアップ
OTLPコレクターまたはバックエンドがすでにセットアップされている場合は、このセクションをスキップして、アプリケーション用の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 Collector、Jaeger、Prometheus など)に送信したい場合、データの転送に使用するプロトコルを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
TracerProvider、MeterProvider、または 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
TracerProvider、MeterProvider、または 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 の OTLP レシーバーを有効にして OTLP エクスポーターを使用する(ベストプラクティス)
- Prometheus エクスポーターを使用する。Prometheus エクスポーターは、メトリクスを収集しリクエストに応じて Prometheus テキスト形式にシリアライズする HTTP サーバーを起動する
MetricReaderです。
バックエンドのセットアップ
Prometheus サーバーバックエンドを実行してメトリクスのスクレイピングを開始するには、Prometheus 入門ガイドを参照してください。
OTLP レシーバーを有効にするには、OTLP レシーバーの有効化に関する Prometheus ガイドを参照してください。
以下のセクションでは、Prometheus エクスポーターの .NET 固有の設定手順を詳しく説明します。
メトリクスを Prometheus にエクスポートするには2つのアプローチがあります。
OTLP エクスポーターの使用(プッシュ): OTLP プロトコルを使用してメトリクスを Prometheus にプッシュします。 これには Prometheus の OTLP レシーバーを有効にする必要があります。 このアプローチはエグゼンプラーをサポートし、安定しているため、本番環境に推奨されます。
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();
OTLP レシーバーを有効にして Prometheus を起動してください。
./prometheus --web.enable-otlp-receiver
Docker を使用する場合は次のようにします。
docker run -p 9090:9090 prom/prometheus --web.enable-otlp-receiver
Prometheus エクスポーターの使用(プル/スクレイプ)
このアプローチは、アプリケーション内にメトリクスエンドポイント(例: /metrics)を公開し、Prometheus が定期的にスクレイプします。
このエクスポーターはまだ開発中で、エグゼンプラーをサポートしていません。 本番環境では、代わりに OTLP エクスポーターのアプローチの使用を検討してください。
依存関係
プロジェクトの依存関係としてエクスポーターパッケージをインストールします。
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 スクレイピングミドルウェアを登録する必要があります。
IApplicationBuilder の UseOpenTelemetryPrometheusScrapingEndpoint 拡張メソッドを使用します。
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
このコンポーネントは開発時の内部ループ用であり、本番環境対応にする予定はありません。
本番環境では、OpenTelemetry.Exporter.Prometheus.AspNetCore を使用するか、OpenTelemetry.Exporter.OpenTelemetryProtocol と OpenTelemetry Collector を組み合わせて使用してください。
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またはZipkin互換のバックエンドをセットアップしている場合は、このセクションをスキップして、アプリケーション用の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();
フィードバック
このページは役に立ちましたか?
Thank you. Your feedback is appreciated!
Please let us know how we can improve this page. Your feedback is appreciated!