Семплінг
Семплінг — це процес, який обмежує кількість трейсів, що генеруються системою. 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"}}
Відгук
Чи це було корисним?
Дякуємо. Ми цінуємо ваші відгуки!
Будь ласка, дайте нам знати як ми можемо покращити цю сторінку. Ми цінуємо ваші відгуки!