如何在多个微服务中使用 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,但我无法让它工作,而且我不确定是否应该在每个服务中设置一个跟踪提供程序,或者到底出了什么问题。

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

解决方法

要做到这一点,您应该使用 tracer.inject 和 tracer.extract。

例如在客户端:

m

在您的服务器中:

3 * n < m * n

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...