Monitoreando la validez de la prueba¶
Estado del alcance (post-congelación de alcance 2026-05-10) — Ver ARCHITECTURE.md para los 37 MÓDULOs canónicos + 7 Test Kinds + arquitectura de safety DOM/CPOS/PIE-PA. ADRs 0014, 0019-0025 cubren adiciones post-Freeze.
Objetivo de este documento: en segundos, no horas, un operador debe poder responder "la medición del NGFW que acabo de recolectar es realmente significativa, o la infraestructura de prueba fue el cuello de botella?"
El cluster existe para cargar un Next-Generation Firewall y medir cuánto de la degradación de tasa/latencia es el costo de descifrado TLS del NGFW. Eso solo es verdad si la infraestructura generadora de carga (hosts UCS, kernel Linux, webservers Caddy, flotas browser-engine + synthetic-load, trunk Nexus 9000, NFS in-cluster) mantiene holgura durante la prueba. Si el host o la flota se satura primero, todo número de NGFW que el dashboard imprime está mal.
Esta página describe las métricas, alertas y dashboard Grafana que existen para hacer esa condición obvia.
Las cuatro señales¶
| Señal | Umbral "prueba invalidada" | Dónde aparece |
|---|---|---|
| TestBedInfrastructureBottleneck | persona p99 > 1s y CPU de algún host > 85%, o alguna HPA en maxReplicas | Panel stat "Test bed status" del Grafana se vuelve rojo. Alerta Prometheus dispara severity=critical. |
| HostUDPBufferOverflow | UDP RcvbufErrors > 0 por 2 min en cualquier host | Toda medición de HTTP/3 que involucre ese host es inválida (kernel descartó paquetes QUIC). |
| HostConntrackNearFull | Tabla conntrack > 80% llena | Todas las mediciones que involucren ese host son inválidas (kernel pronto descartará paquetes). |
| HostNetworkPacketDrops | > 100 paquetes/s descartados en NIC real | Números de RTT y throughput de ese host están mal. |
Cualquiera de esas alertas disparando invalida la corrida en curso. Detén la prueba, corrige la causa, re-ejecuta.
Qué mirar primero¶
Abre el dashboard Grafana Test-Bed Infrastructure Health (UID ai-forse-infra-health). Fila superior, cuatro stat panels grandes:
| Panel | Verde significa | Rojo significa |
|---|---|---|
| Test bed status | latencia persona estable Y CPU host < 85% Y ninguna HPA fija | Corrida sospechosa. Investigar los próximos 3 paneles. |
| Hosts with tuning missing | Todos ejecutaron host-tuning.sh apply |
Al menos un host está con sysctls default (conntrack 262K, puertos 28K) — ese host saturará primero. |
| HPAs at maxReplicas | Ninguna fija | Flota a plena capacidad; el test bed es el límite, no el NGFW. |
| OOMKills (15m) | Cero | Al menos un contenedor golpeó su límite de memoria. Si fue un Caddy persona, corrida inválida. |
Todo verde y panel de alertas vacío = mediciones NGFW son honestas, sigue.
Algo en rojo — las filas debajo de los stat panels muestran dónde mirar: - Per-host CPU saturation — gráfico por nodo, umbral rojo en 90% - Memory + conntrack pressure — mismo breakdown por nodo - Network drops / UDP overflow / TCP retransmits — tres gráficos lado a lado; no-cero en cualquiera es malo - Pod CPU throttle + restarts — confirma cuál contenedor es la restricción real - Sysctl effective values — tabla, identifica cuál host no recibió tuning
Qué se monitorea, y cómo¶
Tres nuevos componentes vienen con esta stack:
node_exporter(k8s/dut/90-node-exporter.yaml) — un DaemonSet que corre en todo nodo UCS y exporta métricas kernel en:9100por la OOBI. Sin él, cero visibilidad de host.kube-state-metrics(k8s/dut/91-kube-state-metrics.yaml) — Deployment que expone estado de objetos K8s (restart counts, motivos de OOMKill, réplicas HPA, etc.) como métricas Prometheus. Sin esto, la mitad de las alertas existentes no dispara.- PrometheusRule
web-agent-cluster-infra-health(k8s/dut/92-infra-prometheus-rules.yaml) — 14 alertas en 3 grupos (host, pod, "test validity") + 7 recording rules pre-agregando los joins pesados para que la evaluación sea rápida con intervalo de 30s.
La ConfigMap del dashboard está en platform/observability/dashboards/infra-health-cm.yaml — Grafana lo toma vía label grafana_dashboard: "1" siempre que el sidecar estándar de dashboard esté corriendo.
Confirmando que el tuning está activo¶
Dos verificaciones complementarias:
# Por host, desde el workstation del operador (ejemplo k3s)
sudo scripts/host-tuning.sh status
# A nivel cluster, vía Prometheus
sum(node_nf_conntrack_entries_limit) by (instance) > 1000000
Ambos deben mostrar cada host en el valor tuneado (2 097 152 para conntrack). Si un host está en el default kernel (~262K), la alerta TestBedSysctlMissing dispara automáticamente — no hay que recordar mirar.
Interpretando alertas durante una corrida¶
Una prueba típica de capacidad NGFW produce las siguientes señales cuando el NGFW es el cuello de botella (objetivo):
- p99 de la persona sube suavemente con VU count
- CPU de la persona sube pero permanece bajo 70%
- CPU del host < 50%, conntrack < 30% lleno
- Ninguna HPA en max
- Cero disparos de TestBedInfrastructureBottleneck
Las mismas señales cuando el test bed es el cuello de botella (modo de falla):
- p99 de la persona sube abruptamente en VU count bajo
- Un único host (o flota) golpea el techo antes que la CPU del Caddy persona
- TestBedInfrastructureBottleneck dispara en hasta 3 min del inicio
- HPAMaxedOut dispara
- Frecuentemente coincide con HostUDPBufferOverflow o HostConntrackNearFull
Las alertas fueron diseñadas para hacer el segundo caso imposible de no notar.
Cobertura extendida en PR-V¶
PR-U (#167) entregó la base host + pod. PR-V cierra los gaps que quedaron:
| Nuevo ServiceMonitor / Probe / Regla | Lo que pasas a ver / alertar |
|---|---|
Probe snmp-nexus9000 + snmp-ngfw-dut (k8s/dut/61-snmp-probes.yaml) |
Métricas del NGFW (SUT) y del trunk Nexus 9000 efectivamente recolectadas — sin esto el proyecto estaba ciego frente a los propios dispositivos que existe para medir. |
ServiceMonitor kubelet + cAdvisor (k8s/dut/93-kubelet-cadvisor.yaml) |
container_cpu_*, container_memory_*, container_network_*, container_fs_* — uso real de recursos por contenedor. Los paneles "Top 20 by CPU/RSS" del dashboard lo requieren. |
ServiceMonitor reloader (k8s/87-stakater-reloader.yaml) |
reloader_reload_executed_total — fallos silenciosos de rotación de cert. |
PrometheusRule extended-health (k8s/dut/94-extended-prometheus-rules.yaml) |
16 alertas nuevas en 7 grupos (NIC, disco, presión de sistema, cobertura, NFS, SNMP, reloader). |
Las 16 alertas nuevas (extended set)¶
| Grupo | Alertas |
|---|---|
| NIC | NICLinkDown, NICCarrierFlapping, NICRingBufferOverflow |
| Disco | DiskIOLatencyHigh, DiskNearFull |
| Sistema | LoadAverageHigh, FileDescriptorExhaustion, NTPClockSkew |
| Cobertura | NodeTuningDaemonSetIncomplete, NodeExporterCoverageIncomplete, CNIDHCPDaemonIncomplete |
| NFS | NFSClientOperationFailures, NFSClientHighLatency |
| SNMP | SNMPProbeFailure, SNMPProbeSlow |
| Reloader | ReloaderRolloutFailure |
Total de alertas + paneles tras PR-V¶
| Antes de PR-U | Tras PR-U | Tras PR-V | |
|---|---|---|---|
| Alertas host + pod | 0 | 15 | 31 |
| Alertas compuestas test-validity | 0 | 3 | 3 |
| Filas del dashboard Grafana | 5 (sólo persona) | 6 | 10 |
| ServiceMonitors | 1 | 3 | 6 |
| Probes (SNMP) | 0 | 0 | 2 |
Paneles nuevos (Test-Bed Infrastructure Health)¶
- NGFW + Nexus SNMP probes up — stat único que se pone rojo cuando el SUT o el trunk se vuelve invisible
- SNMP probe duration — timeseries por dispositivo; alerta a 25s (timeout = 30s)
- NIC link state — 1/0 por NIC real, cae a 0 al instante en fallo de cable / SFP
- Disk I/O busy % — por device, > 50% sostenido = cuello de botella en el servidor NFS
- File descriptors used % — señala agotamiento de FDs antes de tumbar pods
- Top 20 containers by CPU / RSS — cAdvisor; identifica el contenedor más pesado vs su limit
- NFS RPC error rate / latency — vista slot-side de la entrega de cloned-sites
Véase también¶
PERFORMANCE_TUNING_HOST.md— los knobs de host que las alertas validanscripts/host-tuning.sh— apply / status / removek8s/70-prometheus-rules.yaml— alertas existentes de agentes + clonerplatform/observability/rules/personas-rules.yaml— alertas existentes de Caddy persona
La regla de infra-health complementa esas — ninguna duplica, todas son necesarias.