Skip to content

Commit 3decb56

Browse files
Fix #699 -- Gracefully handle None value from active_queues in Celery (#700)
`inspect(...).active_queues()` can return `None` when the broker is restarting. This makes `check_active_queues()` handle a missing inspect payload as an empty queue mapping, so it reports unavailable queues instead of crashing with `AttributeError`. Co-authored-by: Johannes Maron <johannes@maron.family>
1 parent 2d372f1 commit 3decb56

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

health_check/contrib/celery.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ def check_active_queues(self, *active_workers):
6666
defined_queues = {self.app.conf.task_default_queue}
6767
active_queues = {
6868
queue.get("name")
69-
for queues in self.app.control.inspect(active_workers)
70-
.active_queues()
71-
.values()
69+
for queues in (
70+
self.app.control.inspect(active_workers).active_queues() or {}
71+
).values()
7272
for queue in queues
7373
}
7474

tests/contrib/test_celery.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,3 +158,22 @@ async def test_check_status__raise_type_error__default_queue(self):
158158

159159
result = await check.get_result()
160160
assert result.error is None
161+
162+
@pytest.mark.asyncio
163+
async def test_check_status__none_active_queues(self):
164+
"""Treat None from inspect.active_queues() as no active queues."""
165+
mock_app = mock.MagicMock()
166+
mock_app.conf.task_queues = [Queue("default", routing_key="default")]
167+
mock_app.conf.task_default_queue = "default"
168+
mock_app.control.ping.return_value = [{"celery@worker1": {"ok": "pong"}}]
169+
mock_inspect = mock.MagicMock()
170+
mock_inspect.active_queues.return_value = None
171+
mock_app.control.inspect.return_value = mock_inspect
172+
173+
check = CeleryPingHealthCheck()
174+
check.app = mock_app
175+
176+
result = await check.get_result()
177+
assert result.error is not None
178+
assert isinstance(result.error, ServiceUnavailable)
179+
assert "default" in str(result.error)

0 commit comments

Comments
 (0)