Трассы внутри задачи celery регистрируются в консоли, но не передаются в бэкенд Jaeger

В нашей компании мы используем Django в качестве backend web framework и активно используем celery для обработки backgroun, а теперь мы хотим начать внедрять распределенную трассировку, так как все становится сложнее.

Мы решили использовать Jaeger в качестве трассировщика и использовали django_opentracing для автоматического инструментария нашей существующей кодовой базы. Все работает отлично для обычных запросов, и мы можем видеть трассировки в jaeger ui, но когда api запрос запускает задачу celery в фоне, в консольных логах мы видим, что Jaeger отправляет трассировки, но они не видны в ui.

Следующий django_opentracing документ ниже - это наша установка кода.

# settings.py file

# ...

# OpenTracing settings

OPENTRACING_TRACE_ALL = True

OPENTRACING_TRACED_ATTRIBUTES = ['META', 'body', 'path', 'path_info', 'method', 'FILES', 'headers']

def get_tracer():
    from jaeger_client import Config
    config = Config(
        config={  # usually read from some yaml config
            'sampler': {
                'type': 'const',
                'param': 1,
            },
            'local_agent': {
                'reporting_host': '127.0.0.1',
                'reporting_port': '5775'
            },
            'logging': True,
        },
        service_name='optimus-store',
        validate=True,
    )
    return config.initialize_tracer()


tracer = get_tracer()

OPENTRACING_TRACING = django_opentracing.DjangoTracing(tracer)

from opentracing_instrumentation.client_hooks import install_all_patches
install_all_patches()

# Opentracing settings end
... other settings stuff

Мой файл celery для проекта django,

import os
from celery import Celery
from django.conf import settings

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "optimus_store.settings")

celery_app = Celery("optimus_order")
# Using a string here means the worker will not have to
# pickle the object when using Windows.
celery_app.config_from_object("django.conf:settings")
celery_app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@celery_app.task(bind=True)
def debug_task(self):
    print(("Request: {0!r}".format(self.request)))

The trace logs i see in main request thread.

The trace logs i see in celery taks logs, We can clearly see the db traces logged.

What trace info i see in jaeger client.

Первое изображение - это журнал трассировки главного запроса моего сервера django.

Второй - это журналы трассировки, которые я вижу в моей задаче celery.

Третье изображение - это информация о трассировке в jaeger ui.

Где мы можем ясно видеть, что трассировки db внутри задачи celery не сообщаются.

Я запустил свой сервер django с помощью команды python manage.py runserver 8081 и задачу celery с помощью celery -A optimus_store worker --loglevel=INFO --concurrency=1 -Q store_high_priority --autoscale=1,1. Я использую локальный сервер redis в качестве брокера сообщений для celery.

А для jaeger backend я использую docker all in one image of jaeger.

Я много гуглил и не смог понять, почему это происходит. Дайте мне знать, если я могу предоставить какую-либо другую информацию. Спасибо.

Вернуться на верх