使用python

时间:2019-11-28 12:57:12

标签: python stackdriver google-cloud-trace opencensus

我正在使用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中的第一条痕迹中。我一直在查看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_idspan_id并忽略第一个微服务的span_context。我现在还没主意。

EDIT2

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

a new

2 个答案:

答案 0 :(得分:1)

苏仁

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

答案 1 :(得分:0)

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

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

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

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

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