Python Jaeger-client Tracer未报告重用



使用示例代码的芹菜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

相关内容

  • 没有找到相关文章

最新更新