采样
采样是限制系统生成的跟踪数量的过程。Erlang SDK提供了几种头采样器。
默认行为
默认情况下,所有跨度都会被采样,因此采样率为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采样器
另外两个内置采样器是AlwaysOnSampler
和AlwaysOffSampler
。
环境变量
可以使用环境变量配置ParentBasedSampler
以使用AlwaysOnSampler
或AlwaysOffSampler
:
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)