Move probe execution from Django app ready() to gunicorn.conf.py Remove threading implementation to simplify startup sequence Ensure probe runs in worker process context with proper error handling
37 lines
992 B
Python
37 lines
992 B
Python
import logging
|
|
import re
|
|
|
|
_PROBE_PATH = re.compile(
|
|
r"^(?:/live|/ready|/metrics|/healthz|/health[^ ]*|/ping)/?(?:\?|$)"
|
|
)
|
|
|
|
|
|
class _ProbePathFilter(logging.Filter):
|
|
def filter(self, record: logging.LogRecord) -> bool:
|
|
request = getattr(record, "args", None)
|
|
if isinstance(request, dict):
|
|
path = request.get("U") or request.get("r", "")
|
|
else:
|
|
path = record.getMessage()
|
|
return not _PROBE_PATH.search(path)
|
|
|
|
|
|
_filter = _ProbePathFilter()
|
|
|
|
|
|
def on_starting(server):
|
|
logging.getLogger("gunicorn.access").addFilter(_filter)
|
|
|
|
|
|
def post_worker_init(worker):
|
|
logging.getLogger("gunicorn.access").addFilter(_filter)
|
|
from library.apps import _run_startup_probe, _should_skip_probe
|
|
|
|
if not _should_skip_probe():
|
|
try:
|
|
_run_startup_probe()
|
|
except Exception as exc:
|
|
logging.getLogger("library.apps").warning(
|
|
"Startup probe crashed: %s", exc, exc_info=True
|
|
)
|