A blog about data, information and Tech by Mario Alberich

        

Siege: extraer URLs reales de los logs (I)

Siege es una herramienta de pruebas de carga, que permite simular el comportamiento de una web bajo condiciones extremas (el asedio del servidor).

Un número de peticiones altas, fuerte nivel de concurrencia, etc., son circunstancias a las que se enfrentará una web con una audiencia elevada, o a puntas de consultas, como por ejemplo debido a campañas publicitarias, eventos específicos, salida a la venta de nuevos productos, y otros.

Así que nos encontramos en esa situación, y decidimos que la herramienta es siege.  ¿qué más hay que hacer?

En ubuntu/debian, la instalación es sencilla, desde una terminal:

~$ sudo apt-get install siege

Con eso ya tendremos instalado siege, y podremos ejecutarlo.  Podemos ejecutar una prueba, contra la web que queremos testear:

~$ siege http://{host}/

o también:

~$ siege -c 30 http://{host}/

para simular 30 usuarios concurrentes.

Donde {host} es el nombre del dominio que se quiere probar. Obvia decir que esta prueba debe realizarse en un entorno controlado y bajo nuestra propia responsabilidad, y que en ningún caso se debe ejecutar sobre servidores y webs ajenas. Las consecuencias de ese uso impropio quedan bajo la responsabilidad del usuario.

Paso 1: Obtener las direcciones


Bien, si con lo anterior ya se puede realizar la prueba, ¿Para qué necesitamos más? Pues porque las simulaciones pueden requerir una variedad mayor de URLs, que cargan diversos componentes, tienen estrategias diversas de caché, o por lo que sea.

Y ¿de dónde sacamos esas URLs? Una de las opciones es un archivo de logs de Apache.  Si dispones de un log de apache con datos de navegación real, o se puede generar uno visitando la web.  Por ejemplo, se puede programar un crawler sencillo, tal como Httrack o similar. Lo que interesa no es la descarga de contenidos, sino que se navegue por la web para generar logs de Apache.

Paso 2: Limpiar y preparar las URLs


El log de apache tiene un formato similar al siguiente:

189.147.178.214 - - [19/May/2013:06:41:18 +0200] "GET /wp-content/themes/retina/style.css HTTP/1.1" 200 5213 "http://www.sopadebits.com/patrones-organizativos-gestion-informacion" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31"

Podemos identificar:

  • Dirección IP
  • Fecha y hora de acceso
  • Método de acceso (GET), URI (sin dominio) y versión del protocolo
  • resultado de la petición (200 = Ok) y tamaño del contenido retornado (5213 bytes)
  • URL desde donde se ha llegado (el referer)
  • Firma del navegador, y sistema operativo.


Lo que nos interesa es la URI, a la que posteriormente deberemos añadir el dominio completo.

¿Cómo extraeremos esa URL? Con awk. Esto permite extraer los contenidos separándolos por espacios (entre infinidad de otras posibilidades, vale la pena echarle un ojo).  En nuestro caso, la instrucción en consola puede ser:

~$ cat {archivo-de-log} | awk '{print $7}'

Bien, eso genera un listado considerable de URLs, muchas de ellas repetidas. Las ordenaremos y obtendremos la lista única de URIs:

~$ cat {archivo-de-log} | awk '{print $7}' | sort | uniq

Voilà! Aquí tienes una lista de URIs únicas, casi ya lo tenemos. Sólo queda añadir el protocolo y el nombre del host. Se puede conseguir echando mano del comando sed:

~$ cat {archivo-de-log} | awk '{print $7}' | sort | uniq | sed -e 's/^/http:\/\/sopadebits/g'

Qué hace esto exactamente? Busca el inicio de la cadena (el carácter "^" es una expresión regular que indica eso) y le añade el dominio (en mi caso, el de este blog sin el ".com"). Es necesario escapar las barras (\/), como ya es habitual en las expresiones regulares.

© 2007 and beyond Mario Alberich, licensed under CC-BY-SA unless stated otherwise.