Трассы внутри задачи 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)))
Первое изображение - это журнал трассировки главного запроса моего сервера 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.
Я много гуглил и не смог понять, почему это происходит. Дайте мне знать, если я могу предоставить какую-либо другую информацию. Спасибо.