Вибірка

Вибірка — це процес, який обмежує кількість трейсів, що генеруються системою. SDK Erlang пропонує кілька головних вибірників.

Стандартна поведінка

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

ParentBasedSampler

При вибірці найчастіше використовується ParentBasedSampler для головної вибірки. Він використовує рішення про вибірку від батьківського відрізка або факт відсутності батька, щоб знати, який вторинний вибірник використовувати.

Вибірник можна налаштувати за допомогою змінних середовища 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. Він детерміновано вибирає відсоток трейсів, який ви передаєте як параметр.

Змінні середовища

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

export OTEL_TRACES_SAMPLER="parentbased_traceidratio"
export OTEL_TRACES_SAMPLER_ARG="0.1"

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

Конфігурація застосунків

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

%% config/sys.config.src
{opentelemetry, {sampler, {parent_based, #{root => {trace_id_ratio_based, 0.10},
                                          remote_parent_sampled => always_on,
                                          remote_parent_not_sampled => always_off,
                                          local_parent_sampled => always_on,
                                          local_parent_not_sampled => always_off}}}}
# config/runtime.exs
config :opentelemetry, sampler: {:parent_based, %{root: {:trace_id_ratio_based, 0.10},
                                                  remote_parent_sampled: :always_on,
                                                  remote_parent_not_sampled: :always_off,
                                                  local_parent_sampled: :always_on,
                                                  local_parent_not_sampled: :always_off}}

AlwaysOn і AlwaysOff Sampler

Інші два вбудовані механізми вибірки — це AlwaysOnSampler та AlwaysOffSampler.

Змінні середовища

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

export OTEL_TRACES_SAMPLER="parentbased_always_on"

І для AlwaysOffSampler:

export OTEL_TRACES_SAMPLER="parentbased_always_off"

Конфігурація застосунку

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

%% config/sys.config.src
{opentelemetry, {sampler, {parent_based, #{root => always_on,
                                          remote_parent_sampled => always_on,
                                          remote_parent_not_sampled => always_off,
                                          local_parent_sampled => always_on,
                                          local_parent_not_sampled => always_off}}}}
# config/runtime.exs
config :opentelemetry, sampler: {:parent_based, %{root: :always_on,
                                                  remote_parent_sampled: :always_on,
                                                  remote_parent_not_sampled: :always_off,
                                                  local_parent_sampled: :always_on,
                                                  local_parent_not_sampled: :always_off}}

Користувацький механізм вибірки

Користувацькі механізми вибірки можна створити, реалізувавши otel_sampler поведінку. Цей приклад механізму вибірки:

-module(attribute_sampler).

-behavior(otel_sampler).

-export([description/1,
         setup/1,
         should_sample/7]).

-include("otel_sampler.hrl").

setup(Attributes) when is_map(Attributes) ->
    Attributes;
setup(_) ->
    #{}.

description(_) ->
    <<"AttributeSampler">>.

should_sample(_Ctx, _TraceId, _Links, _SpanName, _SpanKind, Attributes, ConfigAttributes) ->
    AttributesSet = sets:from_list(maps:to_list(Attributes)),
    ConfigSet = sets:from_list(maps:to_list(ConfigAttributes)),
    case sets:is_disjoint(AttributesSet, ConfigSet) of
        true -> {?RECORD_AND_SAMPLE, [], []};
        _ -> {?DROP, [], []}
end.
defmodule AttributesSampler do
  def setup(attributes) when is_map(attributes) do
    attributes
  end

  def setup(_) do
    %{}
  end

  def description(_) do
    "ExampleSampler"
  end

  def should_sample(_ctx, _trace_id, _links, _span_name, _span_kind, attributes, config_attributes) do
    no_match =
      Enum.into(attributes, %MapSet{})
      |> MapSet.disjoint?(Enum.into(config_attributes, %MapSet{}))

    if no_match, do: {:record_and_sample, [], []}, else: {:drop, [], []}
  end
end

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

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

{opentelemetry, {sampler, {attributes_sampler, #{'http.target' => <<"/healthcheck">>}}}}
config :opentelemetry, sampler: {AttributesSampler, %{"http.target": "/healthcheck"}}

Востаннє змінено December 26, 2024: [uk] Ukrainian documentation for OpenTelemetry (cf1a5745)