OpenTelemetry Python - 如何将新跨度实例化为给定 traceid 的子跨度

Posted

技术标签:

【中文标题】OpenTelemetry Python - 如何将新跨度实例化为给定 traceid 的子跨度【英文标题】:OpenTelemetry Python - How to instanciate a new span as a child span for a given trace_id 【发布时间】:2021-10-02 10:07:39 【问题描述】:

我的目标是通过几个组件来跟踪我的应用程序的整个过程。我正在使用 GCP 和 Pub/Sub 消息队列在组件之间传递信息(使用 Python 开发)。

我目前正试图通过创建一个新跨度作为我的根跟踪的子跨度来在组件 A 和组件 B 之间保持相同的根跟踪。

这是一个小图:

Component A            ---> Pub/Sub message       ---> component B
(create the root trace)      (contain information)      (new span for root trace)

我有一个给定的 trace_idspan_id 我的父母可以通过 Pub/Sub 传输,但我不知道如何将新跨度声明为最后一个子级。我设法做的就是将一个新跟踪链接到父跟踪,但这不是我正在寻找的行为。

有人已经尝试过这样做吗?

问候,

【问题讨论】:

你能更详细地描述你想在这里做什么吗?也许有关您的设置等的更多信息。 【参考方案1】:

对于其他来这里的人,这是我根据@dalalstreetboi3739 的建议最终做的事情: (我意识到我得到的“trace_id”已经是一个符合 w3c 的跟踪头 https://www.w3.org/TR/trace-context/#trace-context-http-headers-format,它允许我直接使用 TraceContextTextMapPropagator):

data = get_json()
trace_id_str = data['traceid']
carrier = 'traceparent': trace_id_str

ctx = TraceContextTextMapPropagator().extract(carrier=carrier)
with tracer.start_as_current_span("/api/doit", ctx) as span:
   # do awesome stuff here
   # current span is now a child of the parent "trace_id"
   requests.get("http://what")

【讨论】:

【参考方案2】:

称为跟踪上下文传播,有多种格式,例如 w3c 跟踪上下文、jaeger、b3 等...https://github.com/open-telemetry/opentelemetry-specification/blob/b46bcab5fb709381f1fd52096a19541370c7d1b3/specification/context/api-propagators.md#propagators-distribution。为此,您将不得不使用传播器的注入/提取方法之一。这是使用 W3CTraceContext 传播器的简单示例。

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 the context into carrier and send it over

with tracer.start_as_current_span("first-span") as span:
    prop.inject(carrier=carrier)
    print("Carrier after injecting span context", carrier)


# Extracting the remote context from carrier and starting a new span under same trace.

ctx = prop.extract(carrier=carrier)
with tracer.start_as_current_span("next-span", context=ctx):
    pass

【讨论】:

感谢您的回答,它就像一个魅力!我只需要将它与这个示例混合,以便它适合我的用例opentelemetry-python.readthedocs.io/en/latest/…

以上是关于OpenTelemetry Python - 如何将新跨度实例化为给定 traceid 的子跨度的主要内容,如果未能解决你的问题,请参考以下文章

如何直接从浏览器将 OpenTelemetry 跟踪发送到 Honeycomb.io?

如何使用 OpenTelemetry 将 Prometheus 导出到 Google Cloud Monitoring?

如何在 gRPC 服务器存根中从 ctx 创建 OpenTelemetry span

如何从字符串 traceid 创建 opentelemetry span

如何将 OpenTelemetry Java 代理生成的跟踪导出到 Google Cloud Trace?

使用OpenTelemetry搭配Zipkin构建NetCore分布式链路跟踪 | WebAPI + gRPC