传播

跨服务传播器

分布式追踪超出了单个服务的范围,这意味着需要在服务之间传播一些上下文,以创建Span之间的父子关系。这需要进行跨服务的上下文传播,通过该机制将追踪的标识符发送给远程进程。

针对HTTP框架和服务器的仪表化库,例如 Phoenix, Cowboy, Elli 以及客户端如 Tesla 将自动使用全局注册的传播器注入或提取上下文。默认情况下,使用的全局传播器是W3C Trace ContextBaggage格式。

可以通过应用程序环境变量text_map_propagators来配置这些全局传播器:

%% sys.config
...
{text_map_propagators, [baggage,
                        trace_context]},
...
## runtime.exs
...
text_map_propagators: [:baggage, :trace_context],
...

或者通过以逗号分隔的列表形式使用环境变量OTEL_PROPAGATORS进行配置。这两种形式的配置都接受以下值:trace_contextbaggageb3b3multi

要手动注入或提取上下文,可以使用otel_propagator_text_map模块:

%% 使用进程字典中的上下文添加到一个空的标题列表中
Headers = otel_propagator_text_map:inject([]),

%% 从Headers中创建一个进程字典中的上下文
otel_propagator_text_map:extract(Headers),
# 使用进程字典中的上下文添加到一个空的标题列表中
headers = :otel_propagator_text_map.inject([])

# 从headers中创建一个进程字典中的上下文
:otel_propagator_text_map.extract(headers)

otel_propagator_text_map:inject/1otel_propagator_text_map:extract/1使用全局注册的传播器。要使用特定的传播器,可以使用otel_propagator_text_map:inject/2otel_propagator_text_map:extract/2,其中第一个参数是要调用的传播器模块的名称。

最后修改 December 10, 2023: translate (a4350d6e)