使用示例代码的芹菜4.1.1跟踪任务。每个工人运行:
import logging
from jaeger_client import Config
import opentracing
def get_tracer(service="Vienna"):
config = Config(
config={
'sampler': {
'type': 'const',
'param': 1,
},
'logging': True,
},
service_name=service,
)
return config.initialize_tracer() or opentracing.global_tracer()
当我第一次开始芹菜并运行任务时,每个工人都会获得一个工作示踪剂,并且每个工人都有一个日志输出:
[2019-07-04 19:17:00,527: INFO/ForkPoolWorker-2] Initializing Jaeger Tracer with UDP reporter
[2019-07-04 19:17:00,546: INFO/ForkPoolWorker-2] opentracing.tracer initialized to <jaeger_client.tracer.Tracer object at 0x7f804d079c10>[app_name=SocketIOTask]
初始示踪剂之后运行的任何任务 来自Config.initialze_tracer
(返回None
(和日志警告Jaeger tracer already initialized, skipping
。
在控制台上观看tcpdump表明没有发送UDP数据包,我认为我会得到一个非初始化的默认示踪剂,并且使用了NOOP记者。
我已经在opentracing和jaeger_client上仔细研究了代码,我找不到围绕此的规范方式。
from jaeger_client import Config
def get_tracer(service="Vienna"):
config = Config(
config={
'sampler': {
'type': 'const',
'param': 1,
},
'logging': True,
},
service_name=service,
)
tracer = config.initialize_tracer()
if tracer is None:
Config._initialized = False
tracer = config.initialize_tracer()
return tracer
芹菜叉默认情况下多个过程(--pool=prefork
(。问题在于Jaeger_client执行该实际消息在单独的线程中发送。该线程是在分叉之前创建的,并且在子过程中不可用。结果,从子流程中记录不起作用。
最明显的解决方案是使用--pool=solo
,-pool=threads
等。但是,在CPU结合任务的情况下,我们仍然需要使用--pool=prefork
。在这种情况下,我们会遇到另一个问题。
在一侧,jaeger_client被设计为用作单身人士。它打开文件描述符,但永远不会关闭它们(即使close()
也比关闭更齐平(。另一方面,我们需要为每个芹菜过程创建一个单独的示踪剂。
为了解决问题,我使用了以下解决方法:
tracer = None
tracer_owner_pid = 0
def get_jaeger_tracer():
global tracer_owner_pid
global tracer
pid = os.getpid()
if tracer_owner_pid == pid:
return tracer
logging.getLogger('').handlers = []
logging.basicConfig(format='%(message)s', level=logging.DEBUG)
config = Config(
config={
'sampler': {
'type': 'const',
'param': 1,
},
'logging': True,
},
service_name='foo',
)
tracer = config.new_tracer()
tracer_owner_pid = pid
return tracer