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_time
、finish_time
、tags
等)。
我目前无法弄清楚如何检索更新的跨度(以便读取服务器可能添加的任何标签)以及服务器根据请求结果创建的任何 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考虑的用例,也不可能。
我将 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_time
、finish_time
、tags
等)。
我目前无法弄清楚如何检索更新的跨度(以便读取服务器可能添加的任何标签)以及服务器根据请求结果创建的任何 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考虑的用例,也不可能。