【问题标题】:How to do trace propagation with nested spans across services using Opentelemtry in python?如何在 python 中使用 Opentelemtry 跨服务嵌套跨度进行跟踪传播?
【发布时间】:2021-07-14 20:12:11
【问题描述】:

我在 python 和 Jaeger 中使用 opentelemetry api 和 sdk 版本 1.0.0 来查看痕迹。

我有两个相互通信的服务,我可以在 Jaeger 上单独查看每个服务的跟踪,但跨度不是嵌套的(虽然它们应该嵌套)。

这个 sn-p 向您展示了我如何在服务之间传播跟踪。

from opentelemetry import trace
from opentelemetry.trace import set_span_in_context


ctx_parent = trace.SpanContext(
  is_remote=True,
  trace_id=int(params["trace_id"], 16)
  span_id=int(params["span_id"], 16)
)

tracer = trace.get_tracer(__name__)
context = set_span_in_context(ctx_parent)
with tracer.start_as_current_span(
  "span_name",
  context=context,
  kind=trace.SpanKind.SERVER
) as span:
  print("Parent span does not appear on Jaeger....")

在以前的 opentelemetry 版本 (0.7b1) 中,我可以直接使用 ctx_parent 而不使用 set_span_in_context 并且它工作正常(我在 Jaeger 上可视化了嵌套跨度),但不幸的是他们从 pypi 中删除了这些包,所以我不能再建立我的项目...

感谢您的帮助!

【问题讨论】:

    标签: python open-telemetry


    【解决方案1】:

    这就是 Otel 仪器的做法。

    from opentelemetry import trace, context
    from opentelemetry.propagate import extract
    from opentelemetry.context import attach, detach
    
    
    tracer = trace.get_tracer(__name__)
    
    incoming_request_headers = {"traceparent": "00-00000000000000000000000000000001-0000000000000002-01"}
    token = attach(extract(incoming_request_headers))
    
    with tracer.start_as_current_span(
      "span_name",
      kind=trace.SpanKind.SERVER,
    ) as span:
      print("Parent span does not appear on Jaeger....")
    
    detach(token)
    

    【讨论】:

    • 感谢@Owais Lone。它是否在进行许多并发调用的异步上下文中工作?
    猜你喜欢
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2020-10-30
    • 2013-09-26
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多