我正在使用Stackdriver Trace监视某些微服务的延迟,但是在使所有往返行程显示为一个请求时遇到了一些问题。
说我有两项服务(为简单起见)。为了从两者获得跟踪,我需要在两个服务中都安装客户端库。现在说在第一项服务中:
@app.route('/dump')
def dump():
url = "http://db-dump/dump"
tracer = app.config['TRACER']
tracer.start_span(name='dump')
result = requests.get(url)
tracer.end_span()
return result.content
在我的第二项服务中,我这样做:
@app.route('/dump')
def dump():
conn = connect()
tracer = app.config['TRACER']
tracer.start_span(name='dump')
db_content = select(conn)
tracer.end_span()
db_content_to_print = format(db_content)
return render_page(db_content_to_print)
此第二项服务,对数据库进行查询,对结果进行处理,然后将其发送给显示内容的第一项服务。
现在,我当然必须开始计算两个微服务的延迟,因为我想知道从第一个服务到第二个服务需要多长时间。而且,我还必须开始计算第二项服务,因为我想知道从数据库中检索内容需要多长时间。
但是当我在GCP控制台上获得跟踪信息时,我看到了:
第一个跟踪来自数据库,第二个跟踪均为(从第一个服务到第二个+数据库)。
我想知道如何将第二条迹线嵌入python中的第一条迹线。我一直在检查python的opencensus
文档,发现了这一点:
class opencensus.trace.span.Span(name,parent_span = None,...)
跨度是一个单独的定时事件,它构成跟踪的节点树。每个范围都有其名称,范围ID和父ID。家长编号表示一个跨度中各个跨度之间的因果关系单个分布式跟踪。没有父ID的跨度为称为根跨度。与特定迹线关联的所有范围也共享通用的跟踪ID。跨度不需要连续,可以是两个跨度之间的差距。
所以,我想我必须将第一个请求的span_id
与请求一起发送给第二个微服务?这里还有另一个问题,这似乎需要使用这些参数初始化跟踪器,但是我在第二个微服务上的跟踪器已经初始化。发送请求时我无法初始化它,因为它已经无法正确计算延迟。
我需要问这个,要进行测试,我必须创建映像,将其上传到docker hub,然后在k8s上进行测试。在这里做盲目的工作太多了。
Stackdriver trace的Python客户端库在alpha中,因此GCP网站上没有太多与此相关的文档。
编辑
由于没有响应,我实际上尝试传递span_context
信息,这是这样:
>>> print(tracer.span_context)
SpanContext(trace_id=987b84e7efc5562ff6c21723e674cd41, span_id=910de32857b896da, trace_options=TraceOptions(enabled=True), tracestate=None)
...到初始化时的第二个微服务,但是没有用。当它开始计算第二个微服务上的跟踪时,它将自动生成新的trace_id
和span_id
,而忽略第一个微服务的span_context
。我目前没有主意。
EDIT2
我想要的是整个跟踪(微服务1->微服务2->数据库)出现在同一条跟踪下,但跨度不同。类似于以下内容:
苏仁,
您能否通过trace_id
而不是span_id
?那应该在一条跟踪中显示所有内容。