微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Opentelemetry 1.4.0 上下文传播

如何解决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() 类,所以我不知道如何在提取方法中设置 getter 参数。此外,set_in_carrier 在注入方法中被替换为 setter 参数,我也不知道如何设置这个参数。

如何在 opentelemetry 1.4.0 中为 W3C 跟踪上下文规范实现 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。