Как правильно интегрировать Opentelemetry при использовании модели fork process для многопроцессорности в приложении python django
У нас есть приложение на python/django, в нашем приложении мы подключаемся к хранилищу данных snowflake и у нас есть длинные запросы для отчетности (sql-запросы используются для получения данных из snowflake). Для обработки длительных запросов (и достижения мультиобработки) мы использовали Threading (код прикреплен ниже). Также у нас была настроена телеметрия, и она работала нормально. Опентелеметрия работает нормально при использовании Threads.
Сейчас мы перешли от подхода Thread к модели fork process для мультиобработки, и телеметрия сломалась, она не работает так, как ожидалось. Мы не можем заставить ее работать.
Мы используем функцию декоратора background_process_job для создания Thread на windows и Process на Linux, Когда мы тестируем наш код на windows (создается поток), телеметрия работает нормально BUT Когда мы тестируем тот же код на linux, вместо потока создается процесс и телеметрия не работает. Мы что-то упускаем?
Почему телеметрия @tracer.start_as_current_span(«send-message-core-thread») не работает при использовании fork-процесса и прекрасно работает при использовании Threads?
def background_process_job(function):
def decorator(*args, **kwargs):
# If windows, start a thread.
if platform.system() == 'Windows':
thread = Thread(target=function, args=args, kwargs=kwargs)
thread.daemon = True
thread.start()
logger.debug(f"Thread started with id {thread.native_id}")
else:
# if linux, start a background process.
process = Process(target=function, args=args, kwargs=kwargs)
process.daemon = True
process.start()
logger.debug(f"Process started with id {process.pid}")
return decorator
@background_process_job #will create a Thread on Windows and process on linux
@tracer.start_as_current_span("send-message-core-thread")
def send_message_core(request):
#heavy processing sending traces
Решение, которое я пробовал: (но не сработало)
Я попробовал функцию post_fork
# I created a gunicorn-telemetry.py file in root project with code
def post_fork(server, worker):
server.log.info("server log: Worker spawned with pid: %s", worker.pid)
# Ensure Azure Monitor tracing is set up for each worker process
configure_azure_monitor()
и в моем docker-compose.yml
entrypoint: [
"gunicorn",
"-c" ,
"gunicorn-telemetry.py",
"-b", "0.0.0.0:8000",
"algo_api.wsgi:application",
"--timeout 300"
]