Skip to content

Commit 76cd22c

Browse files
SimplicityGuyclaude
andcommitted
fix(dashboard): show extractor progress counts instead of queue message counts
The extractor panel was displaying RabbitMQ queue message counts (pending messages for consumers) instead of the actual extraction progress from the extractor's /health endpoint. Now uses extraction_progress for per-type counts and last_extraction_time for active/idle detection. Also adds a total records display to the panel. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 954da59 commit 76cd22c

3 files changed

Lines changed: 40 additions & 15 deletions

File tree

dashboard/dashboard.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ class ServiceStatus(BaseModel):
7272
current_task: str | None
7373
progress: float | None # 0.0 to 1.0
7474
error: str | None
75+
extraction_progress: dict[str, int] | None = None # extractor only: per-type counts + total
76+
last_extraction_time: dict[str, float | None] | None = None # extractor only: seconds since last activity
7577

7678

7779
class QueueInfo(BaseModel):
@@ -249,6 +251,8 @@ async def get_service_statuses(self) -> list[ServiceStatus]:
249251
current_task=data.get("current_task"),
250252
progress=data.get("progress"),
251253
error=None,
254+
extraction_progress=data.get("extraction_progress"),
255+
last_extraction_time=data.get("last_extraction_time"),
252256
)
253257
)
254258
else:

dashboard/static/dashboard.js

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,38 @@ class Dashboard {
165165
badge.className = this._serviceBadgeClasses(service.status);
166166
badge.textContent = this._statusLabel(service.status);
167167
}
168+
169+
// Extractor card – use extraction_progress from health endpoint
170+
if (service.name === 'extractor' && service.extraction_progress) {
171+
const TYPES = ['masters', 'releases', 'artists', 'labels'];
172+
const progress = service.extraction_progress;
173+
const elapsed = service.last_extraction_time || {};
174+
175+
TYPES.forEach(type => {
176+
const el = document.getElementById(`extractor-${type}-state`);
177+
if (!el) return;
178+
const count = progress[type] || 0;
179+
// Active if last extraction was within 30 seconds
180+
const active = elapsed[type] != null && elapsed[type] < 30;
181+
if (active) {
182+
el.textContent = `Processing (${count.toLocaleString()})`;
183+
el.className = 'text-blue-400';
184+
} else if (count > 0) {
185+
el.textContent = 'Idle';
186+
el.className = 'text-emerald-400';
187+
} else {
188+
el.textContent = 'Idle';
189+
el.className = 'text-emerald-400';
190+
}
191+
});
192+
193+
// Update total records
194+
const totalEl = document.getElementById('extractor-total-records');
195+
if (totalEl) {
196+
const total = progress.total || 0;
197+
totalEl.textContent = total > 0 ? total.toLocaleString() : '—';
198+
}
199+
}
168200
});
169201
}
170202

@@ -206,21 +238,6 @@ class Dashboard {
206238
const activeGraphMap = isDlq ? graphinatorDlqMap : graphinatorMap;
207239
const activeTableMap = isDlq ? tableInatorDlqMap : tableInatorMap;
208240

209-
// Extractor card – queue state based on publish rate (always uses regular queues).
210-
TYPES.forEach(type => {
211-
const el = document.getElementById(`extractor-${type}-state`);
212-
if (!el) return;
213-
const q = graphinatorMap[type] || tableInatorMap[type];
214-
if (q) {
215-
const processing = q.message_rate > 0;
216-
el.textContent = processing ? `Processing (${q.messages.toLocaleString()})` : 'Idle';
217-
el.className = processing ? 'text-blue-400' : 'text-emerald-400';
218-
} else {
219-
el.textContent = '—';
220-
el.className = 'text-zinc-500';
221-
}
222-
});
223-
224241
// Graphinator card – total messages in active queue set.
225242
TYPES.forEach(type => {
226243
const el = document.getElementById(`graphinator-${type}-count`);

dashboard/static/index.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,10 @@ <h3 class="text-sm font-semibold flex items-center gap-2">
142142
<span>Labels</span>
143143
<span id="extractor-labels-state" class="text-zinc-500"></span>
144144
</div>
145+
<div class="flex justify-between text-[10px] text-zinc-500 uppercase font-bold tracking-wider pt-3 mt-1 border-t border-[#2D2D2D]">
146+
<span>Total Records</span>
147+
<span id="extractor-total-records" class="text-white normal-case font-mono"></span>
148+
</div>
145149
</div>
146150
</div>
147151

0 commit comments

Comments
 (0)