Hypercorn/Unicorn Support

The OpenTelemetry SDK is not fork-safe, meaning you cannot use the same instance of the SDK in multiple processes. Specifically, the BatchSpanProcessor, PeriodicExportingMetricReader, and BatchLogProcessor must not be copied from a parent process to a child process. Instead, the parent process and child process must create their own instances. If instances of these processors/readers are copied from a parent to a child process, they will not function correctly.

These components spawn background threads to send data to the backend and maintain state protected by a lock, which is not fork-safe (see Python issue 6721). As a result, they face the same limitations as any code using locks or mutexes.

A common workaround is to create new instances of these processors/readers in each process using the register_at_fork hook from the os module. However, Unicorn/Hypercorn use the spawn method to start worker processes, which does not invoke the register_at_fork hook. Consequently, this workaround is not applicable to Unicorn/Hypercorn.

The recommended solution is to use gunicorn with the worker class uvicorn.workers.UvicornWorker since it supports the register_at_fork hook.