传播
跨服务传播器
分布式追踪超出了单个服务的范围,这意味着需要在服务之间传播一些上下文,以创建Span之间的父子关系。这需要进行跨服务的上下文传播,通过该机制将追踪的标识符发送给远程进程。
针对HTTP框架和服务器的仪表化库,例如 Phoenix, Cowboy, Elli 以及客户端如 Tesla 将自动使用全局注册的传播器注入或提取上下文。默认情况下,使用的全局传播器是W3C Trace Context和 Baggage格式。
可以通过应用程序环境变量text_map_propagators
来配置这些全局传播器:
%% sys.config
...
{text_map_propagators, [baggage,
trace_context]},
...
## runtime.exs
...
text_map_propagators: [:baggage, :trace_context],
...
或者通过以逗号分隔的列表形式使用环境变量OTEL_PROPAGATORS
进行配置。这两种形式的配置都接受以下值:trace_context
、baggage
、b3
和 b3multi
。
要手动注入或提取上下文,可以使用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/1
和otel_propagator_text_map:extract/1
使用全局注册的传播器。要使用特定的传播器,可以使用otel_propagator_text_map:inject/2
和otel_propagator_text_map:extract/2
,其中第一个参数是要调用的传播器模块的名称。
最后修改 December 10, 2023: translate (a4350d6e)