Семплінг

Семплінг — це процес, який обмежує кількість трейсів, що генеруються системою. 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"}}

Востаннє змінено June 5, 2025: [uk] spellchecking (8ca5a3a5)