Fix OpenTelemetry multiple initialization issue

- Add _ot_initialized flag to prevent multiple setup calls
- Make setup_opentelemetry() idempotent
- Handle 'Address in use' error gracefully for Prometheus server
- Prevent OpenTelemetry setup failures due to multiple initialization
This commit is contained in:
Oliver Falk
2025-10-17 14:56:15 +02:00
parent 8e61f02702
commit ad4e5068b9

View File

@@ -163,6 +163,14 @@ class OpenTelemetryConfig:
logger.info(f"Prometheus metrics server started on {host}:{port}")
except OSError as e:
if e.errno == 98: # Address already in use
logger.warning(
f"Prometheus metrics server already running on {endpoint}"
)
else:
logger.error(f"Failed to start Prometheus metrics server: {e}")
self.enabled = False
except Exception as e:
logger.error(f"Failed to start Prometheus metrics server: {e}")
self.enabled = False
@@ -202,6 +210,7 @@ class OpenTelemetryConfig:
# Global OpenTelemetry configuration instance (lazy-loaded)
_ot_config = None
_ot_initialized = False
def get_ot_config():
@@ -218,6 +227,12 @@ def setup_opentelemetry() -> None:
This function should be called during Django application startup.
"""
global _ot_initialized
if _ot_initialized:
logger.debug("OpenTelemetry already initialized, skipping setup")
return
logger.info("Setting up OpenTelemetry...")
ot_config = get_ot_config()
@@ -230,6 +245,7 @@ def setup_opentelemetry() -> None:
logger.info("OpenTelemetry setup completed successfully (export enabled)")
else:
logger.info("OpenTelemetry setup completed successfully (export disabled)")
_ot_initialized = True
else:
logger.info("OpenTelemetry setup failed")