# エクスポーター

Site [llms.txt](/ja/llms.txt)

---

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



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

レジストリには、[Erlang/Elixir 用のエクスポーターのリスト][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=erlang>
[vendors]: /ecosystem/vendors/



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








## OpenTelemetry Collector へのエクスポート {#exporting-to-the-opentelemetry-collector}

[Collector](/docs/collector/) はテレメトリーデータを受信、処理、エクスポートするためのベンダー非依存の手段を提供します。
[opentelemetry_exporter](https://hex.pm/packages/opentelemetry_exporter) パッケージは、HTTP（デフォルト）と gRPC の両方を使用した Collector へのエクスポートをサポートしています。
Collector はスパンを Zipkin や Jaeger などのセルフホストサービスや、商用サービスにエクスポートできます。
利用可能なエクスポーターの一覧は、[レジストリ](/ecosystem/registry/?component=exporter)を参照してください。

## Collector のセットアップ {#setting-up-the-collector}

テスト目的であれば、以下の Collector 設定をプロジェクトのルートに配置して利用できます。

```yaml
# otel-collector-config.yaml

# OTLP を受信して Jaeger にエクスポートする OpenTelemetry Collector の設定
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: '0.0.0.0:4317'
      http:
        endpoint: '0.0.0.0:4318'
exporters:
  debug:
  otlp/jaeger:
    endpoint: jaeger-all-in-one:4317
    tls:
      insecure: true
    sending_queue:
      batch:
service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [debug, otlp/jaeger]
```

より詳細な例として、`opentelemetry-erlang` がテストに使用している[設定ファイル](https://github.com/open-telemetry/opentelemetry-erlang/blob/main/config/otel-collector-config.yaml)を確認できます。

このチュートリアルでは、アプリと並行して Collector を Docker イメージとして起動します。
このチュートリアルでは、[はじめに](/docs/languages/erlang/getting-started)ガイドの Dice Roll のサンプルを引き続き使用します。

以下の docker-compose ファイルをアプリのルートに追加してください。

```yaml
# docker-compose.yml
version: '3'
services:
  otel:
    image: otel/opentelemetry-collector-contrib:0.98.0
    command: ['--config=/conf/otel-collector-config.yaml']
    ports:
      - 4317:4317
      - 4318:4318
    volumes:
      - ./otel-collector-config.yaml:/conf/otel-collector-config.yaml
    links:
      - jaeger-all-in-one

  jaeger-all-in-one:
    image: jaegertracing/jaeger:latest
    ports:
      - '16686:16686'
```

この設定は、[docker-compose.yml](https://github.com/open-telemetry/opentelemetry-erlang/blob/main/docker-compose.yml) で HTTP と gRPC の両方のレシーバーを持つ Collector を起動し、[docker-compose](https://docs.docker.com/compose/) で同時に実行される Zipkin にエクスポートするために使用されます。

実行中の Collector にエクスポートするには、`opentelemetry_exporter` パッケージを他の `opentelemetry` 依存関係よりも前にプロジェクトの依存関係に追加する必要があります。

   <ul class="nav nav-tabs" id="tabs-1" role="tablist">
  <li class="nav-item">
      <button class="nav-link active"
          id="tabs-01-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-01-00" role="tab"
          data-td-tp-persist="erlang" aria-controls="tabs-01-00" aria-selected="true">
        Erlang
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-01-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-01-01" role="tab"
          data-td-tp-persist="elixir" aria-controls="tabs-01-01" aria-selected="false">
        Elixir
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-1-content">
    <div class="tab-body tab-pane fade show active"
        id="tabs-01-00" role="tabpanel" aria-labelled-by="tabs-01-00-tab" tabindex="1">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-erlang" data-lang="erlang"><span class="line"><span class="cl"><span class="p">{</span><span class="n">deps</span><span class="p">,</span> <span class="p">[{</span><span class="n">opentelemetry_exporter</span><span class="p">,</span> <span class="s">&#34;~&gt; 1.8&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="n">opentelemetry_api</span><span class="p">,</span> <span class="s">&#34;~&gt; 1.4&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="n">opentelemetry</span><span class="p">,</span> <span class="s">&#34;~&gt; 1.5&#34;</span><span class="p">}]}.</span>
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-01-01" role="tabpanel" aria-labelled-by="tabs-01-01-tab" tabindex="1">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-elixir" data-lang="elixir"><span class="line"><span class="cl"><span class="kd">def</span> <span class="n">deps</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">  <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="ss">:opentelemetry_exporter</span><span class="p">,</span> <span class="s2">&#34;~&gt; 1.8&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="ss">:opentelemetry_api</span><span class="p">,</span> <span class="s2">&#34;~&gt; 1.4&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="ss">:opentelemetry</span><span class="p">,</span> <span class="s2">&#34;~&gt; 1.5&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span>
</span></span></code></pre></div>
    </div>
</div>


次に、SDK アプリケーションの設定より前に Release の設定に追加し、SDK がエクスポーターを初期化して使用する前にエクスポーターの依存関係が起動されるようにします。

`rebar.config` での Release 設定と [mix の Release タスク](https://hexdocs.pm/mix/Mix.Tasks.Release.html)の例を示します。

   <ul class="nav nav-tabs" id="tabs-2" role="tablist">
  <li class="nav-item">
      <button class="nav-link active"
          id="tabs-02-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-00" role="tab"
          data-td-tp-persist="erlang" aria-controls="tabs-02-00" aria-selected="true">
        Erlang
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-02-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-01" role="tab"
          data-td-tp-persist="elixir" aria-controls="tabs-02-01" aria-selected="false">
        Elixir
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-2-content">
    <div class="tab-body tab-pane fade show active"
        id="tabs-02-00" role="tabpanel" aria-labelled-by="tabs-02-00-tab" tabindex="2">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-erlang" data-lang="erlang"><span class="line"><span class="cl"><span class="c">%% rebar.config
</span></span></span><span class="line"><span class="cl"><span class="p">{</span><span class="n">relx</span><span class="p">,</span> <span class="p">[{</span><span class="n">release</span><span class="p">,</span> <span class="p">{</span><span class="n">my_instrumented_release</span><span class="p">,</span> <span class="s">&#34;0.1.0&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">         <span class="p">[</span><span class="n">opentelemetry_exporter</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	      <span class="p">{</span><span class="n">opentelemetry</span><span class="p">,</span> <span class="n">temporary</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">          <span class="n">my_instrumented_app</span><span class="p">]},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">       <span class="p">...]}.</span>
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-02-01" role="tabpanel" aria-labelled-by="tabs-02-01-tab" tabindex="2">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-elixir" data-lang="elixir"><span class="line"><span class="cl"><span class="c1"># mix.exs</span>
</span></span><span class="line"><span class="cl"><span class="kd">def</span> <span class="n">project</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">  <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="ss">releases</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">      <span class="ss">my_instrumented_release</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="ss">applications</span><span class="p">:</span> <span class="p">[</span><span class="ss">opentelemetry_exporter</span><span class="p">:</span> <span class="ss">:permanent</span><span class="p">,</span> <span class="ss">opentelemetry</span><span class="p">:</span> <span class="ss">:temporary</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">      <span class="p">],</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="n">...</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span>
</span></span></code></pre></div>
    </div>
</div>


最後に、`opentelemetry` と `opentelemetry_exporter` アプリケーションのランタイム設定を Collector にエクスポートするように設定します。
以下の設定は、何も設定されていない場合に使用されるデフォルト値を示しています。
デフォルトは HTTP プロトコルで、エンドポイントは `localhost` のポート `4318` です。
注意点:

- `otlp_protocol` に `grpc` を使用する場合、エンドポイントを `http://localhost:4317` に変更する必要があります。
- 上記の docker compose ファイルを使用している場合、`localhost` を `otel` に置き換える必要があります。

   <ul class="nav nav-tabs" id="tabs-3" role="tablist">
  <li class="nav-item">
      <button class="nav-link active"
          id="tabs-03-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-03-00" role="tab"
          data-td-tp-persist="erlang" aria-controls="tabs-03-00" aria-selected="true">
        Erlang
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-03-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-03-01" role="tab"
          data-td-tp-persist="elixir" aria-controls="tabs-03-01" aria-selected="false">
        Elixir
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-3-content">
    <div class="tab-body tab-pane fade show active"
        id="tabs-03-00" role="tabpanel" aria-labelled-by="tabs-03-00-tab" tabindex="3">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-erlang" data-lang="erlang"><span class="line"><span class="cl"><span class="c">%% config/sys.config.src
</span></span></span><span class="line"><span class="cl"><span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="n">opentelemetry</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="p">[{</span><span class="n">span_processor</span><span class="p">,</span> <span class="n">batch</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">   <span class="p">{</span><span class="n">traces_exporter</span><span class="p">,</span> <span class="n">otlp</span><span class="p">}]},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="n">opentelemetry_exporter</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="p">[{</span><span class="n">otlp_protocol</span><span class="p">,</span> <span class="n">http_protobuf</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">   <span class="p">{</span><span class="n">otlp_endpoint</span><span class="p">,</span> <span class="s">&#34;http://localhost:4318&#34;</span><span class="p">}]}]}</span>
</span></span><span class="line"><span class="cl"><span class="p">].</span>
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-03-01" role="tabpanel" aria-labelled-by="tabs-03-01-tab" tabindex="3">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-elixir" data-lang="elixir"><span class="line"><span class="cl"><span class="c1"># config/config.exs</span>
</span></span><span class="line"><span class="cl"><span class="n">config</span> <span class="ss">:opentelemetry</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="ss">resource</span><span class="p">:</span> <span class="p">%{</span><span class="ss">service</span><span class="p">:</span> <span class="p">%{</span><span class="ss">name</span><span class="p">:</span> <span class="s2">&#34;roll_dice_app&#34;</span><span class="p">}},</span>
</span></span><span class="line"><span class="cl">  <span class="ss">span_processor</span><span class="p">:</span> <span class="ss">:batch</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="ss">traces_exporter</span><span class="p">:</span> <span class="ss">:otlp</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">config</span> <span class="ss">:opentelemetry_exporter</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="ss">otlp_protocol</span><span class="p">:</span> <span class="ss">:http_protobuf</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="ss">otlp_endpoint</span><span class="p">:</span> <span class="s2">&#34;http://localhost:4318&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="c1"># docker compose ファイルを使用している場合は otlp_endpoint: &#34;http://otel:4318&#34;</span>
</span></span></code></pre></div>
    </div>
</div>


一方のターミナルで `docker compose up` を実行し、別のターミナルで `mix phx.server` を実行すると、トレースを確認できます。
アプリにいくつかリクエストを送信した後、`http://localhost:16686` にアクセスし、Service ドロップダウンから `roll_dice_app` を選択して、「Find Traces」をクリックしてください。

## 注意点 {#gotchas}

一部の環境では、コンテナを root ユーザーとして実行できません。
そのような環境で作業する場合、このチュートリアルで使用する `docker-compose.yml` ファイルの `otel` サービスにトップレベルのキーバリューとして `user: "1001"` を追加できます。
