Saltar al contenido
crawlforgeEnglish
Se rompió12 de octubre de 20266 min de lecturaRead in English

314 enlaces y un consejo equivocado

La 0.13.0 dice por qué una URL externa no se comprobó, y destapó que el informe de nuestra web culpaba a un tope y recomendaba un flag que no existe.

En la bitácora de campo de la primera semana de agosto había una línea esperando desde hacía dos meses. Rastreando diariodelamancha.com, 9.446 filas de URLs externas tenían el exclusion_reason vacío y nada decía por qué se habían quedado sin comprobar, cuando las que se saltaba un patrón o el robots.txt sí lo decían. Parecía lo más pequeño de la lista, una columna en blanco, y entró en la 0.13.0 el mismo día que el lector de diffs guardados.

Escondía algo más gordo.

Qué significa una columna vacía

Cada URL que encuentra el rastreador tiene su fila en el fichero, también las que no descarga. Un enlace externo se registra para que el informe sepa a dónde apunta el sitio, y por defecto recibe una petición HEAD para comprobar su estado, que es lo que permite informar de enlaces salientes rotos. Cuando esa comprobación no se hace, la fila dice por qué: nofollow si el enlace va marcado así, pattern si lo ha cazado tu --exclude y local_network si apunta a una dirección de tu propia red, que el rastreador se niega a tocar.

Quedaban dos casos sin motivo. Uno es --no-external-check, cuando apagas tú las comprobaciones. El otro es crawlforge audit ./dist, la auditoría de una carpeta ya construida, que no tiene cliente HTTP y no puede comprobar nada que esté fuera de la carpeta.

Un motivo vacío no es neutro. El motor ya usaba esa forma exacta (externa, saltada, sin estado, sin error y sin motivo) para decir «una sonda que se cortó a medias», y eso es lo que busca una reanudación para volver a intentarlo. El informe también la usaba, y ahí estaba el fallo.

El informe de nuestra propia web

Para ver a qué afectaba el cambio repasé todos los sitios que leen esa columna. Uno es la nota que añade el informe sobre los enlaces externos, y la pasé por la auditoría del build de esta web, la misma que lanzamos antes de cada despliegue:

314 enlaces externos quedaron sin comprobar: se alcanzó el tope max_external.
Súbelo con --max-external.

No hay nada cierto ahí. No se alcanzó ningún tope, porque una auditoría de carpeta no hace peticiones y no hay nada que topar. Y --max-external es un flag de crawl y de list que audit no acepta, así que quien siguiera el consejo recibiría un error de la misma herramienta que se lo había dado.

La nota se escribió para un caso real, un rastreo que termina con enlaces sin comprobar porque se agotó el límite por defecto de 10.000 comprobaciones. Lo reconocía por el motivo vacío. La auditoría de carpeta dejaba ese mismo motivo vacío por una causa que no tenía nada que ver, y la nota no podía distinguirlas. Quien consultara el fichero, tampoco.

Habíamos auditado esta web con la herramienta varias veces y la línea siempre estaba ahí, pero en un informe con unas decenas de hallazgos se leía como un trámite.

Dos motivos, y una forma de leer los ficheros viejos

Ahora cada caso tiene su valor: external_check_off cuando apagas las comprobaciones y no_network cuando la auditoría no tiene red. Lo escriben las dos ramas que registran externas, la de un enlace normal y la del destino externo de una redirección. Cada una tiene su test, porque son dos trozos de código distintos y un arreglo que solo cubriera los enlaces habría dejado los destinos de redirección como estaban.

El informe de una auditoría de carpeta dice ahora esto:

314 enlaces externos quedaron sin comprobar: auditar una carpeta no hace peticiones de red.
Para comprobarlos, rastrea el sitio publicado con `crawlforge crawl <URL>`.

Faltaban los ficheros que ya existen. Todas las auditorías de carpeta anteriores a la 0.13.0 tienen esas filas con la columna vacía, y un trabajo de CI puede guardar un fichero viejo mucho tiempo. El fichero de rastreo guarda el modo con el que se generó, así que el informe reconoce también el modo filesystem y una auditoría antigua recibe el mensaje correcto sin tener que repetirla.

Hacía falta comprobar también el otro lado, porque el modo no puede tapar el caso que sí es el tope. Un rastreo HTTP con externas sin comprobar y sin motivo sigue señalando a max_external, y hay un test que vigila que siga así.

inspect, la ficha de una URL, enseñaba estas filas como «excluida del rastreo (no_network)». No se había excluido nada: la URL estaba registrada y lo único que faltaba era su estado. Ahora dice «URL externa — estado sin comprobar», con el motivo entre paréntesis.

El test que no se puso en rojo

Como siempre, cada test nuevo tenía que fallar al quitarle su arreglo, y fallaron seis de siete.

El que no falló cubría una línea que añadí para que las auditorías de carpeta antiguas no se contaran dos veces, una como «sin red» y otra como «tope». Con la línea quitada el test seguía pasando, y miré por qué: la nota comprueba primero el caso sin red y, cuando se cumple, la otra cuenta no se llega a leer. La línea protegía de algo que no podía pasar, así que la borré en vez de escribir un test para justificarla.

El número de siempre

Esta versión sí toca el motor, así que la prueba de rendimiento de antes de publicar importaba más que la última vez. Medí en la misma máquina y con la misma carga, alternando la 0.12.0 y la nueva durante seis rondas, tres empezando por cada una:

0.12.0   66.201  59.696  66.712  62.936  64.184  54.151
0.13.0   65.179  39.869  63.366  64.315  64.864  61.970

Las medianas son 63.560 y 63.840 elementos por segundo. Cada lado tiene una ronda rara y la carga media estuvo entre 13 y 20 todo el rato. El cambio pone un campo en filas que ya se escribían, así que era difícil que costara algo, pero ya hemos tenido un cambio de tres líneas que costó diez veces más. La suite pasa 1.075 tests.

La bitácora tiene ahora una línea pendiente menos. Lo que de verdad le hace falta son líneas nuevas de alguien que use la herramienta a diario, y desde agosto no ha habido ninguna.

Se construye en público

Cada dos semanas: mediciones, fallos y ejemplos de uso. Nada más.

← Volver a la bitácora