RPC客户端如何访问服务器创建的范围属性/子范围

2024-10-03 13:26:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

到目前为止,我有:

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()似乎没有使跨度的任何基本信息(start_timefinish_timetags等)可公开访问

我目前不知道如何从请求的结果中检索更新的跨度(以便读取服务器可能添加的任何标记)和服务器创建的任何子跨度。(对于服务器如何知道要创建哪种类型的子跨度,我也有点困惑——显然,它们需要与通过头传递的跨度相同。)

简而言之,虽然向Jaeger这样的中央服务器报告跟踪是有用的,但我在这里的目的是让RPC客户端打印出所有服务器的跟踪信息。(并不是说我也不想在Jaeger中使用跟踪,但一旦客户端跟踪报告开始工作,我就会处理这个问题。)


Tags: 服务器http客户端tagtagsrpcstarttracer
1条回答
网友
1楼 · 发布于 2024-10-03 13:26:04

简单的回答是“你不能。”

我的问题是基于对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服务器将“父”ID字段嵌入到跟踪信息中

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

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

相关问题 更多 >