Opentelemetry 1.4.0上下文传播



我运行的是Opentelemetry 0.18rc1,我的应用程序运行得很好。

我使用W3C跟踪上下文规范进行上下文传播。对于注入和提取,我使用TraceContextTextMapPropagator

from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
from opentelemetry.context import get_current
prop = TraceContextTextMapPropagator()
carrier = {}
prop.inject(set_in_carrier=dict.__setitem__, carrier=carrier, context=get_current())

为了在下一个微服务中提取,我使用了:

from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
from opentelemetry.propagators import textmap
prop = TraceContextTextMapPropagator()
carrier_getter = textmap.DictGetter()
context = prop.extract(carrier_getter, request.headers)

当我尝试升级到最新的opentelemetry 1.4.0时,我的注入和提取方法停止了工作。DictGetter((类似乎从新版本中删除了,所以我不知道如何在extract方法中设置getter参数。此外,在inject方法中,set_in_carrier被替换为setter参数,我也不知道如何设置这个参数。

我如何在opentelemetry 1.4.0 for W3C Trace Context规范中实现Inject和Extract方法?

set_in_carrier被称为Setter的东西取代,DefaultSetter实现了这一点,以在类似dict的载体(例如HTTP头(中设置值。您不需要显式传递当前上下文,因为如果您不传递任何上下文,它将获取当前上下文。注入载体将简化为

from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
prop = TraceContextTextMapPropagator()
carrier = {}
prop.inject(carrier=carrier)

当你提取时,它将是

from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
prop = TraceContextTextMapPropagator()
context = prop.extract(carrier=request.headers)

这里有一个工作示例,当注入和提取发生在同一个文件中,但在现实世界中,它通常发生在不同的服务中。

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import (BatchSpanProcessor,
ConsoleSpanExporter)
from opentelemetry.trace.propagation.tracecontext import 
TraceContextTextMapPropagator
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))
tracer = trace.get_tracer(__name__)
prop = TraceContextTextMapPropagator()
carrier = {}
# Injecting
with tracer.start_as_current_span("first-span") as span:
prop.inject(carrier=carrier)
print("Carrier after injecting span context", carrier)
# Extracting
ctx = prop.extract(carrier=carrier)
with tracer.start_as_current_span("next-span", context=ctx):
pass

最新更新