3 · Infraestructura·7 min de lectura

Nuestra sonda llevaba semanas diciendo «no se pudo medir». Tenía razón, y por eso nadie lo arregló.

10 sep 2026InfraestructuraMétodoVerificación

Hace unas semanas publicamos una regla que nos parecía —y nos sigue pareciendo— de las mejores que tenemos: lo que no se pueda medir se reporta como «no medible», con el nombre exacto de lo que falta. Nunca como cero.

La sonda que vigila el servidor de un cliente la cumplía al pie de la letra. Entre sus diez medidas había una que decía, parte tras parte, exactamente esto:

salida
"licencias": { "responde": true, "sesiones": null }
El gestor de licencias contesta. Cuántas sesiones tiene, no se sabe. Honesto, con nombre y apellido.

Nos gustaba ver ese null. Era la prueba de que la sonda no inventaba. Cada vez que alguien lo miraba pensaba «bien, ahí no estamos mintiendo» y pasaba al siguiente renglón.

Ese `null` estuvo ahí semanas. Y el día que el sistema de licencias frenó al dueño de la empresa, la sonda —que corre cada quince minutos, dentro del servidor, para esto exactamente— no tenía una sola cifra que aportar.

Por qué no se podía medir#

El gestor de licencias publica una página interna. La sonda la pedía y contaba filas de tabla:

salida
$filas = [regex]::Matches($r.Content, '<tr').Count
sesiones = if ($filas -gt 0) { $filas - 1 } else { $null }
Cuenta cuántas veces aparece la etiqueta de fila <tr> y le resta el encabezado. Es el enfoque clásico para leer una tabla de HTML.

Razonable. El problema es que esa página no es una tabla. Esto es lo que devuelve de verdad:

salida
/*JSON:sessions*/ { "index":"1", "fn":"Ventas", "usr":"planta4",
  "scrn":"375", "seats":"1", "lt":"Thu Sep 10, 12:48:17" },
{ "index":"2", "fn":"Compras", "usr":"contabilidad2", ... }
Objetos JSON crudos detrás de un comentario. Ni una etiqueta <tr> en todo el documento.

Cero etiquetas. Cero filas. Y como cero filas no pasaba el -gt 0, la sonda reportaba null«no se pudo medir» — y seguía adelante.

La medida no estaba rota por descuido. Estaba rota por un supuesto: que una página con datos es una página con una tabla. El supuesto era falso y el código no tenía forma de enterarse, porque su manera de fallar era exactamente igual a su manera de portarse bien.

Lo incómodo#

Ese null no era un error silencioso. Era un error a gritos, en el idioma que nosotros mismos diseñamos, en el campo que creamos para eso, con el nombre del hueco escrito al lado. La sonda hizo todo lo que le pedimos.

Y no sirvió de nada, porque a un hueco declarado le faltaban dos cosas que nunca le pusimos:

  • Un dueño. Nadie era responsable de cerrarlo. Aparecía en el parte, se leía, se aceptaba.
  • Una fecha. Un hueco de hoy y un hueco de hace tres semanas se veían idénticos. El segundo ya no es una medición pendiente: es una decisión de no medir, tomada por omisión.

Un tablero que miente se descubre el día que alguien cruza la cifra contra la realidad. Un tablero que declara sus huecos no se descubre nunca, porque siempre tiene razón. Ésa es la parte que nos faltaba entender: la honestidad de la herramienta no sustituye a que alguien la revise. La vuelve más cómoda de no revisar.

Qué había del otro lado#

Cuando por fin lo abrimos, el null tapaba esto:

salida
Ventas               2 / 2   lleno
Inventarios          2 / 2   lleno
Cuentas por pagar    2 / 2   lleno
Compras              1 / 1   lleno
Bancos               1 / 2
Contabilidad         0 / 2
Cuentas por cobrar   0 / 2
Nómina               0 / 1
Asientos ocupados contra asientos que existen. Cuatro de ocho módulos sin un lugar libre, en el mismo minuto en que alguien no podía entrar.

Y, de pasada, algo que nadie estaba buscando: la licencia completa vencía en catorce días. Los ocho módulos, el mismo día. Ese dato estaba en la misma página, a dos renglones del anterior, esperando desde siempre.

Lo que hicimos#

Se reescribió la medida para parsear el JSON en lugar de contar etiquetas. Cada quince minutos ahora quedan registrados los asientos por módulo, quién los tiene, y cuándo vence la licencia.

Pero el arreglo que importa no es ése, porque ése sólo cierra un hueco. El que importa es que un hueco ahora envejece: cada renglón de «no medible» lleva desde cuándo está ahí, y pasado cierto tiempo deja de ser una nota al pie y se convierte en un hallazgo con su propio nombre.

No porque no confiemos en la herramienta. Al contrario: porque le creímos.


Caso real, anonimizado. Las cuentas y los nombres de máquina fueron sustituidos; los números, las páginas internas y el comportamiento de las herramientas son los que medimos.