如何解决将 Jaeger Python 客户端与 Luigi 一起使用
我刚刚开始使用 Jaeger 进行跟踪,并希望让 Python client 与 Luigi 一起使用。问题的根源在于,Luigi 使用多处理来分叉工作进程。文档提到这可能会导致问题,并建议 - 在 Web 应用程序的情况下 - 推迟跟踪器初始化,直到请求处理过程分叉。这对我不起作用,因为我想在主进程和工作进程中创建跟踪。
在主进程中,我像描述的那样初始化跟踪器here:
from jaeger_client import Config
config = Config(...)
tracer = config.initialize_tracer()
这会在内部创建一个 Tornado io-loop,它不能在 fork 进程中重用。所以我尝试在每个 Luigi 工作进程中重新初始化 Jaeger 客户端。这可以通过将 task_process_context
-Section 的(未记录?)worker
设置为实现上下文管理器协议的类来实现。它看起来像这样:
class WorkerContext:
def __init__(self,process):
pass
def __enter__(self):
Config._initialized = False
Config._initialized_lock = threading.Lock()
config = Config(...)
self.tracer = config.initialize_tracer()
def __exit__(self,type,value,traceback):
self.tracer.close()
time.sleep(2)
这两行当然非常“hackish”:
Config._initialized = False
Config._initialized_lock = threading.Lock()
类变量被复制到分叉进程中,如果我不重置变量,initialize_tracer
会抱怨已经被初始化。
多处理如何派生新进程的细节以及这对 Tornado 循环意味着什么对我来说有点“神秘”。所以我的问题是:
以上代码安全还是我自找麻烦?
当然我会摆脱访问配置内部。但如果该解决方案被认为是安全的,我会要求维护者提供一个 reset
方法,该方法可以在分叉进程中调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。