首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Opentelemetry 1.4.0上下文传播

Opentelemetry 1.4.0上下文传播
EN

Stack Overflow用户
提问于 2021-07-23 14:19:46
回答 1查看 69关注 0票数 0

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

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

代码语言:javascript
复制
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())

对于下一个微服务中的提取,我使用:

代码语言:javascript
复制
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方法?

EN

回答 1

Stack Overflow用户

发布于 2021-07-23 16:25:41

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

代码语言:javascript
复制
from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator

prop = TraceContextTextMapPropagator()
carrier = {}
prop.inject(carrier=carrier)

当你提取它的时候

代码语言:javascript
复制
from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator

prop = TraceContextTextMapPropagator()
context = prop.extract(carrier=request.headers)

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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68494838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档