透传原始上下文¶
用户在使用TFRobot的时候会有一类需求是在整个Span追踪链路中透传他们的一些上下文信息。这些上下文信息可能是用户自定义的,也可能是一些第三方系统的上下文信息。为了满足这类需求,您只需要使用OpenTelemetry的上下文管理机制进行上下文传递即可。以下是一个使用说明。
1. 在发起Span的地方,将需要透传的上下文信息放入到当前的Span上下文中。¶
def main():
# 调用方打开一个Span上下文
with tracer.start_as_current_span("caller_span") as caller_span:
# 传入预设的配置
token = attach(set_value("key", {"a": "b"}))
try:
# 调用你的库函数
your_function()
finally:
detach(token)
在这段代码中,使用OpenTelemetry set_value 函数对上下文内容进行设置。然后使用attach函数将其附着到追踪流上去。
attach会返回一个附着的token,这个token可以用于后续的detach操作。
需要注意在后续操作完成后,需要使用detach函数将上下文内容从追踪流上去除。
最佳实践需要使用try-catch-finally来保证detach的正确执行
2. 在需要使用上下文的地方(一般是EventHook的处理函数内)¶
def your_function():
# 创建一个新的Span
with tracer.start_as_current_span("your_function_span") as span:
# 获取当前的上下文对象
key_value = get_value("key")
print("key-value is:", key_value)
在这段代码中,使用OpenTelemetry的get_value函数获取到了之前设置的上下文内容。
3. 完整代码如下:¶
from opentelemetry import trace
from opentelemetry.context import get_current, set_value, get_value, attach, detach
from opentelemetry.sdk.trace import TracerProvider
# 设置追踪器提供者
trace.set_tracer_provider(TracerProvider())
tracer = trace.get_tracer(__name__)
def your_function():
# 创建一个新的Span
with tracer.start_as_current_span("your_function_span") as span:
# 获取当前的上下文对象
current_context = get_current()
key_value = get_value("key")
other_value = get_value("other")
# 获取当前Span的上下文
span_context = span.get_span_context()
# 打印当前的上下文和Span的上下文
print("Current Context:", current_context)
print("Span Context:", span_context)
print("key-value is:", key_value)
print("other-value is:", other_value)
def main():
# 调用方打开一个Span上下文
with tracer.start_as_current_span("caller_span") as caller_span:
# 传入预设的配置
token = attach(set_value("key", {"a": "b"}))
try:
# 调用你的库函数
your_function()
finally:
detach(token)
def test_run_main():
main()
在完整代码中,添加了一些其它的上下文的打印,主要是为了方便对OpenTelemetry不熟悉的使用者了解更多的关于OpenTelemetry上下文的内容。
通过以上手段,可以实现对原始内容的传递与追踪。但还请重点关注请求生命周期