JMeter Docker (contenedores)
Tabela de conteúdos
avançado - This article is part of a series.
Neste artigo, abordaremos a execução do JMeter dentro de um contêiner usando a plataforma Docker. Este post é necessário para entender a última etapa do JMeter distribuído usando contêineres, caso contrário, eu acabaria com um post bastante extenso e prefiro simplificar o conteúdo. Sem mais delongas, vamos começar.
O que é um contêiner? #
É basicamente um produto pronto onde o software necessário para executar um ou mais processos é instalado. A grande vantagem dos contêineres é que eles são portáteis e você pode isolar ambientes de execução inteiros em um único arquivo. No nosso caso particular, vamos criar um contêiner com tudo o que é necessário para podermos executar os scripts do JMeter, então precisamos:
- Sistema operacional: Linux Alpine (o rei do Linux compacto)
- Java: JDK ou JRE 1.8+
- JMeter: JMeter 5.2.1
O script JMeter JMX e/ou os arquivos de suporte ficarão fora do contêiner por enquanto, mas também podem estar dentro. Para mais informações sobre este assunto, recomendo que você visite este link O que é um contêiner?.
O que é Docker? #
O Docker é uma plataforma de software que nos permite gerenciar, criar, excluir e executar nossa imagem de contêiner. O Docker, assim como o JMeter, é de código aberto]( https://www.docker.com/community/open-source), então não precisamos pagar uma licença para usá-lo. Mas é sempre bom fazer doações a fundações de software livre para continuar promovendo seu desenvolvimento. Aqui você pode encontrar uma boa explicação de O que é Docker?.
Como funciona? #
Vamos criar uma imagem de contêiner a partir de um arquivo Dockerfile. Este arquivo conterá as informações e a configuração necessárias para baixar o Alpine Linux, instalar o Java JRE 1.8+, baixar e/ou descompactar o JMeter. Em seguida, executaremos alguns scripts de shell para inicializar o contêiner e executar nosso teste. No final, mencionarei como podemos fazer o mesmo, mas incluindo plugins JMeter.
Resumo do Processo #
1.- Instalar o Docker #
Primeiro precisamos instalar o Docker desktop no nosso computador, convido você a baixar e instalar a última versão disponível, depois esperar que os processos relevantes sejam iniciados para ter o CLI habilitado. Você pode validar se o Docker está instalado na linha de comando assim:
docker --version
Docker version 19.03.8, build afacb8b
2.- Clonar o repositório #
Acho que esqueci de mencionar, mas também precisamos do GIT para clonar o seguinte projeto:
git clone https://github.com/daeep/JMeter_Docker.git
cd JMeter_Docker
3.- Compilar a imagem #
Vamos compilar o arquivo Dockerfile, que está localizado em nossa pasta JMeter_Docker, simplesmente executando o script de shell ./build.sh.
4.- Validação #
Também nesta mesma pasta executaremos o exemplo para validar se tudo funciona corretamente, invocando o script de shell ./example.sh. Se ele solicitar a senha, é porque os comandos do Docker stop, remove e start estão sendo executados usando sudo e isso requer permissões de administrador. O script de shell gerará uma saída como esta:
Se você tiver um resultado semelhante, parabéns!
5.- Execução #
Vamos copiar nosso arquivo JMX para a pasta JMeter_Docker/test, mas primeiro convido você a parametrizar seu script JMX seguindo as instruções descritas aqui, vamos supor que seu script seja carismaticamente chamado de antonio.jmx e que queiramos executá-lo com 50 threads, 50 segundos de rampa e com uma duração de 10 minutos ou 600 segundos. Nós o executamos usando o script de shell ./run.sh na pasta JMeter_Docker da seguinte maneira:
./run.sh -n -t test/antonio.jmx -l test/antonio-50.jtl -j test/antonio-50.log -Jthreads=50 -Jrampup=50 -Jduration=600
Se for o caso, você deverá ter uma saída semelhante à acima. Você conseguiu.
JMeter com Plugins, começando do passo 2 #
6.- Clonar o repositório #
Se o seu script exigir plugins JMeter, eles também poderão ser baixados da nuvem, mas não podemos cobrir esse número infinito de variantes para cada plugin. A melhor opção é usar nossa versão local do JMeter, já que ela já está funcionando para o script que criamos, certo? Vamos supor que isso seja verdade e que já tenhamos baixado os complementos localmente. Primeiro vamos clonar um projeto diferente:
git clone https://github.com/daeep/JMeter_Local_Docker.git
cd JMeter_Local_Docker
7.- Instalar complementos e compactar #
Em seguida, siga as instruções para instalar os plugins do JMeter e dentro da pasta JMeter_Local_Docker/test você encontrará o arquivo JMeter_Docker_Script_Plugins.jmx, abra-o e os plugins baixarão automaticamente o plugin para o Dummy Sampler, que é necessário para executar este JMX. Vamos compactar nossa pasta JMeter, isso pode ser feito usando tarball ou zip, aqui está um exemplo 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 //alternativamente
8.- Copie os binários para a imagem #
Agora prosseguimos copiando o arquivo compactado para a pasta JMeter_Local_Docker, se você executou o passo #C-2 com o nome que indiquei, não precisa fazer nada além de compilá-lo, vá para o passo #C-4.
Se você alterou o nome do arquivo e/ou pasta, precisará fazer o mesmo na seção 3 do Dockerfile. O valor do argumento ARG JMETER_FILE deve corresponder ao nome do arquivo apache-jmeter-5.2.1.tgz ou apache-jmeter-5.2.1.zip, conforme aplicável. Além disso, o valor do argumento ARG JMETER_FOLDER deve corresponder ao nome da pasta e, finalmente, se você usou o utilitário zip, também devemos modificar a linha de descompactação usada pelo comando tar -zvxf para unzip.
9.- Compilar a imagem #
Agora vamos usar o script de shell ./build.sh novamente para construir nossa imagem e, se tudo correr corretamente, podemos executar o teste de exemplo com o comando ./example.sh.
Agora você pode fazer o mesmo que o passo 5 com seu script de plugin. Parabéns!
Conclusão #
Na verdade, há poucas diferenças entre os dois arquivos Dockerfile, sejam eles do projeto com ou sem plugins. Deixei as linhas com as diferenças abaixo. Para escrever este artigo, baseei-me no projeto GIT de Just van den Broecke que está disponível aqui. Fiz algumas modificações na versão original, mas ainda convido você para o projeto dele. Como observação adicional, o Docker concede 2 GB de memória aos contêineres por definição. Se você quiser executar testes para fins educacionais com mais threads, recomendo aumentar esse valor.
Imagem Docker JMeter em YAML: Sem plugins vs. Com plugins #
-----------------------------------------------------------------------------
# 3 Copy local JMeter to the image and set environment variables
ARG JMETER_FILE="apache-jmeter-5.2.1.tgz" //Definimos el archivo comprimido
ARG JMETER_FOLDER="apache-jmeter-5.2.1" //Definimos la carpeta
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/ \ //Copiamos los binarios a la imagen
&& 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
//Definimos la ruta donde estan los binarios comprimidos de JMeter en la nube
# 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 \ //Descargamos JMeter
&& mkdir -p ${JMETER_FOLDER} \
&& tar -xzf /tmp/jmeter/apache-jmeter-${JMETER_VERSION}.tgz -C ${JMETER_FOLDER} \ //Descomprimir JMeter
&& rm -rf /tmp/jmeter
-----------------------------------------------------------------------------