Skip to content

Commit 20c1628

Browse files
committed
feat(queue): add queue health endpoint
1 parent 9ff656e commit 20c1628

File tree

3 files changed

+21
-5
lines changed

3 files changed

+21
-5
lines changed

agent_pm/observability/dashboard.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44

55
from dataclasses import dataclass
66

7-
from ..storage.redis import count_dead_letters
8-
from ..storage.tasks import get_task_queue
7+
from agent_pm.storage.redis import count_dead_letters
8+
from agent_pm.storage.tasks import get_task_queue
9+
from agent_pm.settings import settings
910

1011

1112
@dataclass
@@ -17,7 +18,7 @@ class QueueHealth:
1718

1819
async def gather_queue_health() -> QueueHealth:
1920
queue = await get_task_queue()
20-
client = await queue.get_client() # type: ignore[attr-defined]
21-
dead_letters = await count_dead_letters(client)
22-
auto_triage_enabled = bool(queue)
21+
client = getattr(queue, "_redis", None)
22+
dead_letters = await count_dead_letters(client) if client else 0
23+
auto_triage_enabled = bool(settings.task_queue_auto_requeue_errors)
2324
return QueueHealth(queue_name=getattr(queue, "queue_name", "unknown"), dead_letters=dead_letters, auto_triage_enabled=auto_triage_enabled)

app.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
SlackDigest,
4242
TicketPlan,
4343
)
44+
from agent_pm.observability.dashboard import gather_queue_health
4445
from agent_pm.observability.export import schedule_trace_export
4546
from agent_pm.observability.logging import configure_logging
4647
from agent_pm.observability.metrics import (
@@ -105,6 +106,16 @@ class FollowupUpdate(BaseModel):
105106
app = lifespan_app
106107

107108

109+
@app.get("/tasks/health", dependencies=[Depends(enforce_rate_limit)])
110+
async def task_queue_health(_admin_key: AdminKeyDep = None) -> dict[str, Any]:
111+
data = await gather_queue_health()
112+
return {
113+
"queue": data.queue_name,
114+
"dead_letters": data.dead_letters,
115+
"auto_triage_enabled": data.auto_triage_enabled,
116+
}
117+
118+
108119
async def ensure_project_allowed(plan: TicketPlan) -> TicketPlan:
109120
allowed = settings.allowed_projects
110121
if allowed and plan.project_key not in allowed:

tests/test_tasks_api.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ async def test_tasks_admin_endpoints_with_memory_backend(monkeypatch):
3737
worker_resp = await client.get("/tasks/workers")
3838
assert worker_resp.status_code == 200
3939
assert worker_resp.json() == {"workers": {}}
40+
41+
health_resp = await client.get("/tasks/health")
42+
assert health_resp.status_code == 200
43+
assert "queue" in health_resp.json()
4044
await client.cleanup()
4145
finally:
4246
app.dependency_overrides.clear()

0 commit comments

Comments
 (0)