Most NOC "dashboards" are a couple of static Zabbix maps and a generic Grafana nobody looks at. This replaces them with three boards designed to be read from across the room: a downed AP pulses red with radar rings, a dead switch shakes and drops out of the topology, a server that stopped responding flips to a red "NO RESPONSE" card. Everything animates — the wall tells you what broke without anyone reading a number.
| Board | What it shows |
|---|---|
| Wireless | APs grouped by building from a Zabbix sysmap. A downed AP turns red with expanding radar rings; its building panel enters alarm border. Up/total count per building, sorted so the problem floats to the top. |
| Network | Live LAN topology from a sysmap: nodes "breathe", links animate directional flow, core switches are highlighted, and a downed node shakes + rings. A ticker below streams High/Disaster problems, and an OFF-MAP strip surfaces monitored hosts that aren't drawn on the map. |
| Servers | Prometheus targets as cards with conic CPU/RAM/disk rings (green→amber→red by threshold), live RX/TX throughput, uptime, and OS. Supports windows_exporter and node_exporter. A target with up == 0 turns into a red "NO RESPONSE" card. |
All secrets and endpoints are server-side env vars. The three JSON endpoints are read-only and don't expose upstream detail beyond what a board needs to draw.
Legacy NOC maps only show what someone placed by hand. A switch that was down when the map was drawn simply isn't there — the worst outages become invisible. This board cross-references monitored groups against the map and lists what's missing, with the down ones first.
The proxy logs in once, reuses the session token, and transparently re-logs-in exactly once if a call comes back with an auth error — so a token expiration never shows up as a blank board.
If the backend can't be reached, the board shows "no data — retrying…" and keeps polling; it never freezes on stale numbers pretending everything's fine.
TVs / browser FastAPI proxy + cache upstreams wireless.html ┐ /api/wireless ┐ network.html ├─ fetch every 15 s ────▶ /api/red ├─ TTL 10 s ─▶ Zabbix JSON-RPC servers.html ┘ (no credentials) /api/servers ┘ └─▶ Prometheus HTTP
Each board fires its calls to Zabbix/Prometheus with asyncio.gather, so a board that needs map + availability + problems + host details resolves in the time of a single round trip.
Every board polls the same three endpoints. What happens behind them turns on two questions: is the cache still warm — and does Zabbix still like the token?