Skip to content

Commit 1bb749d

Browse files
committed
fix: Ensure celery flags are properly set
1 parent 6246ad9 commit 1bb749d

2 files changed

Lines changed: 33 additions & 32 deletions

File tree

src/django_o11y/tracing/setup.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,6 @@ def setup_celery_o11y(app: Any, config: dict[str, Any] | None = None) -> None:
161161
# Keep Django/structlog logging ownership in workers.
162162
app.conf.worker_hijack_root_logger = False
163163
app.conf.worker_redirect_stdouts = False
164-
app.conf.worker_send_task_events = True
165-
app.conf.task_send_sent_event = True
166164

167165
from django_structlog.celery.steps import DjangoStructLogInitStep
168166

@@ -217,11 +215,11 @@ def setup_worker_metrics(celery_config: dict[str, Any]) -> None:
217215

218216

219217
def _configure_celery_metrics_events(config: dict[str, Any]) -> None:
220-
"""Enable producer-side Celery events needed by celery-exporter.
218+
"""Set Celery event flags needed by celery-exporter on the app conf at startup.
221219
222-
Workers set their event flags in ``setup_celery_o11y``. This function
223-
covers the Django web process that publishes tasks, ensuring
224-
``task-sent`` events are emitted when metrics are enabled.
220+
Setting these on the app conf before the worker boots means the worker
221+
reads the correct values during its own startup sequence, avoiding the
222+
``task events: OFF`` banner.
225223
"""
226224
celery_config = config.get("CELERY", {})
227225
if not config.get("METRICS", {}).get("PROMETHEUS_ENABLED", True):
@@ -233,10 +231,11 @@ def _configure_celery_metrics_events(config: dict[str, Any]) -> None:
233231
import celery as celery_module
234232

235233
app = celery_module.current_app
234+
app.conf.worker_send_task_events = True
236235
app.conf.task_send_sent_event = True
237236
except Exception: # pragma: no cover
238237
provider_logger.debug(
239-
"Failed to enable Celery producer task-sent events in Django process",
238+
"Failed to enable Celery task events in Django/worker process",
240239
exc_info=True,
241240
)
242241

tests/celery/test_celery.py

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -93,41 +93,43 @@ def test_auto_setup_skips_when_celery_disabled(celery_app):
9393
get_o11y_config.cache_clear()
9494

9595

96-
def test_celery_setup_enables_task_events(celery_app):
97-
"""setup_celery_o11y sets worker_send_task_events and task_send_sent_event."""
98-
from django_o11y.tracing import setup
96+
def test_configure_celery_metrics_events_sets_flags(celery_app):
97+
"""_configure_celery_metrics_events sets worker_send_task_events and task_send_sent_event."""
98+
from unittest.mock import patch
9999

100-
original_pid = setup._instrumented_pid
101-
setup._instrumented_pid = None
100+
from django_o11y.tracing.setup import _configure_celery_metrics_events
102101

103-
try:
104-
config = {"CELERY": {"ENABLED": True}}
105-
setup.setup_celery_o11y(celery_app, config=config)
102+
config = {
103+
"CELERY": {"ENABLED": True, "METRICS_ENABLED": True},
104+
"METRICS": {"PROMETHEUS_ENABLED": True},
105+
}
106106

107-
assert celery_app.conf.worker_send_task_events is True
108-
assert celery_app.conf.task_send_sent_event is True
109-
finally:
110-
setup._instrumented_pid = original_pid
107+
with patch("celery.current_app", celery_app):
108+
_configure_celery_metrics_events(config)
111109

110+
assert celery_app.conf.worker_send_task_events is True
111+
assert celery_app.conf.task_send_sent_event is True
112112

113-
def test_celery_setup_does_not_set_events_when_disabled(celery_app):
114-
"""Task events are not touched when CELERY.ENABLED is False."""
115-
from django_o11y.tracing import setup
116113

117-
original_pid = setup._instrumented_pid
118-
setup._instrumented_pid = None
119-
# Reset to a known baseline
114+
def test_configure_celery_metrics_events_skips_when_metrics_disabled(celery_app):
115+
"""Task events are not set when Prometheus metrics are disabled."""
116+
from unittest.mock import patch
117+
118+
from django_o11y.tracing.setup import _configure_celery_metrics_events
119+
120120
celery_app.conf.worker_send_task_events = False
121121
celery_app.conf.task_send_sent_event = False
122122

123-
try:
124-
config = {"CELERY": {"ENABLED": False}}
125-
setup.setup_celery_o11y(celery_app, config=config)
123+
config = {
124+
"CELERY": {"ENABLED": True, "METRICS_ENABLED": True},
125+
"METRICS": {"PROMETHEUS_ENABLED": False},
126+
}
126127

127-
assert celery_app.conf.worker_send_task_events is False
128-
assert celery_app.conf.task_send_sent_event is False
129-
finally:
130-
setup._instrumented_pid = original_pid
128+
with patch("celery.current_app", celery_app):
129+
_configure_celery_metrics_events(config)
130+
131+
assert celery_app.conf.worker_send_task_events is False
132+
assert celery_app.conf.task_send_sent_event is False
131133

132134

133135
def test_celery_prefork_pool_detection_defaults_to_prefork():

0 commit comments

Comments
 (0)