我正在使用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中的第一条痕迹中。我一直在查看opencensus
文档中的python,发现了这一点:
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->数据库)出现在同一条跟踪下,但跨度不同。与此类似:
答案 0 :(得分:1)
苏仁
您能否通过trace_id
而不是span_id
?那应该在一条跟踪中显示所有内容。
答案 1 :(得分:0)