Как правильно интегрировать 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"
]  
Вернуться на верх