python 一个请求的 Stackdriver Strace 嵌入式跟踪
Stackdriver Strace embedded traces for one request with python
我正在使用 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
文档,我发现了这个:
class opencensus.trace.span.Span(name, parent_span=None,...)
A span is an individual timed event which forms a node of the trace
tree. Each span has its name, span id and parent id. The parent id
indicates the causal relationships between the individual spans in a
single distributed trace. Span that does not have a parent id is
called root span. All spans associated with a specific trace also
share a common trace id. Spans do not need to be continuous, there can
be gaps between two spans.
所以,我想,我必须将第一个请求的 span_id
连同请求一起发送到第二个微服务?这里还有一个问题,这似乎需要用这些参数初始化跟踪器,但我在第二个微服务上的跟踪器已经初始化了。我无法在发送请求时初始化它,因为它已经无法正确计算延迟。
我需要问这个,为了进行测试,我必须创建图像,将其上传到 docker hub,然后在 k8s 上进行测试。在这里盲目工作太多了。
Python Stackdriver 跟踪的客户端库处于 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。但是我现在有一个不同的问题,我会提出另一个问题。
所以,总而言之,我解决了在不同跨度中使用跟踪的问题。现在他们在同一个:
问题是第一条轨迹仍然包含第二条轨迹。如果我有第三个,第一个将包括它们两个,第二个将包括第三个,因为我无法从第二个微服务中停止第一个跨度。当我尝试时,出现以下错误。
WARNING:root:No active span, cannot do end_span.
我尝试的是在到达第二个微服务后立即结束第一个跨度,但出现此错误。我只是要 post 另一个答案,因为我无法通过这个屏幕如何。
苏仁,
你能把 trace_id
换成 span_id
吗?这应该会在一条轨迹中显示所有内容。
我正在使用 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
文档,我发现了这个:
class opencensus.trace.span.Span(name, parent_span=None,...)
A span is an individual timed event which forms a node of the trace tree. Each span has its name, span id and parent id. The parent id indicates the causal relationships between the individual spans in a single distributed trace. Span that does not have a parent id is called root span. All spans associated with a specific trace also share a common trace id. Spans do not need to be continuous, there can be gaps between two spans.
所以,我想,我必须将第一个请求的 span_id
连同请求一起发送到第二个微服务?这里还有一个问题,这似乎需要用这些参数初始化跟踪器,但我在第二个微服务上的跟踪器已经初始化了。我无法在发送请求时初始化它,因为它已经无法正确计算延迟。
我需要问这个,为了进行测试,我必须创建图像,将其上传到 docker hub,然后在 k8s 上进行测试。在这里盲目工作太多了。
Python Stackdriver 跟踪的客户端库处于 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。但是我现在有一个不同的问题,我会提出另一个问题。
所以,总而言之,我解决了在不同跨度中使用跟踪的问题。现在他们在同一个
问题是第一条轨迹仍然包含第二条轨迹。如果我有第三个,第一个将包括它们两个,第二个将包括第三个,因为我无法从第二个微服务中停止第一个跨度。当我尝试时,出现以下错误。
WARNING:root:No active span, cannot do end_span.
我尝试的是在到达第二个微服务后立即结束第一个跨度,但出现此错误。我只是要 post 另一个答案,因为我无法通过这个屏幕如何。
苏仁,
你能把 trace_id
换成 span_id
吗?这应该会在一条轨迹中显示所有内容。