采样

采样是限制系统生成的跟踪数量的过程。Erlang SDK提供了几种头采样器

默认行为

默认情况下,所有跨度都会被采样,因此采样率为100%。如果您不需要管理数据量,则不需要配置采样器。

ParentBasedSampler

在采样时,最常用的是ParentBasedSampler用于头采样。它使用跨度的父级的采样决策,或者没有父级的事实来确定使用哪个次要采样器。

可以通过环境变量OTEL_TRACES_SAMPLEROTEL_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采样器

另外两个内置采样器是AlwaysOnSamplerAlwaysOffSampler

环境变量

可以使用环境变量配置ParentBasedSampler以使用AlwaysOnSamplerAlwaysOffSampler

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) ->
    case maps:intersect(Attributes, ConfigAttributes) of
        Map when map_size(Map) > 0 ->
            {?DROP, [], []};
        _ ->
            {?RECORD_AND_SAMPLE, [], []}
    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
    case :maps.intersect(attributes, config_attributes) do
      map when map_size(map) > 0 ->
        {:drop, [], []}
      _ ->
        {:record_and_sample, [], []}
    end
  end
end

该采样器将采样不具有与采样器配置中传递的属性匹配的属性的跨度。

示例配置,不对具有指定URL为/healthcheck的属性的跨度进行采样:

{opentelemetry, {sampler, {attributes_sampler, #{'http.target' => <<"/healthcheck">>}}}}
config :opentelemetry, sampler: {AttributesSampler, %{"http.target": "/healthcheck"}}
最后修改 December 10, 2023: translate (a4350d6e)