JMeter + Docker (contenedores)

docker-title

En este artículo vamos a cubrir la ejecución de JMeter dentro de un contenedor utilizando la plataforma Docker, esta publicación es necesaria para entender el último paso de JMeter distribuido utilizando contenedores, de otra forma me quedaría una publicación bastante extensa y prefiero simplificar el contenido. Sin más preámbulos, comencemos.

¿Qué es un Contenedor?

Básicamente es un enlatado en donde se encuentra instalado el software necesario para ejecutar un proceso o varios procesos. La gran ventaja de los contenedores, es que son portables y puedes aislar ambientes de ejecución completos en un solo archivo. En nuesto caso particular vamos a crear un contenedor con todo lo necesario para que podamos ejecutar los scripts de JMeter, por lo que requerimos:

  • Sistema Operativo: Linux Alpine (el rey de los linux compactos)
  • Java: JDK o JRE 1.8+
  • JMeter: JMeter 5.2.1

El script JMX de JMeter y/o archivos de soporte estarán fuera del contenedor por el momento, pero también pudieran estar dentro. Para más información al respecto te recomieeeendo visitar esta liga ¿Qué es un contenedor?.

¿Qué es Docker?

Docker es una plataforma de software que nos permite administrar, crear, eliminar y ejecutar la imagen de nuestro contenedor. Docker al igual que JMeter son open source, por lo que no requerimos pagar licenciamiento para utilizarlo. Pero siempre es bueno realizar donaciones a los fundaciones de software libre para seguir promoviendo su desarrollo. Aquí podrás encontrar una buena explicación de ¿Qué es Docker?.

¿Cómo funciona?

Vamos a crear una imagen de contenedor apartir de un archivo Dockerfile, este fichero contendrá la información y configuración necesaria para descargar alpine linux, instalar Java JRE 1.8+, descargar y/o descomprimir JMeter. Despúes ejecutaremos algunos shell scripts para inicializar el contenedor y para ejecutar nuestra prueba. Al final mencionaré como podemos hacer lo mismo pero incluyendo los complementos de JMeter.

Receta de cocina

Paso #1

Primero debemos instalar Docker desktop en nuesto equipo, te invito a descarga e instalar la última versión disponible, después esperar a que se inicien los procesos pertinentes para tener habilitado el CLI. Puedes validar que tienes instalado Docker en línea de comandos así:

docker --version
 Docker version 19.03.8, build afacb8b

Paso #2

Creo que se me olvidó mencionarlo pero también requerimos GIT para poder clonar el siguiente proyecto:

git clone https://github.com/daeep/JMeter_Docker.git
 cd JMeter_Docker

Paso #3

Vamos a compilar el archivo Dockerfile, que se encuentra en nuestra carpeta JMeter_Docker, esto simplemente ejecutando el shell script ./build.sh.

docker-start

docker-end

Paso #4

También desde esta misma carpeta vamos a ejecutar el ejemplo para validar que todo funciona correctamente, invocando el shell script ./example.sh. Si te pregunta por la contraseña, es porque se estan ejecutando los comandos de Docker stop, remove and start por medio de sudo y esto require permisos de administrador. El shell script generará una salida como esta:

docker-ejecucion

Si tienes una salida similar ¡felicidades!

Paso #5

Vamos a copar nuestro archivo JMX a la carpeta JMeter_Docker/test, pero antes te invito a parametrizar tu script JMX siguiendo las instrucciones descritas aquí, vamos a suponer que tu script se llama carísmaticamente antonio.jmx y que lo queremos ejecutar con 50 hilos, 50 segundos de rampa y con una duración de 10 minutos o 600 segundos. Lo ejecutamos utilizando el shell script ./run.sh en la carpeta JMeter_Docker de la siguiente manera :

./run.sh -n -t test/antonio.jmx -l test/antonio-50.jtl -j test/antonio-50.log -Jthreads=50 -Jrampup=50 -Jduration=600

Deberas tener una salida similar a la anterior, si es así. Lo has logrado.

Complementos

Paso #C-1

Si tu script requiere complementos de JMeter, estos también se pueden descargar de la nube, pero como no podemos cubrir este sin fin de variantes para cada complemento. La mejor opción es utilizar nuestra versión de JMeter local, puesto que esta se encuentra funcionando para el script que hemos construido, ¿cierto?. Vamos a partir de que esto es cierto y que ya tenemos descargados los complementos localmente. Primero vamos a clonar un proyecto diferente:

git clone https://github.com/daeep/JMeter_Local_Docker.git
 cd JMeter_Local_Docker

Paso #C-2

Después sigue las instrucciones para instalar los complementos de JMeter y dentro de la carpeta JMeter_Local_Docker/test se encuentra el archivo JMeter_Docker_Script_Plugins.jmx, abrelo y los complementos descargarán automáticamente el complemento para el Dummy Sampler, el cual es necesario para ejecutar este JMX. Vamos a comprimir nuestra carpeta de JMeter, esto puede ser por medio de tar ball or zip, les dejo el ejemplo de ambos:

tar -czvf apache-jmeter-5.2.1.tgz apache-jmeter-5.2.1
 zip -r apache-jmeter-5.2.1.zip apache-jmeter-5.2.1

Paso #C-3

Ahora procedemos a copiar el archivo comprimido a la carpeta JMeter_Local_Docker, si realizaste el paso #C-2 con el nombre como lo indiqué no tienes que hacer nada más que contruirlo, ve al paso #C-4.

Si cambiaste el nombre del archivo y/o la carpeta, tendrás que hacer lo propio en la sección #3 del Dockerfile. El valor del argumento ARG JMETER_FILE debe corresponder al nombre del archivo apache-jmeter-5.2.1.tgz o apache-jmeter-5.2.1.zip segun sea el caso. También el valor del argumento ARG JMETER_FOLDER debe corresponder al nombre de la carpeta y por último, si utilizaste la utilería zip, también debemos modificar la línea de descompresión que utiliza el comando tar -zvxf por unzip.

Paso #C-4

Ahora utilicemos nuevamente el shell scripting ./build.sh para construir nuestra imagen y si todo sale correctamente podemos ejecutar la prueba muestra con el comando ./example.sh.

docker-ejecucion-complemento

Ahora puedes hacer lo mismo que el paso #5 con tu script con complementos. ¡Felicidades!

Conclusión

Realmente existen pocas diferencias entre ambos archivos Dockerfile tanto del proyecto con o sin complementos, les dejo en la parte de abajo las líneas con diferencias. Para realizar este artículo me basé en el proyecto GIT de Just van den Broecke el cual esta disponible aquí, le realicé algunas modificaciones a la versión original, pero igual y los invito a su proyecto. Como dato adicional, por definición Docker otorga 2 GB de memoria a los contenedores, si quieres realizar pruebas con fines didácticos con más hilos te recomiendo incrementar este valor.

¡Suerte!

JMeter Docker Local vs Docker Cloud

-----------------------------------------------------------------------------

 # 3 Copy local JMeter to the image and set environment variables
 ARG JMETER_FILE="apache-jmeter-5.2.1.tgz"
 ARG JMETER_FOLDER="apache-jmeter-5.2.1"
 COPY ${JMETER_FILE} /tmp/

 # 4 Update & Upgrade, then decompress local JMeter and delete tar ball file
 RUN apk update \
	&& apk upgrade \
	&& apk add ca-certificates \
	&& update-ca-certificates \
	&& apk add --update openjdk8-jre tzdata curl unzip bash \
	&& apk add --no-cache nss \
	&& rm -rf /var/cache/apk/* \
	&& mkdir -p ${JMETER_HOME} \
	&& tar -zvxf /tmp/${JMETER_FILE} -C /home/jmeter/ \
	&& rm -f /tmp/${JMETER_FILE}

 -----------------------------------------------------------------------------

 # 3 Set JMeter version 5.2.1 for downloading and some ENV variables
 ENV JMETER_VERSION 5.2.1
 ENV JMETER_FOLDER /home/jmeter/
 ENV JMETER_DOWNLOAD https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-${JMETER_VERSION}.tgz

 # 4 Update, upgrade, download Java JRE and JMeter then decompress it
 RUN apk update \
	&& apk upgrade \
	&& apk add ca-certificates \
	&& update-ca-certificates \
	&& apk add --update openjdk8-jre tzdata curl unzip bash \
	&& apk add --no-cache nss \
	&& rm -rf /var/cache/apk/* \
	&& mkdir -p /tmp/jmeter/ \
	&& curl -L --silent ${JMETER_DOWNLOAD} > /tmp/jmeter/apache-jmeter-${JMETER_VERSION}.tgz \
	&& mkdir -p ${JMETER_FOLDER} \
	&& tar -xzf /tmp/jmeter/apache-jmeter-${JMETER_VERSION}.tgz -C ${JMETER_FOLDER}  \
	&& rm -rf /tmp/jmeter
	
 -----------------------------------------------------------------------------

-Antonio