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

如何在 python 中使用 Opentelemtry 跨服务使用嵌套跨度进行跟踪传播?

如何解决如何在 python 中使用 Opentelemtry 跨服务使用嵌套跨度进行跟踪传播?

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

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

代码段向您展示了我如何在服务之间传播跟踪。

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 中删除了这些包所以我不能再构建我的项目了...

感谢您的帮助!

解决方法

这就是 Otel instrumentations 的做法。

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)

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