# Exporters

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}

レジストリには、[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 エクスポーターとその設定方法について説明します。






{{__hugo_ctx/}}


## Exporting to the OpenTelemetry Collector

The [Collector](/docs/collector/) provides a vendor agnostic way to receive,
process and export telemetry data. The package
[opentelemetry_exporter](https://hex.pm/packages/opentelemetry_exporter)
provides support for both exporting over both HTTP (the default) and gRPC to the
collector, which can then export Spans to a self-hosted service like Zipkin or
Jaeger, as well as commercial services. For a full list of available exporters,
see the [registry](/ecosystem/registry/?component=exporter).

## Setting up the Collector

For testing purposes, you can start with the following Collector configuration
at the root of your project:

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

# OpenTelemetry Collector config that receives OTLP and exports to Jager
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]
```

For a more detailed example, you can view the
[config](https://github.com/open-telemetry/opentelemetry-erlang/blob/main/config/otel-collector-config.yaml)
that `opentelemetry-erlang` uses for testing.

For the purposes of this tutorial, we'll start the Collector as a docker image
along side our app. For this tutorial, we'll continue along with the Dice Roll
example from the [Getting Started](/docs/languages/erlang/getting-started) guide

Add this docker-compose file to the root of your app:

```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/all-in-one:latest
    ports:
      - '16686:16686'
```

This configuration is used in
[docker-compose.yml](https://github.com/open-telemetry/opentelemetry-erlang/blob/main/docker-compose.yml)
to start the Collector with receivers for both HTTP and gRPC that then export to
Zipkin also run by [docker-compose](https://docs.docker.com/compose/).

To export to the running Collector the `opentelemetry_exporter` package must be
added to the project's dependencies before other `opentelemetry` dependencies:

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


It should then be added to the configuration of the Release before the SDK
Application to ensure the exporter's dependencies are started before the SDK
attempts to initialize and use the exporter.

Example of Release configuration in `rebar.config` and for
[mix's Release task](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>


Finally, the runtime configuration of the `opentelemetry` and
`opentelemetry_exporter` Applications are set to export to the Collector. The
configurations below show the defaults that are used if none are set, which are
the HTTP protocol with endpoint of `localhost` on port `4318`. Note:

- If using `grpc` for the `otlp_protocol` the endpoint should be changed to
  `http://localhost:4317`.
- If you're using the docker compose file from above, you should replace
  `localhost` with `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"># otlp_endpoint: &#34;http://otel:4318&#34; if using docker compose file</span>
</span></span></code></pre></div>
    </div>
</div>


You can see your traces by running `docker compose up` in one terminal, then
`mix phx.server` in another. After sending some requests through the app, go to
`http://localhost:16686` and select `roll_dice_app` from the Service drop down,
then click "Find Traces".

## Gotchas

Some environments do not allow containers to execute as root users. If you work
in an environment like this, you can add `user: "1001"` as a top-level key/value
to the `otel` service in the `docker-compose.yml` file used in this tutorial.
