RPC客户端如何访问服务器创建的跨度attributes/child跨度

How can RPC client access span attributes/child spans created by server

我将 Python opentracing 模块与 RPC(通过 HTTP)客户端一起使用。

目前我对将跟踪日志发送到像 Jaeger 这样的应用程序不感兴趣 - 我只想检查 RPC 调用时客户端中的跨度(和 child 跨度)returns.

到目前为止我有这个:

tracer = MockTracer()
with tracer.start_span('my-client') as span:
    span.set_tag(tags.HTTP_METHOD, 'GET')
    span.set_tag(tags.HTTP_URL, url)
    span.set_tag(tags.SPAN_KIND, tags.SPAN_KIND_RPC_CLIENT)
    opentracing.global_tracer().inject(span.context, Format.HTTP_HEADERS, headers)
    results = requests.request('GET', url, headers=headers, params=params, json=body)
# Extract from span any tags added by the server and/or any child spans created by the server???

我发现我必须使用 MockTracer() 才能得到任何东西。基础 Tracer() class 似乎没有公开任何跨度的基本信息(start_timefinish_timetags 等)。

我目前无法弄清楚如何检索更新的跨度(以便读取服务器可能添加的任何标签)以及服务器根据请求结果创建的任何 child 跨度。 (我也对服务器如何知道要创建哪种 child 跨度感到困惑 - 显然它们需要与通过 headers 传入的跨度相同。)

简而言之,虽然向像 Jaeger 这样的中央服务器报告跟踪很有用,但我的目的是让 RPC 客户端打印出所有服务器的跟踪信息。 (并不是说我也不想要 Jaeger 中的跟踪,但一旦客户端跟踪报告正常工作,我就会处理它。)

简短的回答是"you can't."

我的问题是基于对 opentracing 功能的根本误解。

Tracing context is only propagated downstream, not upstream.

来自同一个讨论帖:

On the wire propagation is only meant to carry "span context", which is a small set of ID fields and possible baggage. Returning the whole trace as part of the request is not a use case that was considered.

The trace collection is meant to be asynchronous and out of process.

所以我现在的理解是:

每个单独的软件组件都会创建自己的跟踪数据,将其打包,然后将其发送到跟踪服务器(例如 Jaeger)。每个软件组件 必须 配置为使用相同的跟踪提供程序和相同的跟踪服务器 - RPC 客户端无法告诉 RPC 服务器对于特定跟踪它应该使用 Jaeger 跟踪提供程序和Jaeger 服务器位于某某地址。 (至少,opentracing 标准没有提供这样做的方法。)客户端注入到 RPC 请求中的跟踪信息允许 RPC 服务器将 'parent' ID 字段嵌入到跟踪信息中。

跟踪器(例如 Jaeger)负责通过匹配嵌入在其中的 ID 代码来找出它从各种软件组件接收到的各种跟踪之间的关系。

所以我想做的不是opentracing考虑的用例,也不可能。