CreaRack-SL

Selector de interfaz en la gráfica de Bandwidth del Observatory (cierra #262)

User value

El desplegable de interfaz del panel Bandwidth del Observatory cambia de función: hasta la v1.85.0, elegir una interfaz le decía al Agente local qué interfaz sondear — cada cambio disparaba un PATCH al target, reconfiguraba el Agente y dejaba la línea base del gráfico en blanco unos minutos. Con el Agente 2.22.0 (que ya guarda una serie por cada interfaz seleccionada), el mismo desplegable elige qué interfaz se muestra, y el cambio es instantáneo: no toca el target, no reconfigura nada, no borra histórico. La interfaz principal (la que usan el resto de widgets del dispositivo) se sigue fijando en SNMP Settings y aparece marcada “(primary)” en el desplegable.

Cómo usarla

  1. En la pestaña de un equipo con varias interfaces SNMP descubiertas, abre el desplegable de interfaz sobre la gráfica de Bandwidth (el mismo control también gobierna Interface Errors).
  2. Elige cualquier interfaz de la lista — la marcada “(primary)” es la que fija SNMP Settings.
  3. La gráfica recarga al instante con la serie de esa interfaz. La elección se recuerda por pestaña del navegador (localStorage, clave observatory_iface_<deviceId>), no se guarda en el servidor.
  4. Límite honesto: con un Agente anterior a 2.22.0, las interfaces no principales no tienen serie propia — la gráfica queda vacía al elegirlas. Verificado en pantalla contra el Xirrus de la oficina tras el deploy.

Implementación

  • Backend — MetricsReader.bandwidth_selectors(tenant_id, target_id, ifindex) (monitoring/services/metrics_reader.py) decide el selector PromQL: sin ifindex, snmp_bandwidth_{in,out}_mbps{...} (la interfaz principal); con ifindex, snmp_if_bandwidth_{in,out}_mbps{..., interface="N"} (serie por interfaz del Agente 2.22.0). get_generic_metric(..., ifindex) aplica el mismo matcher a Interface Errors/Discards (snmp_if_errors_per_min, snmp_if_discards_per_min). ifindex se valida contra _IFINDEX = re.compile(r"^\d{1,6}$") antes de interpolarse en la query — igual que el resto de nombres de métrica, para no abrir una inyección PromQL.
  • API — GET /api/monitoring/targets/{id}/vm/all y /vm/snmp (monitoring/api/metrics.py) aceptan el query param iface=N; _clean_ifindex() descarta cualquier valor que no sean solo dígitos (≤6) antes de pasarlo a MetricsReader.
  • Frontend — ChartCoordinator.setInterface(ifindex, hours) (static/js/pages/observatory/ChartCoordinator.js, ?v=7) guarda la elección en localStorage y recarga; ChartCoordinator.savedInterface(deviceId) la recupera al construir el coordinador. ObservatoryTabs.js (?v=6) pinta el desplegable con el sufijo “(primary)” en la interfaz que coincide con config.snmp_interface.
  • El caché de MetricsReader incluye el ifindex en la clave (snmp_in_if<N> / snmp_out_if<N>) para no mezclar series de distintas interfaces.

Tests

  • tests/monitoring/test_bandwidth_interface_chart.py (5 tests) — selectores PromQL con y sin ifindex, rechazo de iface no numérico, get_generic_metric con matcher de interfaz.

Commits relacionados

  • 99c40ebe (2026-08-25) — feat(monitoring): la gráfica de Bandwidth muestra la interfaz que elijas (cierra #262) · v1.85.1 (#438).
  • ff59f8ce (2026-08-25) — feat(agent): 2.22.0 · ancho de banda por interfaz (base de datos que consume esta feature) · v1.85.0 (#437).

Límite honesto

  • Con Agente < 2.22.0, las interfaces no principales no producen serie propia (snmp_if_bandwidth_*) y la gráfica queda vacía al seleccionarlas.
  • La elección de interfaz vive solo en localStorage del navegador — no sincroniza entre dispositivos ni sesiones del mismo usuario.

Véase también

  • [[entity—monitoring—api—snmp]]
  • [[entity—monitoring—service—snmp-service]]
  • [[crearack—monitoring—configurar-snmp]]
  • [[crearack—monitoring—dashboards]]
  • [[feature—monitoring—auditoria-261-ciclo-1-metricas-snmp]]
  • [[concept—terminal—local-agent]]
  • [[crearack-tech—backend—multi-vendor-snmp-guide]]