python - 如何将 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。
例如在客户端:
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 中有一个树视图。
如果您需要更多信息,请告诉我。
推荐阅读
- node.js - Is there a way to pass PM2 cluster instance ID to a compiled webpack node.js server?
- swift - 无法在 gCloud 中部署 Swift Vapor 应用程序
- node.js - "Callback function is not a function" Error when following Google Cloud Scheduler / PubSub tutorial
- asp.net-mvc - 带有 HTML 页面的 MVC Web 应用程序
- reactjs - 为什么 react hot loader 仅适用于 hot(module)(App) 并在其他人中重置 reducer 状态?
- java - Force Oracle JDBC to use a proxy on a per-connection basis
- swift - I am trying to save an SKLabelNode which is the highscore label but it doesn't work. Also tried UserDefaults
- ruby - rspec 挂钩(之前和之后)不起作用
- javascript - 在 jQuery 中编写 ejs 变量
- python - Accessing Python 3 type annotations for variables at runtime