Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python为一个请求嵌入Stackdriver Strace跟踪_Python_Stackdriver_Google Cloud Trace_Opencensus - Fatal编程技术网

使用python为一个请求嵌入Stackdriver Strace跟踪

使用python为一个请求嵌入Stackdriver Strace跟踪,python,stackdriver,google-cloud-trace,opencensus,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')

我使用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)
第二个服务对数据库进行查询,对结果进行gts,并将结果发送给第一个服务,该服务显示内容

现在,我当然要开始计算两个微服务的延迟,因为我想知道从第一个服务到第二个服务需要多长时间。我还必须开始计算第二个服务,因为我想知道从数据库检索内容需要多长时间

但当我在GCP控制台上获得跟踪时,我看到:

其中第一个跟踪来自数据库,第二个跟踪同时来自两个(从第一个服务到第二个服务+数据库)

我想知道如何在python中将第二个跟踪嵌入到第一个跟踪中。我一直在检查python的
opencensus
文档,我发现:

类opencensus.trace.span.span(名称,父项\u span=None,…)

范围是形成跟踪节点的单个定时事件 树。每个跨度都有其名称、跨度id和父id。父id 指示一个区域中各个跨度之间的因果关系 单个分布式跟踪。没有父id的范围是 称为根跨度。与特定轨迹关联的所有跨距也是 共享公共跟踪id。跨距不需要是连续的,可以 两个跨度之间的间隙

那么,我想,我必须将第一个请求的
span\u id
与请求一起发送到第二个微服务?这里还有一个问题,这似乎需要用这些参数初始化跟踪程序,但第二个微服务上的跟踪程序已经初始化。我无法在发送请求时初始化它,因为它已经无法正确计算延迟

我需要问这个问题,为了进行测试,我必须创建图像,上传到docker hub,然后在k8s上进行测试。在这里瞎了太多的事了

Stackdriver跟踪的Python客户端库是alpha格式的,所以GCP站点上也没有太多关于这方面的文档

编辑

由于没有响应,我实际上尝试传递
span_上下文
信息,如下所示:

>>> print(tracer.span_context)
SpanContext(trace_id=987b84e7efc5562ff6c21723e674cd41, span_id=910de32857b896da, trace_options=TraceOptions(enabled=True), tracestate=None)
…在初始化时连接到第二个微服务,但它不起作用。当它开始计算第二个微服务上的跟踪时,它会自动生成新的
trace\u id
span\u id
,并忽略第一个微服务的
span\u上下文
。我现在没有主意了

EDIT2

我想要的是,整个跟踪(microservice1->microservice2->数据库)以不同的跨度显示在同一跟踪下。类似于此:


我终于完成了。看起来,我必须将
跟踪id
传递给第二个微服务。不是span_id。但是我现在有一个不同的问题,我将提出另一个问题

所以,总而言之,我解决了在不同跨距中有记录道的问题。现在他们在同一个地方:

问题是第一个跟踪仍然包括第二个跟踪。如果我有第三个,第一个将包括这两个,第二个将包括第三个,因为我无法从第二个微服务停止第一个跨度。当我尝试时,我得到以下错误

警告:root:无活动范围,无法结束。\

我尝试的是在到达后立即从第二个微服务结束第一个跨度,但我得到了这个错误。我只是想发布另一个答案,因为我无法通过这个屏幕了解如何解决问题。

Suren


请您将
trace\u id
而不是
span\u id
传递给我,好吗?这应该可以在一个跟踪中显示所有内容。

你好,Suren,如果我得到的信息正确,请告诉我第一个跟踪来自数据库,第二个跟踪来自两个跟踪(从第一个服务到第二个服务+数据库)这意味着您需要的是从第一个服务到第二个服务再到数据库再到第一个服务,所有这些都在一个跟踪中,这样您就可以看到获取答案所需的全部时间。我说得对吗?如果没有,请详细说明,以便我能提供帮助。非常感谢。没错。第一个来自数据库,第二个来自第一个服务到第二个,第二个来自数据库。它们以不同的轨迹出现。我希望它们出现在同一个轨迹中,但跨度不同。我在我的帖子(编辑2)中添加了一张新图片,这是正确的。我发布了答案,但不确定我是否做对了,所以将其删除以进行更多调查。但如果你确认这是正确的方法,我会继续。谢谢