首页 > 解决方案 > 如何将 opentelmetry 与多个微服务一起使用(python)

问题描述

在单个应用程序中,我可以轻松创建(嵌套)跨度,但我试图在多个服务中跟踪 http 请求,而我尝试使用上下文传播的任何方法都不起作用。所以也许我的设置是错误的。

有人可以在python中解释这个的确切要求吗?

据我了解,在每个微服务中,我必须设置我的跨度导出器、收集器和跟踪提供程序。

exporter = JaegerSpanExporter(
    service_name="some-name",
    agent_host_name="localhost",
    agent_port=6831, ) span_processor = BatchExportSpanProcessor(exporter)
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(span_processor) tracer
tracer = trace.get_tracer(__name__)

在我想要检测的类中完成之后,我只需导航到我想要跟踪的服务中的代码块:

def some_method()
    with tracer.start_as_current_span("my-span"):
        # set some attributes and some events ....
        start_some_request()

当我启动我的服务时,跟踪工作完美,我可以在我的 Jaeger UI 上看到它们,但是跨度并没有聚合在单个 http 请求的单个跟踪下。

我知道那里应该有一些上下文传播来实现这一点,但我找不到任何方法可以在 python 中完成这项工作。我正在使用 W3C ContextTrace,但我无法让它工作,而且我不确定是否应该在每个服务中设置跟踪提供程序,或者到底出了什么问题。

我已经阅读了很多文档,但我仍然不知道如何让它工作。

标签: pythonjaegerdistributed-tracingopen-telemetry

解决方案


为此,您应该使用 tracer.inject 和 tracer.extract。

例如在客户端:

with tracer.start_span('client') as span:
    headers = {}
    # inject your context in the headers, to pass it to downstream service
    tracer.inject(span, Format.HTTP_HEADERS, headers)
    ...
    your code
    ...

在您的服务器中:

# extract context from upstream service
span_ctx = tracer.extract(Format.HTTP_HEADERS, self.headers)
span_tags = {tags.SPAN_KIND: tags.SPAN_KIND_RPC_SERVER}
# start a new span, child of the upstream span
with tracer.start_span('front', child_of=span_ctx, tags=span_tags) as span:
...
your code
...

像这样,您应该在 Jaeger UI 中有一个树视图。

如果您需要更多信息,请告诉我。


推荐阅读