Enmilocalfunciona

Thoughts, stories and ideas.

Pruebas de carga con Gor

Publicado por Juan José del Campo el

QAGor

En este artículo os presentamos Gor como herrramienta para realizar pruebas de carga.  Mostraremos ejemplos básicos de uso y alternativas más avanzadas.

Hace poco tiempo hemos tenido la necesidad de realizar pruebas de carga en un nuevo entorno de preproducción ("acme.preproduccion"). La ejecución satisfacoria de estas pruebas nos debían permitir comparar resultados con el actual de producción y posteriormente con futuras releases.

De entre las distintas alternativas que se presentaban (fuera del alcance de este artículo) hemos elegido Gor, una herramienta de pruebas de carga basada en la captura y replicación de llamadas HTTP. Es sencilla y flexible. Nos permite:

  1. Replicar con veracidad el entorno de producción: Contenido y flujos de las llamadas, escenarios, volúmenes...
  2. Mantener la temporalidad y orden de las llamadas.
  3. Modificar el contenido de las llamadas. Ejemplo, actualización de parámetros como el timestamp, usuario...
  4. Modificar la velocidad de emisión,  con el fin de replicar, no sólo carga real, sino simular escenarios con mayor estrés.

Cómo funciona

Gor captura el tráfico (--input-raw/http/file/tcp) , y lo reenvía al desino especificado (--output-http,file,tcp).

Para ejecutarlo sólo hay que descargarse el binario de su página de releases y ejecutarlo, pasando en la llamada el modo de captura y el modo de reenvío.

# Ejemplo de una captura de las llamadas al puerto 80 y reenvío por http
sudo gor --input-raw :80 --output-http "http://acme.preproduccion"  
  • S.O. soportados: Gor corre en Linux y Mac (Mac desde la v0.11.0)
  • Seguridad: Soporta autenticación básica:
... --output-http "http://usuario:contraseña@acme.preproduccion"
  • Soporte SSL: El tráfico SSL no está soportado (... piénsalo otra vez ;), ¿tiene realmente sentido?). Cómo afrontarlo: https://github.com/buger/gor/issues/85
  • OpenSource: El proyecto está compartido en github y está desarrollado en Go.

Modos de captura:

  • RAW: Captura en modo no intrusivo el tráfico. Tiene un límite en el payload del mensaje de 200kb (22KB). El exceso quedaría truncado. Precisa de privilegios de acceso (raw socket), por lo que la llamada debe ir con sudo.
sudo gor --input-raw :80 ...  
  • HTTP: Captura en modo intrusivo el tráfico (no es compatible con otro proceso escuchando en el mismo puerto, como web server). Soporta cualquier tamaño de payload.
gor --input-http :80 ...  
  • TCP: Optimiza la comunicación entre dos proceso Gor (uno en modo captura y otro en modo emisor). Ejemplo:
gor --input-tcp replay.local:28020 ...  
  • FILE: Utiliza como origen el fichero *.gor con el tráfico capturado. Permite mantener la relación temporal de las llamadas.
gor --input-file /ruta_al_fichero_capturas/trafico_prod.gor ...  

Modos de reenvío:

  • HTTP: Utiliza el protocolo HTTP para las llamadas a los servidores destino.
  • TCP: Optimiza la comunicaciónentre los dos procesos Gor.
  • FILE: Guarda en un fichero de texto (*.gor) el tráfico capturado.

Configuración avanzada - funcionalidades adicionales

  • Multiplexación del envío: Soporta envíos del mismo tráfico a múltiples direcciones.
... --output-http "http://acme.AAA.preproduccion"  --output-http "http://acme.BBB.preproduccion" --output-http "http://acme.CCC.preproduccion"  
  • Dividir cantidad de tráfico entre múltiples destinos: En lugar de enviar el mismo tráfico a cada destino, divide el tráfico equitativamente entre ellos.
... --output-http "http://acme.AAA.preproduccion"  --output-http "http://acme.BBB.preproduccion" --output-http "http://acme.CCC.preproduccion"  -split-output=true
  • Modificar el ratio de envío, pruebas de estrés:  Con valor absoluto o porcentaje. Para el caso del porcentaje, el operador "|xx%" puede superar el 100%, por lo que puede emplearse no sólo para pruebas de carga sino también para pruebas de estrés. El ratio puede especificarse a nivel de general o relacionado con alguno de los filtros soportados.
# Ejemplo: Cómo limitar el reenvío en función de un parámetro del header
 ... --output-tcp "replay.local:28020|10%" --http-header-limiter "X-API-KEY: 10%"

# Triplicar la velocidad de envío. El % se aplica al input. 
gor --input-file "/ruta_al_fichero_capturas/trafico_prod.gor|300%" --output-http "staging.com"  
  • Reescritura de la llamada: Reescritura de URL, parámetros, cabeceras...
  • Modificación del cuerpo de los mensajes: modificación del payload de las llamadas. Se implementa mediante el uso de programas intermedios (--middleware) de transfomación de la llamada.
# Ejemplo de uso del programa "/opt/cambia-fecha" 
sudo gor --input-raw :80 --middleware "/opt/cambia-fecha" --output-http "http://staging.server"  

¿Necesitas más? Proyecto Gor