Stackdriver Strace使用python对一个请求的嵌入式跟踪

问题描述 投票:1回答:1

我正在使用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控制台上获得跟踪信息时,我看到了:

enter image description here

第一个跟踪来自数据库,第二个跟踪均为(从第一个服务到第二个+数据库)。

我想知道如何将第二条迹线嵌入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_idspan_id,而忽略第一个微服务的span_context。我目前没有主意。

EDIT2

我想要的是整个跟踪(微服务1->微服务2->数据库)出现在同一条跟踪下,但跨度不同。类似于以下内容:

a new

python stackdriver google-cloud-trace opencensus
1个回答
1
投票

苏仁,

您能否通过trace_id而不是span_id?那应该在一条跟踪中显示所有内容。


0
投票

最后我完成了。看起来,我不得不将trace_id传递给第二个微服务。不是span_id。但是我现在有一个不同的问题,我将提出另一个问题。

因此,总而言之,我解决了将迹线分开放置的问题。现在它们在同一个enter image description here中:

问题在于,第一条迹线仍然包括第二条迹线。如果我要拥有第三个微服务,则第一个将包括两者,而第二个将包括第三个,因为我无法阻止第二个微服务的第一个跨度。当我尝试时,出现以下错误。

WARNING:root:No active span, cannot do end_span.

我试图在到达那里后立即结束第二个微服务的第一个跨度,但是出现此错误。我将要发布另一个答案,因为我无法通过该屏幕。

© www.soinside.com 2019 - 2024. All rights reserved.