Volver a la wiki

Wireless Monitor — Architecture & Technical Reference

Wireless Monitor — Architecture & Technical Reference

Versión: v1.0.27 (05-03-2026) Ruta: /monitoring/wireless/ Estado: v3 — Configurable chart grid, multi-radio, reports, real-time WS


Objetivo

Página dedicada para monitoreo de Access Points WiFi, separada de Observatory. Observatory está optimizado para dispositivos de red genéricos (switches, routers, firewalls) con ping/SNMP/HTTP. Wireless Monitor agrega datos específicos de WiFi: radios, SSIDs, clientes conectados, señal, y métricas vendor-specific.


Arquitectura

Principio: Reutilización máxima

No se creó ningún modelo ni app nueva. La página reutiliza 100% de la infraestructura existente:

ComponenteReutilización
DeviceProfile (network app)Modelo existente — filtrado por device_type='access_point'
deep_snmp_data (JSONField)Datos de Deep Discovery ya almacenados
VendorProfile + RegistryOIDs vendor-specific ya configurados
MonitoringTarget + VictoriaMetricsTime-series para charts (extras, snmp, fast_snmp)
DeviceFilterService.js100% reutilizado (search, status, group, rack)
SidebarResize.js100% reutilizado (drag handle, localStorage)
ApiService.js100% reutilizado (CSRF, error handling)
EChartsConfigurable chart grid con 4 chart types
MonitoringConsumer (WebSocket)WS push para metrics real-time
Auto-Provision deep-discover API100% reutilizado (botón Refresh Data)

Layout

Sigue el patrón Observatory: sidebar izquierdo + workspace con sistema de pestañas.

+-------------------+--------------------------------------------------+
|     SIDEBAR       |              WORKSPACE                           |
|                   |  [Dashboard] [AP-1] [AP-2] [×]  ← Tabs          |
| CreaRack-Pro      |                                                  |
| Wireless monitor  |  +---+ +---+ +---+ +---+                        |
|                   |  |119| |107| |2.2k| |Top|  ← Summary Cards      |
| Access Points 119 |  +---+ +---+ +---+ +---+                        |
| [Search...]       |                                                  |
| [Status ▼]        |  ┌─AP Table (sortable)─────────────────────────┐ |
| [Group ▼][Rack ▼] |  │ ● │ Name  │ IP   │ Vendor │ R │ Cl │FW    │ |
|                   |  │ ● │ AP-1  │ .42  │ Xirrus │ 8 │ 49 │8.5   │ |
|  ● AP-1 (49 cl)  |  │ ○ │ AP-2  │ .55  │ Cambium│ 3 │  0 │6.6   │ |
|  ○ AP-2 (0 cl)   |  └─────────────────────────────────────────────┘ |
|  ● AP-3 (15 cl)  |                                                  |
|                   |  == AP DETAIL TAB ==============================  |
|                   |  [Hardware: model, FW, serial, uptime, MAC]      |
|  [Report]         |  Charts  [1h][4h][12h][24h]        [Add Chart]  |
|  [Fleet Report]   |  ┌──────────────┐ ┌──────────────┐              |
|  [Refresh All]    |  │Station Count?│ │AP Bandwidth ?│              |
|                   |  │ ~~~~~~~~~~~~ │ │ ~~~~~~~~~~~~ │              |
|                   |  └──────────────┘ └──────────────┘              |
|                   |  ┌──────────────┐ ┌──────────────┐              |
|                   |  │Ch Util     ? │ │Noise Floor ? │              |
|                   |  │ ≈≈≈≈≈≈≈≈≈≈≈ │ │ ≈≈≈≈≈≈≈≈≈≈≈ │              |
|                   |  └──────────────┘ └──────────────┘              |
|                   |  [Radio Table] [SSID Table] [Client Table]      |
+-------------------+--------------------------------------------------+

Evolución

VersiónFechaCaracterísticas
v120-02-2026Base: sidebar, tabs, hardware info, dual charts (Station Count + Bandwidth), tables
v204-03-2026WebSocket real-time bandwidth, auto deep discovery, heatmap batch
v305-03-2026Configurable chart grid, multi-radio, reports, time pills, info tooltips, print theme

Configurable Chart Grid (v3)

Módulos

MóduloLíneasResponsabilidad
WirelessChartRegistry.js~110Static registry: 9 métricas con chart type, data source, colors, tooltips, axis config, info text
WirelessChartGrid.js~160Grid container: add/remove panels, time pills, WS distribution, timer refresh, layout persistence
WirelessChartPanel.js~500Individual panel: metric selector, ECharts init, data loading, real-time append, loading overlay
WirelessReport.js~475Reports: AP report (stats + charts + deep data + CSV), Fleet report, print with light theme

Métricas disponibles (9)

KeyLabelChart TypeSourceMulti-radio
station_countStation CountareaextrasNo
throughputAP Bandwidthdual-areasnmpNo
channel_utilizationChannel Utilizationmulti-areaextrasYes (×8)
noise_floorNoise Floormulti-areaextrasYes (×8)
avg_data_rateAvg Data Ratemulti-areaextrasYes (×8)
snrSNRmulti-areaextrasYes (×8)
channelChannelstepextrasNo
tx_powerTX PowerareaextrasNo
clients_per_radioClients / RadioareaextrasNo

Chart Types

Features

Multi-Radio Detection

Per-radio metrics (Channel Util, Noise Floor, etc.) use OID keys suffixed _1 through _8 (e.g., channel_utilization_1, channel_utilization_2). The available-metrics logic in WirelessDetail.js collapses these per-radio keys to their base key (e.g., channel_utilization) so the metric appears once in the selector, not 8 times.

VendorProfile.monitoring_oids:
  channel_utilization_1: ".1.3.6..."
  channel_utilization_2: ".1.3.6..."
  ...
  channel_utilization_8: ".1.3.6..."

→ Available metrics: ["channel_utilization"]  (collapsed)
→ Registry lookup: CHART_REGISTRY.channel_utilization.metricKeys = ["channel_utilization_1", ..., "channel_utilization_8"]
→ Chart: 1 line per radio that has data

WebSocket Real-Time (v2)

Data flow

Agent (Sentinel fast_snmp_loop, 15s)
  → WebSocket push to SaaS (MonitoringConsumer)
    → Forward to browser WS subscribers
      → WirelessChartGrid.handleRealtimeMetric()
        → Each panel checks if WS key matches its metricKeys
          → Appends data point to ECharts series

Metric key matching

Green dot indicator

When a chart grid receives real-time WS data, the .chart-grid-label shows a pulsing green dot (CSS ::after pseudo-element via .ws-realtime-active class).


Auto Deep Discovery


Reports (v3)

AP Report

Generated via GET /api/monitoring/wireless/report/{profileId}?hours=24:

  1. Header: AP name, IP, vendor, model, firmware
  2. Time range pills: 1h, 4h, 12h, 24h, 7d — re-generates report
  3. Stats cards: Avg/Min/Max/P95 for Station Count, Bandwidth In/Out, Noise Floor, TX Power, Channel, Clients/Radio
  4. Charts: Up to 7 static ECharts (no animation) for available metrics
  5. Deep data tables: Hardware, Radios (pivot), SSIDs (pivot), Clients (pivot, max 50)
  6. Export CSV: Client-side generation with timestamped filename
  7. Print: Light theme for ECharts axes + CSS @media print for dark text/white background

Fleet Report

Generated via GET /api/monitoring/wireless/fleet-report?hours=24:

  1. Summary cards: Total APs, Online, Offline, Total Clients
  2. AP table: Name, IP, Status, Clients, Vendor, Model, Firmware
  3. Export CSV + Print

_print() switches ECharts axis colors before window.print():

CSS @media print handles text colors, table styling, break-inside: avoid.


Fuentes de datos

1. DeviceProfile.deep_snmp_data (JSONField)

Estructura con categorías separadas por tipo de dato:

{
  "hardware": [
    {"name": "hostname", "index": "0", "value": "AP-01", "oid": "..."},
    {"name": "model", "index": "0", "value": "XR4836", "oid": "..."},
    {"name": "firmwareVersion", "index": "0", "value": "8.5.11", "oid": "..."}
  ],
  "wireless": [
    {"name": "radioName", "index": "1", "value": "iap1", "oid": "..."},
    {"name": "radioBand", "index": "0", "value": "2.4GHz", "oid": "..."},
    {"name": "associatedClients", "index": "1", "value": "12", "oid": "..."}
  ],
  "ssids": [
    {"name": "ssidName", "index": "0", "value": "Corporate", "oid": "..."},
    {"name": "ssidVlan", "index": "0", "value": "100", "oid": "..."}
  ],
  "clients": [
    {"name": "clientMac", "index": "0", "value": "AA:BB:CC:...", "oid": "..."},
    {"name": "clientSignal", "index": "0", "value": "-65", "oid": "..."}
  ]
}

2. VictoriaMetrics (time-series)

EndpointDataUsed by
GET /targets/{id}/vm/extras?hours=NPer-radio metrics (channel_util, noise, SNR, etc.) + station_countChart panels (area, multi-area)
GET /targets/{id}/vm/snmp?hours=NBandwidth in/out Mbps (from Agent Sentinel, polled at config.snmp_interface ifIndex)Chart panels (dual-area)
GET /monitoring/wireless/report/{id}?hours=NAggregated stats + all time-seriesReports
GET /monitoring/wireless/fleet-report?hours=NFleet summaryFleet report
GET /monitoring/availability-heatmapBatch availability for dashboard heatmap

3. WebSocket (real-time)

WS key patternExamplePanel match
snmp_fast_*snmp_fast_channel_utilization_1multi-area panels
snmp_extras_*snmp_extras_noise_floor_3multi-area panels
snmp_bandwidth_in_mbps—dual-area (throughput)
snmp_bandwidth_out_mbps—dual-area (throughput)

4. Campos OID por vendor

CampoCambiumXirrus
RadioradioBand, radioChannel, radioTxPower, noiseFloor, radioStatus, clientsPerRadioradioName, radioMac, associatedClients, interfaceSpeed
SSIDssidName, ssidVlan, ssidSecurity, ssidActiveClientsssidName, ssidVlan, ssidSecurity
ClientclientMac, clientIp, clientSignal, clientSsid, clientHostname, clientVendor, clientPhyMode, clientSessionTimestationMac
Hardwarehostname, model, firmwareVersion, serialNumber, macAddress, location, numRadios, uptimeSecondscdpHostname, cdpModel, cdpFirmware, location

5. Status determination

Si tiene MonitoringTarget → usar last_status (up→online, down→offline)
Si NO tiene MT pero last_verified < 2h → online (respondió a SNMP)
Si NO tiene MT pero tiene deep_snmp_data antiguo → offline
Si no tiene nada → unknown (gris)

Actualización v1.85.2 (ciclos 5 y 6 de la auditoría #261, 25-08-2026): se añadió WirelessLive (monitoring/api/wireless.py) como señal adicional — una consulta instantánea a VictoriaMetrics por petición sobre snmp_fast_station_count/snmp_extras_connected_clients (ventana 2×cadencia + margen). Un AP con SNMP fresco cuenta online aunque el ping falle (en el CCIB, donde la red filtra ICMP, esto afectaba a 47 APs), y sus clientes salen del dato vivo en vez de la foto del deep discovery, que pasa a ser solo respaldo. Mismo criterio aplicado también a /wireless/deep-data (antes tenía su propio cálculo sin frescura). Detalle completo en [[feature—wireless—clientes-vivos-ahora]].

Actualización v1.164.5 (28-09-2026, visto en PROD durante FABCON26): la agregación de SSIDs de get_wireless_group_summary (tabla de la ficha de un grupo) suma un segundo filtro además del de arriba — que el AP esté vivo no basta, la FOTO del deep discovery (deep_snmp_updated_at) también tiene que ser reciente (SSID_PHOTO_MAX_AGE, 60 min). Sin este filtro, un AP vivo con una foto de semanas atrás colaba en la tabla redes de eventos ya terminados. Detalle completo, con el contrato de la respuesta y los campos nuevos, en [[feature—wireless—clientes-vivos-ahora]].


Archivos

Backend

ArchivoDescripción
monitoring/views.pywireless_view: query DeviceProfile, conteo radios/clientes, status con fallback
monitoring/api.pyGET /wireless/summary, GET /wireless/report/{id}, GET /wireless/fleet-report
monitoring/urls.pypath('wireless/', ...)

Frontend

ArchivoLíneasDescripción
templates/monitoring/wireless.html~195Template: sidebar + tabs + dashboard cards + tabla AP
static/js/pages/wireless.js~700Coordinador: init, tabs, filtros, sort, WS, auto-refresh
static/js/pages/wireless/WirelessDashboard.js~97Summary cards + tabla AP sortable + heatmap
static/js/pages/wireless/WirelessDetail.js~850Detail: hardware info, chart grid, deep data tables, WS subscriptions
static/js/pages/wireless/WirelessChartGrid.js~160Chart grid: panels, time pills, WS distribution, layout persistence
static/js/pages/wireless/WirelessChartPanel.js~500Chart panel: metric selector, ECharts, data loading, real-time append
static/js/pages/wireless/WirelessChartRegistry.js~110Static registry: 9 metrics with config (type, source, colors, info)
static/js/pages/wireless/WirelessReport.js~475Reports: AP + Fleet, stats cards, charts, deep tables, CSV, print
static/css/pages/wireless.css~1,300Layout, sidebar, tabs, cards, tables, chart grid, report modal, print styles

Integration

ArchivoCambio
templates/base.htmlLink “Wireless” en navbar
templates/terminal/index.htmlBotón “Send to Wireless” en Auto-Provision Step 3
static/js/network/auto_provision.jssendToWireless() + conteo split APs/switches

Sistema de pestañas

Replica el patrón de Observatory:

  1. Dashboard tab (siempre presente, no cerrable): summary cards + tabla AP + heatmap widget
  2. AP tabs (dinámicas): click en sidebar/tabla → abre pestaña con detalle
  3. Persistencia: localStorage key wireless_tabs_v2 guarda tabs abiertas y tab activa
  4. Cleanup: al cerrar tab, se destruye WirelessChartGrid (dispone todos los ECharts)
  5. Auto deep discovery: trigger al abrir tab + refresh cada 5 min

Multi-vendor rendering

WirelessDetail.js detecta automáticamente el vendor por los campos presentes:


Auto-Provision integration

“Send to Wireless” (Step 3)


API Endpoints

MétodoRutaDescripción
GET/monitoring/wireless/Página Wireless Monitor (view Django)
GET/api/monitoring/wireless/summaryStats agregadas: total, online, offline, clients, busiest
GET/api/monitoring/wireless/group-summary/{group_id}Stats agregadas de un grupo: online, offline, clients, SSIDs (con filtro de frescura — ver v1.164.5 arriba)
GET/api/monitoring/wireless/report/{profileId}AP report: stats + metrics + deep_data
GET/api/monitoring/wireless/fleet-reportFleet report: all APs summary + table
GET/api/monitoring/availability-heatmapBatch availability for dashboard heatmap
GET/api/network/auto-provision/profiles/{id}Perfil con deep_snmp_data
POST/api/network/auto-provision/profiles/{id}/deep-discoverRefresh deep SNMP data
GET/api/monitoring/targets/{id}/vm/extrasTime-series per-radio metrics
GET/api/monitoring/targets/{id}/vm/snmpTime-series bandwidth

Roadmap (v4)


Última actualización: 28-09-2026 Mantenido por: Claude (Anthropic) + Equipo CreaRack

Véase también

Subir