# Семплінг

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

---

<!-- markdownlint-disable no-duplicate-heading -->

[Семплінг](/docs/concepts/sampling/) — це процес, який обмежує кількість трейсів, що генеруються системою. SDK Erlang пропонує кілька [головних семплерів](/docs/concepts/sampling#head-sampling).

## Стандартна поведінка {#default-behavior}

Стандартно всі відрізки семплюються, і таким чином, 100% трейсів семплюються. Якщо вам не потрібно керувати обсягом даних, вам не потрібно налаштовувати семплер.

## ParentBasedSampler

При семплінгу найчастіше використовується `ParentBasedSampler` для [головного семплінгу](/docs/concepts/sampling/#head-sampling). Він використовує рішення про семплінг від батьківського відрізка або факт відсутності батька, щоб знати, який вторинний семплер використовувати.

Семплер можна налаштувати за допомогою змінних середовища `OTEL_TRACES_SAMPLER` та `OTEL_TRACES_SAMPLER_ARG` або за допомогою конфігурації застосунку, що дозволяє налаштувати кожен з 5 потенційних станів батьківського відрізка:

- `root` - Немає батька
- `remote_parent_sampled` - Батько з віддаленого відрізка, який семплюється
- `remote_parent_not_sampled` - Батько з віддаленого відрізка, який не семплюється
- `local_parent_sampled` - Батько з локального відрізка, який семплюється
- `local_parent_not_sampled` - Батько з локального відрізка, який не семплюється

### TraceIdRatioBasedSampler

У межах `ParentBasedSampler` найпоширенішим є `TraceIdRatioBasedSampler`. Він детерміновано семплює відсоток трейсів, який ви передаєте як параметр.

#### Змінні середовища {#environment-variables}

Ви можете налаштувати `TraceIdRatioBasedSampler` за допомогою змінних середовища:

```shell
export OTEL_TRACES_SAMPLER="parentbased_traceidratio"
export OTEL_TRACES_SAMPLER_ARG="0.1"
```

Це вказує SDK семплювати відрізки так, щоб лише 10% трас створювалися.

#### Конфігурація застосунків {#application-configuration}

Приклад у конфігурації застосунку з кореневим семплером для семплінгу 10% трейсів і використанням рішення батька в інших випадках:

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

<div class="tab-content" id="tabs-0-content">
    <div class="tab-body tab-pane fade show active"
        id="tabs-00-00" role="tabpanel" aria-labelled-by="tabs-00-00-tab" tabindex="0">
        <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 class="n">opentelemetry</span><span class="p">,</span> <span class="p">{</span><span class="n">sampler</span><span class="p">,</span> <span class="p">{</span><span class="n">parent_based</span><span class="p">,</span> <span class="p">#{</span><span class="n">root</span> <span class="o">=&gt;</span> <span class="p">{</span><span class="n">trace_id_ratio_based</span><span class="p">,</span> <span class="mi">0</span><span class="p">.</span><span class="mi">10</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">                                          <span class="n">remote_parent_sampled</span> <span class="o">=&gt;</span> <span class="n">always_on</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                          <span class="n">remote_parent_not_sampled</span> <span class="o">=&gt;</span> <span class="n">always_off</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                          <span class="n">local_parent_sampled</span> <span class="o">=&gt;</span> <span class="n">always_on</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                          <span class="n">local_parent_not_sampled</span> <span class="o">=&gt;</span> <span class="n">always_off</span><span class="p">}}}}</span>
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-00-01" role="tabpanel" aria-labelled-by="tabs-00-01-tab" tabindex="0">
        <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/runtime.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 class="ss">sampler</span><span class="p">:</span> <span class="p">{</span><span class="ss">:parent_based</span><span class="p">,</span> <span class="p">%{</span><span class="ss">root</span><span class="p">:</span> <span class="p">{</span><span class="ss">:trace_id_ratio_based</span><span class="p">,</span> <span class="mf">0.10</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">                                                  <span class="ss">remote_parent_sampled</span><span class="p">:</span> <span class="ss">:always_on</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                                  <span class="ss">remote_parent_not_sampled</span><span class="p">:</span> <span class="ss">:always_off</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                                  <span class="ss">local_parent_sampled</span><span class="p">:</span> <span class="ss">:always_on</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                                  <span class="ss">local_parent_not_sampled</span><span class="p">:</span> <span class="ss">:always_off</span><span class="p">}}</span>
</span></span></code></pre></div>
    </div>
</div>


### AlwaysOn і AlwaysOff Sampler {#alwayson-and-alwaysoff-sampler}

Інші два вбудовані семплери — це `AlwaysOnSampler` та `AlwaysOffSampler`.

#### Змінні середовища {#environment-variables}

Ви можете налаштувати `ParentBasedSampler` для використання або `AlwaysOnSampler`, або AlwaysOffSampler`за допомогою змінної середовища`OTEL_TRACES_SAMPLER`:

```shell
export OTEL_TRACES_SAMPLER="parentbased_always_on"
```

І для `AlwaysOffSampler`:

```shell
export OTEL_TRACES_SAMPLER="parentbased_always_off"
```

#### Конфігурація застосунку {#application-configuration}

Ось приклад у конфігурації застосунком з кореневим семплером, який завжди семплює, і використанням рішення батька в інших випадках:

   <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="c">%% config/sys.config.src
</span></span></span><span class="line"><span class="cl"><span class="p">{</span><span class="n">opentelemetry</span><span class="p">,</span> <span class="p">{</span><span class="n">sampler</span><span class="p">,</span> <span class="p">{</span><span class="n">parent_based</span><span class="p">,</span> <span class="p">#{</span><span class="n">root</span> <span class="o">=&gt;</span> <span class="n">always_on</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                          <span class="n">remote_parent_sampled</span> <span class="o">=&gt;</span> <span class="n">always_on</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                          <span class="n">remote_parent_not_sampled</span> <span class="o">=&gt;</span> <span class="n">always_off</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                          <span class="n">local_parent_sampled</span> <span class="o">=&gt;</span> <span class="n">always_on</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                          <span class="n">local_parent_not_sampled</span> <span class="o">=&gt;</span> <span class="n">always_off</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="c1"># config/runtime.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 class="ss">sampler</span><span class="p">:</span> <span class="p">{</span><span class="ss">:parent_based</span><span class="p">,</span> <span class="p">%{</span><span class="ss">root</span><span class="p">:</span> <span class="ss">:always_on</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                                  <span class="ss">remote_parent_sampled</span><span class="p">:</span> <span class="ss">:always_on</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                                  <span class="ss">remote_parent_not_sampled</span><span class="p">:</span> <span class="ss">:always_off</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                                  <span class="ss">local_parent_sampled</span><span class="p">:</span> <span class="ss">:always_on</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                                  <span class="ss">local_parent_not_sampled</span><span class="p">:</span> <span class="ss">:always_off</span><span class="p">}}</span>
</span></span></code></pre></div>
    </div>
</div>


## Користувацький семплер {#custom-sampler}

Користувацькі семплери можна створити, реалізувавши [`otel_sampler` поведінку](https://hexdocs.pm/opentelemetry/1.3.0/otel_sampler.html#callbacks). Цей приклад семплера:

   <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="p">-</span><span class="ni">module</span><span class="p">(</span><span class="n">attribute_sampler</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="ni">behavior</span><span class="p">(</span><span class="n">otel_sampler</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="ni">export</span><span class="p">([</span><span class="n">description</span><span class="o">/</span><span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">         <span class="n">setup</span><span class="o">/</span><span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">         <span class="n">should_sample</span><span class="o">/</span><span class="mi">7</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="ni">include</span><span class="p">(</span><span class="s">&#34;otel_sampler.hrl&#34;</span><span class="p">).</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">setup</span><span class="p">(</span><span class="nv">Attributes</span><span class="p">)</span> <span class="k">when</span> <span class="n">is_map</span><span class="p">(</span><span class="nv">Attributes</span><span class="p">)</span> <span class="o">-&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nv">Attributes</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nf">setup</span><span class="p">(_)</span> <span class="o">-&gt;</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="nf">description</span><span class="p">(_)</span> <span class="o">-&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="o">&lt;&lt;</span><span class="s">&#34;AttributeSampler&#34;</span><span class="o">&gt;&gt;</span><span class="p">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nf">should_sample</span><span class="p">(_</span><span class="nv">Ctx</span><span class="p">,</span> <span class="p">_</span><span class="nv">TraceId</span><span class="p">,</span> <span class="p">_</span><span class="nv">Links</span><span class="p">,</span> <span class="p">_</span><span class="nv">SpanName</span><span class="p">,</span> <span class="p">_</span><span class="nv">SpanKind</span><span class="p">,</span> <span class="nv">Attributes</span><span class="p">,</span> <span class="nv">ConfigAttributes</span><span class="p">)</span> <span class="o">-&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nv">AttributesSet</span> <span class="o">=</span> <span class="nn">sets</span><span class="p">:</span><span class="nf">from_list</span><span class="p">(</span><span class="nn">maps</span><span class="p">:</span><span class="nf">to_list</span><span class="p">(</span><span class="nv">Attributes</span><span class="p">)),</span>
</span></span><span class="line"><span class="cl">    <span class="nv">ConfigSet</span> <span class="o">=</span> <span class="nn">sets</span><span class="p">:</span><span class="nf">from_list</span><span class="p">(</span><span class="nn">maps</span><span class="p">:</span><span class="nf">to_list</span><span class="p">(</span><span class="nv">ConfigAttributes</span><span class="p">)),</span>
</span></span><span class="line"><span class="cl">    <span class="k">case</span> <span class="nn">sets</span><span class="p">:</span><span class="nf">is_disjoint</span><span class="p">(</span><span class="nv">AttributesSet</span><span class="p">,</span> <span class="nv">ConfigSet</span><span class="p">)</span> <span class="k">of</span>
</span></span><span class="line"><span class="cl">        <span class="n">true</span> <span class="o">-&gt;</span> <span class="p">{</span><span class="o">?</span><span class="nv">RECORD_AND_SAMPLE</span><span class="p">,</span> <span class="p">[],</span> <span class="p">[]};</span>
</span></span><span class="line"><span class="cl">        <span class="p">_</span> <span class="o">-&gt;</span> <span class="p">{</span><span class="o">?</span><span class="nv">DROP</span><span class="p">,</span> <span class="p">[],</span> <span class="p">[]}</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span><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="kd">defmodule</span> <span class="nc">AttributesSampler</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">  <span class="kd">def</span> <span class="n">setup</span><span class="p">(</span><span class="n">attributes</span><span class="p">)</span> <span class="ow">when</span> <span class="n">is_map</span><span class="p">(</span><span class="n">attributes</span><span class="p">)</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="n">attributes</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kd">def</span> <span class="n">setup</span><span class="p">(</span><span class="n">_</span><span class="p">)</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="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kd">def</span> <span class="n">description</span><span class="p">(</span><span class="n">_</span><span class="p">)</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;ExampleSampler&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kd">def</span> <span class="n">should_sample</span><span class="p">(</span><span class="n">_ctx</span><span class="p">,</span> <span class="n">_trace_id</span><span class="p">,</span> <span class="n">_links</span><span class="p">,</span> <span class="n">_span_name</span><span class="p">,</span> <span class="n">_span_kind</span><span class="p">,</span> <span class="n">attributes</span><span class="p">,</span> <span class="n">config_attributes</span><span class="p">)</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="n">no_match</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">      <span class="nc">Enum</span><span class="o">.</span><span class="n">into</span><span class="p">(</span><span class="n">attributes</span><span class="p">,</span> <span class="p">%</span><span class="nc">MapSet</span><span class="p">{})</span>
</span></span><span class="line"><span class="cl">      <span class="o">|&gt;</span> <span class="nc">MapSet</span><span class="o">.</span><span class="n">disjoint?</span><span class="p">(</span><span class="nc">Enum</span><span class="o">.</span><span class="n">into</span><span class="p">(</span><span class="n">config_attributes</span><span class="p">,</span> <span class="p">%</span><span class="nc">MapSet</span><span class="p">{}))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">no_match</span><span class="p">,</span> <span class="ss">do</span><span class="p">:</span> <span class="p">{</span><span class="ss">:record_and_sample</span><span class="p">,</span> <span class="p">[],</span> <span class="p">[]},</span> <span class="ss">else</span><span class="p">:</span> <span class="p">{</span><span class="ss">:drop</span><span class="p">,</span> <span class="p">[],</span> <span class="p">[]}</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span>
</span></span></code></pre></div>
    </div>
</div>


Семплюватиме відрізки, які не мають жодних атрибутів, що збігаються з атрибутами, переданими як конфігурація семплера.

Приклад конфігурації, щоб не семплювати жоден відрізок з атрибутом, що вказує на запитаний URL `/healthcheck`:

   <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="p">{</span><span class="n">opentelemetry</span><span class="p">,</span> <span class="p">{</span><span class="n">sampler</span><span class="p">,</span> <span class="p">{</span><span class="n">attributes_sampler</span><span class="p">,</span> <span class="p">#{</span><span class="n">&#39;http.target&#39;</span> <span class="o">=&gt;</span> <span class="o">&lt;&lt;</span><span class="s">&#34;/healthcheck&#34;</span><span class="o">&gt;&gt;</span><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="n">config</span> <span class="ss">:opentelemetry</span><span class="p">,</span> <span class="ss">sampler</span><span class="p">:</span> <span class="p">{</span><span class="nc">AttributesSampler</span><span class="p">,</span> <span class="p">%{</span><span class="s2">&#34;http.target&#34;</span><span class="p">:</span> <span class="s2">&#34;/healthcheck&#34;</span><span class="p">}}</span>
</span></span></code></pre></div>
    </div>
</div>
