# Експортери

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

---


Надсилайте телеметрію до [OpenTelemetry Collector](/docs/collector/), щоб переконатися, що вона експортується правильно. Використання 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/}}


## Експорт до OpenTelemetry Collector {#exporting-to-the-opentelemetry-collector}

[Collector](/docs/collector/) надає незалежний від постачальника спосіб отримання, обробки та експорту телеметричних даних. Пакунок [opentelemetry_exporter](https://hex.pm/packages/opentelemetry_exporter) підтримує експорт як через HTTP (стандартно), так і через gRPC до колектора, який потім може експортувати Відрізки до самостійно розміщених сервісів, таких як Zipkin або Jaeger, а також до комерційних сервісів. Для повного списку доступних експортерів, дивіться [реєстр](/ecosystem/registry/?component=exporter).

## Налаштування Collector {#setting-up-the-collector}

Для тестування ви можете почати з наступної конфігурації Collector в корені вашого проєкту:

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

# Конфігурація OpenTelemetry Collector, яка отримує OTLP і експортує до 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]
```

Для більш детального прикладу ви можете переглянути [конфігурацію](https://github.com/open-telemetry/opentelemetry-erlang/blob/main/config/otel-collector-config.yaml) яку `opentelemetry-erlang` використовує для тестування.

Для цілей цього підручника ми запустимо Collector як образ docker поряд з нашим застосунком. Для цього підручника ми продовжимо з прикладом Dice Roll з розділу [Початок роботи](/docs/languages/erlang/getting-started)

Додайте цей файл 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/all-in-one:latest
    ports:
      - '16686:16686'
```

Ця конфігурація використовується в [docker-compose.yml](https://github.com/open-telemetry/opentelemetry-erlang/blob/main/docker-compose.yml) для запуску Collector з приймачами для HTTP та gRPC, які потім експортують до Zipkin також запущений за допомогою [docker-compose](https://docs.docker.com/compose/).

Щоб експортувати до запущеного 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>


Потім його слід додати до конфігурації Release перед SDK Application, щоб забезпечити запуск залежностей експортера перед тим, як SDK спробує ініціалізувати та використовувати експортер.

Приклад конфігурації Release у `rebar.config` та для [завдання Release mix](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` Applications налаштована на експорт до Collector. Нижче наведені конфігурації показують стандартні значення, які використовуються, якщо жодні не встановлені, а саме протокол HTTP з точкою доступу `localhost` на порту `4318`. Зверніть увагу:

- Якщо використовується `grpc` для `otlp_protocol`, кінцеву точку слід змінити на `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"># otlp_endpoint: &#34;http://otel:4318&#34; якщо використовується файл docker compose</span>
</span></span></code></pre></div>
    </div>
</div>


Ви можете побачити свої трасування, запустивши `docker compose up` в одному терміналі, потім `mix phx.server` в іншому. Після надсилання кількох запитів через застосунок, перейдіть до `http://localhost:16686` і виберіть `roll_dice_app` зі списку Service, потім натисніть "Find Traces".

## Підводні камені {#gotchas}

Деякі середовища не дозволяють контейнерам виконуватися як root користувачі. Якщо ви працюєте в такому середовищі, ви можете додати `user: "1001"` як ключ/значення верхнього рівня до сервісу `otel` у файлі `docker-compose.yml`, який використовується в цьому підручнику.
