# エクスポーター

LLMS index: [llms.txt](/llms.txt)

---

[OpenTelemetryコレクター](/docs/collector/)にテレメトリーを送信し、正しくエクスポートされることを確認してください。
本番環境でコレクターを使用することはベストプラクティスです。
テレメトリーを可視化するために、[Jaeger](https://jaegertracing.io/)、[Zipkin](https://zipkin.io/)、
[Prometheus](https://prometheus.io/)、または[ベンダー固有](/ecosystem/vendors/)のようなバックエンドにエクスポートしてください。



## 使用可能なエクスポーター {#available-exporters}

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





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

[Jaeger]: /blog/2022/jaeger-native-otlp/
[OTLP]: /docs/specs/otlp/
[Prometheus]: https://prometheus.io/docs/prometheus/2.55/feature_flags/#otlp-receiver
[reg]: </ecosystem/registry/?component=exporter&language=dotnet>
[vendors]: /ecosystem/vendors/



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





> [!NOTE]
>
> [ゼロコード計装](</docs/zero-code/dotnet>)を使用している場合は、[設定ガイド](</docs/zero-code/dotnet/configuration/>)に従ってエクスポーターの設定方法を学ぶことができます。





## OTLP {#otlp}

### コレクターのセットアップ {#collector-setup}

> [!NOTE]
>
> OTLPコレクターまたはバックエンドがすでにセットアップされている場合は、このセクションをスキップして、アプリケーション用の[OTLPエクスポーター依存関係のセットアップ](#otlp-dependencies)に進むことができます。

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

```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 コンテナでコレクターを実行します。

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

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




## 依存関係 {#otlp-dependencies}

テレメトリーデータを OTLP エンドポイント（[OpenTelemetry Collector](#collector-setup)、[Jaeger](#jaeger)、[Prometheus](#prometheus) など）に送信したい場合、データの転送に使用するプロトコルを2つから選べます。

- HTTP/protobuf
- gRPC

まず、プロジェクトの依存関係として [`OpenTelemetry.Exporter.OpenTelemetryProtocol`](https://www.nuget.org/packages/OpenTelemetry.Exporter.OpenTelemetryProtocol/) パッケージをインストールします。

```sh
dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
```

ASP.NET Core を使用している場合は、[`OpenTelemetry.Extensions.Hosting`](https://www.nuget.org/packages/OpenTelemetry.Extensions.Hosting) パッケージもインストールしてください。

```sh
dotnet add package OpenTelemetry.Extensions.Hosting
```

## 使い方 {#usage}

### ASP.NET Core {#aspnet-core}

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

```csharp
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 フォーマットを使用するようにカスタマイズするには、次のようにオプションを追加します。

```csharp
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 {#non-aspnet-core}

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

```csharp
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 などの値を設定するために環境変数を使用してください。

## コンソール {#console}

## 依存関係 {#dependencies}

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

```sh
dotnet add package OpenTelemetry.Exporter.Console
```

ASP.NET Core を使用している場合は、[`OpenTelemetry.Extensions.Hosting`](https://www.nuget.org/packages/OpenTelemetry.Extensions.Hosting) パッケージもインストールしてください。

```sh
dotnet add package OpenTelemetry.Extensions.Hosting
```

## 使い方 {#console-usage}

### ASP.NET Core {#console-usage-asp-net-core}

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

```csharp
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 {#console-usage-non-asp-net-core}

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

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

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

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


## Jaeger {#jaeger}

### バックエンドのセットアップ {#jaeger-backend-setup}

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

```shell
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
```

### 使用方法 {#jaeger-usage}

[OTLPエクスポーター](#otlp-dependencies)をセットアップするための手順に従ってください。



## Prometheus {#prometheus}

メトリクスデータを [Prometheus](https://prometheus.io/) に送信するには、以下のいずれかの方法を使用できます。

- [Prometheus の OTLP レシーバーを有効にして](https://prometheus.io/docs/guides/opentelemetry/#enable-the-otlp-receiver) [OTLP エクスポーター](#otlp)を使用する（ベストプラクティス）
- Prometheus エクスポーターを使用する。Prometheus エクスポーターは、メトリクスを収集しリクエストに応じて Prometheus テキスト形式にシリアライズする HTTP サーバーを起動する `MetricReader` です。

### バックエンドのセットアップ {#prometheus-setup}

Prometheus サーバーバックエンドを実行してメトリクスのスクレイピングを開始するには、[Prometheus 入門ガイド](https://prometheus.io/docs/prometheus/latest/getting_started/)を参照してください。

OTLP レシーバーを有効にするには、[OTLP レシーバーの有効化に関する Prometheus ガイド](https://prometheus.io/docs/guides/opentelemetry/#enable-the-otlp-receiver)を参照してください。


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

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

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

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

#### OTLP エクスポーターの使用（プッシュ） {#prometheus-otlp}

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

##### 依存関係 {#prometheus-otlp-dependencies}

プロジェクトの依存関係として [`OpenTelemetry.Exporter.OpenTelemetryProtocol`](https://www.nuget.org/packages/OpenTelemetry.Exporter.OpenTelemetryProtocol/) パッケージをインストールします。

```sh
dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
```

ASP.NET Core を使用している場合は、[`OpenTelemetry.Extensions.Hosting`](https://www.nuget.org/packages/OpenTelemetry.Extensions.Hosting) パッケージもインストールしてください。

```sh
dotnet add package OpenTelemetry.Extensions.Hosting
```

##### 使い方 {#prometheus-otlp-usage}

###### ASP.NET Core {#prometheus-otlp-asp-net-core-usage}

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

```csharp
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 {#prometheus-otlp-non-asp-net-core-usage}

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

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

> [!NOTE]
>
> OTLP レシーバーを有効にして Prometheus を起動してください。
>
> ```sh
> ./prometheus --web.enable-otlp-receiver
> ```
>
> Docker を使用する場合は次のようにします。
>
> ```sh
> docker run -p 9090:9090 prom/prometheus --web.enable-otlp-receiver
> ```

#### Prometheus エクスポーターの使用（プル/スクレイプ） {#prometheus-exporter}

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

> [!WARNING]
>
> このエクスポーターはまだ開発中で、エグゼンプラーをサポートしていません。
> 本番環境では、代わりに [OTLP エクスポーターのアプローチ](#prometheus-otlp)の使用を検討してください。

##### 依存関係 {#prometheus-dependencies}

プロジェクトの依存関係として[エクスポーターパッケージ](https://www.nuget.org/packages/OpenTelemetry.Exporter.Prometheus.AspNetCore)をインストールします。

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

ASP.NET Core を使用している場合は、[`OpenTelemetry.Extensions.Hosting`](https://www.nuget.org/packages/OpenTelemetry.Extensions.Hosting) パッケージもインストールしてください。

```sh
dotnet add package OpenTelemetry.Extensions.Hosting
```

##### 使い方 {#prometheus-exporter-usage}

###### ASP.NET Core {#prometheus-exporter-asp-net-core-usage}

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

```csharp
var builder = WebApplication.CreateBuilder(args);

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

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

```csharp
var builder = WebApplication.CreateBuilder(args);

// ... セットアップ

var app = builder.Build();

app.UseOpenTelemetryPrometheusScrapingEndpoint();

await app.RunAsync();
```

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

```csharp
app.UseOpenTelemetryPrometheusScrapingEndpoint(
    context => context.Request.Path == "/internal/metrics"
        && context.Connection.LocalPort == 5067);
```

###### 非 ASP.NET Core {#prometheus-exporter-non-asp-net-core-usage}

> [!WARNING]
>
> このコンポーネントは開発時の内部ループ用であり、本番環境対応にする予定はありません。
> 本番環境では、[`OpenTelemetry.Exporter.Prometheus.AspNetCore`](#prometheus-exporter-asp-net-core-usage) を使用するか、[`OpenTelemetry.Exporter.OpenTelemetryProtocol`](#aspnet-core) と [OpenTelemetry Collector](/docs/collector) を組み合わせて使用してください。

ASP.NET Core を使用しないアプリケーションでは、別の[パッケージ](https://www.nuget.org/packages/OpenTelemetry.Exporter.Prometheus.HttpListener)で提供されている `HttpListener` バージョンを使用できます。

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

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

```csharp
var meterProvider = Sdk.CreateMeterProviderBuilder()
    .AddMeter(MyMeter.Name)
    .AddPrometheusHttpListener(
        options => options.UriPrefixes = new string[] { "http://localhost:9464/" })
    .Build();
```

##### Prometheus の設定（スクレイプ） {#prometheus-configuration-scrape}

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

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

Prometheus エクスポーターの設定の詳細については、[OpenTelemetry.Exporter.Prometheus.AspNetCore](https://github.com/open-telemetry/opentelemetry-dotnet/blob/main/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/README.md) を参照してください。


## Zipkin {#zipkin}

### バックエンドのセットアップ {#zipkin-setup}

> [!NOTE]
>
> すでにZipkinまたはZipkin互換のバックエンドをセットアップしている場合は、このセクションをスキップして、アプリケーション用の[Zipkinエクスポーターの依存関係](#zipkin-dependencies)をセットアップしてください。

以下のコマンドを実行して、[Zipkin](https://zipkin.io/)をDockerコンテナで実行できます。

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


## 依存関係 {#zipkin-dependencies}

トレースデータを [Zipkin](https://zipkin.io/) に送信するには、プロジェクトの依存関係として[エクスポーターパッケージ](https://www.nuget.org/packages/OpenTelemetry.Exporter.Zipkin)をインストールします。

```shell
dotnet add package OpenTelemetry.Exporter.Zipkin
```

ASP.NET Core を使用している場合は、[`OpenTelemetry.Extensions.Hosting`](https://www.nuget.org/packages/OpenTelemetry.Extensions.Hosting) パッケージもインストールしてください。

```sh
dotnet add package OpenTelemetry.Extensions.Hosting
```

## 使い方 {#zipkin-usage}

### ASP.NET Core {#zipkin-asp-net-core-usage}

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

```csharp
var builder = WebApplication.CreateBuilder(args);

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

### 非 ASP.NET Core {#zipkin-non-asp-net-core-usage}

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

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