OpenTelemetry Python - 如何将新跨度实例化为给定 trace_id 的 child 跨度
OpenTelemetry Python - How to instanciate a new span as a child span for a given trace_id
我的目标是通过几个组件来跟踪我的应用程序的整个过程。我正在使用 GCP 和 Pub/Sub 消息队列在组件之间传递信息(在 Python 中开发)。
我目前正在尝试通过创建一个新的跨度作为我的根跟踪的 child 跨度来在组件 A 和组件 B 之间保持相同的根跟踪。
这是一个小图:
Component A ---> Pub/Sub message ---> component B
(create the root trace) (contain information) (new span for root trace)
我有我的 parent 的给定 trace_id
和 span_id
,我可以通过 Pub/Sub 传输,但我不知道如何声明一个新的跨度作为最后一个 child。我设法做的就是 link 到 parent 的新跟踪,但这不是我正在寻找的行为。
有人试过这样做吗?
此致,
这叫做跟踪上下文传播,有多种格式,例如 w3c 跟踪上下文、jaeger、b3 等...https://github.com/open-telemetry/opentelemetry-specification/blob/b46bcab5fb709381f1fd52096a19541370c7d1b3/specification/context/api-propagators.md#propagators-distribution。为此,您将不得不使用传播者的一种 inject/extract 方法。这是使用 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
对于来到这里的其他人,这是我根据@dalalstreetboi3739 的建议最终做的:
(我意识到我得到的“trace_id”已经是符合 w3c 的跟踪 header 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")
我的目标是通过几个组件来跟踪我的应用程序的整个过程。我正在使用 GCP 和 Pub/Sub 消息队列在组件之间传递信息(在 Python 中开发)。
我目前正在尝试通过创建一个新的跨度作为我的根跟踪的 child 跨度来在组件 A 和组件 B 之间保持相同的根跟踪。
这是一个小图:
Component A ---> Pub/Sub message ---> component B
(create the root trace) (contain information) (new span for root trace)
我有我的 parent 的给定 trace_id
和 span_id
,我可以通过 Pub/Sub 传输,但我不知道如何声明一个新的跨度作为最后一个 child。我设法做的就是 link 到 parent 的新跟踪,但这不是我正在寻找的行为。
有人试过这样做吗?
此致,
这叫做跟踪上下文传播,有多种格式,例如 w3c 跟踪上下文、jaeger、b3 等...https://github.com/open-telemetry/opentelemetry-specification/blob/b46bcab5fb709381f1fd52096a19541370c7d1b3/specification/context/api-propagators.md#propagators-distribution。为此,您将不得不使用传播者的一种 inject/extract 方法。这是使用 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
对于来到这里的其他人,这是我根据@dalalstreetboi3739 的建议最终做的:
(我意识到我得到的“trace_id”已经是符合 w3c 的跟踪 header 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")