Funcionalidadactivecreado Tue Aug 25#monitoring#network#snmp#observability#ux#reliability#django#victoriametrics
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
- 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).
- Elige cualquier interfaz de la lista — la marcada “(primary)” es la que fija SNMP Settings.
- La gráfica recarga al instante con la serie de esa interfaz. La elección se recuerda por pestaña del navegador (
localStorage, claveobservatory_iface_<deviceId>), no se guarda en el servidor. - 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: sinifindex,snmp_bandwidth_{in,out}_mbps{...}(la interfaz principal); conifindex,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).ifindexse 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/ally/vm/snmp(monitoring/api/metrics.py) aceptan el query paramiface=N;_clean_ifindex()descarta cualquier valor que no sean solo dígitos (≤6) antes de pasarlo aMetricsReader. - Frontend —
ChartCoordinator.setInterface(ifindex, hours)(static/js/pages/observatory/ChartCoordinator.js,?v=7) guarda la elección enlocalStoragey 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 conconfig.snmp_interface. - El caché de
MetricsReaderincluye elifindexen 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 sinifindex, rechazo deifaceno numérico,get_generic_metriccon 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
localStoragedel 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]]