# サンプリング

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

---

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

[サンプリング](/docs/concepts/sampling/)は、システムによって生成されるトレースの量を制限するプロセスです。
Erlang SDK はいくつかの[ヘッドサンプラー](/docs/concepts/sampling#head-sampling)を提供しています。

## デフォルトの動作 {#default-behavior}

デフォルトでは、すべてのスパンがサンプリングされ、トレースの 100% がサンプリングされます。
データ量を管理する必要がない場合は、サンプラーを設定する必要はありません。

## ParentBasedSampler {#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 {#traceidratiobasedsampler}

`ParentBasedSampler` 内で最もよく使われるのは `TraceIdRatioBasedSampler` です。
パラメーターとして渡したパーセンテージのトレースを決定論的にサンプリングします。

#### 環境変数 {#environment-variables}

環境変数で `TraceIdRatioBasedSampler` を設定できます。

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

これにより、トレースの 10% のみが作成されるようにスパンをサンプリングするよう SDK に指示します。

#### アプリケーション設定 {#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 サンプラー {#alwayson-and-alwaysoff-sampler}

その他の2つの組み込みサンプラーは `AlwaysOnSampler` と `AlwaysOffSampler` です。

#### 環境変数 {#environment-variables-1}

環境変数 `OTEL_TRACES_SAMPLER` を使って、`ParentBasedSampler` で `AlwaysOnSampler` または `AlwaysOffSampler` を使用するように設定できます。

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

`AlwaysOffSampler` の場合は以下のとおりです。

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

#### アプリケーション設定 {#application-configuration-1}

アプリケーション設定の例です。
ルートサンプラーで常にサンプリングし、その他のケースでは親の決定を使用します。

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